R: 学习Gradient Boosting算法,提高预测模型准确率

引言

预测模型的准确率可以用2种方法来提高:要么进行特征设计,要么直接使用boosting算法。参加过许多数据科学大赛后,我发现许多人喜欢用boosting算法,因为它只需更少的时间就能产生相似的结果。

目前有许多boosting算法,如Gradient Boosting、 XGBoost,、AdaBoost和Gentle Boost等等。每个算法都有自己基本的数学原理并且在使用它们时都会发现有一些细微的变化。如果你刚接触boosting算法,那太好了!从现在开始你可以在一周内学习所有这些概念。

在本文中,我解释了Gradient Boosting算法的基本概念和复杂性。另外,我也分享了一个实例来学习它在R中的应用。

简要的说明

一旦使用boosting算法,你很快就会发现两个频繁出现的术语:Bagging和Boosting。那么,它们有什么不同呢?下面将一一解释:

Bagging:这是一种方法,当你使用随机采样的数据,建立学习算法,采取简单的手段以找到bagging的可能性。

Boosting:与Bagging类似,但是,对样本的选择更智能。我们随后会对难以分类的样本分配较大的权重。

好!我明白你脑中会产生类似的疑问,像‘难以分类的样本’是什么意思?我怎么知道应该要给错误分类的样本多少额外的权重?不要着急,接下来我将回答你所有的疑问。

让我们从一个简单的例子开始学习

假设,你需要改进先前的模型M。现在,你发现模型已经有80%(在所有指标下)的准确率。你怎样提高M的性能呢?

一种简单的办法是利用一个新的输入变量集建立一个完全不同的模型,并尝试更好的学习模型。与之相反,我有一个更简单的方法,该模型是这样的:

Y = M(x) + error

如果我能够看到误差(error)并不是白噪声,而是跟输出结果(Y)有相关性呢?倘若我们在误差项(error)上再建立一个模型呢?比如,

error = G(x) + error2

也许,你会看到误差率提高到一个更高的数字,比如84%。让我们继续另一个步骤并对error2进行回归。

error2 = H(x) + error3

现在,我们把所有这些组合到一起:

Y = M(x) + G(x) + H(x) + error3

这也许会有超过84%的准确率。如果我们能够找到这三个学习模型的每一个的优化权重呢?

Y = alpha * M(x) + beta * G(x) + gamma * H(x) + error4

如果我们找到了好的权重,我们很有可能做了一个更好的模型。这是boosting学习的基本原则。当我第一次读到这个理论时,很快我就产生了2个问题:

1. 在回归/分类等式中我们能真正看到非白噪声误差么?如果不能,我们怎么能使用这个算法。

2. 如果这有可能的话,为什么没有接近100%的准确率呢?

在本文中我将以清晰简洁的方式来回答这些问题,Boosting通常用于弱学习,即没有分离白噪声的能力。第二,因为boosting会导致过拟合,所以我们需要在正确的时间点停止。

让我们试试把一个分类问题可视化

请看下面的图表:

我们从第一个箱线图开始。我们看到一条垂直线,这是我们的第一个弱学习模型。这时我们有3/10的误分类率。现在我们对3个误分类的样本分配更高的权重,此时,对它们分类非常重要。因此,垂直线向右边缘靠近。我们重复这个操作,然后以恰当的权重组合每个学习模型。

相关数学概念的解释

  • 如何给样本分配权重

我们以均匀分布的假设开始。将它记作D1,即在n个样本中出现的概率为1/n。

步骤1:假设alpha(t)

步骤2:得到弱分类结果h(t)

步骤3:在下次迭代中更新的总量分布

步骤4:在下次迭代中使用新的总量分布来找到下一个学习模型

被步骤3的数学表达式吓到了么?我来给你解释一下。简单地看一下e指数的参数,alpha是学习率,y是真实的响应(+1或-1),h(x)是通过学习得到的预测分类。本质上,如果学习有错误的话,e指数的值变成1*alpha或者-1*alpha。重要的是,如果最后一次预测出错,权重将会增加。那么接下来怎么做呢?

步骤5:迭代步骤1至步骤4直到找不到假设可以进一步提高。

步骤6:到目前为止,在所有用到的学习模型前使用加权平均。但是权重是多少呢?这里权重就是alpha值,alpha的计算公式如下:

是时候实践一下了,下面是个实例

最近我参加了由Analytics Vidhya组织的在线编程马拉松。为了变量转换更容易,我把文件complete_data中的测试数据和训练数据组合起来使用。我从基本的导入函数开始,把总量分到Devlopment、ITV和Scoring中。

#加载caret包,清空工作空间变量,并设置工作空间

library(caret)

rm(list=ls())

setwd("C:\\Users\\ts93856\\Desktop\\AV")

#导入Metrice包

library(Metrics)

#读取complete_data.csv文件

complete <- read.csv("complete_data.csv", stringsAsFactors = TRUE)

#提取训练集,评分集

train <- complete[complete$Train == 1,]

score <- complete[complete$Train != 1,]

#设置随机种子

set.seed(999)

#对训练集和测试集进行采样

ind <- sample(2, nrow(train), replace=T, prob=c(0.60,0.40))

trainData<-train[ind==1,]

testData <- train[ind==2,]

set.seed(999)

ind1 <- sample(2, nrow(testData), replace=T, prob=c(0.50,0.50))

trainData_ens1<-testData[ind1==1,]

testData_ens1 <- testData[ind1==2,]

table(testData_ens1$Disbursed)[2]/nrow(testData_ens1)

