В этой статье я попытаюсь показать, как можно использовать различные алгоритмы классификации для предсказания возможных покерных комбинаций.
Что такое «покерная рука»?
В покере игроки составляют наборы из пяти карт, называемые руками, в соответствии с принципами игры. У каждой руки есть позиция, которая сравнивается с позициями разных рук, участвующих в противостоянии, чтобы выбрать, кто выиграет банк.
НАБОР ДАННЫХ ОПИСАНИЕ
Каждая запись представляет собой пример руки, состоящей из пяти игральных карт, взятых из стандартной колоды из 52 карт. Каждая карта описывается с использованием двух атрибутов (мать и ранг), всего 10 атрибутов прогнозирования. Существует один атрибут класса, описывающий «руку в покере». Порядок карт важен, поэтому существует 480 возможных комбинаций флеш-рояля по сравнению с 4 .
ИСТОЧНИК НАБОРА ДАННЫХ ДЛЯ ПОКЕРА: http://archive.ics.uci.edu/ml/machine-learning-databases/poker/
Описание атрибута набора данных:
- 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 позволяет нам получать наиболее точные результаты!
Это одно из моих первых приложений в области машинного обучения. Спасибо, что прочитали мою статью, и я надеюсь, что смогла помочь и вдохновить таких же студентов, как я!