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

时间:2018-02-15 13:56:04

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

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

更新

感谢@FatihAkici

我现在可以应用TreeInterpreter

private void updateSelectedPlaceUI(object sender, EventsController.PlaceEventArgs placeArgs){
    // This is just a test, i should check which type of subclass it is before
    Planet planetTest = placeArgs.Place as Planet; // So now i can use planetTest.planetType
}

我的问题是为什么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)) 两个值似乎是正面和负面的,而不是该特征的一个值。这是我的输出

1 个答案:

答案 0 :(得分:1)

是的,您可以了解影响特定观察预测的特征及其贡献(权重不是正确的术语)。这实际上构成了它如何做出该特定观察的决定的决策路径。您要找的是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