xgboost

来源:互联网 发布:jQuery数组 编辑:程序博客网 时间:2024/05/16 04:58

xgboost学习手册day-1


     xgboost的全称是eXtreme Gradient Boosting。它是Gradient Boosting Machine的一个c++实现。创建之由为受制于现有库的计算速度和精度,xgboost最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。现在xgboost已封装成了python库,并制作成了xgboost工具的R语言接口提交到了CRAN上,也有用户将其封装成了 julia库。

    ​1、延伸说明:Gradient Boosting Machine

    帮助理解——Gradient Boosting与Boosting的区别

​    Boosting是对一份数据,建立M个简单弱分类模型,每次分类都将上一次分错的数据权重提高一点再进行分类,这样最终得到的分类器在测试数据与训练数据上都可以得到比较好的成绩。(http://www.cnblogs.com/LeftNotEasy/archive/2011/01/02/machine-learning-boosting-and-gradient-boosting.html)

多次分类效果图
公式展示

​   程序越往后执行,训练出的模型就越会在意那些容易分错(权重高)的点。

    Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错(其实这里有一个方差、偏差均衡的问题,但是这里假设损失函数越大,模型越容易出错)。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。

   这里有一个很重要的假设,对于求出的前m-1个模型,我们认为是已知的了,不要去改变它,而我们的目标是放在之后的模型建立上。

      总之,Gradient Boosting 与传统的Boosting 的区别是,每一次的计算是为了减少上一次的损失函数,并在损失函数减少的梯度(Gradient)方向上建立一个新的模型。所以,在Gradient Boosting 中,每个新的模型的建立是为了使得之前模型的损失函数往梯度方向减少,与传统Boosting 对正确、错误的样本进行加权有着很大的区别。

​   (https://en.wikipedia.org/wiki/Gradient_boosting)

    2.  决策树与GBDT

(http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html​)

​     决策树算法:

     优点——训练时间复杂度较低,预测的过程比较快速,模型容易展示等。

      缺点——单决策树容易over-fitting,虽然剪枝等方法可以减少这种情况,但还是不够。

     随机森林算法:

     用随机的方式建立一个森林,森林由很多决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。​

     在建立每一棵决策树的过程中,有两点需要注意 - 采样与完全分裂

     step-1:两个随机采样的过程,random forest 对输入的数据要进行行、列的采样。行采样,采用有放回的方式,即在采样得到的样本集合中,可能有重复的样本,这样使训练时,每一棵树的输入样本都不是全部的样本,相对不容易出现over-fitting。假设输入样本为N个,采样的样本也为N个(采样的样本供生成模型使用)。然后进行列采样,从M个feature 中,选择m个(m << M)。

     step-2:对采样后的数据使用完全分裂的方式建立出决策树,决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。​

     优点——​在当前的很多数据集上,相对其他算法有着很大的优势:1、能够处理很高维度(feature很多)的数据,并且不用做特征选择;2、训练完后,能够给出哪些feature比较重要;3、创建随机森林时,对generlization error使用的是无偏估计;4、训练速度快;5、训练过程中,能够检测到feature间的互相影响;6、容易做成并行化方法;7、实现比较简单。

​     Gradient Boost Decision Tree:

      ​GBDT可用来分类、回归。在很多的数据上都有不错的效果。GBDT即MART(Multiple Additive Regression Tree),GBRT(Gradient Boost Regression Tree),Tree Net等。

 

    3、R实例应用记录:

    首先在电脑上安装R或者Rstudio,然后我们可以直接从CRAN上安装xgboost

    (http://www.tuicool.com/articles/FNzI3aZ​)

    ​install.packages('xgboost')

    加载包和数据

​> require(xgboost)

    Loading required package: xgboost

> data(agaricus.train,package='xgboost')

> data(agaricus.test,package='xgboost')

> train<-agaricus.train

> test<- agaricus.test

 

>-summary(train)

          Length Class     Mode   

data  820638 dgCMatrix S4     

label   6513    -none-    numeric  (标签项)

注:dgCMatrix 类是一类稀疏的数字矩阵压缩,稀疏,面向列的格式。实现在列的非零元素增加行顺序排序。 dgCMatrix是Matrix包类稀疏的数字矩阵“标准”。

    把训练集拆分为训练变量与训练标签。​

> data<-train$data

> label<-train$label

> summary(data)

   Length     Class      Mode 

   820638 dgCMatrix        S4 

> summary(label)

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 

 0.0000  0.0000  0.0000  0.4821  1.0000  1.0000 

    训练过程​

> bst<-xgboost(data,label,max.depth=2,eta=1,nround=2,objective="binary:logistic")

[0]     train-error:0.046522

[1]     train-error:0.022263

> cv.res <<span se-mark="1">- 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

​> cv.res 

    train.error/  mean train error/  std test.error/    mean test.error.std 

1: 0.046522     0.001102              0.046523               0.004410 

2: 0.022264     0.000864              0.022266               0.003450​

     预测过程

> pred<-predict(bst,test$data)​

(day-2 具体研究R实现xgboost的参数设置)​

0 0
原创粉丝点击