查看原文
其他

Kaggle 神器 XGBoost 入门:为什么要用它?怎么用?

2017-06-09 Alice AI100


作者 | 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竞赛哦。



   点击下方“阅读原文”查看更多内容。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存