第一次调整Boosting算法的参数可能是一个非常艰难的任务。
有很多参数可供选择,调整不同的参数会有不同的结果产生。
最好的调参可能是取决于数据。
每当我得到一个新的数据集,我都会学到一些新的东西。
对分类和回归树(CART)有很好的理解有助于我们理解boosting

我最喜欢的Boosting包是xgboost,它将在下面的所有示例中使用。
在讨论数据之前,我们先谈谈一些我认为最重要的参数。
这些参数大多用于控制模型适合数据的程度。
我们希望能够捕捉数据的结构,但仅限于真实的结构。
换句话说,我们不希望模型适合噪音(过拟合)

eta: 学习(或收缩)参数。
它控制Boosting中将使用来自新树的多少信息。
该参数必须大于0并且被限制为1.
如果它接近零,我们将仅使用来自每个新树的一小部分信息。
如果我们将eta设置为1,我们将使用新树中的所有信息。
eta的大值导致更快的收敛和更多的过度拟合问题。
小数值可能需要许多树来聚合。colsample_bylevel:就像随机森林一样,

有时候只需要看一些变量就可以增长树中的每个新节点。
如果我们查看所有变量,算法需要更少的树来收敛。
但例如,查看2/3的变量可能会导致模型更具鲁棒性以适应过度拟合。
有一个类似的参数叫做colsample_bytree,它重新采样每个新树中的变量,
而不是每个新节点。

max_depth : 控制树木的最大深度。 更深的树有更多的终端节点并且适合更多的数据。 如果我们深入发展,融合也需要更少的树木。 但是,如果树要深一些,我们将使用来自第一棵树的大量信息,算法的最终树对丢失函数的重要性将会降低。 Boosting从使用许多树木的信息中受益。 因此,巨大的树木是不可取的。 较小的树木也会增长得更快,并且因为Boosting在伪剩余中生长新的树木,我们不需要为单个树木进行任何惊人的调整。

sub_sample : 这个参数决定我们是估计一个Boosting还是一个随机Boosting。 如果我们使用1,我们会获得常规的Boosting。 0和1之间的值是随机的情况。 随机Boosting只使用一小部分数据来增长每棵树。 例如,如果我们使用0.5,每棵树将采样50%的数据增长。 随机增强是非常有用的,如果我们有异常值,因为它限制了它们对最终模型的影响,因为它们被放在几个子样本上。 而且,对于较小的实例,可能会有显着的改进,但它们更易于过度拟合。

gamma:控制在树中增长新节点所需的损失函数的最小减少量。 此参数对损失函数的规模很敏感,它将与响应变量的规模相关联。 使用不同于0的gamma的主要结果是停止生成无用的树的算法,这些树几乎不会减少样本内误差,并且可能导致过度拟合。 这个参数以后再说。

min_child_weigth :控制终端节点中观察值(实例)的最小数量。 此参数的最小值为1,这使得树只有一个观测值的终端节点。 如果我们使用更大的值,我们将限制可能的完美拟合。 这个参数也将留给第二部分。

example:

数据服从一下等式:

   这里: ,。变量数量K将被设置为10,实例数量将被设置为1000。

实验将更改每个Boosting参数,使所有其他参数保持不变以尝试隔离其效果。 标准模型将具有以下参数:

eta:0.1

colsample_bylevel:2/3

sub_sample:0.5

我会将这些参数中的每一个更改为代码中的值。 我们将分析测试样本中的收敛性和均方根误差(RMSE)。 下面的代码将准备一切运行模型。

library(xgboost)
library(ggplot2)
library(reshape2)
library(Ecdat) set.seed(1)
N = 1000
k = 10
x = matrix(rnorm(N*k),N,k)
b = (-1)^(1:k)
yaux=(x%*%b)^2
e = rnorm(N)
y=yaux+e # = select train and test indexes = #
train=sample(1:N,800)
test=setdiff(1:N,train) # = parameters = #
# = eta candidates = #
eta=c(0.05,0.1,0.2,0.5,1)
# = colsample_bylevel candidates = #
cs=c(1/3,2/3,1)
# = max_depth candidates = #
md=c(2,4,6,10)
# = sub_sample candidates = #
ss=c(0.25,0.5,0.75,1) # = standard model is the second value of each vector above = #
standard=c(2,2,3,2) # = train and test data = #
xtrain = x[train,]
ytrain = y[train]
xtest = x[test,]
ytest = y[test]

  

eta:我们将开始分析eta参数。 下面的代码估计每个候选eta的Boosting模型。 首先我们得到了收敛图,这表明eta的更大值收敛得更快。 然而,图下方的列车RMSE表明,更快的收敛并不能转化为良好的样本外表现。 较小的eta值如0.05和0.1是产生较小误差的值。 我的观点是,在这种情况下,0.1给我们一个良好的样本外性能和可接受的收敛速度。 请注意,eta = 0.5和1的结果与其他结果相比非常糟糕。

set.seed(1)
conv_eta = matrix(NA,500,length(eta))
pred_eta = matrix(NA,length(test), length(eta))
colnames(conv_eta) = colnames(pred_eta) = eta
for(i in 1:length(eta)){
params=list(eta = eta[i], colsample_bylevel=cs[standard[2]],
subsample = ss[standard[4]], max_depth = md[standard[3]],
min_child_weigth = 1)
xgb=xgboost(xtrain, label = ytrain, nrounds = 500, params = params)
conv_eta[,i] = xgb$evaluation_log$train_rmse
pred_eta[,i] = predict(xgb, xtest)
}

  

conv_eta = data.frame(iter=1:500, conv_eta)
conv_eta = melt(conv_eta, id.vars = "iter")
ggplot(data = conv_eta) + geom_line(aes(x = iter, y = value, color = variable))

  

(RMSE_eta = sqrt(colMeans((ytest-pred_eta)^2)))
## 0.05 0.1 0.2 0.5 1
## 9.964462 10.052367 10.223738 13.691344 20.929690

  

colsample_bylevel:下一个参数控制每个新节点中测试的变量(特征)的比例。 回想一下,如果我们使用1,所有变量都经过测试。 小于1的值只测试相应的变量部分。 收敛性表明该模型对colsample_bylevel不太敏感。 具有较小值的曲线略高于具有较大值的曲线。 最准确的模型似乎是每棵树中使用25%样本的模型。 这个结果可能会随着不同类型的数据而改变。 例如,我们生成的数据使用相同的分布来创建所有响应变量,并且测试向变量赋予相似的权重,这使得采样不那么重要。

set.seed(1)
conv_cs = matrix(NA,500,length(cs))
pred_cs = matrix(NA,length(test), length(cs))
colnames(conv_cs) = colnames(pred_cs) = cs
for(i in 1:length(cs)){
params = list(eta = eta[standard[1]], colsample_bylevel = cs[i],
subsample = ss[standard[4]], max_depth = md[standard[3]],
min_child_weigth = 1)
xgb=xgboost(xtrain, label = ytrain,nrounds = 500, params = params)
conv_cs[,i] = xgb$evaluation_log$train_rmse
pred_cs[,i] = predict(xgb, xtest)
}

  

conv_cs = data.frame(iter=1:500, conv_cs)
conv_cs = melt(conv_cs, id.vars = "iter")
ggplot(data = conv_cs) + geom_line(aes(x = iter, y = value, color = variable))

  

(RMSE_cs = sqrt(colMeans((ytest-pred_cs)^2)))

## 0.333333333333333 0.666666666666667                 1
## 10.29836 10.05237 10.20938

  

max_depth:第三个参数是每棵树中允许的最大深度。 当然,如果我们种植更大的树木,模型会更快地收敛(见下图)。 但是,最好的示例外性能是max_depth = 4。 请记住,更大的树木更可能导致过度贴合。 根据我的经验,不需要使用大于4到6的值,但可能有例外。

set.seed(1)
conv_md=matrix(NA,500,length(md))
pred_md=matrix(NA,length(test),length(md))
colnames(conv_md)=colnames(pred_md)=md
for(i in 1:length(md)){
params=list(eta=eta[standard[1]],colsample_bylevel=cs[standard[2]],
subsample=ss[standard[4]],max_depth=md[i],
min_child_weigth=1)
xgb=xgboost(xtrain, label = ytrain,nrounds = 500,params=params)
conv_md[,i] = xgb$evaluation_log$train_rmse
pred_md[,i] = predict(xgb, xtest)
}

  

conv_md=data.frame(iter=1:500,conv_md)
conv_md=melt(conv_md,id.vars = "iter")
ggplot(data=conv_md)+geom_line(aes(x=iter,y=value,color=variable))

  

  

(RMSE_md=sqrt(colMeans((ytest-pred_md)^2)))

##         2         4         6        10
## 12.502733 9.374257 10.134965 10.100691

  

sub_sample:下一个参数决定我们是否估计Boosting或Stochastic Boosting。 较小的值会导致样本中的误差更大,但它可能会产生更强大的样本外估计。 但是,如前所述,对于具有许多特征的样本,与观察次数和数据非常嘈杂时相比,您将获得更大的改进。 这里不是这种情况。 尽管如此,与确定性案例相比有一些改进,我相信这主要是由响应变量中的异常值引起的(boxplot变量y可以看到)。

