从预训练模型中可视化样本的优缺点
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
,对于该特定样本,每个特征及其从对数损失中添加或否定的数量。
假设我要预测公寓价格。所以,我有很多带标签的数据,在每间公寓中我都有可能影响价格的特征,例如:
- 城市
- 街道
- 楼层
- 建成年份
- 社会经济地位
- 平方英尺
- 等等
然后我训练了一个模型,比方说 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
,对于该特定样本,每个特征及其从对数损失中添加或否定的数量。