Источник извести: https://github.com/marcotcr/lime
источник treeinterpreter: интерпретатор дерева
Я пытаюсь понять, как DecisionTree
сделал свои прогнозы, используя Lime и treeinterpreter. Хотя оба утверждают, что они могут интерпретировать дерево решений в своем описании. Кажется, что оба интерпретируют один и тот же DecisionTree
по-разному. То есть, порядок внесения признаков. Как это возможно? если оба ищут одно и то же и пытаются описать одно и то же событие, но придают важность в разностном порядке.
Кому мы должны доверять? Особенно там, где главная особенность имеет значение в прогнозировании.
Код для дерева
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)
Давайте посмотрим сначала на выход дерева.
так что она правильно сказать, что это был virginica. Однако, назначив важность в
1) ширина лепестка (см), затем длина лепестка (см)
Теперь давайте посмотрим на выход извести
Да, он говорит, что алгоритм предсказал virginica, однако, глядя на то, как он сделал эту классификацию, мы ясно видим следующее
1) длина лепестка (см)> ширина лепестка (см) в извести вместо длины лепестка (см) <ширина лепестка (см), как показано на дереве
2), где ширина сепалы и длина сепалы были предсказаны равной нулю, требования к извести определенной величины, как показано в загруженных изображениях
Что здесь происходит?
Проблема возрастает, когда функции 1000+, где каждая цифра имеет значение для принятия решения.