Kaggle 神器 XGBoost 入门:为什么要用它?怎么用?
作者 | Alice
在 Kaggle 的很多比赛中,我们可以看到很多 winner 喜欢用 XGBoost,而且获得非常好的表现,今天就来看看 XGBoost到底是什么以及如何应用。
本文结构:
什么是XGBoost?
为什么要用它?
怎么应用?
学习资源
什么是 XGBoost?
XGBoost :eXtreme Gradient Boosting
项目地址:https://github.com/dmlc/xgboost
是由 Tianqi Chen http://homes.cs.washington.edu/~tqchen/ 最初开发的实现可扩展,便携,分布式 gradient boosting (GBDT, GBRT or GBM) 算法的一个库,可以下载安装并应用于 C++,Python,R,Julia,Java,Scala,Hadoop,现在有很多协作者共同开发维护。
XGBoost 所应用的算法就是 gradient boosting decision tree,既可以用于分类也可以用于回归问题中。
那什么是 Gradient Boosting?
Gradient boosting 是 boosting 的其中一种方法
所谓 Boosting ,就是将弱分离器 f_i(x) 组合起来形成强分类器 F(x) 的一种方法。
所以 Boosting 有三个要素:
A loss function to be optimized:
例如分类问题中用 cross entropy,回归问题用 mean squared error。A weak learner to make predictions:
例如决策树。An additive model:
将多个弱学习器累加起来组成强学习器,进而使目标损失函数达到极小。
Gradient boosting 就是通过加入新的弱学习器,来努力纠正前面所有弱学习器的残差,最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。之所以称为 Gradient,是因为在添加新模型时使用了梯度下降算法来最小化的损失。
第一种 Gradient Boosting 的实现就是 AdaBoost(Adaptive Boosting)。
AdaBoost 就是将多个弱分类器,通过投票的手段来改变各个分类器的权值,使分错的分类器获得较大权值。同时在每一次循环中也改变样本的分布,这样被错误分类的样本也会受到更多的关注。
为什么要用 XGBoost?
前面已经知道,XGBoost 就是对 gradient boosting decision tree 的实现,但是一般来说,gradient boosting 的实现是比较慢的,因为每次都要先构造出一个树并添加到整个模型序列中。
而 XGBoost 的特点就是计算速度快,模型表现好,这两点也正是这个项目的目标。
表现快是因为它具有这样的设计:
Parallelization:
训练时可以用所有的 CPU 内核来并行化建树。Distributed Computing :
用分布式计算来训练非常大的模型。Out-of-Core Computing:
对于非常大的数据集还可以进行 Out-of-Core Computing。Cache Optimization of data structures and algorithms:
更好地利用硬件。
下图就是 XGBoost 与其它 gradient boosting 和 bagged decision trees 实现的效果比较,可以看出它比 R, Python,Spark,H2O 中的基准配置要更快。
另外一个优点就是在预测问题中模型表现非常好,下面是几个 kaggle winner 的赛后采访链接,可以看出 XGBoost 的在实战中的效果。
Vlad Sandulescu, Mihai Chiru, 1st place of the KDD Cup 2016 competition. Link to the arxiv paper.
Marios Michailidis, Mathias Müller and HJ van Veen, 1st place of the Dato Truely Native? competition. Link to the Kaggle interview.
Vlad Mironov, Alexander Guschin, 1st place of the CERN LHCb experiment Flavour of Physics competition. Link to the Kaggle interview.
KDD Cup 2016 competition
https://kddcup2016.azurewebsites.net/
Link to the arxiv paper.
http://arxiv.org/abs/1609.02728
Dato Truely Native? competition.
https://www.kaggle.com/c/dato-native
Link to the Kaggle interview.
http://blog.kaggle.com/2015/12/03/dato-winners-interview-1st-place-mad-professors/
CERN LHCb experiment Flavour of Physics competition.
https://www.kaggle.com/c/flavours-of-physics
Link to the Kaggle interview.
http://blog.kaggle.com/2015/11/30/flavour-of-physics-technical-write-up-1st-place-go-polar-bears/
怎么应用?
先来用 Xgboost 做一个简单的二分类问题,以下面这个数据为例,来判断病人是否会在 5 年内患糖尿病,这个数据前 8 列是变量,最后一列是预测值为 0 或 1。
数据描述:
https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes
下载数据集,并保存为 “pima-indians-diabetes.csv“ 文件:
https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data
1. 基础应用
引入 XGBoost等包
分出变量和标签
将数据分为训练集和测试集,测试集用来预测,训练集用来学习模型
XGBoost 有封装好的分类器和回归器,可以直接用 XGBClassifier 建立模型。
这里是 XGBClassifier 的文档:
http://xgboost.readthedocs.io/en/latest/python/python_api.html#module- xgboost.sklearn
XGBoost 的结果是每个样本属于第一类的概率,需要用 round 将其转换为 0 1 值
得到 Accuracy: 77.95%
2. 监控模型表现
XGBoost 可以在模型训练时,评价模型在测试集上的表现,也可以输出每一步的分数。
只需要将
变为:
那么它会在每加入一颗树后打印出 logloss
并打印出 Early Stopping 的点:
3. 输出特征重要度
gradient boosting 还有一个优点是可以给出训练好的模型的特征重要性,这样就可以知道哪些变量需要被保留,哪些可以舍弃。
需要引入下面两个类
和前面的代码相比,就是在 fit 后面加入两行画出特征的重要性
4. 调参
如何调参呢,下面是三个超参数的一般实践最佳值,可以先将它们设定为这个范围,然后画出 learning curves,再调解参数找到最佳模型:
learning_rate = 0.1 或更小,越小就需要多加入弱学习器;
tree_depth = 2~8;
subsample = 训练集的 30%~80%;
接下来我们用 GridSearchCV 来进行调参会更方便一些:
可以调的超参数组合有:
树的个数和大小(n_estimators and max_depth).
学习率和树的个数 (learning_rate and n_estimators).
行列的 subsampling rates (subsample, colsample_bytree and colsample_bylevel).
下面以学习率为例:
先引入这两个类
设定要调节的 learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
和原代码相比就是在 model 后面加上 grid search 这几行:
最后会给出最佳的学习率为 0.1
Best: -0.483013 using {'learning_rate': 0.1}
我们还可以用下面的代码打印出每一个学习率对应的分数:
前面就是关于 XGBoost 的一些基础概念和应用实例,下面还有一些学习资源供参考。
学习资源
Tianqi Chen 的讲座:
https://www.youtube.com/watch?v=Vly8xGnNiWs&feature=youtu.be
讲义:
https://speakerdeck.com/datasciencela/tianqi-chen-xgboost-overview-and-latest-news-la-meetup-talk
入门教程:
https://xgboost.readthedocs.io/en/latest/
安装教程:
http://xgboost.readthedocs.io/en/latest/build.html
应用示例:
https://github.com/dmlc/xgboost/tree/master/demo
最好的资源当然就是项目的 Github 主页:
https://github.com/dmlc/xgboost
参考
http://machinelearningmastery.com/develop-first-xgboost-model-python-scikit-learn/
https://www.zhihu.com/question/37683881
原文地址
http://www.jianshu.com/p/7e0e2d66b3d4
开课啦开课啦:
AI100学院特请在机器学习领域深耕10余年的中科院副教授冒老师带来干货课程——《XGBoost从基础到实战》,从XGBoost的原理讲解到代码实战,一步步带领大家从XGBoost的安装到一行行Python代码实现各类算法任务,不需要有很强的数学基础,直接从实战入手。通过4节XGBoost的专题课程,大家可以零基础理解XGBoost原理,掌握XGBoost调参,并能融会贯通地学习其他机器学习算法,学习如何用机器学习算法解决实际问题。如果你足够优秀,还能进击Kaggle竞赛哦。