假设我要预测公寓价格。因此,我有很多带有标签的数据,在每套公寓的哪里,我都有可能影响价格的功能,例如:
我训练一个模型,比方说XGBOOST。现在,我要预测新公寓的价格。有什么好方法可以显示这间公寓的“好”,什么是坏,以及多少(按0-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值绘制的图的一个示例(功能是机密的,因此已全部删除)
对于该特定样本,您可以看到97%的预测为label=1
,并且每个功能以及对数损失增加或减少的对数。