Ваше первое дерево решений в Python (комбинация NFL)

Feb 22 2023
Может ли производительность игрока в NFL Combine предсказать, будет ли он выбран на драфте? Давайте построим модель, чтобы узнать! Что такое дерево решений? Дерево решений — это алгоритм машинного обучения, который используется для задач классификации и регрессии. Это тип алгоритма обучения с учителем, что означает, что он обучается на размеченных данных.

Может ли производительность игрока в NFL Combine предсказать, будет ли он выбран на драфте? Давайте построим модель, чтобы узнать!

Что такое дерево решений?

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

Как мы можем использовать это здесь?

Как указано выше, деревья решений могут использоваться для классификации (независимо от того, будет ли игрок выбран на драфте) с помеченными данными (результаты объединения НФЛ из прошлого).

Давайте реализуем это на Python (полный блокнот можно найти здесь:https://github.com/ant-vessicchio/learn_data_science_through_sports/blob/main/NFL_Combine/NFL_Combine_1st_Decision_Tree.ipynb)

Во-первых, импорт, который нам понадобится:

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

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn import tree

master_table = master_table = pd.read_csv("NFL.csv")
master_table.head()

      
                

X = master_table.iloc[:,3:9]
Y = master_table.iloc[:,-1]

      
                

#Drop Records Containing Null Values
X.dropna(inplace=True)  
X.isnull().sum() #Check

Что это значит?

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

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

Набор тестов используется для оценки того, насколько хорошо обученная модель работает с новыми, невидимыми данными. Данные тестирования включают как входные данные, так и соответствующие выходные метки, но выходные метки __не__ используются во время тестирования. Вместо этого модель делает прогнозы на основе данных тестирования, а прогнозируемые выходные данные сравниваются с фактическими выходными данными для оценки производительности модели.

X_train, X_test, y_train, y_test = train_test_split(X,Y, test_size = 0.3, random_state=100)

Обучение и оценка модели

Мы будем использовать DecisionTreeClassifier в sklearn. Первый шаг — создать экземпляр класса и указать любые гиперпараметры, которые вы хотите использовать. Некоторые из часто используемых гиперпараметров включают в себя:

- max_depth: максимальная глубина дерева решений
- min_samples_split: минимальное количество выборок, необходимое для разделения внутреннего узла
- критерий: функция, используемая для измерения качества разделения (например, «джини» или «энтропия»)

Мы не будем использовать больше, чем это сейчас. И я рекомендую вам прочитать документацию sklearn для получения дополнительной информации!
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

clf = DecisionTreeClassifier(criterion = 'gini',min_samples_split = 3, max_depth = 3)

clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

print(f" Accuracy score: {accuracy_score(y_test,y_pred)}")

      
                

Визуализируйте, что происходит:

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

plt.figure(figsize=(12,8))
from sklearn import tree
tree.plot_tree(clf.fit(X_train,y_train), feature_names = X_train.columns )
plt.show()

      
                

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

# let's create a dictionary of features and their importance values
feat_dict= {}
for col, val in sorted(zip(X_train.columns, clf.feature_importances_),key=lambda x:x[1],reverse=True):
  feat_dict[col]=val

feat_df = pd.DataFrame({'Feature':feat_dict.keys(),'Importance':feat_dict.values()})
feat_df

      
                

И чтобы сделать простую иллюстрацию важности функции:

import seaborn as sns
values = feat_df.Importance    
idx = feat_df.Feature
plt.figure(figsize=(10,8))
clrs = ['green' if (x < max(values)) else 'red' for x in values ]
sns.barplot(y=idx,x=values,palette=clrs).set(title='Feature Importance - Player Drafted (Y/N)')
plt.show()

      
                

Некоторые идеи:

  • Изменить/добавить гиперпараметры
  • Создайте модель для каждой позиции и посмотрите, улучшит ли это точность!
  • Может быть, попробовать обработать недостающие данные по-другому?

Если вам понравилась эта статья, пожалуйста, прокомментируйте ниже, подпишитесь на меня, чтобы получить больше контента, и следите за всем моим бесплатным курсом «Learn Data Science Through Sports», размещенным на моем GitHub и SubReddit:

Кроме того, не стесняйтесь обращаться ко мне в LinkedIn!https://www.linkedin.com/in/anthony-vessicchio/

Большое спасибо, и я надеюсь, что вам понравилась эта статья!