Lime 源码:https://github.com/marcotcr/lime
treeinterpreter 源码:tree interpreter
我尝试使用 Lime 和 treeinterpreter 来理解 DecisionTree
是如何进行预测的。虽然两者在其描述中都声称能够解释决策树,但似乎它们对同一个 DecisionTree
的解释方式不同。也就是说,特征贡献的顺序不同。这怎么可能呢?如果它们都在看同一件事,并且试图描述相同的事件,但分配的重要性顺序却不同。
我们应该相信谁?特别是当顶部特征对预测很重要时。
决策树的代码
import sklearnimport sklearn.datasetsimport sklearn.ensembleimport numpy as npimport limeimport lime.lime_tabularfrom __future__ import print_functionnp.random.seed(1)from treeinterpreter import treeinterpreter as tifrom sklearn.tree import DecisionTreeClassifieriris = sklearn.datasets.load_iris()dt = DecisionTreeClassifier(random_state=42) dt.fit(iris.data, iris.target)n = 100instances =iris.data[n].reshape(1,-1)prediction, biases, contributions = ti.predict(dt, instances)for i in range(len(instances)): print ("prediction:",prediction) print ("-"*20) print ("Feature contributions:") print ("-"*20) for c, feature in sorted(zip(contributions[i], iris.feature_names), key=lambda x: ~abs(x[0].any())): print (feature, c)
Lime 的代码
import sklearnimport sklearn.datasetsimport sklearn.ensembleimport numpy as npimport limeimport lime.lime_tabularfrom __future__ import print_functionnp.random.seed(1)from sklearn.tree import DecisionTreeClassifieriris = sklearn.datasets.load_iris()dt = DecisionTreeClassifier(random_state=42) dt.fit(iris.data, iris.target)explainer = lime.lime_tabular.LimeTabularExplainer(iris.data, feature_names=iris.feature_names, class_names=iris.target_names, discretize_continuous=False)n = 100exp = explainer.explain_instance(iris.data[n], dt.predict_proba, num_features=4, top_labels=2)exp.show_in_notebook(show_table=True, predict_proba= True , show_predicted_value = True , show_all=False)
我们先来看一下决策树的输出结果。
所以a 它确实正确地识别为virginica。然而,它通过以下方式分配了重要性
1) 花瓣宽度(cm)然后是花瓣长度(cm)
现在让我们看一下lime的输出结果
是的,它确实说算法预测为virginica,然而,观察它是如何做出这个分类的,我们清楚地看到以下情况
1) 在 lime 中,花瓣长度(cm)> 花瓣宽度(cm),而不是在决策树中显示的花瓣长度(cm)< 花瓣宽度(cm)
2) 在决策树中预测为零的萼片宽度和萼片长度,lime 声称有特定值,如上传的图片所示
这里发生了什么?
当特征达到1000+时,问题变得更加严重,因为每一个数字都可能影响决策。
回答: