揭秘Kaggle神器xgboost

日期: 2025-03-19 15:16:13 |浏览: 0|编号: 82041

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

揭秘Kaggle神器xgboost

在 的很多比赛中,我们可以看到很多 喜欢用 ,而且获得非常好的表现,今天就来看看 到底是什么以及如何应用。

本文结构:

什么是 ?

项目地址:

是由 Chen ~/最初开发的实现可扩展,便携,分布式 (GBDT, GBRT or GBM) 算法的一个库,可以下载安装并应用于 C++,,R,Julia,Java,Scala,,现在有很多协作者共同开发维护。

所应用的算法就是 tree,既可以用于分类也可以用于回归问题中。

那什么是 ?

是 的其中一种方法,所谓 ,就是将弱分离器 f_i(x) 组合起来形成强分类器 F(x) 的一种方法。

所以 有三个要素:

就是通过加入新的弱学习器,来努力纠正前面所有弱学习器的残差,最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。之所以称为 ,是因为在添加新模型时使用了梯度下降算法来最小化的损失。

第一种 的实现就是 ( )。

就是将多个弱分类器,通过投票的手段来改变各个分类器的权值,使分错的分类器获得较大权值。同时在每一次循环中也改变样本的分布,这样被错误分类的样本也会受到更多的关注。

为什么要用 ?

前面已经知道, 就是对 tree 的实现,但是一般来说, 的实现是比较慢的,因为每次都要先构造出一个树并添加到整个模型序列中。

而 的特点就是计算速度快,模型表现好,这两点也正是这个项目的目标。

表现快是因为它具有这样的设计:

下图就是 与其它 和 trees 实现的效果比较,可以看出它比 R, ,Spark,H2O 中的基准配置要更快。

另外一个优点就是在预测问题中模型表现非常好,下面是几个 的赛后采访链接,可以看出 的在实战中的效果。

怎么应用?

先来用 做一个简单的二分类问题,以下面这个数据为例,来判断病人是否会在 5 年内患糖尿病,这个数据前 8 列是变量,最后一列是预测值为 0 或 1。

数据描述:

++

下载数据集,并保存为 “pima--.csv“ 文件:

1. 基础应用

引入等包

. it

.

分出变量和标签

= ('pima--.csv', =",")

X = [:,0:8]

Y = [:,8]

将数据分为训练集和测试集,测试集用来预测,训练集用来学习模型

seed = 7

= 0.33

, , , =

(X, Y, =, =seed)

有封装好的分类器和回归器,可以直接用 建立模型,这里是 的文档:

#-.

model = ()

model.fit(, )

的结果是每个样本属于第一类的概率,需要用 round 将其转换为 0 1 值

= model.() = [round(value) ]

得到 : 77.95%

= (, )print(": %.2f%%"% ( * 100.0))

2. 监控模型表现

可以在模型训练时,评价模型在测试集上的表现,也可以输出每一步的分数,只需要将

model = ()

model.fit(, )

变为:

model = () = [(, )] model.fit(, , s=10, =

"", =, =True)

那么它会在每加入一颗树后打印出

[31] -:0.

[32] -:0.

[33] -:0.

并打印出 Early 的点:

. Best :[32] -:0.

3. 输出特征重要度

还有一个优点是可以给出训练好的模型的特征重要性,

这样就可以知道哪些变量需要被保留,哪些可以舍弃。

需要引入下面两个类:

e

和前面的代码相比,就是在 fit 后面加入两行画出特征的重要性

model.fit(X, y)

(model)

.show()

4. 调参

如何调参呢,下面是三个超参数的一般实践最佳值,可以先将它们设定为这个范围,然后画出 ,再调解参数找到最佳模型:

接下来我们用 来进行调参会更方便一些:

可以调的超参数组合有:

下面以学习率为例:

先引入这两个类

.

. d

设定要调节的 = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3],和原代码相比就是在 model 后面加上 grid 这几行:

model = ()

= [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]

= dict(=)

kfold = (=10, =True, =7)

= (model, , ="", =-1, cv=kfold)

= .fit(X, Y)

最后会给出最佳的学习率为 0.1

Best: -0. using {‘’: 0.1}

print("Best: %f using %s"% (., .))

我们还可以用下面的代码打印出每一个学习率对应的分数:

means = .[''] stds = .[''] = .[''], stdev, param inzip(means, stds, ):

print("%f (%f) with: %r"% (mean, stdev, param))-0.(0.) with: {'': 0.0001}

-0.(0.) with: {'': 0.001}

-0.(0.) with: {'': 0.01}

-0.(0.) with: {'': 0.1}

-0.(0.) with: {'': 0.2}

-0.(0.) with: {'': 0.3}

前面就是关于 的一些基础概念和应用实例,下面还有一些学习资源供参考:

学习资源

Chen 的讲座:

讲义:

入门教程:

安装教程:

应用示例:

最好的资源当然就是项目的 主页:

参考:

2017中国人工智能大会(CCAI 2017)| 7月22日-23日 杭州

本届CCAI由中国人工智能学会、蚂蚁金服主办,由CSDN承办,最专业的年度技术盛宴:

- 40位以上实力讲师

- 8场权威专家主题报告

- 4场开放式专题研讨会

- 超过100家媒体报道

- 超过2000位技术精英和专业人士参会

与大牛面对面,到官网报名:

提醒:请联系我时一定说明是从旅游网上看到的!