如何找到影响特定样本预测的功能及其贡献,比如第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))
两个值似乎是正面和负面的,而不是该特征的一个值。这是我的输出
答案 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。