Python での最初のデシジョン ツリー (NFL Combine)
NFLコンバインでの選手の成績から、ドラフトに指名されるかどうかを予測できるでしょうか? モデルを構築して調べてみましょう!
デシジョンツリーとは何ですか?
デシジョン ツリーは、分類タスクと回帰タスクに使用される機械学習アルゴリズムです。これは教師あり学習アルゴリズムの一種であり、ラベル付きデータでトレーニングされることを意味します。デシジョン ツリーの背後にある基本的な考え方は、複数の入力変数に基づいてターゲット変数の値を予測するモデルを作成することです。
ここでどうやって使えばいいのでしょうか?
上で述べたように、デシジョン ツリーは、ラベル付きデータ (過去の NFL 結合結果) による分類 (プレーヤーがドラフトされるかどうか) に使用できます。
これを 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)
モデルのトレーニングと評価
sklearn で DecisionTreeClassifier を使用します。最初のステップは、クラスのインスタンスを作成し、使用するハイパーパラメーターを指定することです。一般的に使用されるハイパーパラメータには次のようなものがあります。
- max_ Depth: 決定木の最大の深さ
- min_samples_split: 内部ノードを分割するために必要なサンプルの最小数
- criterion: 分割の品質を測定するために使用される関数 (例: 「gini」または「entropy」)
今のところこれ以上は使用しません。さらに詳しい情報については、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()
いくつかのアイデア:
- ハイパーパラメータの変更/追加
- 各位置のモデルを構築して、精度が向上するかどうかを確認してください。
- 欠損データを別の方法で処理してみてはいかがでしょうか?
この記事を気に入っていただけた場合は、以下にコメントして、より多くのコンテンツをご覧になるために私をフォローしてください。また、私の GitHub と SubReddit でホストされている「スポーツを通じてデータ サイエンスを学ぶ」無料コース全体をフォローしてください。
また、LinkedIn でお気軽にご連絡ください。https://www.linkedin.com/in/anthony-vessicchio/
どうもありがとうございました。この記事をお楽しみいただければ幸いです。

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































