lightgbm pythonVS xgboost谁才是最强的梯度提升库

1067人阅读
机器学习(4)
java(30)
转自:http://cos.name/2015/03/xgboost/
本文作者:何通,(总部在纽约,中国分部为)数据科学家,加拿大Simon
Fraser University计算机学院研究生,研究兴趣为数据挖掘和生物信息学。
在数据分析的过程中,我们经常需要对数据建模并做预测。在众多的选择中,,&和是三个尤其流行的R包,它们在Kaggle的各大数据挖掘竞赛中的出现频率独占鳌头,被坊间人称为R数据挖掘包中的。根据我的个人经验,gbm包比同样是使用树模型的randomForest包占用的内存更少,同时训练速度较快,尤其受到大家的喜爱。在python的机器学习库sklearn里也有的存在。
Boosting分类器属于集成学习模型,它基本思想是把成百上千个分类准确率较低的树模型组合起来,成为一个准确率很高的模型。这个模型会不断地迭代,每次迭代就生成一颗新的树。对于如何在每一步生成合理的树,大家提出了很多的方法,我们这里简要介绍由Friedman提出的Gradient Boosting Machine。它在生成每一棵树的时候采用梯度下降的思想,以之前生成的所有树为基础,向着最小化给定目标函数的方向多走一步。在合理的参数设置下,我们往往要生成一定数量的树才能达到令人满意的准确率。在数据集较大较复杂的时候,我们可能需要几千次迭代运算,如果生成一个树模型需要几秒钟,那么这么多迭代的运算耗时,应该能让你专心地想静静……
现在,我们希望能通过xgboost工具更好地解决这个问题。的全称是eXtreme Gradient Boosting。正如其名,它是Gradient Boosting Machine的一个c++实现,作者为正在华盛顿大学研究机器学习的大牛。他在研究中深感自己受制于现有库的计算速度和精度,因此在一年前开始着手搭建xgboost项目,并在去年夏天逐渐成型。xgboost最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。它的处女秀是Kaggle的竞赛,因为出众的效率与较高的预测准确度在比赛论坛中引起了参赛选手的,在1700多支队伍的激烈竞争中占有一席之地。随着它在Kaggle社区知名度的提高,最近也有队伍借助xgboost在比赛中。
为了方便大家使用,陈天奇将xgboost封装成了python库。我有幸和他合作,制作了xgboost工具的R语言接口,并将其提交到了。也有用户将其封装成了。python和R接口的功能一直在不断更新,大家可以通过下文了解大致的功能,然后选择自己最熟悉的语言进行学习。
一、基础功能
首先,我们从github上安装这个包:
devtools::install_github('dmlc/xgboost',subdir='R-package')
动手时间到!第一步,运行下面的代码载入样例数据:
require(xgboost)
data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')
train &- agaricus.train
test &- agaricus.test
需要我们通过一些蘑菇的若干属性判断这个品种是否有毒。数据以1或0来标记某个属性存在与否,所以样例数据为稀疏矩阵类型:
& class(train$data)
[1] &dgCMatrix&
attr(,&package&)
[1] &Matrix&
不用担心,xgboost支持稀疏矩阵作为输入。下面就是训练模型的命令
xgboost(data = train$data, label = train$label, max.depth = 2, eta = 1,
nround = 2, objective = &binary:logistic&)
[0] train-error:0.046522
[1] train-error:0.022263
我们迭代了两次,可以看到函数输出了每一次迭代模型的误差信息。这里的数据是稀疏矩阵,当然也支持普通的稠密矩阵。如果数据文件太大不希望读进R中,我们也可以通过设置参数data = 'path_to_file'使其直接从硬盘读取数据并分析。目前支持直接从硬盘读取libsvm格式的文件。
做预测只需要一句话:
pred &- predict(bst, test$data)
做交叉验证的函数参数与训练函数基本一致,只需要在原有参数的基础上设置nfold:
xgb.cv(data = train$data, label = train$label, max.depth = 2,
eta = 1, nround = 2, objective = &binary:logistic&,
nfold = 5)
[0] train-error:0.046522+0.001102 test-error:0.046523+0.004410
[1] train-error:0.022264+0.000864 test-error:0.022266+0.003450
train.error.mean train.error.std test.error.mean test.error.std
交叉验证的函数会返回一个data.table类型的结果,方便我们监控训练集和测试集上的表现,从而确定最优的迭代步数。
二、高速准确
上面的几行代码只是一个入门,使用的样例数据没法表现出xgboost高效准确的能力。xgboost通过如下的优化使得效率大幅提高:
xgboost借助,能自动利用单机CPU的多核进行并行计算。需要注意的是,Mac上的Clang对OpenMP的支持较差,所以默认情况下只能单核运行。xgboost自定义了一个数据矩阵类DMatrix,会在训练开始时进行一遍预处理,从而提高之后每次迭代的效率。
在尽量保证所有参数都一致的情况下,我们使用希格斯子竞赛的数据做了对照实验。
MODEL AND PARAMETER
Time (in secs)
以上实验使用的CPU是i7-4700MQ。python的sklearn速度与gbm相仿。如果想要自己对这个结果进行测试,可以在比赛的官方网站下载数据,并参考这份中的代码。
除了明显的速度提升外,xgboost在比赛中的效果也非常好。在这个竞赛初期,大家惊讶地发现R和python中的gbm竟然难以突破组织者预设的benchmark。而xgboost横空出世,用不到一分钟的训练时间便打入当时的top 10,引起了大家的兴趣与关注。准确度提升的主要原因在于,xgboost的模型和传统的GBDT相比加入了对于模型复杂度的控制以及后期的剪枝处理,使得学习出来的模型更加不容易过拟合。更多算法上的细节可以参考这份陈天奇给出的。
三、进阶特征
除了速度快精度高,xgboost还有一些很有用的进阶特性。下面的“demo”链接对应着相应功能的简单样例代码。
只要能够求出目标函数的梯度和Hessian矩阵,用户就可以自定义训练模型时的目标函数。允许用户在交叉验证时自定义误差衡量方法,例如回归中使用RMSE还是RMSLE,分类中使用AUC,分类错误率或是F1-score。甚至是在希格斯子比赛中的“奇葩”衡量标准。交叉验证时可以返回模型在每一折作为预测集时的预测结果,方便构建ensemble模型。允许用户先迭代1000次,查看此时模型的预测效果,然后继续迭代1000次,最后模型等价于一次性迭代2000次。可以知道每棵树将样本分类到哪片叶子上,如何利用这个信息提高模型的表现。可以计算变量重要性并画出树状图。可以选择使用线性模型替代树模型,从而得到带L1+L2惩罚的线性回归或者logistic回归。
这些丰富的功能来源于对日常使用场景的总结,数据挖掘比赛需求以及许多用户给出的精彩建议。
四、未来计划
现在,机器学习工具在实用中会不可避免地遇到“单机性能不够”的问题。目前,xgboost的正在开发当中。基础设施搭建完成之日,便是新一轮R包开始设计与升级之时。
我为xgboost制作R接口的目的就是希望引进好的工具,让大家使用R的时候心情更愉悦。总结下来,xgboost的特点有三个:速度快,效果好,功能多,希望它能受到大家的喜爱,成为一驾新的马车。
xgboost功能较多,参数设置比较繁杂,希望在上手之后有更全面了解的读者可以参考。欢迎大家多多交流,在提出疑问与建议。我们也邀请有兴趣的读者提交代码完善功能,让xgboost成为更好用的工具。
另外,在使用github开发的过程中,我深切地感受到了协作写代码带来的变化。一群人在一起的时候,可以写出更有效率的代码,在丰富的使用场景中发现新的需求,在极端情况发现隐藏很深的bug,甚至在主代码手拖延症较为忙碌的时候有人挺身而出拿下一片issue。这样的氛围,能让一个语言社区的交流丰富起来,从而充满生命力地活跃下去
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:115133次
积分:1979
积分:1979
排名:第17952名
原创:66篇
转载:125篇
(2)(3)(14)(23)(14)(7)(13)(3)(6)(24)(19)(18)(23)(23)深受Kaggle数据分析竞赛欢迎的梯度提升算法实现XGBoost - 推酷
深受Kaggle数据分析竞赛欢迎的梯度提升算法实现XGBoost
作者介绍:Matthew Emery,加拿大数据科学家,RAP爱好者,毕业于英属哥伦比亚大学。
Email:m.emery@alumni.ubc.ca
LinkedIn:/in/lstmemery
GitHub:/lstmemery
在数据科学领域有一个叫做“没有免费的午餐”定理,具体来说就是,对于任意两个算法,当它们在面对所有可能的问题时的表现被平均化后,这两个算法是等价的,如果这个定理成立,那为什么2015年在数据科学竞赛网站Kaggle上赢得比赛的绝大部分方案都采用了XGBoost呢?XGBoost是如何工作的呢?它运行起来又像什么呢?
本文打算回答这些问题,注意,对你而言,不一定需要精通数学,但需要知道决策树是怎么一回事。
梯度提升树(Gradient Boosted Trees,GBT)科普
过度拟合相当于填鸭式的机器学习,如果你只知其然而不知其所以然,你就难以得到想要的结果,决策树就是典型的例子,因此,数据科学家必须学习多门技术,从而避免过度拟合的出现。
其中一个方法就是boosting(提升算法),我们通过训练几个弱分类器(低度拟合决策树)代替训练一个强分类器(过度拟合决策树),其中的诀窍就是让当前的树了解前面哪一颗树有错误,为了让boosting工作起来,需要用不同的方法让分类器处于错误状态,训练结束后,每棵树都要确定每个样本的分类,通过这种方式,部分分类器的弱点可以得到其它分类器的补偿。
自适应提升算法(Adaptive boosting ,AdaBoost)是boosting最经典的实现方法,第一棵树和其它分类错误的树完全一样,后面的树也和前面的树一样,被粗暴地认为分类 错误,这种策略导致在新建一棵树时要优先考虑正确的分类。
迭代提升算法(Gradient boosting)是boosting另一种优秀实现,第一棵树用常规方法拟合了数据,后面的树会尝试找出将前面的树的错误减少到最小的判定方式,如果我们知道描述数据的数学函数,要将错误减少到最小就很好办,我们就不会用决策树来尝试接近它。在不知道这个函数的情况下,我们需要一个新的策略来将错误减少到最小。
假设你在大雾笼罩的山顶,伸手不见五指,要找到下山最快的道路,哪种方法是最可行的?一种方法是伸出你的脚在每个方向上都试探一下,从而感知到下山最陡峭的路,现在,沿着这条最陡峭的路下山,不断重复这个过程,直到你下到山脚,数据科学家把这个算法叫做梯度下降算法,在本文中,我们也称之为梯度提升树算法。
梯度下降算法示例
是什么让XGBoost如此受欢迎?
梯度提升树算法最早公开的时间是2001年,那么XGBoost究竟是怎么改进这个算法的呢?
我经常看到有人误解XGBoost的精度要比其它梯度提升树算法实现精度高,可事实不是这样,算法的作者发现XGBoost的错误率和SCI-Kit Learn实现几乎一样。
XGBoost不是绝对的精确,但它绝对够快:
1、XGBoost识别能力不强:提升树特别适合特征明确的场景(如这个人出生在英格兰吗?),但在真实数据集中,特征明确的列通常是0,在决定从哪里分类时,XGBoost有非零数据的指针,只需要查找这些记录即可。
2、XGBoost可并行:提升树算法最消耗时间片的是对连续型特征排序(如你每天开车上班有多远?),稀疏数据结构和聪明的实现方式让XGBoost可为每个列独立排序,通过这种方法,排序工作在CPU的并行线程之间可以分离执行。
3、XGBoost支持近似分类:为了在连续型特征上找到最佳分类点,梯度提升树需要将所有数据放入内存进行排序,对小数据集来说不会存在什么问题,但当数据集大小超过内存时这个方法就行不通了,XGBoost可以对这些数据使用容器进行粗糙排序而不是完整排序,XGBoost论文作者表示,只要容器数量足够多,分类表现可以接近于精确分类。
我们还是举个例子来看看XGBoost到底可以做什么,这里我以一个房产数据集作为训练数据,可以从
from sklearn.model_selection import train_test_split
import xgboost as xgb
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor, \
AdaBoostRegressor, RandomForestRegressor
X = pd.read_csv('../../results/munged_training.csv')
y = pd.read_csv('../../results/munged_labels.csv')
# Make a validation set
X_train, X_validation, y_train, y_validation = train_test_split(X,
random_state=1848)
# Sci-Kit Learn's Out of the Box Gradient Tree Implementation
sklearn_boost = GradientBoostingRegressor(random_state=1849)
sklearn_boost.fit(X_train, y_train.values.ravel())
print('Training Error: {:.3f}'.format(1 - sklearn_boost.score(X_train,
y_train)))
print('Validation Error: {:.3f}'.format(1 - sklearn_boost.score(X_validation,
y_validation)))
%timeit sklearn_boost.fit(X_train, y_train.values.ravel())
Training Error: 0.031
Validation Error: 0.110
1 loop, best of 3: 1.23 s per loop
xgb_boost = xgb.XGBRegressor(seed=1850)
xgb_boost.fit(X_train, y_train.values.ravel())
print('Training Error: {:.3f}'.format(1 - xgb_boost.score(X_train,
y_train)))
print('Validation Error: {:.3f}'.format(1 - xgb_boost.score(X_validation,
y_validation)))
%timeit xgb_boost.fit(X_train, y_train.values.ravel())
Training Error: 0.038
Validation Error: 0.111
1 loop, best of 3: 443 ms per loop
# Sci-Kit Learn's Adaptive Boosting
ada_boost = AdaBoostRegressor(random_state=1851)
ada_boost.fit(X_train, y_train.values.ravel())
print('Training Error: {:.3f}'.format(1 - ada_boost.score(X_train,
y_train)))
print('Validation Error: {:.3f}'.format(1 - ada_boost.score(X_validation,
y_validation)))
%timeit ada_boost.fit(X_train, y_train.values.ravel())
Training Error: 0.126
Validation Error: 0.196
1 loop, best of 3: 729 ms per loop
# Random Forest: A fast, non-boosting algorithm
random_forest = RandomForestRegressor(random_state=1852)
random_forest.fit(X_train, y_train.values.ravel())
print('Training Error: {:.3f}'.format(1 - random_forest.score(X_train,
y_train)))
print('Validation Error: {:.3f}'.format(1 - random_forest.score(X_validation,
y_validation)))
%timeit random_forest.fit(X_train, y_train.values.ravel())
Training Error: 0.024
Validation Error: 0.128
1 loop, best of 3: 398 ms per loop
首先,我们来看看合法性错误, Sci-Kit Learn 实现和XGBoost实现几乎是一样的,它们两者使用默认的超参数就打败了AdaBoost(自适应提升算法)和RandomForest(随机森林算法),但XGBoost在执行速度上的优势非常明显,相当于Sci-Kit Learn实现的3倍,速度和随机森林算法相当。
XGBoost的准确性和速度让它成为评估特征工程的一个出色工具,你也可以加入新特征来给XGBoost交错旋转提速,交叉验证并查看新特征是否提升了模型的准确性,因为提升树是支持过度拟合的,你可以不断地加入新的特征,直到想不到新的特征为止。
XGBoost并不是到处都在使用,这也许就是最好的(虽然它在大多数情况下表现都非常佳),但它又可到处使用,只要是围绕数据开展探索,XGBoost无疑是你的最佳拍档。
以上为译文
文章原标题《Why Kagglers Love XGBoost 》,作者Matthew Emery,译者:耕牛的人,审校:主题曲(身行)
文章为简译,更为详细的内容,请查看
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 lightgbm 的文章

 

随机推荐