xgboost原理与代码实现实例

一:xgboost原理

  在数据建模中,当我们有数个连续值特征时,Boosting分类器是最常用的非线性分类器方法

将成百上千个准确率较低的模型组合起来,成为一个准确率较高的模型,这个模型会不断的迭代,

每次迭代就会产生一颗新的树,然而当数据集比较大比较复杂的时候,我们可能需要几千次的迭代

这样造成巨大的计算瓶颈,xgboost正是为了解决这个瓶颈问题而提出的,单机它采用多线程来加速树的

构建过程。

在学习xgboost之前必须要熟悉gbdt,gbdt就是boosting方法和cart回归树,通过拟合上一个模型的残差进行学习。


此题直接从需要优化的目标函数说起,这个目标函数总体包括三部分,第一部分就是损失函数l,第二部分f(t)部分就是指的L1、L2正则,constant指的是常数项,xgboost是泰勒展开的三项做了一个近似,最终的目标函数只依赖于一阶和二阶导数。











二:xgboost代码实现例子

这个例子是在手写字的train.csv和test.csv,数据集的形式不是图片,而是将每张图片都转化为了1×784的数组,数组中每一个值对应的是像素点的大小;test中有28000个图像转化后的1×784,所以test集的为28000×784的总数。

# -*- coding=utf-8 -*-
import xgboost as xgb
import pandas as pd
import time
import numpy as np
now = time.time()
dataset=pd.read_csv('./train.csv')
train=dataset.iloc[:,1:].values
labels=dataset.iloc[:,:1].values
tests = pd.read_csv('./test.csv')
test=tests.iloc[:,:].values
paras={
    'booster':'gbtree',
    #手写字是0-9,是一个多类的问题,因此采用multisoft多分类器
    'objective':'multi:softmax',
    'num_class':10,
    'gamma':0.05,#树的叶子节点下一个区分的最小损失,越大算法模型越保守
    'max_depth':12,
    'lambda':450,#L2正则项权重
    'subsample':0.4,#采样训练数据,设置为0.5
    'colsample_bytree':0.7,#构建树时的采样比率
    'min_child_weight':12,#节点的最少特征数
    'silent':1,
    'eta':0.005,#类似学习率
    'seed':700,
    'nthread':4,#cpu线程数
}
plst=list(paras.items())#超参数放到集合plst;
offset=35000#训练集中数据50000,划分35000用作训练,15000用作验证
num_rounds=500#迭代次数
xgtest=xgb.DMatrix(test)#加载数据可以是numpy的二维数组形式,也可以是xgboost的二进制的缓存文件,加载的数据存储在对象DMatrixxgtrain=xgb.DMatrix(train[:offset,:],label=labels[:offset])#将训练集的二维数组加入到里面
xgval=xgb.DMatrix(train[offset:,:],label=labels[offset:])#将验证集的二维数组形式的数据加入到DMatrix对象中

watchlist =[(xgtrain,'train'),(xgval,'val')]#return训练和验证的错误率
model = xgb.train(plst,xgtrain,num_rounds,watchlist,early_stopping_rounds=100)
preds=model.predict(xgtest,ntree_limit=model.best_iteration)
np.savetxt('submission_xgb_MultiSoftMax.csv',np.c_[range(1,len(test)+1),preds],
           #np._c[]的作用就是将preds与前面的随机数两两配对,放到一块,看我的csdn整理的用法
           delimiter=',',header='ImageId,Label',comments='',fmt='%d')
#header标题为ImagerIdlabel就是列的名字为这俩个,看submission_xgb_MultiSoftMax.csv就都明白了
cost_time=time.time()-now
print("end...",'\n',"cost time",cost_time,"(s)...")
[0]    train-merror:0.189971    val-merror:0.191
Multiple eval metrics have been passed: 'val-merror' will be used for early stopping.

Will train until val-merror hasn't improved in 100 rounds.
[1]    train-merror:0.180514    val-merror:0.182286
[2]    train-merror:0.174029    val-merror:0.176857

[3]    train-merror:0.170171    val-merror:0.171429

。。。。

[498]    train-merror:0.111514    val-merror:0.117143
[499]    train-merror:0.111486    val-merror:0.117143

('end...', '\n', 'cost time', 1021.9334750175476, '(s)...')

经过500次迭代,历时十几分钟结束

输出的结果保存到csv文件中,如下:

ImageId,Label
1,2
2,0
3,9
4,7
5,2
6,7
7,0
8,3
9,0
10,3
11,5
12,7
13,4
14,0
15,4




猜你喜欢

转载自blog.csdn.net/gentelyang/article/details/80100300
今日推荐