XGBoost你真的懂吗?我不相信.

从祖先中选择
泰勒福克曼
编译:机器之心
原文:3359 blogs . ancestry . com/ancestry/2017/12/18/understanding-machine-learning-xgboost/
在本文中,我们将介绍一些技术来更好地理解XGBoost的预测过程。这允许我们利用梯度推进的能力,同时仍然理解模型的决策过程。
为了解释这些技术,我们将使用Titanic数据集。这个数据集有每个泰坦尼克号乘客的信息(包括乘客是否活着)。我们的目标是预测一名乘客是否会生还,并了解做出这一预测的过程。即使有这些数据,我们也可以看到理解模型决策的重要性。想象一下,如果我们有一个关于最近沉船的乘客数据集。建立这样一个预测模型的目的其实并不是预测结果本身,而是了解预测过程可以帮助我们学习如何最大化事故中的幸存者。
进口熊猫作为pd
从xgboost导入XGBClassifier
从sklearn.model_selection导入训练_测试_拆分
来自sklearn.metrics导入准确度_分数
进口经营者
将matplotlib.pyplot作为plt导入
将seaborn作为sns导入
导入lime.lime_tabular
来自sklearn.pipeline导入管道
预处理导入输入器
将numpy作为np导入
从sklearn.grid_search导入GridSearchCV
%matplotlib内联
我们首先要做的是观察我们的数据。你可以在Kaggle上找到这个数据集(https://www.kaggle.com/c/titanic/data)。获得数据集后,我们将简单地清理数据。即:
清楚姓名和乘客身份
将分类变量转换成虚拟变量。
用中间值填充和删除数据
这些清洁技术非常简单。本文的目标不是讨论数据清理,而是解释XGBoost。所以这些都是快速合理的清洗来训练模型。
data=pd.read_csv(\ ‘。/data/titanic/train . CSV \ ‘)
y=数据。幸存
x=data . drop([\ ‘ survive \ ‘,\’Name\ ‘,\’PassengerId\’],1)
X=pd.get_dummies(X)
现在让我们将数据集分为训练集和测试集。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.33,random_state=42)
并通过少量的超参数测试建立训练管道。
Pipeline=Pipeline((inputr,inputr(strategy=median)),(model,XGBClassifier())])
参数=dict(model__max_depth=[3,5,7],
model__learning_rate=[.01, 1],
模型_ n _估计量=[100,500])
cv=GridSearchCV(管道,param _ grid=参数)
cv.fit(X_train,y_train)
然后检查测试结果。为简单起见,我们将使用与Kaggle相同的指标:准确性。
测试预测=变异预测(X测试)
打印(\ ‘测试精度: {}\ ‘。格式(accuracy_score(y_test,test_predictions))
测试的准确性58680 . 58686868686
在这一点上,我们获得了不错的准确率,在Kaggle的9000个竞争对手中排名前500。因此,我们仍有进一步改进的空间,但这将是对读者的一次锻炼。
让我们继续讨论我们从理解模型中学到了什么。一种常见的方法是使用XGBoost提供的特性重要性。特征的重要性级别越高,其对改进模型预测的贡献就越大。接下来,我们将使用重要性参数对特征进行分级,并比较它们的相对重要性。
fi=list(zip(X.columns,cv.best_estimator_。命名步骤[模型]。feature_importances_))
fi . sort(key=operator . item getter(1),reverse=True)
top_10=fi[:10]
x=[x[0] for x in top_10]
y=[x[1] for x in top_10]
从上图可以看出,票价和年龄是非常重要的特征。我们可以进一步检查生存/死亡和票价之间的相关分布:
我们可以清楚地看到,那些幸存者的平均票价远高于受害者,所以把票价作为一个重要特征可能是合理的。
特性的重要性可能是理解一般特性重要性的一个好方法。如果存在这样一个特例,即模型预测一个高票价的乘客无法生存,那么我们可以得出结论,高票价不一定导致生存。接下来,我们将分析可能导致模型得出该乘客无法生存的结论的其他特征。
这种在个体层面上的分析对于高效的机器学习系统可能非常有用。考虑其他例子,并使用模型预测某人是否可以获得贷款。我们知道信用评分会是模型非常重要的特征,但是有一个客户信用评分很高,但是被模型拒绝了。我们将如何向客户解释这一点?怎么跟经理解释?
好在最近出现了华盛顿大学关于解释任意分类器预测过程的研究。他们的方法叫做LIME,已经在GitHub上开源了(https://github.com/marcotcr/lime)。本文不打算对此进行讨论,请参考论文(https://arxiv . org/pdf/1602.04938 . pdf)。
接下来,我们尝试在模型中应用石灰。基本上,我们首先需要定义一个处理训练数据的解释器(我们需要确保传递给解释器的估计训练数据集正是要训练的数据集):
x _ train _ imputed=cv . best _ estimator _。named _ steps[inputr]。变换(X_train)
explainer=lime.lime _ tabular。LimeTabularExplainer(X _ train _ imputed,
feature _ names=X _ train . columns . to list,
class_names=[\ ‘未幸存\ ‘,\ ‘幸存\’],
discretize _ continuous=True)
然后,您必须定义一个函数,该函数将特征数组作为一个变量,并返回一个数组和每个类的概率:
model=cv.best_estimator_。命名步骤[模型]
定义xgb _ prediction(X _ array _ in):
如果镜头(X_array_in.shape) 2:
X _数组_输入=NP . expand _ dims(X _数组_输入,0)
返回model.predict_proba(X_array_in)
最后,我们通过一个例子让解释器使用你的函数输出特征号和标签:
x _ test _ imputed=cv . best _ estimator _。named _ steps[inputr]。转换(X_test)
exp=explainer . explain _ instance(X _ test _ imputed[1],xgb_prediction,num_features=5,top_labels=1)
exp . show _ in _ notebook(show _ table=True,show_all=False)
这里有一个例子,有76%的概率无法存活。我们还想知道哪个特性对哪个类的贡献最大,以及它有多重要。比如性别=女性时,生存概率更大。让我们看看柱状图:
所以看起来很合理。如果你是女性,这大大增加了你在训练数据中的生存几率。那么为什么预测结果是“不活”呢?似乎Pclass=2.0大大降低了存活率。让我们看看:
看来Pclass等于2的存活率还是比较低的,所以对我们的预测结果有了更好的理解。看看LIME上显示的top5特性。看来这个人还能活下来。让我们看看它的标签:
y_test.values[0]
一个
这个人确实活了下来,所以我们的模型是错的!感谢LIME,我们可以对问题的原因有所了解:看起来Pclass可能需要被放弃。这种方式可以帮助我们,希望能找到一些改进模型的方法。
本文为读者理解XGBoost提供了一种简单有效的方法。希望这些方法可以帮助你合理使用XGBoost,让你的模型做出更好的推断。
注:本文由机器之心整理,授权请联系本微信官方账号。

其他教程

五个实战营销原型(纯干货)

2022-9-9 3:39:37

其他教程

朗读老舍散文《过年》(老舍的儿子写的春节)

2022-9-9 3:41:47

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索