В этой статье я попытаюсь показать, как можно использовать различные алгоритмы классификации для предсказания возможных покерных комбинаций.

Что такое «покерная рука»?

В покере игроки составляют наборы из пяти карт, называемые руками, в соответствии с принципами игры. У каждой руки есть позиция, которая сравнивается с позициями разных рук, участвующих в противостоянии, чтобы выбрать, кто выиграет банк.

НАБОР ДАННЫХ ОПИСАНИЕ

Каждая запись представляет собой пример руки, состоящей из пяти игральных карт, взятых из стандартной колоды из 52 карт. Каждая карта описывается с использованием двух атрибутов (мать и ранг), всего 10 атрибутов прогнозирования. Существует один атрибут класса, описывающий «руку в покере». Порядок карт важен, поэтому существует 480 возможных комбинаций флеш-рояля по сравнению с 4 .

ИСТОЧНИК НАБОРА ДАННЫХ ДЛЯ ПОКЕРА: http://archive.ics.uci.edu/ml/machine-learning-databases/poker/

Описание атрибута набора данных:

  1. S1 «Масть карты №1»
    Порядковый номер (1–4), представляющий {червы, пики, бубны, трефы}

    2) C1 «Ранг карты №1»
    Числовое (1–13), представляющее (Туз, 2, 3, … , Дама, Король)

    3) S2 «Масть карты № 2»
    Порядковое (1–4), представляющее { Черви, пики, бубны, трефы}

    4) C2 «Ранг карты №2»
    Числовое значение (1–13), представляющее (туз, 2, 3, … , дама, король)

    5) S3 «Масть карты № 3»
    Порядковый номер (1–4), представляющий {червы, пики, бубны, трефы}

    6) C3 « Ранг карты №3»
    Числовое значение (1–13), представляющее (туз, 2, 3, … , дама, король)

    7) S4 «Масть карты №4»
    Порядковый номер (1–4), представляющий {червы, пики, бубны, трефы}

    8) C4 «Ранг карты № 4»
    Числовой (1–13), представляющий (туз, 2, 3, … , Дама, Король)

    9) S5 «Масть карты № 5»
    Порядковый номер (1–4), представляющий {червы, пики, бубны, трефы}

    10) C5 «Ранг карты 5»
    Числовой al (1–13), представляющий (туз, 2, 3, … , дама, король)

    11) КЛАСС «Покерная рука»
    Порядковый номер (0–9)

ВИДЫ ПОКЕРНЫХ КОМАНД:

0: Ничего в руках; не признанная покерная комбинация
1: Одна пара; одна пара равных рангов в пределах пяти карт
2: две пары; две пары одинаковых рангов в пределах пяти карт
3: Тройка; три равных ранга в пяти картах
4: Straight; пять карт, расположенных последовательно без пропусков
5: Флеш; пять карт одной масти
6: Фулл-хаус; пара + тройка разного ранга
7: каре; четыре равных ранга в пяти картах
8: Стрит-флеш; стрит + флеш
9: Флеш-рояль; {туз, король, дама, валет, десятка} + флеш

ИМПОРТ ВСЕХ БИБЛИОТЕК

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

ПРЕДВАРИТЕЛЬНАЯ ОБРАБОТКА ДАННЫХ

data_train=pd.read_csv("poker-hand-training-true.data",header=None)
data_test = pd.read_csv("poker-hand-testing.data",header=None)
col=['Suit of card #1','Rank of card #1','Suit of card #2','Rank of card #2','Suit of card #3','Rank of card #3','Suit of card #4','Rank of card #4','Suit of card #5','Rank of card 5','Poker Hand']
data_train.columns=col
data_test.columns=col
y_train=data_train['Poker Hand']
y_test=data_test['Poker Hand']
y_train=pd.get_dummies(y_train)
y_test=pd.get_dummies(y_test)
x_train=data_train.drop('Poker Hand',axis=1)
x_test=data_test.drop('Poker Hand',axis=1)
print('Shape of Training Set:',x_train.shape)
print('Shape of Testing Set:',x_test.shape)
>>Shape of Training Set: (25010, 10)
>>Shape of Testing Set: (1000000, 10)

1.НЕЙРОННАЯ СЕТЬ

Нейронная сеть — это последовательность алгоритмов, которая пытается обнаружить фундаментальные связи в большом количестве информации с помощью процедуры, копирующей способ работы человеческого мозга. Нейронная сеть может приспосабливаться к изменению ввода; таким образом, сеть выдает наиболее идеальный результат, не ожидая изменения критериев вывода.

Для создания NN мы использовали библиотеку Keras, которая представляет собой высокоуровневую оболочку API для низкоуровневого API, способную работать поверх TensorFlow, CNTK или Theano.

Моя архитектура нейронной сети состояла из 3 плотных слоев с 15, 10 и 10 узлами в каждом слое соответственно.

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras import regularizers


model = Sequential()
model.add(Dense(15, activation='relu', input_dim=10))
model.add(Dense(10, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])


history = model.fit(x_train, y_train, epochs = 10, batch_size = 256, verbose=1,validation_data=(x_test,y_test),shuffle=True)


