申请专栏作者 参展
投稿发布
您的当前位置:主页 > yabo体育平台注册页 > 正文

揭秘Kaggle神器xgboost

来源: 时间:2018-09-06
请支持本站,点击下面的广告后浏览!

在 Kaggle 的很多比赛中,我们可以看到很多 winner 喜欢用 xgboost,而且获得非常好的表现,今天就来看看 xgboost 到底是什么以及如何应用。 可思yabo88滚球-人工智能资讯平台sykv.com

本文结构: 可思yabo88滚球-AI,sykv.com人工智能,深度学习,机器学习,神经网络

  • 什么是 xgboost?
  • 为什么要用它?
  • 怎么应用?
  • 学习资源

什么是 xgboost?

XGBoost :eXtreme Gradient Boosting
项目地址: 可思yabo88滚球-AI,sykv.com人工智能,深度学习,机器学习,神经网络

是由 Tianqi Chen??最初开发的实现可扩展,便携,分布式 gradient boosting (GBDT, GBRT or GBM) 算法的一个库,可以下载安装并应用于 C++,Python,R,Julia,Java,Scala,Hadoop,现在有很多协作者共同开发维护。 内容来自可思yabo88滚球sykv.com

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

可思yabo88滚球-www.sykv.cn,sykv.com

那什么是 Gradient Boosting?

可思yabo88滚球sykv.com,sykv.cn

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

可思yabo88滚球-人工智能资讯平台sykv.com

所以?Boosting 有三个要素

可思yabo88滚球sykv.com,sykv.cn
  • A loss function to be optimized:
    例如分类问题中用 cross entropy,回归问题用 mean squared error。
  • A weak learner to make predictions:
    例如决策树。
  • An additive model:
    将多个弱学习器累加起来组成强学习器,进而使目标损失函数达到极小。

Gradient boosting?就是通过加入新的弱学习器,来努力纠正前面所有弱学习器的残差,最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。之所以称为 Gradient,是因为在添加新模型时使用了梯度下降算法来最小化的损失。 可思yabo88滚球-AI,sykv.com人工智能,深度学习,机器学习,神经网络

第一种 Gradient Boosting 的实现就是?AdaBoost(Adaptive Boosting)。 可思yabo88滚球sykv.com,sykv.cn

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

?

可思yabo88滚球sykv.com,sykv.cn


为什么要用 xgboost?

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

可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球

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

内容来自可思yabo88滚球sykv.com

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

可思yabo88滚球sykv.com,sykv.cn

  • Parallelization:
    训练时可以用所有的 CPU 内核来并行化建树。
  • Distributed Computing :
    用分布式计算来训练非常大的模型。
  • Out-of-Core Computing:
    对于非常大的yabo88滚球集还可以进行 Out-of-Core Computing。
  • Cache Optimization of data structures and algorithms:
    更好地利用硬件。

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

可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球

?

可思yabo88滚球sykv.com

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

可思yabo88滚球-AI,sykv.com人工智能,深度学习,机器学习,神经网络

  • Vlad Sandulescu, Mihai Chiru, 1st place of the?. Link to?.
  • Marios Michailidis, Mathias Müller and HJ van Veen, 1st place of the?. Link to?.
  • Vlad Mironov, Alexander Guschin, 1st place of the?. Link to?.

怎么应用?

先来用 Xgboost 做一个简单的二分类问题,以下面这个yabo88滚球为例,来判断病人是否会在 5 年内患糖尿病,这个yabo88滚球前 8 列是变量,最后一列是预测值为 0 或 1。 可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球

yabo88滚球描述:

可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球

下载yabo88滚球集,并保存为 “pima-indians-diabetes.csv“ 文件:

本文来自可思yabo88滚球(sykv.com),转载请联系本站及注明出处

1. 基础应用

可思yabo88滚球-www.sykv.cn,sykv.com

引入xgboost等包

可思yabo88滚球sykv.com,sykv.cn

from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score 可思yabo88滚球sykv.com,sykv.cn 

分出变量和标签

本文来自可思yabo88滚球(sykv.com),转载请联系本站及注明出处

dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")

X = dataset[:,0:8]
Y = dataset[:,8] 内容来自可思yabo88滚球sykv.com 

将yabo88滚球分为训练集和测试集,测试集用来预测,训练集用来学习模型

可思yabo88滚球-人工智能资讯平台sykv.com
seed = 7
test_size = 0.33
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed) 可思yabo88滚球sykv.com,sykv.cn 

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

本文来自可思yabo88滚球(sykv.com),转载请联系本站及注明出处

?

内容来自可思yabo88滚球sykv.com
model = XGBClassifier()
model.fit(X_train, y_train) 可思yabo88滚球sykv.com,sykv.cn 

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

内容来自可思yabo88滚球sykv.com

y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred] 

可思yabo88滚球-yabo88滚球挖掘,智慧医疗,机器视觉,机器人sykv.com

得到 Accuracy: 77.95%

可思yabo88滚球sykv.com,sykv.cn
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0)) 

可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球

2. 监控模型表现

本文来自可思yabo88滚球(sykv.com),转载请联系本站及注明出处

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

可思yabo88滚球sykv.com,sykv.cn

model = XGBClassifier()
model.fit(X_train, y_train) 可思yabo88滚球sykv.com,sykv.cn 

