揭秘Kaggle神器xgboost

2023-11-13

在 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 的在实战中的效果。


怎么应用?

先来用 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等包

from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

分出变量和标签

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

X = dataset[:,0:8]
Y = dataset[:,8]

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

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)

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

http://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn

model = XGBClassifier()
model.fit(X_train, y_train)

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

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

得到 Accuracy: 77.95%

accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))

2. 监控模型表现

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

model = XGBClassifier()
model.fit(X_train, y_train)

变为:

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)

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

[31]    validation_0-logloss:0.487867
[32]    validation_0-logloss:0.487297
[33]    validation_0-logloss:0.487562

并打印出 Early Stopping 的点:

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

3. 输出特征重要度

gradient boosting还有一个优点是可以给出训练好的模型的特征重要性,
这样就可以知道哪些变量需要被保留,哪些可以舍弃。

需要引入下面两个类:

from xgboost import plot_importance
from matplotlib import pyplot

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

model.fit(X, y)

plot_importance(model)
pyplot.show()

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).

下面以学习率为例:

先引入这两个类

from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold

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

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)

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

Best: -0.483013 using {‘learning_rate’: 0.1}

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

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

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))
-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}

前面就是关于 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


2017中国人工智能大会(CCAI 2017)| 7月22日-23日 杭州
本届CCAI由中国人工智能学会、蚂蚁金服主办,由CSDN承办,最专业的年度技术盛宴:
- 40位以上实力讲师
- 8场权威专家主题报告
- 4场开放式专题研讨会
- 超过100家媒体报道
- 超过2000位技术精英和专业人士参会
与大牛面对面,到官网报名:http://ccai.caai.cn/


图片描述

图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

揭秘Kaggle神器xgboost 的相关文章

随机推荐

  • 汇编语言编程,将DATAS段中的每个单词的前4个字母改为大写并将改写后的结果分4行输出到屏幕上

    编程 将DATAS段中的每个单词的前4个字母改为大写并将改写后的结果分4行输出到屏幕上 题目 编程 将DATAS段中的每个单词的前4个字母改为大写并将改写后的结果分4行输出到屏幕上 DATAS SEGMENT db 1 display db
  • 01-Java语言基础

    01 01 计算机基础知识 计算机概述 了解 A 什么是计算机 计算机在生活中的应用举例 计算机 Computer 全称 电子计算机 俗称电脑 是一种能够按照程序运行 自动 高速处理海量数据的现代化智能电子设备 由硬件和软件所组成 没有安装
  • Linux网络编程:libevent事件通知I/O框架

    文章目录 一 libevent库 二 libevent框架 1 常规事件event 1 1 创建事件event event new 1 2 添加事件到 event base event add 1 3 从event base上摘下事件 ev
  • cv2.error: OpenCV(4.6.0) :-1: error: (-5:Bad argument) in function ‘cvtColor‘> Overload resolution

    不知道有没有小伙伴遇到了和我一样的报错 查找相关解决办法 大多的回答是让我降opencv版本 降版本过程中遇到问题 无法找到相关版本 可能是python版本的问题 最后经过不断尝试搜索解决问题 发现只是自己的函数用法写错了 有相同错误的小伙
  • 精通python100天——第二天:python基础

    1 熟悉交互式环境 python交互式环境虽然不像IDE在开发中天天要用到 但它也是我们入门不可忽视的一个环节 那怎么进入python交互式环境呢 分两种情况 第一种 安装了annocoda 点击Windows桌面左下角徽标 找到Anaco
  • 几种经典排序算法的演示(C++实现)

    该文章所有代码均基于SortView类 头文件及基本代码如下 include
  • Trie树 与 三分树(Ternary Trees)

    总结 为什么用Trie树 词频统计 可能有人要说了 词频统计简单啊 一个hash或者一个堆就可以打完收工 但问题来了 如果内存有限呢 还能这么玩吗 所以这里我们就可以用trie树来压缩下空间 因为公共前缀都是用一个节点保存的 前缀匹配 如果
  • ndk-build编译64位.so,出现ndk error: cast from 'int*' to 'int' loses precision [-fpermissive]

    这是因为Linux 64位系统上指针类型占用8个字节 而int类型占用4个字节 所以会出现loses precision 可以先将int 转成long类型 long类型可以隐式类型转换到int类型 如下 int func int p p 赋
  • 【vue】websocket封装&使用

    本文章向大家介绍使用websocket 主要包括使用websocket使用实例 应用技巧 基本知识点总结和需要注意事项 具有一定的参考价值 需要的朋友可以参考一下 小程序封装sokect传送门 创建一个websocket js utils
  • C++基础——匿名对象介绍、拷贝对象时的一些编译器优化

    目录 创建对象的几种方式 匿名对象的创建格式 二 编译器对于拷贝对象做出的优化 场景一 检测 优化 检测 场景二 检测 优化 场景三 检测 优化 场景四 优化 检测 整体优化总结 通过C 长时间的学习 我们已经学会了好多通过类定义对象的方法
  • 深入探究Selenium定位技巧及最佳实践

    在使用Selenium进行Web自动化测试时 准确地定位元素是非常重要的一步 Selenium提供了多种元素定位方法 本文将深入探究这八大元素定位方法 帮助读者更好地理解和应用Selenium的定位技巧 1 ID定位 ID是元素在HTML中
  • JAVA的类加载机制

    类加载机制 参考 https blog csdn net zhangliangzi article details 51319033 https www jianshu com p 3556a6cca7e5 https blog csdn
  • 以promise方式调用微信小程序的api

    仅仅适用于部分API需要用到promise方式调用 封装一个方法如下 export const promisify method options gt return new Promise resolve reject gt 将option
  • 用c语言编写lr(1)文法,C语言编写源程序建立LR(1)分析器.pdf

    目 录 前 言2 用C语言编写源程序建立LR 1 分析器3 一 设计目的 要求 算法与设计思想3 1 设计内容3 2 设计要求3 3 设计的基本原理3 1 CLOSURE I 的构造3 2 GO I X 的构造3 3 FIRST集合的构造4
  • Android屏幕适配全攻略(最权威的官方适配指导)

    转载请注明出处 http blog csdn net zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者 本篇文章以Google的官方文档为基础 全面而深入的讲解了Android屏幕适配的原因 重要概
  • Java for Web学习笔记(五九):Controller替代Servlet(1)请求匹配

    URL匹配 书写方式 是对DispatcherServlet所匹配的URL进行二次匹配 本例DispatcherServelt的servlet mapping中
  • Echarts隐藏坐标轴

    xAxis show false 不显示坐标轴线 坐标轴刻度线和坐标轴上的文字 axisTick show false 不显示坐标轴刻度线 axisLine show false 不显示坐标轴线 axisLabel show false 不
  • GNU许可证常见问题

    最新在学习开源软件 开源软件的组成最重要的一个就是license 及许可证 开源License在法律上赋予用户相关权利和义务 任何开源应用行为都必须围绕此 游戏规则 进行 其中重点学习了GUN GPL的许可证 本地记录下一个重要的网站 方便
  • 数据库出错提示Duplicate entry * for key *的解决方法

    错误编号 1062 错误提示 查询语句错误 1062 ERR Duplicate entry 16777215 for key PRIMARY SQL INSERT INTO forum attachment SET tid 0 pid 0
  • 揭秘Kaggle神器xgboost

    在 Kaggle 的很多比赛中 我们可以看到很多 winner 喜欢用 xgboost 而且获得非常好的表现 今天就来看看 xgboost 到底是什么以及如何应用 本文结构 什么是 xgboost 为什么要用它 怎么应用 学习资源 什么是