【发布时间】:2018-08-01 05:47:20
【问题描述】:
石灰来源:https://github.com/marcotcr/lime
treeinterpreter 来源:tree interpreter
我试图了解DecisionTree 如何使用 Lime 和 treeinterpreter 进行预测。虽然两者都声称他们能够在他们的描述中解释决策树。似乎两者都以不同的方式解释相同的DecisionTree。即特征贡献order。这怎么可能?如果两者都在看同一件事,并试图描述同一事件,但按不同顺序分配重要性。
我们应该信任谁?尤其是最重要的特征在预测中很重要的地方。
树的代码
import sklearn
import sklearn.datasets
import sklearn.ensemble
import numpy as np
import lime
import lime.lime_tabular
from __future__ import print_function
np.random.seed(1)
from treeinterpreter import treeinterpreter as ti
from sklearn.tree import DecisionTreeClassifier
iris = sklearn.datasets.load_iris()
dt = DecisionTreeClassifier(random_state=42)
dt.fit(iris.data, iris.target)
n = 100
instances =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)
石灰的代码
import sklearn
import sklearn.datasets
import sklearn.ensemble
import numpy as np
import lime
import lime.lime_tabular
from __future__ import print_function
np.random.seed(1)
from sklearn.tree import DecisionTreeClassifier
iris = 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 = 100
exp = 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)花瓣长度(cm)>花瓣宽度(cm)以石灰代替花瓣长度(cm)
2)其中萼片宽度和萼片长度预测为零,石灰声称具有一定的价值,如上传的图片所示
这里发生了什么?
当特征达到 1000+ 时,问题就越来越大,每个数字都对做出决定很重要。
【问题讨论】:
-
您没有设置random_state 来生成随机森林,因此两个示例之间的随机森林不同。因此,比较石灰和树解释器的结果是没有实际意义的。底层分类器不一样。
-
@Victor 我看到你编辑了问题,在这两种情况下都添加了
random_state=50;您能否确认您的图片中显示的确切数字在此修改后仍然有效?? -
@desertnaut 现在请检查,我更新了图像。当我说“立即”时,我的意思是更新图像。
标签: python machine-learning scikit-learn