Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用して、ランダム フォレストの機能重要度を取得します。垂直検索。あい。

Python と Scikit-Learn を使用してランダム フォレストの機能の重要度を取得する

概要

  ランダムフォレスト アルゴリズムは、データ ポイントを分類するか、その近似値を決定するために、多くのデシジョン ツリーの予測の集合を使用するツリー ベースの教師あり学習アルゴリズムです。 これは、分類または回帰のいずれかに使用できることを意味します。

分類に適用されると、データ ポイントのクラスは、ツリーによって最も投票されたクラスに基づいて選択されます。 回帰に適用すると、データ ポイントの値は、ツリーによって出力されたすべての値の平均になります。

ランダム フォレストを使用する際に覚えておくべき重要なことは、ツリーの数はハイパーパラメーターであり、モデルを実行する前に定義されるということです。

データ サイエンスで作業する場合、特定のプロジェクトにランダム フォレスト モデルが選択された理由の XNUMX つは、集合したツリーを見て理解する能力に関係している可能性があります。 なぜ 分類が行われた、または なぜ 値が与えられました - これは呼び出されます 説明可能性.

ツリーベースのアルゴリズムを考えると、モデルを説明しようとすることは、いくつかの方法で行うことができます.各ツリーを表示して見ることです (モデルに 200 以上のツリーがある場合は難しい場合があります)。 Shapley (または SHAP) 値、モデルによって最も考慮された機能を見て、 ライム モデルの入力と出力の関係などを調べます。通常は、すべての方法を組み合わせて使用​​します。

このクイック ガイドでは、モデルがペンギンを分類する際に決定を下すために重要であると考えられた機能のチャートを作成することに焦点を当てます。 これは、 機能の重要性、およびチームの他のメンバー (技術者および非技術者) に伝えて、意思決定がどのように行われるかを垣間見ることができます。

これを行うには、必要なライブラリをインポートし、Palmer Penguins データセットを読み込み、データを分割し、モデルを作成し、機能の重要度を取得し、Seaborn を使用してそれらをプロットしましょう! データ、EDA、またはモデル自体については詳しく説明しません。これらは専用ガイドのトピックです。

注: 以下からデータセットをダウンロードできます GitHubの またはコードから直接。

ライブラリのインポート

使用するいくつかのライブラリをインポートすることから始めましょう。


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

データの分割

トレーニングとテストのためにデータを分割しましょう。


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

機能の重要度の取得

最後に、モデルをトレーニングし、機能の重要度を次のようにエクスポートできます。


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

これは出力します:

array([0.41267633, 0.30107056, 0.28625311])

これらは機能値です。機能名を表示するには、次を実行します。


rf.feature_names_in_

これにより、各機能の対応する名前が得られます。

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

つまり、この特定のモデルのペギン クラスを決定するための最も重要な機能は、 bill_length_mm!

重要度は、各ノード分割でデータがどの程度うまく分離されているかの測定値に相対的です。この場合、測定値は ジニ指数 – 次に、ジニ値は、 bill_length_mm アンサンブル内の 100 本の木を平均します。 これらの手順の結果は、 0.41267633、またはこの場合は 40% 以上です。

機能の重要性の視覚化

重要度の値を表す一般的な方法は、バー チャットを使用することです。 最初に機能名とそれに対応する重要度を含むデータフレームを作成し、次に Seaborn を使用してそれらを視覚化しましょう barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

アドバイス: 情報を提示する際の良い方法は、値を昇順または降順で並べることです。 この場合、データはすでに順序付けられており、最初の値が最初に知りたい値です。 そうでない場合は、データフレームを注文できます sort_values. これは、昇順または降順で任意の列に対して実行できます。 importances_df.sort_values(by="importances", ascending=False).

この最初のプロットを見ると、各機能の重要度の値を解釈するのが難しくなります。 くちばしの長さが他の XNUMX つのバーよりも大きいことは明らかですが、正確には bill_depth_mm に相当します 0.30107056、そして flipper_length_mm 0.28625311 です。 したがって、この最初のグラフは、各バーの値を表示することで改善できます。 これは、Seaborn の containers 物体。 各バー情報を保存し、値をバー ラベルとして渡します。

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用して、ランダム フォレストの機能重要度を取得します。垂直検索。あい。

これで、各重要度の値を明確に、またはほぼ明確に確認できます。 bill_length_mm 値は、チャートの外枠の一部である垂直線によって切り取られています。 境界線は、より注目を集める手段として領域を囲むために使用されますが、この場合、グラフは XNUMX つしかないため、囲む必要はありません。 境界線を取り除き、数字の読みやすさを改善しましょう:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用して、ランダム フォレストの機能重要度を取得します。垂直検索。あい。

チャートは読みやすいように見えますが、X 軸の目盛りは浮いているように見え、バーと一緒に値が既にあるので、 xticks:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用して、ランダム フォレストの機能重要度を取得します。垂直検索。あい。

目盛りを削除した後、Y ラベルと X ラベルが少し読みにくくなっていることに注意してください。 Yラベル、 feature_names、垂直であり、X 軸には、 importances. タイトルはすでにチャートが 機能の重要性、軸ラベルを削除することもできます。

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用して、ランダム フォレストの機能重要度を取得します。垂直検索。あい。

最初のグラフと比較すると、このグラフがいかにきれいで、読みやすく、理解しやすいかがわかります。 私たちにできることはまだいくつかあります。 数字がバーに非常に近いことに注意してください。数字の間にもう少しスペースがあると読みやすくなります。

このプロットのもう XNUMX つの要素は色です。対照的な色を使用すると、分離の概念が伝達されます。逆に、類似の色を使用すると、統一または全体の一部の概念が伝達されます。 機能はすべてペンギンの一部であるため、統一性を維持しながら各バーを区別する色を使用できます。

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用して、ランダム フォレストの機能重要度を取得します。垂直検索。あい。

結果をさらに直接的にしたい場合は、タイトルを変更して結論を​​追加できます。 知られていることは、以前に説明した基準に従って、請求書の長さが最も重要な機能と見なされたことです. これは、プロットを見た人にとって最初の情報になる可能性があります。 ペンギンのくちばしの長さは、ランダム フォレスト (RF) ベース モデルにおける種の分類で最も重要な特徴でした。 :

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

これは、機能の重要度チャートの最終結果です。

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用して、ランダム フォレストの機能重要度を取得します。垂直検索。あい。

まとめ

このガイドでは、ランダム フォレスト分類器を作成し、モデルのトレーニングに使用された機能の重要度を調べました。 説明します モデルが学習したこと、およびその推論に影響を与えるもの。

タイムスタンプ:

より多くの スタックアバス