С помощью этой статьи я покажу различные методы классификации для определения результата игры НБА.
Предыстория НБА для тех, кто не имеет о ней представления.
Национальная баскетбольная ассоциация (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. Повышение градиента
Повышение градиента - это метод машинного обучения для задач регрессии и классификации, который создает модель прогнозирования в виде ансамбля слабых моделей прогнозирования, обычно деревьев решений. Повышение градиента включает три элемента:
- Оптимизируемая функция потерь.
- Слабый ученик, чтобы делать прогнозы.
- Аддитивная модель для добавления слабых учеников, чтобы минимизировать функцию потерь.
Мы взяли несколько уровней обучения в список и проверили точность для одного и того же.
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 оказалась лучшей моделью, чем любая другая. Попробуйте другие модели, спасибо.