可视化来自预训练模型的样本的优缺点

时间:2018-08-22 10:50:03

标签: python algorithm machine-learning data-visualization xgboost

假设我要预测公寓价格。因此,我有很多带有标签的数据,在每套公寓的哪里,我都有可能影响价格的功能,例如:

  • 城市
  • 街道
  • 地板
  • 建成年份
  • 社会经济地位
  • 平方英尺

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

例如:楼层号是一个“强有力”的特征(即-在此区域中,该楼层号是理想的,因此对公寓的价格产生积极影响),但是社会经济地位是一个较弱的特征(即,社会经济状况)状态低下,因此会对公寓的价格产生负面影响。

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

我想到了对每个功能进行详尽的搜索-但恐怕这会花费太多时间。

是否有更出色的方法?

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

1 个答案:

答案 0 :(得分:1)

有个好消息给你

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

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

它可以向您显示“真实”功能的重要性,它比"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值绘制的图的一个示例(功能是机密的,因此已全部删除) enter image description here

对于该特定样本,您可以看到97%的预测为label=1,并且每个功能以及对数损失增加或减少的对数。