python - 如何了解随机森林中特定样本的特征及其贡献

标签 python python-3.x python-2.7 machine-learning scikit-learn

如何找到影响特定样本(例如第 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 属于类别 1 的概率增加了 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 =类1}。将 0.03、0.11、-0.06、0、0.06、0.04 添加到 0.50146 的偏差中,得到 0.68,即 P{instance1 = class2}。因此,这些数字构成了从实例的初始偏差到最终分类概率的完整贡献轨迹。

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

关于python - 如何了解随机森林中特定样本的特征及其贡献,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48808985/

相关文章:

python - 搜索并用 python 替换

python - 'pkgs'目录和 'site-packages'目录有什么区别? [ python ]

python - 导入python文件

python - Tor + Urllib2 Python

python - python中的条件类继承

python - 如何从字典中删除南键?

python 杂货店

python - 基于索引的python列表中的优雅切片

python - 在类内部分配之前引用的局部变量

python - 将 vim 函数传递给 vim 的内置 python