利用SHAP解释Xgboost模型(清晰版原文点这里)
Xgboost相对于线性模型在进行预测时往往有更好的精度,但是同时也失去了线性模型的可解释性。所以Xgboost通常被认为是黑箱模型。
2017年,Lundberg和Lee的论文提出了SHAP值这一广泛适用的方法用来解释各种模型(分类以及回归),其中最大的受益者莫过于之前难以被理解的黑箱模型,如boosting和神经网路模型。
本教程中,我们在真实数据集上进行实操,利用SHAP来解释Xgboost模型。
预计学惯用时:30分钟。
本教程基于Python 3.6版本、Xgboost 0.82版本以及shap 0.28.5版本。
原创者:东布东 | 修改校对:SofaSofa TeamM |
1. Feature importance
在SHAP被广泛使用之前,我们通常用feature importance或者partial dependence plot来解释xgboost。 feature importance是用来衡量数据集中每个特征的重要性。
简单来说,每个特征对于提升整个模型的预测能力的贡献程度就是特征的重要性。(拓展阅读:随机森林、xgboost中feature importance,Partial Dependence Plot是什么意思?,怎么利用permutation importance来解释xgboost模型)
Feature importance可以直观地反映出特征的重要性,看出哪些特征对最终的模型影响较大。但是无法判断特征与最终预测结果的关系是如何的。
下面这个例子中,我们用2018年足球球员身价数据(请在SofaSofa数据竞赛页面进行数据下载,下载解压后只需要train.csv
这个文件)来具体阐述。
# 载入模块
import xgboost as xgb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt; plt.style.use(seaborn)
# 读取数据,目标变数y是球员的身价(万欧元)
data = pd.read_csv(train.csv)
# 获得当时球员年龄
today = pd.to_datetime(2018-01-01)
data[birth_date] = pd.to_datetime(data[birth_date])
data[age] = np.round((today - data[birth_date]).apply(lambda x: x.days) / 365., 1)
# 选择特征,这里只是举例,未必是最佳组合
# 特征依次为身高(厘米)、潜力、速度、射门、传球、带球、防守、体格、国际知名度、年龄
cols = [height_cm, potential, pac, sho, pas, dri, def, phy, international_reputation, age]
# 训练xgboost回归模型
model = xgb.XGBRegressor(max_depth=4, learning_rate=0.05, n_estimators=150)
model.fit(data[cols], data[y].values)
# 获取feature importance
plt.figure(figsize=(15, 5))
plt.bar(range(len(cols)), model.feature_importances_)
plt.xticks(range(len(cols)), cols, rotation=-45, fontsize=14)
plt.title(Feature importance, fontsize=14)
plt.show()