XGBoost入门及实战

kaggle比赛必备算法XGBoost入门及实战

xgboost一直在kaggle竞赛江湖里被传为神器,它在对结构化数据的应用占据主导地位,是目前开源的最快最好的工具包,与常见的工具包算法相比速度提高了10倍以上!

XGBoost is an implementation of gradient boosted decision trees (GBDT) designed for speed and performance.

xgboost 是对梯度增强决策树(GBDT)的一种实现,具有更高的性能以及速度,既可以用于分类也可以用于回归问题中。本文将尽量用通俗易懂的方式进行介绍并给出实战案例。

1.什么是XGBoost?

xgboost 是 eXtreme Gradient Boosting的简写。

The name xgboost, though, actually refers to the engineering goal to push the limit of computations resources for boosted tree algorithms. Which is the reason why many people use xgboost.

以上是xgboost作者陈天奇在Quora(类似国内的知乎)上对名字的解释。

xgboost是一个软件包,可以通过各种API接口访问使用:

  • Command Line Interface (CLI).命令行
  • C++
  • Java
  • R
  • python 和 scikit-learn
  • Julia
  • Scala

xgboost 的底层实现在我看来还是比较复杂的,想深入理解可以查看陈博士的Paper (XGBoost: A Scalable Tree Boosting System) ,它针对传统GBDT算法做了很多细节改进,包括损失函数、正则化、稀疏感知算法、并行化算法设计等等。

Szilard Pafka 数据科学家做了详细的性能对比,并发表的文章进行解释说明(githup:https://github.com/szilard/benchm-ml) 以下是 XGBoost 与其它 gradient boosting 和 bagged decision trees 实现的效果比较,可以看出它比 R, Python,Spark,H2O 中的基准配置要更快。

2.XGBoost的特性

说到Xgboost,不得不先从GBDT(Gradient Boosting Decision Tree)说起。因为xgboost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted,两者都是boosting方法。

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

那什么是GBDT??我们看一张图:

GBDT的原理很简单,我们反复循环构建新的模型并将它们组合成一个集成模型的,从初始Naive模型开始,我们从计算数据集中每个观测的误差,然后下一个树去拟合误差函数对预测值的残差(残差就是预测值与真实值之间的误差),最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。

之所以称为 Gradient,是因为在添加新模型时使用了梯度下降算法来最小化的损失。

如图所示:Y = Y1 + Y2 + Y3。

Parallelization并行处理

XGBoost工具支持并行处理。Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是 tree 粒度的并行,XGBoost 也是一次迭代完才能进行下一次迭代的。

XGBoost的并行是在特征粒度上的,决策树的学习最耗时的一个步骤就是对特征的值进行排序,XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

正则化

XGBoost 在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的 score 的L2模的平方和。从Bias-variance tradeoff 角度来讲,正则项降低了模型的 variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

缺失值处理

对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。

损失函数

传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。

分布式计算

XGBoost is an optimized distributed gradient boosting library designed to be highly efficient, flexible and portable. It implements machine learning algorithms under the Gradient Boosting framework. XGBoost provides a parallel tree boosting (also known as GBDT, GBM) that solve many data science problems in a fast and accurate way.

3.实战示例

官方指导文档:
https://xgboost.readthedocs.io/en/latest/index.html

github 示例文档:
https://github.com/dmlc/xgboost/tree/master/demo/guide-python

本文将继续使用kaggle竞赛平台上的房价预测的数据,具体数据请移步kaggle实战之房价预测,了解一下?

准备数据

import pandas as pd
from sklearn.model_selection import train_test_split from sklearn.preprocessing import Imputer data = pd.read_csv('../input/train.csv') data.dropna(axis=0, subset=['SalePrice'], inplace=True) y = data.SalePrice X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object']) train_X, test_X, train_y, test_y = train_test_split(X.as_matrix(), y.as_matrix(), test_size=0.25) my_imputer = Imputer() train_X = my_imputer.fit_transform(train_X) test_X = my_imputer.transform(test_X) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

构建模型

#引入xgboost
from xgboost import XGBRegressor
#xgboost 有封装好的分类器和回归器,可以直接用XGBRegressor建立模型
my_model = XGBRegressor() # Add silent=True to avoid printing out updates with each cycle my_model.fit(train_X, train_y, verbose=False) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

评估及预测

# make predictions
predictions = my_model.predict(test_X) from sklearn.metrics import mean_absolute_error print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y))) 
  • 1
  • 2
  • 3
  • 4
  • 5

