С помощью этой статьи я покажу различные методы классификации для определения результата игры НБА.

Предыстория НБА для тех, кто не имеет о ней представления.

Национальная баскетбольная ассоциация (NBA) - это мужская профессиональная баскетбольная лига в Северной Америке, состоящая из 30 команд (29 в США и 1 в Канаде). Это одна из четырех основных профессиональных спортивных лиг США и Канады и широко считается ведущей мужской профессиональной баскетбольной лигой в мире.

Что такое классификация в машинном обучении?

Большая часть практического машинного обучения использует обучение с учителем. Контролируемое обучение - это когда у вас есть входные переменные (x) и выходная переменная (Y), и вы используете алгоритм для изучения функции сопоставления от входа к выходу Y = f (X). Цель состоит в том, чтобы аппроксимировать функцию сопоставления настолько хорошо, чтобы, когда у вас есть новые входные данные (x), вы могли предсказать выходные переменные (Y) для этих данных.

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

Чего мы пытаемся достичь в этой статье?

В этой статье мы будем использовать различные типы алгоритмов классификации с использованием машинного обучения и проверим точность нашей модели для прогнозирования результата. В этой статье тестирование не рассматривается, но наша основная цель - показать, как проверить точность модели. Набор данных, используемый в этом примере, представляет собой результаты всех игр НБА с 2014 по 2018 год, и его можно найти здесь: https://www.kaggle.com/ionaskel/nba-games-stats-from-2014-to -2018

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

Импортируйте стандартные библиотеки, которые необходимы для нашей цели.

import pandas as pd
import numpy as np
import matplotlib as mp
import matplotlib.pyplot as plt

Теперь давайте прочитаем CSV-файл, который мы загрузили с Kaggle для нашего набора данных. Эти данные необходимо обработать для дальнейшей предварительной обработки.

df=pd.read_csv(r'C:\Siddhanth\SI4407\Sem 5\ML and AI\Home\nba.csv')
df.head(

Выход:

Первый шаг, который нам нужно сделать для классификации, - это преобразовать все данные в числовые значения. Для преобразования нечислового значения в числовое существует множество методов. Я использовал One Hot Encoding с использованием Pandas в качестве pd.dummies для преобразования дома и вдали в 1 и 0. Подробнее об этом можно прочитать здесь: https://pandas.pydata.org/pandas-docs /stable/reference/api/pandas.get_dummies.html

Вот как:

one_hot = pd.get_dummies(df['Home'],prefix='Side')
df = df.drop('Home',axis = 1)
df = df.join(one_hot)
df.head()

Выход:

Как вы можете видеть, столбец Home был изменен на Side_Away и Side_Home и был добавлен во фрейм данных в конце с помощью соединения. Точно так же для других нечисловых данных, таких как Team и Opponent, мы сделали то же самое, используя Label Encoder, используя sklearn. Подробнее об этом здесь: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
df['Team']=le.fit_transform(df['Team'])
df['Opponent']=le.transform(df['Opponent'])
df.head()

Выход:

Здесь каждой команде присвоено числовое значение, и в соответствии с их номером их имя было заменено на номер в столбце «Противник». Теперь остается столбец WINorLOSS, который можно легко преобразовать в 1 и 0.

d=df['WINorLOSS']
d=list(map(lambda x: 1 if x != 'L' else 0, d))
df['WINorLOSS']=d
df.head()

Выход:

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

1. КОРЗИНА

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

Давайте воспользуемся этой моделью и попробуем наш показатель точности.

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.33, random_state=42)
regressor = DecisionTreeRegressor(random_state =1)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
from sklearn.metrics import accuracy_score
accuracy_score(y_pred,y_test)

Выход:

Модель CART представлена ​​в виде двоичного дерева.

2. Случайный лес

Алгоритм случайного леса может использоваться как для классификации, так и для задач регрессии . Один и тот же алгоритм для классификации и регрессии. Вы можете подумать, что я шучу. Но правда в том, что да, мы можем использовать один и тот же алгоритм случайного леса как для классификации, так и для регрессии. Лучшее видео, которое я нашел для Random Forest на YouTube: https://www.youtube.com/watch?v=J4Wdy0Wc_xQ

Давайте проверим нашу точность:

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=100, max_depth=3, random_state=1)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy_score(y_pred,y_test)

Выход:

3. Повышение градиента

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

  1. Оптимизируемая функция потерь.
  2. Слабый ученик, чтобы делать прогнозы.
  3. Аддитивная модель для добавления слабых учеников, чтобы минимизировать функцию потерь.

Мы взяли несколько уровней обучения в список и проверили точность для одного и того же.

from sklearn.ensemble import GradientBoostingClassifier
lr_list = [0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1]
for learning_rate in lr_list:
    gb_clf = GradientBoostingClassifier(n_estimators=20, learning_rate=learning_rate, max_features=2, max_depth=2, random_state=0)
    gb_clf.fit(X_train, y_train)
print("Learning rate: ", learning_rate)
    print("Accuracy score (training): {0:.3f}".format(gb_clf.score(X_train, y_train)))
    print("Accuracy score (validation): {0:.3f}".format(gb_clf.score(X_test, y_test)))

Выход:

4. Нейронные сети

Искусственные нейронные сети вызвали большой интерес в исследованиях и промышленности машинного обучения благодаря множеству прорывных результатов в распознавании речи, компьютерном зрении и обработке текста. В этом сообщении в блоге мы попытаемся понять особый тип искусственной нейронной сети, называемый многослойным персептроном. Подробнее об этом можно прочитать здесь: https://ujjwalkarn.me/2016/08/09/quick-intro-neural-networks/

Давайте проверим нашу точность

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(20, activation='relu', input_dim=38))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs = 10, batch_size = 64, verbose=1,validation_data=(X_test,y_test),shuffle=True)
score = model.evaluate(X_test, y_test, batch_size=64)

Выход:

ЗАКЛЮЧЕНИЕ

Разные модели дают разные результаты, некоторые из них не подходят или переоснащаются, а некоторые дают немного точные ответы. Теперь, используя эти методы, можно проводить тестирование с использованием других данных, чтобы предсказать результат любого матча НБА. Для нашего набора данных CART оказалась лучшей моделью, чем любая другая. Попробуйте другие модели, спасибо.