Как рассчитать значения формы для модели ADABoost? - PullRequest
1 голос
/ 27 февраля 2020

Я использую 3 разные модели (Случайный лес, Повышение градиента, Повышение Ады) и ансамбль моделей на основе этих 3 моделей.

Мне удалось использовать SHAP для GB и RF, но не для ADA с следующая ошибка:

Exception                                 Traceback (most recent call last)
in engine
----> 1 explainer = shap.TreeExplainer(model,data = explain_data.head(1000), model_output= 'probability')

/home/cdsw/.local/lib/python3.6/site-packages/shap/explainers/tree.py in __init__(self, model, data, model_output, feature_perturbation, **deprecated_options)
    110         self.feature_perturbation = feature_perturbation
    111         self.expected_value = None
--> 112         self.model = TreeEnsemble(model, self.data, self.data_missing)
    113 
    114         if feature_perturbation not in feature_perturbation_codes:

/home/cdsw/.local/lib/python3.6/site-packages/shap/explainers/tree.py in __init__(self, model, data, data_missing)
    752             self.tree_output = "probability"
    753         else:
--> 754             raise Exception("Model type not yet supported by TreeExplainer: " + str(type(model)))
    755 
    756         # build a dense numpy version of all the tree objects

Exception: Model type not yet supported by TreeExplainer: <class 'sklearn.ensemble._weight_boosting.AdaBoostClassifier'>

Я нашел эту ссылку на Git в этом состоянии

TreeExplainer создает объект TreeEnsemble из любого типа модели, которую мы пытаемся объяснить , а затем работает с этим вниз по течению. Поэтому все, что вам нужно сделать, это добавить еще один оператор if в конструкторе

TreeEnsemble, аналогичном выражению для повышения градиента

Но я действительно не знаю, как его реализовать, поскольку Я совершенно новичок в этом.

1 Ответ

0 голосов
/ 08 апреля 2020

У меня была такая же проблема, и я изменил файл в git, который вы комментируете.

В моем случае я использую windows, поэтому файл находится в C: \ Users \ my_user \ AppData \ Local \ Continuum \ anaconda3 \ Lib \ site-packages \ shap \ объяснить, но вы можете дважды щелкнуть по сообщению об ошибке, и файл будет открыт.

Следующим шагом является добавление еще одного elif в ответе справки git. В моем случае я сделал это из строки 404 следующим образом:

1) Измените исходный код.

... 
    self.objective = objective_name_map.get(model.criterion, None)
    self.tree_output = "probability"
elif str(type(model)).endswith("sklearn.ensemble.weight_boosting.AdaBoostClassifier'>"): #From this line I have modified the code
    scaling = 1.0 / len(model.estimators_) # output is average of trees
    self.trees = [Tree(e.tree_, normalize=True, scaling=scaling) for e in model.estimators_]
    self.objective = objective_name_map.get(model.base_estimator_.criterion, None) #This line is done to get the decision criteria, for example gini.
    self.tree_output = "probability" #This is the last line I added
elif str(type(model)).endswith("sklearn.ensemble.forest.ExtraTreesClassifier'>"): # TODO: add unit test for this case
    scaling = 1.0 / len(model.estimators_) # output is average of trees
    self.trees = [Tree(e.tree_, normalize=True, scaling=scaling) for e in model.estimators_]
...

Обратите внимание, что в других моделях для кода shap требуется атрибут 'criterion' что у классификатора AdaBoost нет прямого пути. Таким образом, в этом случае этот атрибут получен из "слабых" классификаторов с помощью AdaBoost, поэтому я добавляю model.base_estimator_.criterion.

Наконец, вам нужно снова импортировать библиотеку, обучить вашу модель и получить Shap значения. Я оставляю пример:

2) Импортируйте снова библиотеку и попробуйте:

from sklearn import datasets
from sklearn.ensemble import AdaBoostClassifier
import shap

# import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target

ADABoost_model = AdaBoostClassifier()
ADABoost_model.fit(X, y)

shap_values = shap.TreeExplainer(ADABoost_model).shap_values(X)
shap.summary_plot(shap_values, X, plot_type="bar")

, которая генерирует следующее:

3) Получите ваши новые результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...