如何在RandomForest中了解特定样本的特征及其贡献

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在RandomForest中了解特定样本的特征及其贡献相关的知识,希望对你有一定的参考价值。

如何找到影响特定样本预测的特征及其贡献,如第5行

更新

感谢@FatihAkici

我现在可以应用TreeInterpreter

from treeinterpreter import treeinterpreter as ti

instances = X_train.loc[[1,2]]
print(rf.predict(instances))
prediction, biases, contributions = ti.predict(rf, instances)

for i in range(len(instances)):
    print ("Instance", i)
    print ("Bias (trainset mean)", biases[i])
    print ("Feature contributions:")
    for c, feature in sorted(zip(contributions[i], 
                                 rf.feature_importances_), 
                             key=lambda x: ~abs(x[0].any())):
        print (feature, np.round(c, 2))
    print ("-"*20 )

print (prediction)
print (biases + np.sum(contributions, axis=1))

我的问题是为什么[ 0.12 -0.12]有两个似乎是正面和负面的值,而不是那个特征的一个值。这是我的输出

答案

是的,您可以了解影响特定观察预测的特征及其贡献(权重不是正确的术语)。这实际上构成了它如何做出该特定观察的决定的决策路径。你在寻找的是TreeInterpreter

第二个问题是:为什么每个变量和实例(例如第一个特征和第一个实例的[0.12 -0.12])总是有两个值似乎是正面和负面的,而不是该特征的一个值?

所以我的答案是:每个列表(例如[0.12 -0.12])只代表一个特征对实例在类1和类2中的最终概率的贡献。记住,特征从不指示实例必须在哪个类中,但是相反,它们会增加或减少实例的最终类概率。因此,0.12意味着特征1将实例0的概率加到0.12中,并且将其在类2中的概率降低0.12。这些值总是对称的,这意味着无论是什么使得实例更可能在第1类中,它都不太可能在第2类中。

类似地,特征2将实例1的等级1的概率降低0.05,并且将其等级2的概率提高0.05。

因此,每个特征对类1中的实例1的贡献(增加或减少)为:0.12,-0.05,0.22,0.14,0.07,0.01。现在将这些全部添加到第1类(0.49854)的偏差中,得到1,这是该实例在第1类中的最终概率,如模型输出所示。

类似地,添加每个列表的所有第二个值,并添加在类2(0.50146)中的偏差,得到0,这是该实例在类2中的最终概率,如上面的模型输出所示。

最后重复完全相同的练习,例如1,即将-0.03,-0.11,0.06,0,-0.06,-0.04加到0.49854的偏差,你得到0.32,这是P{instance1 = class1}。并且在偏差0.50146处加上0.03,0.11,-0.06,0,0.06,0.04,得到0.68,即P{instance1 = class2}。因此,这些数字构成了一个完整的贡献轨迹,从实例的初始偏差到最终分类概率。

我在datascience.stackexchange.com的概念层面回答了一个非常相似的问题,请随时查看by clicking here

以上是关于如何在RandomForest中了解特定样本的特征及其贡献的主要内容,如果未能解决你的问题,请参考以下文章

随机森林

Scikit learn + Random Forest - 单棵树的特征

如何使用 Ranger 按类别获取特征重要性?

sklearn 的 RandomForest 中如何计算特征重要性?

pyspark randomForest 特征重要性:如何从列号中获取列名

随机森林