Prédiction de main de poker – Prakhar Rathi
Avant de commencer à discuter de l’approche, voici un petit rappel de poker pour ceux d’entre vous qui débutent dans le jeu. Le poker est probablement le jeu de cartes le plus populaire au monde en ce moment. Ce n’est pas un jeu très compliqué. Chaque jeu peut faire des mains en utilisant 5 cartes, dont 2 dans votre main et trois sur la table. Il existe différents types de mains qu’un joueur peut avoir et chacune des mains a un classement basé sur les règles du poker.
Description des données
Vous pouvez obtenir une copie des fichiers de test et de formation ici. Même s’ils suivent le même format, l’ensemble de problèmes que j’ai trouvé utilisé 1,000,000
échantillons de formation et 25,010
test de l’échantillon alors que c’est l’inverse en cas de lien. Cependant, comme je l’ai dit, une approche d’apprentissage automatique peut ne vous mener nulle part. Je pense que la raison pour laquelle ils ont donné près de 40 fois plus d’exemples de tests que de formation était pour qu’une approche générique d’apprentissage automatique échoue. Nous y reviendrons dans un moment. Voici la description des données du fichier. Chaque main se compose de cinq cartes avec une couleur et un rang donnés, tirées d’un jeu standard de 52 cartes. Les combinaisons et les rangs sont représentés comme des catégories ordinales:
Attribute Information:S1 “Suit of card #1”
Ordinal (1-4) representing {Hearts, Spades, Diamonds, Clubs}
C1 “Rank of card #1”
Numerical (1-13) representing (Ace, 2, 3, ... , Queen, King)...
S5 “Suit of card #5”
C5 “Rank of card #5”
Chaque ligne de l’ensemble d’entraînement a l’étiquette de classe qui l’accompagne pour la main de poker qu’elle comprend. Les mains sont omises de l’ensemble de test et doivent être prédites. Les mains sont classées dans les catégories ordinales suivantes:
0: Nothing in hand; not a recognized poker hand
1: One pair; one pair of equal ranks within five cards
2: Two pairs; two pairs of equal ranks within five cards
3: Three of a kind; three equal ranks within five cards
4: Straight; five cards, sequentially ranked with no gaps
5: Flush; five cards with the same suit
6: Full house; pair + different rank three of a kind
7: Four of a kind; four equal ranks within five cards
8: Straight flush; straight + flush
9: Royal flush; {Ace, King, Queen, Jack, Ten} + flush
Notez que les mains à affleurement droit et à affleurement royal ne sont pas représentatives de
le vrai domaine car ils ont été suréchantillonnés. La quinte flush
est 14,43 fois plus susceptible de se produire dans l’ensemble d’entraînement, tandis que la quinte flush royale est 129,82 fois plus probable. Voici à quoi ressemblent les données dans DataFrame train_data.head()
Je suis presque sûr que la première technique d’apprentissage automatique qui vous est venue à l’esprit était une approche basée sur un arbre et, oui, cela a beaucoup de sens, non? Sauf que le point de référence Random-Forest était d’une précision de 62,4%. Ouais, assez bas.
Maintenant, ceux d’entre vous qui ont décidé que c’est un problème de ML et que ce ne sont que les résultats de base et que vous pouvez faire mieux, je l’apprécie. En fait, je suis ouvert à la lecture de toute approche d’apprentissage automatique que vous avez pu trouver pour résoudre ce problème avec une très grande précision (de préférence 1). Parlez-en dans les commentaires ci-dessous. Cependant, je suis presque certain qu’il n’existe pas de solution ML «faisable» à ce problème. Vous pouvez empiler couche après couche et construire un modèle d’apprentissage en profondeur avec un grand nombre de paramètres, mais seriez-vous vraiment fier de vous.
Au moment où j’ai vu ce problème, j’ai commencé à penser comme un joueur de poker. Ils ont tendance à toujours mettre la main à droite et ils ne semblent pas utiliser d’algorithme ML. Bien sûr, ils ont la meilleure architecture de réseau neuronal, c’est-à-dire le cerveau, mais comment imiter cette approche? C’est à ce moment-là que j’ai réalisé qu’au lieu de l’apprentissage automatique, je devrais utiliser une approche itérative simple avec quelques fonctions de base. Alors, salissons les mains.
Il sera toujours utile d’avoir une entrée de test. Cela vous permettra de modifier les entrées et de tester chacune de vos fonctions.
# Creating a testing dictionary
test = {‘S1’: 1,
‘C1’: 2,
‘S2’: 1,
‘C2’: 3,
‘S3’: 2,
‘C3’: 4,
‘S4’: 2,
‘C4’: 5,
‘S5’: 2,
‘C5’: 6}
Bibliothèques
C’est une tâche assez simple, vous avez donc juste besoin de la bibliothèque pandas pour la manipulation des données et de scikit-learn pour les mesures de précision.
import pandas as pd
Extraction de données
Notre prochain travail consiste à créer une fonction qui extrait les données d’une ligne du DataFrame qui sera dans le type de données Series et les stocke dans un dictionnaire avec chaque fonctionnalité comme clé dans le dictionnaire.
Output:
{'S1': 3, 'C1': 12, 'S2': 3, 'C2': 2, 'S3': 3, 'C3': 11, 'S4': 4, 'C4': 5, 'S5': 2, 'C5': 5}
Fonctions pour vérifier les mains de la carte
Maintenant, nous avons besoin de différentes fonctions pour vérifier le type de main d’un joueur. Ces fonctions fonctionnent de manière très basique. Nous transmettons les informations de la carte dans un dictionnaire et ils vérifient si une condition de poker particulière est satisfaite ou non. Renvoyez 1 pour oui et 0 pour non. Vous pouvez être aussi imaginatif que vous le souhaitez. Tout d’abord, vérifions affleurer. UNE affleurer est atteint lorsque les cinq cartes appartiennent à la même couleur. Une fonction de vérification assez simple.
Ensuite, nous devons vérifier si un joueur a un tout droit ou pas. UNE tout droit c’est quand un joueur a toutes les cartes dans un ordre particulier (par exemple: – 3, 4, 5, 6, 7). Très chanceux!
Vérifions maintenant la meilleure combinaison de cartes – une royale. Un royal est une combinaison de cartes spéciale ayant {Ace, King, Queen, Jack, Ten}
dans la main de la carte.
La fonction suivante consiste à classer les mains dans toutes les catégories restantes. Cela peut devenir un peu délicat à certains endroits, mais j’ai utilisé une approche arborescente pour créer cette fonction. J’ai trié les cartes et en fonction des différentes combinaisons, j’ai pu assigner différentes classes aux mains. J’ajouterai une explication plus détaillée si quelqu’un le demande dans les commentaires ci-dessous.
Attribuer des étiquettes aux mains
Il est temps d’utiliser les fonctions ci-dessus pour classer les données en différentes étiquettes.
Itérer sur les données d’entraînement
Après tout ce travail acharné (intelligent), testons notre algorithme en itérant sur les données d’entraînement.
La fonction ci-dessus semble fonctionner plutôt bien. Évaluons les résultats.
Output:
1.0
Ces résultats semblent vraiment satisfaisants et nous avons à peine dû utiliser une heure de notre temps. C’était une bonne journée! Voici un lien vers mon carnet pour une explication plus détaillée.
La conclusion? Assez basique. Tout n’exige pas l’apprentissage automatique. Parfois, une ancienne et simple itération peut faire la magie. Commencez à penser du point de vue des parties prenantes et le problème pourrait commencer à se résoudre. Cela ne signifie pas que ce que nous avons fait ici n’est pas Analytics ou Data Science. Nous traitons des données et les analysons mais ce que je présente est une façon de penser pour aller au-delà d’une approche conventionnelle pour résoudre des problèmes. Encore une fois, c’est juste une approche et peut-être que vous êtes plus à l’aise avec ML et ça va. C’est entièrement votre appel tant que vous pouvez faire le travail.