模型调参

xgboost模型参数有几十种,以上我们只是使用的默认的参数进行训练预测,参数详解请参照:
Parameters (official guide)

XGBoost有几个参数会显著影响模型的准确性和训练速度,你应该需要特别关注,并适当的进行调参:

#1. n_estimators

n_estimators指定通过建模周期的次数,可以理解成迭代次数,值太大会导致过度拟合,这是对训练数据的准确预测,但对新数据的预测偏差很大。一般的范围在100-1000之间。

#2.early_stopping_rounds

这个参数 early_stopping_rounds 提供了一种自动查找理想值的方法,试验证分数停止改进时停止迭代。

我们可以为 n_estimators 设置一个较高值,然后使用 early_stopping_rounds来找到停止迭代的最佳时间。

my_model = XGBRegressor(n_estimators=1000) #评价模型在测试集上的表现,也可以输出每一步的分数 verbose=True my_model.fit(train_X, train_y, early_stopping_rounds=5, eval_set=[(test_X, test_y)], verbose=True) #[0] validation_0-rmse:181513 #Will train until validation_0-rmse hasn't improved in 5 rounds. #[1] validation_0-rmse:164369 #[2] validation_0-rmse:149195 #[3] validation_0-rmse:135397 #[4] validation_0-rmse:123108 #[5] validation_0-rmse:111850 #[6] validation_0-rmse:102150 #[7] validation_0-rmse:93362.6 #[8] validation_0-rmse:85537.3 #[9] validation_0-rmse:78620.8 #[10] validation_0-rmse:72306.5 #[11] validation_0-rmse:67021.3 #[12] validation_0-rmse:62228.3 # XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1, # colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0, # max_depth=3, min_child_weight=1, missing=None, n_estimators=1000, # n_jobs=1, nthread=None, objective='reg:linear', random_state=0, # reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, # silent=True, subsample=1) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

当使用 early_stopping_rounds 参数时,您需要留出一些数据来检查要使用的轮数,从以上实例代码可以看出 n_estimators=1000 为停止迭代次数。

#3.learning_rate

以下是一个小技巧但很重要,可用于训练更好的xgboost模型:

一般来说,一个较小的 learning_rate(和较大的 n_estimators )将产生更精确的xgboost 模型,由于该模型在整个循环中进行了更多的迭代,因此它也需要更长的时间来训练。

我们用 GridSearchCV 来进行调整 learning_rate 的值,以找到最合适的参数:

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] my_model= XGBRegressor(n_estimators=1000) 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(my_model, param_grid, n_jobs=-1, cv=kfold) grid_result = grid_search.fit(train_X, train_y) print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) #Best: 0.285843 using {'learning_rate': 0.01} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

#4.n_jobs

在运行时的较大数据集上,可以使用并行性更快地构建模型,通常将参数n_jobs设置为机器上的CPU的数量。对于较小的数据集,这个参数没有任何作用。

可视化XGBoost树

训练完模型后, 一般只是看看特征重要性(feature importance score),但是 XGBoost提供了一个方法plot_tree(),使得模型中每个决策树是可以画出来看看的。

import matplotlib.pyplot as plt
from xgboost import plot_tree plot_tree(my_model,num_trees=0) #设置图形的大小 plt.rcParams['figure.figsize'] = [50, 20] plt.show() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以得到以下这个的图,plot_tree有些参数可以调整, 比如num_trees=0表示画第一棵树,rankdir='LR’表示图片是从左到右(Left to Right)。

上图中f1,f2是feature ID,需要进行转换成特征属性显示:

