从预训练模型中可视化样本的优缺点

Visualize strengths and weaknesses of a sample from pre-trained model

假设我要预测公寓价格。所以,我有很多带标签的数据,在每间公寓中我都有可能影响价格的特征,例如:

然后我训练了一个模型,比方说 XGBOOST。现在,我想预测一套新公寓的价格。有什么好方法可以显示这间公寓中的 "good" 是什么,什么是坏的,以及差多少(按 0-1 缩放)?

例如:楼层数是一个 "strong" 特征(即 - 在这个区域需要这个楼层数,从而对公寓价格产生积极影响),但社会经济地位是一个弱特征(即社会经济地位低,因此对公寓价格产生负面影响)。

我想要的是或多或少地说明为什么我的模型决定这个价格,我希望用户通过这些指标来感受公寓的价值。

我想对每个功能进行详尽搜索 - 但我担心这会花费太多时间。

有没有更好的方法呢?

任何帮助将不胜感激...

好消息,有。

最近发布了一个名为 "SHAP" (SHapley Additive exPlanation) 的软件包。 Here's a link 到 github.

它支持复杂模型(很难直观解释)的可视化,例如提升树(尤其是 XGBOOST!)

它可以显示 "real" 特征重要性,优于 "gain""weight""cover" xgboost供应,因为它们不一致。

您可以阅读有关为什么 SHAP 更适合特征评估的全部内容 here

很难为您提供适合您的代码,但有一个很好的文档,您应该编写适合您的代码。

以下是构建您的第一个图表的指南:

import shap
import xgboost as xgb

# Assume X_train and y_train are both features and labels of data samples

dtrain = xgb.DMatrix(X_train, label=y_train, feature_names=feature_names, weight=weights_trn)

# Train your xgboost model
bst = xgb.train(params0, dtrain, num_boost_round=2500, evals=watchlist, early_stopping_rounds=200)

# "explainer" object of shap
explainer = shap.TreeExplainer(bst)

# "Values you explain, I took them from my training set but you can "explain" here what ever you want
shap_values = explainer.shap_values(X_test)

shap.summary_plot(shap_values, X_test)
shap.summary_plot(shap_values, X_test, plot_type="bar")

要绘制“为什么某个样本得到它的分数”,您可以为其使用内置的 SHAP 函数(仅适用于 Jupyter Notebook)。 Perfect example here

我个人写了一个函数,将使用 matplotlib 绘制它,这需要一些努力。

这是我使用 shap 值绘制的图的示例(特征是机密的,因此已全部删除)

您可以看到 97% 的预测为 label=1,对于该特定样本,每个特征及其从对数损失中添加或否定的数量。