score = model.evaluate(x_test, y_test, batch_size=256)
##OUTPUT
Train on 25010 samples, validate on 1000000 samples
Epoch 1/10
25010/25010 [==============================] - 4s 156us/step - loss: 0.3935 - acc: 0.8842 - val_loss: 0.3070 - val_acc: 0.8999
Epoch 2/10
25010/25010 [==============================] - 4s 147us/step - loss: 0.2283 - acc: 0.8996 - val_loss: 0.1818 - val_acc: 0.8997
Epoch 3/10
25010/25010 [==============================] - 4s 145us/step - loss: 0.1790 - acc: 0.8998 - val_loss: 0.1767 - val_acc: 0.9000
Epoch 4/10
25010/25010 [==============================] - 4s 143us/step - loss: 0.1758 - acc: 0.9001 - val_loss: 0.1750 - val_acc: 0.9001
Epoch 5/10
25010/25010 [==============================] - 4s 149us/step - loss: 0.1748 - acc: 0.9000 - val_loss: 0.1743 - val_acc: 0.9000
Epoch 6/10
25010/25010 [==============================] - 4s 144us/step - loss: 0.1743 - acc: 0.9001 - val_loss: 0.1740 - val_acc: 0.9000
Epoch 7/10
25010/25010 [==============================] - 4s 146us/step - loss: 0.1740 - acc: 0.9003 - val_loss: 0.1737 - val_acc: 0.9001
Epoch 8/10
25010/25010 [==============================] - 4s 147us/step - loss: 0.1738 - acc: 0.9002 - val_loss: 0.1734 - val_acc: 0.9000
Epoch 9/10
25010/25010 [==============================] - 4s 146us/step - loss: 0.1735 - acc: 0.9005 - val_loss: 0.1732 - val_acc: 0.9003
Epoch 10/10
25010/25010 [==============================] - 4s 151us/step - loss: 0.1734 - acc: 0.9004 - val_loss: 0.1730 - val_acc: 0.9004
1000000/1000000 [==============================] - 3s 3us/step

Точность проверки составляет 90,04% .

Теперь экспериментируем и сравниваем с другими моделями классификации…

2. ЛОГИСТИЧЕСКАЯ РЕГРЕССИЯ

Как и все регрессионные анализы, логистическая регрессия является прогностическим анализом. Логистическая регрессия используется для описания данных и объяснения взаимосвязи между одной зависимой бинарной переменной и одной или несколькими независимыми переменными номинальных, порядковых, интервальных или относительных уровней.

Я использовал библиотеку Sci-kit Learn для импорта всех алгоритмов и применил метод выбора модели логистической регрессии для использования алгоритма логистической регрессии.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
clf = LogisticRegression(random_state=0, solver='lbfgs',max_iter=100,multi_class='ovr').fit(x_train, y_train)
y_pred=clf.predict(x_test)
accuracy_score(y_pred,y_test)
##OUTPUT
0.501209

Как видите, точность проверки на удивление низкая по сравнению с нейронной сетью.

Точность проверки составляет 50,12%!!

3. Деревья классификации и регрессии для машинного обучения (CART)

Деревья классификации и регрессии или CART для краткости - это термин, введенный Лео Брейманом для обозначения алгоритмов дерева решений, которые можно использовать для задач моделирования классификации или регрессионного прогнозирования.

Классически этот алгоритм называют «деревьями решений», но на некоторых платформах, таких как R, они называются более современным термином CART.

Алгоритм CART обеспечивает основу для важных алгоритмов, таких как деревья решений в пакетах, случайный лес и деревья решений с усилением.

Я использовал библиотеку Sci-kit Learn для импорта всех алгоритмов и применил метод выбора модели дерева решений для использования алгоритма дерева решений.

from sklearn.tree import DecisionTreeClassifier
decision_tree = DecisionTreeClassifier(random_state=0,max_depth = 2)
decision_tree = decision_tree.fit(x_train,y_train)
y_pred = decision_tree.predict(x_test)
accuracy_score(y_pred,y_test)
##OUTPUT
0.501209

Опять же, точность проверки на удивление низкая и очень похожа на точность логистической регрессии.

Точность проверки составляет 50,12%!!

И НАКОНЕЦ…

4. Машина опорных векторов (SVM)

SVM — это контролируемый алгоритм машинного обучения, который можно использовать как для задач классификации, так и для регрессии. Тем не менее, он в основном используется в задачах классификации. В этом алгоритме мы отображаем каждый элемент данных как точку в n-мерном пространстве (где n — количество имеющихся у вас объектов), при этом значение каждого объекта является значением конкретной координаты.

from sklearn import svm
clf = svm.LinearSVC()
clf.fit(x_train,y_train) 
y_pred = clf.predict(x_test)
accuracy_score(y_pred,y_test)
##OUTPUT
0.431699

Точность проверки здесь составляет 43,16 %!

ВОТ МОЙ ПОЛНЫЙ КОД:

В конце концов, нейронная сеть с использованием библиотеки Keras позволяет нам получать наиболее точные результаты!

Это одно из моих первых приложений в области машинного обучения. Спасибо, что прочитали мою статью, и я надеюсь, что смогла помочь и вдохновить таких же студентов, как я!