scikit-learnを使用したランダムフォレストでの機能重要度を使用した機能選択


12

scikit-learnを使用して、ランダムフォレストの機能の重要性プロットしました。ランダムフォレストを使用して予測を改善するには、プロット情報を使用してフィーチャを削除するにはどうすればよいですか?つまり、プロット情報に基づいて、フィーチャが無用であるか、ランダムフォレストのパフォーマンスの低下をさらに悪化させるかを特定する方法を教えてください。プロットは属性に基づいておりfeature_importances_、分類子を使用していsklearn.ensemble.RandomForestClassifierます。

機能選択に他にも手法があることは承知していますが、この質問では機能の使い方に焦点を当てたいと思いますfeature_importances_


そのような特徴重要度プロットの例:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

回答:


14

feature_importances_属性を使用して、最も高い重要度スコアを持つ機能を選択できます。したがって、たとえば次の関数を使用して、重要度に応じてK個の最良の特徴を選択できます。

def selectKImportance(model, X, k=5):
     return X[:,model.feature_importances_.argsort()[::-1][:k]]

または、パイプラインを使用している場合は、次のクラス

class ImportanceSelect(BaseEstimator, TransformerMixin):
    def __init__(self, model, n=1):
         self.model = model
         self.n = n
    def fit(self, *args, **kwargs):
         self.model.fit(*args, **kwargs)
         return self
    def transform(self, X):
         return X[:,self.model.feature_importances_.argsort()[::-1][:self.n]]

だから例えば:

>>> from sklearn.datasets import load_iris
>>> from sklearn.ensemble import RandomForestClassifier
>>> iris = load_iris()
>>> X = iris.data
>>> y = iris.target
>>> 
>>> model = RandomForestClassifier()
>>> model.fit(X,y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)
>>> 
>>> newX = selectKImportance(model,X,2)
>>> newX.shape
(150, 2)
>>> X.shape
(150, 4)

また、「トップk機能」以外の基準に基づいて選択したい場合は、それに応じて関数を調整するだけで十分です。


デビッドに感謝します。どの機能が有用であるかのしきい値を選択する方法についての洞察はありますか?(最も役に立たない機能を削除して、RFを再度実行し、それが予測パフォーマンスにどのように影響するかを確認してください)
フランクダーノンコート

1
ほとんどの自動化された機能選択と同様に、ほとんどの人がチューニンググリッドを使用すると思います。ただし、機能を選択(およびエンジニアリング)するときにドメインの専門知識を使用することはおそらく最も価値がありますが、実際には自動化できません。
デビッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.