Ihr erster Entscheidungsbaum in Python (NFL Combine)

Feb 22 2023
Kann die Leistung eines Spielers im NFL Combine vorhersagen, ob er gedraftet wird oder nicht? Lassen Sie uns ein Modell bauen, um es herauszufinden! Was ist ein Entscheidungsbaum? Ein Entscheidungsbaum ist ein maschineller Lernalgorithmus, der für Klassifizierungs- und Regressionsaufgaben verwendet wird. Es handelt sich um eine Art überwachten Lernalgorithmus, das heißt, er wird anhand gekennzeichneter Daten trainiert.

Kann die Leistung eines Spielers im NFL Combine vorhersagen, ob er gedraftet wird oder nicht? Lassen Sie uns ein Modell bauen, um es herauszufinden!

Was ist ein Entscheidungsbaum?

Ein Entscheidungsbaum ist ein maschineller Lernalgorithmus, der für Klassifizierungs- und Regressionsaufgaben verwendet wird. Es handelt sich um eine Art überwachten Lernalgorithmus, das heißt, er wird anhand gekennzeichneter Daten trainiert. Die Grundidee eines Entscheidungsbaums besteht darin, ein Modell zu erstellen, das den Wert einer Zielvariablen basierend auf mehreren Eingabevariablen vorhersagt.

Wie können wir es hier nutzen?

Wie oben erwähnt, können Entscheidungsbäume zur Klassifizierung (ob ein Spieler gedraftet wird oder nicht) mit beschrifteten Daten (die NFL Combine-Ergebnisse aus der Vergangenheit) verwendet werden.

Lassen Sie uns dies in Python implementieren (das vollständige Notizbuch finden Sie hier:https://github.com/ant-vessicchio/learn_data_science_through_sports/blob/main/NFL_Combine/NFL_Combine_1st_Decision_Tree.ipynb)

Zuerst die Importe, die wir benötigen:

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

Was bedeutet das?

Dies ist eine Technik, die in Algorithmen des maschinellen Lernens verwendet wird, um die Leistung eines Modells ohne Verzerrung zu bewerten.

Der Trainingssatz ist der Teil der Daten, der zum Trainieren des maschinellen Lernmodells verwendet wird. In diesem Datensatz „kennt“ das Modell das Ergebnis (es erhält die Ausgabebezeichnung von Y) und nutzt diese Informationen, um ein Modell „anzupassen“, das auf neue und „unsichtbare“ Daten verallgemeinern kann.

Der Testsatz wird verwendet, um zu bewerten, wie gut das trainierte Modell bei neuen, unsichtbaren Daten funktioniert. Die Testdaten umfassen sowohl Eingabedaten als auch entsprechende Ausgabebezeichnungen, die Ausgabebezeichnungen werden jedoch während des Tests __nicht__ verwendet. Stattdessen trifft das Modell Vorhersagen zu den Testdaten und die vorhergesagten Ausgaben werden mit den tatsächlichen Ausgaben verglichen, um die Leistung des Modells zu bewerten.

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

Training und Bewertung des Modells

Wir werden den DecisionTreeClassifier in sklearn verwenden. Der erste Schritt besteht darin, eine Instanz der Klasse zu erstellen und alle Hyperparameter anzugeben, die Sie verwenden möchten. Zu den häufig verwendeten Hyperparametern gehören:

- max_ Depth: die maximale Tiefe des Entscheidungsbaums
- min_samples_split: die minimale Anzahl von Stichproben, die zum Teilen eines internen Knotens erforderlich sind
- Kriterium: die Funktion, die zum Messen der Qualität einer Teilung verwendet wird (z. B. „Gini“ oder „Entropie“)

Mehr werden wir vorerst nicht verwenden. Und ich empfehle Ihnen, die Sklearn-Dokumentation für weitere Informationen zu lesen!
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)}")

      
                

Visualisieren Sie, was los ist:

Eine ziemlich coole Funktion eines Entscheidungsbaums sind die Visualisierungen, die er bereitstellen kann. Hier können Sie im Wesentlichen den Grenzwert für jedes Merkmal in der Entscheidungsfindung sehen, wie viele Stichproben in jede Klasse klassifiziert wurden und den Gini-Index, der das Maß dafür ist, wie gut ein bestimmtes Attribut die Trainingsbeispiele in einem Entscheidungsbaum trennt.

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()

      
                

Ein sehr cooles Feature eines Entscheidungsbaums ist die Generierung der Feature-Wichtigkeit. Die Merkmalswichtigkeit in einem Entscheidungsbaum bezieht sich auf ein Maß dafür, wie wichtig jedes Merkmal oder jede Eingabevariable für die Bestimmung der endgültigen Ausgabe des Baums ist.

# 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

      
                

Und um die Wichtigkeit der Funktion einfach zu veranschaulichen:

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()

      
                

Einige Ideen:

  • Hyperparameter ändern/hinzufügen
  • Erstellen Sie für jede Position ein Modell und prüfen Sie, ob dies die Genauigkeit verbessert!
  • Versuchen Sie vielleicht, mit fehlenden Daten anders umzugehen?

Wenn Ihnen dieser Artikel gefallen hat, kommentieren Sie bitte unten, folgen Sie mir für weitere Inhalte und folgen Sie meinem gesamten kostenlosen Kurs „Learn Data Science Through Sports“, der auf meinem GitHub und SubReddit gehostet wird:

Sie können mich auch gerne auf LinkedIn kontaktieren!https://www.linkedin.com/in/anthony-vessicchio/

Vielen Dank und ich hoffe, dass Ihnen dieser Artikel gefallen hat!