变为: 可思yabo88滚球sykv.com

model = XGBClassifier()
eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True) 可思yabo88滚球-yabo88滚球挖掘,智慧医疗,机器视觉,机器人sykv.com 

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

可思yabo88滚球-人工智能资讯平台sykv.com
[31]    validation_0-logloss:0.487867
[32]    validation_0-logloss:0.487297
[33]    validation_0-logloss:0.487562 可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球 

并打印出 Early Stopping 的点:

可思yabo88滚球-yabo88滚球挖掘,智慧医疗,机器视觉,机器人sykv.com

Stopping. Best iteration:
[32]    validation_0-logloss:0.487297 

可思yabo88滚球-www.sykv.cn,sykv.com

3. 输出特征重要度 可思yabo88滚球sykv.com

gradient boosting还有一个优点是可以给出训练好的模型的特征重要性,
这样就可以知道哪些变量需要被保留,哪些可以舍弃。 可思yabo88滚球-AI,sykv.com人工智能,深度学习,机器学习,神经网络

需要引入下面两个类: 可思yabo88滚球sykv.com

from xgboost import plot_importance
from matplotlib import pyplot 
可思yabo88滚球-人工智能资讯平台sykv.com

和前面的代码相比,就是在 fit 后面加入两行画出特征的重要性 内容来自可思yabo88滚球sykv.com

model.fit(X, y)

plot_importance(model)
pyplot.show() 

可思yabo88滚球-yabo88滚球挖掘,智慧医疗,机器视觉,机器人sykv.com

? 可思yabo88滚球-人工智能资讯平台sykv.com

4. 调参 可思yabo88滚球-人工智能资讯平台sykv.com

如何调参呢,下面是三个超参数的一般实践最佳值,可以先将它们设定为这个范围,然后画出 learning curves,再调解参数找到最佳模型: 可思yabo88滚球-www.sykv.cn,sykv.com

  • learning_rate = 0.1 或更小,越小就需要多加入弱学习器;
  • tree_depth = 2~8;
  • subsample = 训练集的 30%~80%;

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

可思yabo88滚球-人工智能资讯平台sykv.com

可以调的超参数组合有:

可思yabo88滚球-www.sykv.cn,sykv.com

树的个数和大小?(n_estimators and max_depth).
学习率和树的个数?(learning_rate and n_estimators).
行列的 subsampling rates?(subsample, colsample_bytree and colsample_bylevel).

可思yabo88滚球-www.sykv.cn,sykv.com

下面以学习率为例:

可思yabo88滚球-www.sykv.cn,sykv.com

先引入这两个类

本文来自可思yabo88滚球(sykv.com),转载请联系本站及注明出处

from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold 
可思yabo88滚球-人工智能资讯平台sykv.com

设定要调节的 learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3],和原代码相比就是在 model 后面加上 grid search 这几行: 内容来自可思yabo88滚球sykv.com

model = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
param_grid = dict(learning_rate=learning_rate)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)
grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss", n_jobs=-1, cv=kfold)
grid_result = grid_search.fit(X, Y) 
可思yabo88滚球sykv.com,sykv.cn

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

可思yabo88滚球-AI,sykv.com人工智能,深度学习,机器学习,神经网络

Best: -0.483013 using {‘learning_rate’: 0.1} 可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球

print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) 
可思yabo88滚球-www.sykv.cn,sykv.com

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

可思yabo88滚球-yabo88滚球挖掘,智慧医疗,机器视觉,机器人sykv.com
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param)) 可思yabo88滚球-人工智能资讯平台sykv.com 
-0.689650 (0.000242) with: {'learning_rate': 0.0001}
-0.661274 (0.001954) with: {'learning_rate': 0.001}
-0.530747 (0.022961) with: {'learning_rate': 0.01}
-0.483013 (0.060755) with: {'learning_rate': 0.1}
-0.515440 (0.068974) with: {'learning_rate': 0.2}
-0.557315 (0.081738) with: {'learning_rate': 0.3} 可思yabo88滚球-AI,sykv.com人工智能,深度学习,机器学习,神经网络 

前面就是关于 xgboost 的一些基础概念和应用实例,下面还有一些学习资源供参考: 可思yabo88滚球sykv.com

学习资源: 内容来自可思yabo88滚球sykv.com

Tianqi Chen 的讲座:

讲义: 可思yabo88滚球sykv.com,sykv.cn

入门教程: 可思yabo88滚球-yabo88滚球挖掘,智慧医疗,机器视觉,机器人sykv.com

安装教程:

可思yabo88滚球sykv.com,sykv.cn

应用示例:

可思yabo88滚球-AI,sykv.com智能驾驶,人脸识别,区块链,大yabo88滚球

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

内容来自可思yabo88滚球sykv.com

参考:
? 可思yabo88滚球sykv.com,sykv.cn


转发量:

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片 匿名?

关于我们?? 免责声明?? 广告合作?? 版权声明?? 联系方式?? 原创投稿?? 网站地图??

Copyright?2005-2019 Sykv.com 可思yabo88滚球 版权所有 ?? ICP备案:京ICP备14056871号

人工智能资讯?? 人工智能资讯?? 人工智能资讯?? 人工智能资讯

?扫码入群
咨询反馈
扫码关注

微信公众号

返回顶部
关闭