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