set.seed(1)
conv_ss=matrix(NA,500,length(ss))
pred_ss=matrix(NA,length(test),length(ss))
colnames(conv_ss)=colnames(pred_ss)=ss
for(i in 1:length(ss)){
params=list(eta=eta[standard[1]],colsample_bylevel=cs[standard[2]],
subsample=ss[i],max_depth=md[standard[3]],
min_child_weigth=1)
xgb=xgboost(xtrain, label = ytrain,nrounds = 500,params=params)
conv_ss[,i] = xgb$evaluation_log$train_rmse
pred_ss[,i] = predict(xgb, xtest)
}

  

conv_ss=data.frame(iter=1:500,conv_ss)
conv_ss=melt(conv_ss,id.vars = "iter")
ggplot(data=conv_ss)+geom_line(aes(x=iter,y=value,color=variable))

  

(RMSE_ss=sqrt(colMeans((ytest-pred_ss)^2)))

##      0.25       0.5      0.75         1
## 9.731273 10.052367 11.119535 11.233855

  

这里的主要结论是,调整Boosting模型没有独特的规则。 最好的方法是测试几种配置。

请继续关注,如果你喜欢这篇文章,我们会尽快讨论Boosting。

Tuning xgboost in R:Part 1的更多相关文章

  1. A Complete Tutorial on Tree Based Modeling from Scratch (in R & Python)

    A Complete Tutorial on Tree Based Modeling from Scratch (in R & Python) MACHINE LEARNING PYTHON  ...

  2. xgboost: 速度快效果好的boosting模型

    转自:http://cos.name/2015/03/xgboost/ 本文作者:何通,SupStat Inc(总部在纽约,中国分部为北京数博思达信息科技有限公司)数据科学家,加拿大Simon Fra ...

  3. A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning

    A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning by Jason Brownlee on S ...

  4. How to Configure the Gradient Boosting Algorithm

    How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...

  5. 【转】The most comprehensive Data Science learning plan for 2017

    I joined Analytics Vidhya as an intern last summer. I had no clue what was in store for me. I had be ...

  6. COS访谈第十八期:陈天奇

    COS访谈第十八期:陈天奇 [COS编辑部按] 受访者:陈天奇      采访者:何通   编辑:王小宁 简介:陈天奇,华盛顿大学计算机系博士生,研究方向为大规模机器学习.他曾获得KDD CUP 20 ...

  7. [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes

    ##################    Rancher v2.1.7  +    Kubernetes 1.13.4  ################ ##################### ...

  8. 利用python进行数据分析2_数据采集与操作

    txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...

  9. Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页

    {#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...

随机推荐

  1. Storm 重启排查

    Storm实战常见问题及解决方案 https://www.cnblogs.com/catkins/p/5302634.html Storm 重启排查(续) https://www.iteye.com/ ...

  2. Maven高级:01.maven分模块构建&&02.私服的应用

    IntelliJ IDEA 2018.3.6 x64 07 Maven高级:01.maven分模块构建(上) 07 Maven高级:01.maven分模块构建(中) 07 Maven高级:01.mav ...

  3. Unity3D事件函数的执行顺序

    In Unity scripting, there are a number of event functions that get executed in a predetermined order ...

  4. pytorch(ch5

    读取图片数据集::# -*- coding: utf-8 -*-import torch as tfrom torch.utils import dataimport osfrom PIL impor ...

  5. 谷歌发布自家物理密匙TitanKey,能让人们远离互联网“黑洞”吗?

    随着隐私泄露事件的飞速增多,人们对如何保护自身隐私安全也越来越重视.而基于这种诉求,众多企业也在持续发力安全层面.毕竟,在目前危机四伏的互联网大环境下,真正能保护人们隐私安全的服务.设备等都是&quo ...

  6. 洛谷P1525 关押罪犯(并查集、二分图判定)

    本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...

  7. jquery预加载的几种例子

    实际编写前端页面时,有时候希望一打开某个页面就加载一些方法.下面是4种预加载方法. ①页面加载完之前执行,与嵌入的js加载方式一样(写jquery插件的时候使用) (function ($) { al ...

  8. dsp

  9. 【网络流】Modular Production Line

    [网络流]Modular Production Line 焦作上的一道,网络流24题中的原题.... https://nanti.jisuanke.com/t/31715 给出了1e5个点,但是因为最 ...

  10. Mysql_常规操作

    001.数据库 全局操作 # 连接数据库: # mysql -h主机地址 -u用户名 -p(登陆用户密码)     ​# 修改用户密码 mysqladmin # mysqladmin -u root ...