#Response Rate of 9.052%

下面你要做的是建立GBM模型。

fitControl <- trainControl(method = "repeatedcv", number = 4, repeats = 4)

trainData$outcome1 <- ifelse(trainData$Disbursed == 1, "Yes","No")

set.seed(33)

#将训练数据放入训练池中对模型参数训练,这里采样线性模型,方法采用gbm估计

gbmFit1 <- train(as.factor(outcome1) ~ ., data = trainData[,-26], method = "gbm", trControl = fitControl,verbose = FALSE)

#测试数据套入模型中进行验证预测

gbm_dev <- predict(gbmFit1, trainData,type= "prob")[,2]

gbm_ITV1 <- predict(gbmFit1, trainData_ens1,type= "prob")[,2]

gbm_ITV2 <- predict(gbmFit1, testData_ens1,type= "prob")[,2]

#计算模型AUC曲线

auc(trainData$Disbursed,gbm_dev)

auc(trainData_ens1$Disbursed,gbm_ITV1)

auc(testData_ens1$Disbursed,gbm_ITV2)

在这段代码运行结束后,正如你所看到的,所有AUC值将非常接近0.84,我将把特征设计的任务留给你,因为比赛还在继续进行中。同时欢迎你使用此代码来参加比赛。GBM是最为广泛使用的算法。XGBoost是另外一个提高学习模型的较快版本。

结语

我已经发现boosting学习非常快而且极其高效。它们从来不让我失望,总是能在kaggle或其它平台上能获得较高的初始评分。然而,这一切还取决你如何进行好的特征设计。

原文发布时间为:2015-12-29

时间: 2024-11-08 21:46:32

R: 学习Gradient Boosting算法,提高预测模型准确率的相关文章

从头了解Gradient Boosting算法

目的 虽然大多数Kaggle竞赛获胜者使用各种模型的叠加/集合,但是一个特定的模式是大部分集合的部分是梯度提升(GBM)算法的一些变体.以最新的Kaggle比赛获胜者为例:Michael Jahrer的解决方案是在安全驾驶的预测中的表示学习.他的解决方案是6个模型的混合.1 个LightGBM(GBM的变体)和5个神经网络.虽然他的成功归因于他为结构化数据发明的新的半监督学习,但梯度提升模型也发挥了作用. 尽管GBM被广泛使用,许多从业人员仍然将其视为复杂的黑盒算法,只是使用预建的库运行模型.这

How to Configure the Gradient Boosting Algorithm

How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost 0 0 0 0   Gradient boosting is one of the most powerful techniques for applied machine learning and as such is quickly becoming one of the most popula

Gradient Boosting Decision Tree学习

Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple Additive Regression Tree(MART),阿里貌似叫treelink. 首先学习GBDT要有决策树的先验知识. Gradient Boosting Decision Tree,和随机森林(random forest)算法一样,也是通过组合弱学习器来形成一个强学习器.GBDT的发明

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 September 9, 2016 in XGBoost 0 0 0 0   Gradient boosting is one of the most powerful techniques for building predictive models. In this post you will d

蓝桥杯 算法提高 日期计算

  算法提高 日期计算  时间限制:1.0s   内存限制:256.0MB       问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情况. 输入格式 输入只有一行 YYYY MM DD 输出格式 输出只有一行 W 数据规模和约定 1599 <= YYYY <= 2999 1 <= MM <= 12 1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期 1

数据结构 算法 书籍-c语言学习数据结构和算法有什么好书推荐吗?

问题描述 c语言学习数据结构和算法有什么好书推荐吗? c语言学习数据结构和算法有什么好书推荐吗? 求大神告知一下,谢谢了 解决方案 学习数据结构的好书哪位大哥介绍几本好书? 关于学习数据结构与算法的书 解决方案二: 刘汝佳的算法竞技入门经典,白色的 解决方案三: 数据结构 http://wenku.baidu.com/link?url=aFQ-ayTp5v3G0VJS1RXFfa-1a4cSm3TwUWD22pDUFqp6vX7CvSuepfFgePJnO8ZJcxMItGpbA3Y5KZthc

java-蓝桥杯算法提高 最大值问题

问题描述 蓝桥杯算法提高 最大值问题 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负. 输入格式 输入的第一行为n,数对的个数 以下n行每行两个整数 ai bi 输出格式 输出你选定的数对的ai+bi之和 样例输入 5 -403 -625 -847 901 -624 -708 -293 413 886 709 样例输出 1715 数据规模和约定 1<=n<=100 -1000<=ai,b

《中国人工智能学会通讯》——7.11 深度学习在推荐算法上的应用进展

7.11 深度学习在推荐算法上的应用进展 最近几年是深度学习发展的黄金时间,其在多个领域取得了重要进展,包括图像领域.语音领域.文本领域等.深度学习为科研工作者提供了一种非常有效的技术途径,其本质上是对数据特征进行深层次的抽象挖掘,通过大规模数据来学习有效的特征表示以及复杂映射机制,从而建立有效的数据模型.从方法上来说,深度学习具有的优点本质上是领域无关的.因此,在可预见的未来,深度学习将会作为一种较为通用的数据建模方法,对于多个潜在领域的应用产生重要影响. 在信息大数据时代,用户的个性化需求不

深度学习 目标检测算法 SSD 论文简介

  深度学习 目标检测算法 SSD 论文简介    一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf  Slides:http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf 二.代码训练测试: https://github.com/weiliu89/caffe/tree/ssd        一.论文算法大致流程: 1.类似"anchor"机制: