График силы Shap и график решения, дающий неправильный вывод для модели XGBClassifier - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь предоставить графики принятия решения для небольшого подмножества прогнозов, но результаты, полученные с помощью shap, отличаются от того, что я получаю, когда просто использую модель для прогнозирования даже при использовании link = 'logit' в вызове,Результат каждого графика решения, который я пытаюсь создать, должен быть больше ожидаемого значения из-за подмножества, которое я пытаюсь построить. Однако каждый полученный график имеет прогнозируемое значение ниже ожидаемого.

У меня есть две модели в минимальном ансамбле, поэтому я использую цикл for, чтобы определить, для какой модели создать график. У меня нет проблем с созданием правильных графиков для модели RandomForestClassifier, но проблема возникает для модели XGB.

rf_explainer = shap.TreeExplainer(RF_model)
xgb_explainer = shap.TreeExplainer(XGB_model)

for i in range(flagged.shape[0]):
    if flagged_preds.RF_Score[i] == flagged_preds.Ensemble_Score[i]:
        idx = flagged.index[i]
        idxstr = idx[1].astype('str') + ' -- ' + idx[2].date().strftime('%Y-%m-%d') + ' -- ' + idx[0].astype('str')
        shap_value = rf_explainer.shap_values(flagged.iloc[i,:])
        shap.decision_plot(rf_explainer.expected_value[1], shap_value[1], show=False)
        plt.savefig(f'//PathToFolder/{idxstr} -- RF.jpg', format = 'jpg', bbox_inches = 'tight', facecolor = 'white')

    if flagged_preds.XGB_Score[i] == flagged_preds.Ensemble_Score[i]:
        idx = flagged.index[i]
        idxstr = idx[1].astype('str') + ' -- ' + idx[2].date().strftime('%Y-%m-%d') + ' -- ' + idx[0].astype('str')
        shap_value = xgb_explainer.shap_values(flagged.iloc[i,:])
        shap.decision_plot(xgb_explainer.expected_value, shap_value, link = 'logit',  show=False)
        plt.savefig(f'//PathToFolder/{idxstr} -- XGB.jpg', format = 'jpg', bbox_inches = 'tight', facecolor = 'white')
    plt.close()

Как уже упоминалось ранее, при подсчете очков каждое наблюдение (из тех, что меня интересуют) должно иметь оценку> 0,5, но это не то, что я вижу на своих графиках. Вот пример:

Example Decision Plot

Этот график показывает результат около .1, но при оценке этого наблюдения с использованием предиката_пробы я получаю значение .608

Я не могу предоставить данные из-за деликатного характера данных, и я не уверен, что является основной проблемой.

Любая обратная связь будет приветствоваться, спасибо.



Соответствующие пункты замораживания пунктов:

Python 3.7.3

matplotlib== 3.0.3

shap == 0.30.1

xgboost == 0.90

...