#这个函数就是根据给定的特征名字(我直接使用了数据的列名称), 按照特定格式生成一个xgb.fmap文件
def ceate_feature_map(features): outfile = open('xgb.fmap', 'w') i = 0 for feat in features: outfile.write('{0}\t{1}\tq\n'.format(i, feat)) i = i + 1 outfile.close() ceate_feature_map(X.columns) #在调用plot_tree函数的时候, 直接指定fmap文件即可 plot_tree(my_model,num_trees=0,fmap='xgb.fmap') plt.rcParams['figure.figsize'] = [50, 20] plt.show() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

可视化XGBoost模型的另一种方法是显示模型中原始数据集中每个要属性的重要性,XGBoost有一个 plot_importance() 方法,可以展示特征的重要性。

from xgboost import plot_importance
plot_importance(my_model)
plt.rcParams['figure.figsize'] = [10, 10] plt.show() 
  • 1
  • 2
  • 3
  • 4

从图中可以看出,特征属性 f16 - GrLivArea得分最高,可以展示特征的重要性。因此,XGBoost还为我们提供了一种进行特征选择的方法!!

4.参考资料

1.xgboost作者讲义PPT:https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
2.xgboost入门与实战(原理篇):https://blog.csdn.net/sb19931201/article/details/52557382
3.史上最详细的XGBoost实战:https://zhuanlan.zhihu.com/p/31182879
4.一文读懂机器学习大杀器XGBOOST原理
5.A Gentle Introduction to XGBoost for Applied Machine Learning

转载于:https://www.cnblogs.com/yumoye/p/10421153.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几个常用算法的适应场景及其优缺点

机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验。通常最开始我们都会选择大家普遍认同的算法,诸如SVM&#x…

p1012拼数题解

#include<iostream> #include<algorithm> using namespace std; bool cmp(string b,string a) {return ba>ab;}//灵魂在这 int main() {string a[21];int n;cin>>n;for(int i1;i<n;i)cin>>a[i];sort(a1,an1,cmp);for(int i1;i<n;i)cout<&l…

常见算法及问题场景——图

最短路径 现实场景 1、一批货从北京到广州的的最快&#xff0c;或最省钱的走法。 把路线中各城市当作图的顶点&#xff0c;各城市之间的花费时间&#xff0c;或金钱当作边的权重&#xff0c;求两点之间的最短路径。 2、在城市群中建一个仓储基地&#xff0c;建在什么位置可以…

EF ++属性会更新实体

var lastBaby await _babyRepository.FirstOrDefaultAsync(); lastBaby.sort; -- sort原本为1 -- 最终会生成一条语句更新sort字段 exec sp_executesql NSET NOCOUNT ON;UPDATE [Babies] SET [BirthOrder] p0, [LastModificationTime] p1WHERE [Id] p2;SELECT ROWCOUNT; ,N…

分类算法应用场景实例二十则

1 O2O优惠券使用预测 以优惠券盘活老用户或吸引新客户进店消费是O2O的一种重要营销方式。然而随机投放的优惠券对多数用户造成无意义的干扰。对商家而言&#xff0c;滥发的优惠券可能降低品牌声誉&#xff0c;同时难以估算营销成本。个性化投放是提高优惠券核销率的重要技术&am…

Shell03

查看字符数的方法&#xff1a; seq -s " " 100 #以空格为分隔符&#xff0c;输出从1到100 seq 100 #以换行为分隔符 charsseq -s " " 100 echo $chars echo ${#chars} #统计字符数 echo $(expr length "$chars") #统计字符数 echo $cha…

luogu P3244 [HNOI2015]落忆枫音

传送门 md这题和矩阵树定理没半毛钱关系qwq 首先先不考虑有环,一个\(DAG\)个外向树个数为\(\prod_{i2}^{n}idg_i(\)就是\(indegree_i)\),因为外向树每个点入度为一,对于一个点有入度个父亲可选,然后乘法原理起来就是答案 现在可能加一条边会有环,那么答案可以考虑总方案减不合法…

EM算法 案例量则

例子一&#xff1a;理论&#xff1a; 简版&#xff1a;猜&#xff08;E-step&#xff09;,反思&#xff08;M-step&#xff09;,重复&#xff1b; 啰嗦版&#xff1a; 你知道一些东西&#xff08;观察的到的数据&#xff09;&#xff0c; 你不知道一些东西&#xff08;观察不到…

