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

作者:TAVISH SRIVASTAVA 翻译:席雄芬 校对:丁一

引言

预测模型的准确率可以用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或其它平台上能获得较高的初始评分。然而,这一切还取决你如何进行好的特征设计。

你以前使用过Gradient Boosting么?模型运行结果如何?你有没有使用boosting学习来提高其它方面的能力。如果有,希望读者你能来稿分享你的经验,谢谢!

原文来自:http://www.analyticsvidhya.com

原文发布于微信公众号 - 大数据文摘(BigDataDigest)

原文发表时间:2015-12-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

50行PyTorch代码实现生成对抗网络(GANs)

【导读】这是一份非常简单的PyTorch实现GAN教程和代码。文中另附有TensorFlow实现版本。

19640
来自专栏机器之心

学界 | BMXNet:基于MXNet的开源二值神经网络实现

选自arXiv 作者:杨浩进等 机器之心编译 参与:李亚洲 ? 论文地址:https://arxiv.org/abs/1705.09864 摘要:二值神经网络(...

31150
来自专栏机器之心

学界 | 新研究提出DeepXplore:首个系统性测试现实深度学习系统的白箱框架

选自arXiv 机器之心编译 作者:Kexin Pei等 参与:吴攀、李亚洲 对于自动驾驶系统等事关人身安全的深度学习应用,了解其在极端情况下的表现是非常重要的...

36390
来自专栏人工智能头条

写给大家看的机器学习书【Part3】直观易懂的感知机学习算法PLA

21350
来自专栏AI科技评论

学界 | MnasNet论文解读:终端轻量化模型新思路

AI 科技评论按,本文作者陈泰红(ahong007@yeah.net),他为 AI 科技评论撰写了关于 MnasNet 论文的独家解读文章。

13010
来自专栏悦思悦读

利用逻辑回归模型判断用户提问意图

在之前开发聊天机器人的文章里,我们讲解了如何使用在线工具LUIS (https://luis.ai) 开发Chat bot的自然语言理解模型。 在构造问题解决型...

490140
来自专栏智能算法

分类算法之朴素贝叶斯分类(Naive Bayesian classification)

如果用一句话来概括贝叶斯分类器,那就是:根据样本集中的先验信息,来推算出某一个样本属于某一类的概率,然后根据推算出来的结果将该样本分为某类 。贝叶斯分类是一类分...

371120
来自专栏大数据文摘

干货 | Active Learning: 一个降低深度学习时间,空间,经济成本的解决方案

22820
来自专栏新智元

【CVPR 2018热文】MIT提出“透明设计”网络,揭开视觉黑盒

【新智元导读】MIT和普朗克航空系统公司的研究人员合作,提出了一类“透明设计网络”,在李飞飞等人提出的视觉理解数据库CLEVR上达到了99.1%的准确率,他们设...

35450
来自专栏新智元

超越GAN!OpenAI提出可逆生成模型,AI合成超逼真人像

【新智元导读】OpenAI最新提出的可逆生成模型Glow,可以使用相对少的数据,快速生成高清的逼真图像,具有GAN和VAE所不具备的精确操作潜在变量、需要内存少...

12500

扫码关注云+社区

领取腾讯云代金券