假设我想预测一套公寓的价格所以,我有很多标签数据,在每个公寓里,我都有可能影响价格的功能,比如:
城市
街道
地板
建造年份
社会经济地位
平方英尺
等。
我训练了一个模特,比如说XGBOOST现在,我想预测一套新公寓的价格有没有好的方法来显示这个公寓里什么是“好的”,什么是坏的,以及用多少来表示(0-1比例)?
例如:楼层数是一个“强”特征(即在该区域,该楼层数是理想的,因此对公寓价格有正面影响),但社会经济地位是一个弱特征(即社会经济地位低,因此对公寓价格有负面影响)。
我想或多或少地说明为什么我的模型决定了这个价格,我希望用户通过这些指标来感受公寓的价值。
我想对每一个功能进行详尽的搜索,但恐怕要花太多时间。
有比这更聪明的方法吗?
任何帮助都将不胜感激…
最佳答案
有个好消息给你。
最近发布了一个名为“shap”(shapley additive explation)的包,就是为了这个目的。
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笔记本)。Perfect example here
我亲自编写了一个函数,它将使用
matplotlib
绘制它,这需要一些努力。下面是一个我用shap值绘制的图的例子(特性是保密的,所以全部删除)
您可以看到一个97%的预测值
label=1
,每个特征以及它从日志丢失中增加或减少的量。