I have assembled a database of Clash Royale games in an attempt to understand the outcomes of various match-ups. The game is composed of an 8 card deck drawn from 102 cards. As you can see from the Cnr, it's a very wide space with many possibilities. Similarly, this deck will be opposed by a wide and diverse space.

I have been using essentially a 206 element wide table. One of the variables relates to the relative strength of the players; one hundred and two variables are indicators for the "home deck"; one hundred and two variables are indicators for the "away deck"; and the final element is an outcome variable that is the binary response variable of interest.

I have utilized an xgboost model to predict the outcome of the opposing decks, but I understand that it is not that useful for extrapolation where card combinations have not actually been played in the data. It seems to me that a logistic approach would be better, but the challenge i am faced with is that the interactions are highly critical, but also explode into too many features to manage.

As additional information, I have used segmentation to "group" the decks into commonly utilized "metas" with good success. Per my note above, however, this does not help in the identification of "new metas" that might be worth exploring.

I am interested in suggested approaches to solving this problem. And if you care to see some of my Clash Royale data, I host a website for my clan at The6ixclan.ca

Edit: I should note that my table contains almost 1 million rows of game data (not necessarily independent since players may have played up to 25 games each).

  • $\begingroup$ What is the goal of your project? It sounds like you are training your model to predict which of two players will win, given both of their decks. However, is that your ultimate objective, or is there a different goal? For example, it might be to identify the strongest cards/card combinations, or the best card to counter a particular deck, or the most optimal deck in general. $\endgroup$
    – Ryan Volpi
    Dec 13, 2020 at 1:23
  • $\begingroup$ Thanks for your comment. Yes..my examination of the results to date confirms that some decks have advantages over others. The way that the game is maintained as "fair" is that certain decks will oppose "winning decks" with higher frequency. Still, I am seeking greater clarity about which cards tend to have advantage over other cards, from a statistical point of view. Problem is, the deck acts as a system. So the interactions are critical, and xgboost is not anticipating outcomes from novel combinations well. $\endgroup$
    – C. Cooney
    Dec 13, 2020 at 2:12

1 Answer 1


Really, there is a lot of things that you can do:

  1. Make sure that you have sufficiently detailed data. I have had a quick look at the rules of the game you suggest, and I have learned that

    • It matters what cards have actually been played, not only the cards that are in the deck.
    • The timing of cards played matters. One can use a model that includes absolute or relative times in predicting outcome. You can use a gaussian model if you believe that a card may be useful only within a certain time interval during the game, or a logistic model if you believe that the card is only useful in the beginning or only at the end of a game.
    • The order in which the cards are played matters. The problem is that even for 8 cards there are 8! = 40320 different orders to play them. Perhaps for the beginning it makes sense to take note of the order of each pair of cards, as well as how far from one another they typically appear.
  2. You may want to perform embedding on decks to determine what decks win more. I would proceed as follows:

    1. Represent each deck as n-dimensional vector, where each element is the number of cards of a particular type in the deck
    2. Perform a local embedding such as t-sne to project that data onto a 2D plot. You may need to play around with the embedding parameter until you get nice results
    3. Color each point by the average winrate of that precise deck.
    4. Visually look for clusters of high winrate, and identify what decks they are
  3. Similar to the above, try clustering

    1. Filter out only the decks that have high winrate
    2. As before, represent them as vectors
    3. Perform clustering, e.g. kmeans to obtain clusters of decks that have most similar cards. You may need to play around with the exact clustering method and distance function until you find one that fits naturally to your data
    4. For each cluster, display cards in that cluster, sorted by frequency of use

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.