远程拷贝代码 指定端口

将本地testdir拷贝到远程服务器tmp目录下 scp -r -p 9022 testdir xiaoming192.168.0.2:/tmp/ 转载于:https://www.cnblogs.com/sea-stream/p/10436199.html

C#编写TensorFlow人工智能应用 TensorFlowSharp

TensorFlowSharp入门使用C#编写TensorFlow人工智能应用学习。 TensorFlow简单介绍 TensorFlow 是谷歌的第二代机器学习系统&#xff0c;按照谷歌所说&#xff0c;在某些基准测试中&#xff0c;TensorFlow的表现比第一代的DistBelief快了2倍。 TensorFlow 内建深度学习的扩展支持…

简单的MVC与SQL Server Express LocalDB

M模式&#xff1a; 类&#xff0c;表示数据的应用程序和使用验证逻辑以强制实施针对这些数据的业务规则。V视图&#xff1a; 应用程序使用动态生成 HTML 响应的模板文件。C控制器&#xff1a; 处理传入的浏览器请求的类中检索模型数据&#xff0c;然后指定将响应返回到浏览器的…

马尔可夫链 (Markov Chain)是什么鬼

作者&#xff1a;红猴子链接&#xff1a;https://www.zhihu.com/question/26665048/answer/157852228来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。马尔可夫链 &#xff08;Markov Chain&#xff09;是什么鬼 它是随机…

malloc/free 和 new/delete

(本文参考于网上&#xff09; 首先两者都可用于申请动态内存和释放内存&#xff61; 对于非内部数据类型的对象而言&#xff0c;只用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数&#xff0c;对象在消亡之前要自动执行析构函数。由于malloc/free是库…

主题模型-LDA浅析

个性化推荐、社交网络、广告预测等各个领域的workshop上都提到LDA模型&#xff0c;感觉这个模型的应用挺广泛的&#xff0c;会后抽时间了解了一下LDA&#xff0c;做一下总结&#xff1a; &#xff08;一&#xff09;LDA作用 传统判断两个文档相似性的方法是通过查看两个文档共…

dorado-SplitSpanel控件

1.这是一个界面布局控件 2.分为SideControl边区域和MainControl主区域 3.常用属性 3.1 collapsed&#xff1a;打开页面时&#xff0c;边区域是否显示 3.2 position&#xff1a;边区域占总的大小 转载于:https://www.cnblogs.com/ergougougou/p/10438752.html

mysql-视图、事物等

一、视图 视图是一个虚拟表&#xff08;非真实存在&#xff09;&#xff0c;其本质是【根据SQL语句获取动态的数据集&#xff0c;并为其命名】&#xff0c;用户使用时只需使用【名称】即可获取结果集&#xff0c;可以将该结果集当做表来使用。 使用视图我们可以把查询过程中的临…

CAFFE怎样跑起来

0、参考文献 [1]caffe官网《Training LeNet on MNIST with Caffe》; [2]薛开宇《读书笔记4学习搭建自己的网络MNIST在caffe上进行训练与学习》&#xff08;[1]的翻译版&#xff0c;同时还有作者的一些注解&#xff0c;很赞&#xff09;; 1、*.sh文件如何执行&#xff1f; ①方…

运行caffe自带的两个简单例子

为了程序的简洁&#xff0c;在caffe中是不带练习数据的&#xff0c;因此需要自己去下载。但在caffe根目录下的data文件夹里&#xff0c;作者已经为我们编写好了下载数据的脚本文件&#xff0c;我们只需要联网&#xff0c;运行这些脚本文件就行了。 注意&#xff1a;在caffe中运…

quartz.net 执行后台任务

... https://www.cnblogs.com/zhangweizhong/category/771057.html https://www.cnblogs.com/lanxiaoke/category/973331.html 宿主在控制台程序中 using System;using System.Collections.Specialized;using System.IO;using System.Threading.Tasks;using Quartz;using Quart…