使用 RandomForestClassifier 理解 TreeInterpreter 的输出

Posted

技术标签:

【中文标题】使用 RandomForestClassifier 理解 TreeInterpreter 的输出【英文标题】:Understanding the output of the TreeInterpreter with RandomForestClassifier 【发布时间】:2018-07-27 08:26:47 【问题描述】:

我已应用随机森林分类器来获取对日期集中特定行有贡献的特征。但是,我得到了该功能的 2 个值,而不是 1 个。我不太清楚为什么。这是我的代码。

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from treeinterpreter import treeinterpreter as ti
from treeinterpreter import treeinterpreter as ti

X, y = make_classification(n_samples=1000,
                           n_features=6,
                           n_informative=3,
                           n_classes=2,
                           random_state=0,
                           shuffle=False)

# Creating a dataFrame
df = pd.DataFrame('Feature 1':X[:,0],
                                  'Feature 2':X[:,1],
                                  'Feature 3':X[:,2],
                                  'Feature 4':X[:,3],
                                  'Feature 5':X[:,4],
                                  'Feature 6':X[:,5],
                                  'Class':y)


y_train = df['Class']
X_train = df.drop('Class',axis = 1)

rf = RandomForestClassifier(n_estimators=50,
                               random_state=0)

rf.fit(X_train, y_train)

print ("-"*20) 

importances = rf.feature_importances_

indices = X_train.columns

instances = X_train.loc[[60]]

print(rf.predict(instances))

print ("-"*20) 

prediction, biases, contributions = ti.predict(rf, instances)


for i in range(len(instances)):
    print ("Instance", i)
    print ("-"*20) 
    print ("Bias (trainset mean)", biases[i])
    print ("-"*20) 
    print ("Feature contributions:")
    print ("-"*20) 

    for c, feature in sorted(zip(contributions[i], 
                                 indices), 
                             key=lambda x: ~abs(x[0].any())):

        print (feature, np.round(c, 3))

    print ("-"*20) 

这是我的代码的输出。有人可以解释为什么偏差和特征输出 2 个值而不是 1 个吗?

--------------------
[0]
--------------------
Instance 0
--------------------
Bias (trainset mean) [ 0.49854  0.50146]
--------------------
Feature contributions:
--------------------
Feature 1 [ 0.16 -0.16]
Feature 2 [-0.024  0.024]
Feature 3 [-0.154  0.154]
Feature 4 [ 0.172 -0.172]
Feature 5 [ 0.029 -0.029]
Feature 6 [ 0.019 -0.019]

【问题讨论】:

【参考方案1】:

您将获得长度为 2 的数组,用于偏差和特征贡献,原因很简单,即您有一个 2 类分类问题。

正如包创建者在this blog post 中明确解释的那样,在 iris 数据集的 3 类情况下,您会得到长度为 3 的数组(即每个类一个数组元素):

from treeinterpreter import treeinterpreter as ti
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
iris = load_iris()

rf = RandomForestClassifier(max_depth = 4)
idx = range(len(iris.target))
np.random.shuffle(idx)

rf.fit(iris.data[idx][:100], iris.target[idx][:100])

prediction, bias, contributions = ti.predict(rf, instance)
print "Prediction", prediction
print "Bias (trainset prior)", bias
print "Feature contributions:"
for c, feature in zip(contributions[0], 
                             iris.feature_names):
    print feature, c

给出:

Prediction [[ 0. 0.9 0.1]]
Bias (trainset prior) [[ 0.36 0.262 0.378]]
Feature contributions:
sepal length (cm) [-0.1228614 0.07971035 0.04315104]
sepal width (cm) [ 0. -0.01352012 0.01352012]
petal length (cm) [-0.11716058 0.24709886 -0.12993828]
petal width (cm) [-0.11997802 0.32471091 -0.20473289]

公式

prediction = bias + feature_1_contribution + ... + feature_n_contribution

from TreeInterpreter 适用于每个类,在分类问题的情况下;因此,对于 k 类分类问题,各个数组的长度为 k(在您的示例中 k=2,而对于 iris 数据集 k=3)。

【讨论】:

以上是关于使用 RandomForestClassifier 理解 TreeInterpreter 的输出的主要内容,如果未能解决你的问题,请参考以下文章

RandomForestClassifier 性能不佳

RandomForestClassifier 导入

使用 RandomForestClassifier 理解 TreeInterpreter 的输出

机器学习算法:RandomForestClassifier的使用

ValueError:未知标签类型:RandomForestClassifier 中的“未知”

使用 RandomForestClassifier.decision_path,我如何判断分类器用于做出决策的样本?