scikit-learnランダムフォレストの機能の重要性は非常に高い標準偏差を示しています


13

私はscikit-learn Random Forest Classifierを使用しており、この例のように機能の重要度をプロットします。

ただし、機能の重要度の標準偏差は、機能の重要度自体よりも常に大きいという意味で、私の結果は完全に異なります(添付画像を参照)。

機能の重要性

このような動作をすることは可能ですか、それをプロットするときにいくつかの間違いをしていますか?

私のコードは次のとおりです。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()

IIUCは、列を使用してオブジェクトを参照しているをpredictors返します。これは、属性がないために正しくありません。numpy arraypandas Dataframenumpy arrayscolumns
ニッケルマーベリ16

申し訳ありませんが、コードのタイプミスでした。予測子と結果はpandas DataFrame、形状m x nとの2つm x 1です。今ははっきりしているはずです。
gc5

2
しばらく前に同じ発見に出会いました。これは、多くの機能が重要であるという事実による可能性がありますが、決定ツリーでは機能が高または低になる可能性があるため(分割時にランダムサブセットのみが提供されるため)、その重要性はツリーごとに大きく異なりますツリー。これにより、標準偏差が大きくなります。
アーチー

素晴らしい投稿です。写真でわかるように、同じ問題に遭遇しました。tsfresh関連する機能を特定し、600 +から約400まで機能を削減するのに役立つパッケージがあります。![My top 35 features ](i.stack.imgur.com/0MROZ.png)これでも、アルゴリズムはうまく機能しています。私のために。成功/失敗の2種類の分類があります。事実上、偽りの成功はありませんが、成功のかなりの割合を逃しています。上記の推測はすべて合理的と思われます。より大きなトレーニングとテストのセットが必要な場合があります。私は少ない
スーパーヒーロー

回答:


3

デフォルトのツリー数である10のRandomForestを使用しています。約30の機能では、これは少なすぎます。したがって、標準偏差は大きくなります。少なくとも100本、さらには1000本の木を試してください。

clf = RandomForestClassifier(n_estimators=1000)

より洗練された分析のために、フィーチャ間の相関がどれだけ大きいかを確認することもできます。


申し訳ありませんがlanenok、木の本数はデフォルトのものではありません。min_samples_split作業中のデータを公開できないため、サンプルコードを挿入します(これはすべてのパラメーター、たとえばに当てはまります)。しかし、それは木の数と他のパラメータによるものですか、それともここでいくつかの間違いをしているのですか?
gc5

2

結果はそれほど奇妙ではありません。以下のようlanenokの状態は、最初のステップであなたが機能重要度に関する「統計」の結果を得ていることを確認するために、木の数を増やす必要があります。

しかし、Genuerらによるこの論文のように。(2010)ショーでは、特徴を排除するために実際に標準偏差を使用できます。引用する:「真の変数の標準偏差は、ゼロに近いノイズの多い変数と比較して大きいことがわかります。


この例で標準偏差を使用して機能を削除すると、すべての機能が削除されます。xD
ホルヘレイタオ

ハハ、私は完全に確信していません、私はあなたが一番右の機能を安全に捨てることができると思いますか?とにかく、私がやろうとしている主なポイントは、高い標準偏差はそれほど奇妙ではなく、実際に戦略でそれらを使用して機能を排除できるということです。
アーチー

1

試してくださいclf = RandomForestClassifier(max_features=None)max_featuresparamがデフォルトに'auto'これに相当しますsqrt(n_features)max_features「最適な分割を探すときに考慮すべき機能の数」と記述されています。意思決定ツリーの任意の時点で少数の機能のみを見るということは、単一の機能の重要性が多くのツリーで大きく異なる可能性があることを意味します。したがって、ランダムなサブセットを見るのではなく、ツリーのすべてのレベルですべての機能を見てください。


1
これは、プレーンなバギングされたツリーに相当することに注意してください。ランダムフォレストの「ランダム」とは、通常、sqrt(n_features)またはの各分割でランダムにフィーチャのサブセットを考慮することを意味しますlog2(n_features)。機能のランダムなサブセットをmax_features=None考慮しなくなりました。これが上記の解決策に影響するかどうかはわかりません。1つの可能性は、多くの機能が単に重要度が高いため、ツリーのアンサンブル全体で大きく異なることです。または、十分なサンプルがないため、リーフにヒットするまでにすべての機能が考慮されるわけではありません。
ジャミス

1

これの一般的な理由は、指定した(またはデフォルトの)パラメーターがRandomForestClassifierデータセットに適していないことです。

この問題に対処する一般的な方法は、例えばを使用してハイパーパラメータ空間を検索することですGridSearchCV

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_gridここに、検索するパラメーターの順列と、make_scorer(accuracy_score)最適化するメジャーがあります。

accuracy_scoreバランスの取れたセットのためではなく、アンバランスなセットに適しています。特定の目的に適したメトリックを選択します。


0

複数の理由が考えられます。木の数と深さは結果を変えることができます。パラメーターを選択した後(クロス検証など)、モデルがうまく機能しない場合は、フィーチャがあまり予測的ではないためと思われます。しかし、他の可能性もあります。たとえば、あなたの特徴が高度に相関している可能性もあります。もう少し情報が役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.