LoginSignup
4
4

More than 5 years have passed since last update.

sklearnのrandom forestでサンプルごとのfeature importanceを計算する

Last updated at Posted at 2019-01-28

sklearnのrandom forestではfeature_importances_というattributeが用意されていますが、これはあくまで分類器そのものの話でサンプルごとにその判断根拠を提示してくれるわけではありません。

あるサンプルが森を通って判断される際に、どの特徴量が何回使われるかを計算してみました。

from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np

df = pd.DataFrame({'A':np.random.uniform(0,1,10000),
                  'B':np.random.uniform(0,1,10000),
                  'C':np.random.uniform(0,1,10000),
                  })

X_train = df
Y_train = df['A']+df['B']+np.random.uniform(0,1,10000)

rf = RandomForestRegressor()
rf.fit(X_train, Y_train)

def feature_importance_for_one_sample(rfregressor, X):
    estimators = rfregressor.estimators_

    feature_count = {}

    for estimator in estimators:
        features = estimator.tree_.feature

        indicator = estimator.decision_path(X)
        node_index = indicator.indices

        for feature in features[node_index]:
            feature_count[feature] = feature_count.get(feature, 0) + 1

    # -2はリーフノードなので削除
    del feature_count[-2]

    return feature_count

feature_importance_for_one_sample(rf, X_train.iloc[[0]])
>>>{0: 48, 1: 52, 2: 25}

まぁなにやらそれっぽい値が出てきました。使えるかどうかは?
なお、Xは1つのサンプルですが、DataFrameで入力しないとエラーになるのでご注意ください。

参考:
https://own-search-and-study.xyz/2016/12/25/scikit-learn%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%9F%E6%B1%BA%E5%AE%9A%E6%9C%A8%E6%A7%8B%E9%80%A0%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81/
https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html#sphx-glr-auto-examples-tree-plot-unveil-tree-structure-py
https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.sparse.csr_matrix.html

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4