基于R语言的梯度推进算法介绍
基于R语言的梯度推进算法介绍
通常来说 , 我们可两个方面来提高一个预测模型的准确性:完善特征工程(feature engineering)或是直接使用Boosting算法 。通过大量数据科学竞赛的试炼 , 我们可以发现人们更钟爱于Boosting算法 , 这是因为和其他方法相比 , 它在产生类似的结果时往往更加节约时间 。
Boosting算法有很多种 , 比如梯度推进(Gradient Boosting)、XGBoost、AdaBoost、Gentle Boost等等 。每一种算法都有自己不同的理论基础 , 通过对它们进行运用 , 算法之间细微的差别也能够被我们所察觉 。如果你是一个新手 , 那么太好了 , 从现在开始 , 你可以用大约一周的时间来了解和学习这些知识 。
在本文中 , 笔者将会向你介绍梯度推进算法的基本概念及其复杂性 , 此外 , 文中还分享了一个关于如何在R语言中对该算法进行实现的例子 。
快问快答每当谈及Boosting算法 , 下列两个概念便会频繁的出现:Bagging和Boosting 。那么 , 这两个概念是什么 , 它们之间究竟有什么区别呢?让我们快速简要地在这里解释一下:
Bagging:对数据进行随机抽样、建立学习算法并且通过简单平均来得到最终概率结论的一种方法 。
Boosting:与Bagging类似 , 但在样本选择方面显得更为聪明一些——在算法进行过程中 , 对难以进行分类的观测值赋予了越来越大的权重 。
我们知道你可能会在这方面产生疑问:什么叫做越来越大?我怎么知道我应该给一个被错分的观测值额外增加多少的权重呢?请保持冷静 , 我们将在接下来的章节里为你解答 。
从一个简单的例子出发假设你有一个初始的预测模型M需要进行准确度的提高 , 你知道这个模型目前的准确度为80%(通过任何形式度量) , 那么接下来你应该怎么做呢?
有一个方法是 , 我们可以通过一组新的输入变量来构建一个全新的模型 , 然后对它们进行集成学习 。但是 , 笔者在此要提出一个更简单的建议 , 如下所示:
Y = M(x)error
如果我们能够观测到误差项并非白噪声 , 而是与我们的模型输出(Y)有着相同的相关性 , 那么我们为什么不通过这个误差项来对模型的准确度进行提升呢?比方说:
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算法的一个基本原则 , 当我初次接触到这一理论时 , 我的脑海中很快地冒出了这两个小问题:
1.我们如何判断回归/分类方程中的误差项是不是白噪声?如果无法判断 , 我们怎么能用这种算法呢?
2.如果这种算法真的这么强大 , 我们是不是可以做到接近100%的模型准确度?
接下来 , 我们将会对这些问题进行解答 , 但是需要明确的是 , Boosting算法的目标对象通常都是一些弱算法 , 而这些弱算法都不具备只保留白噪声的能力;其次 , Boosting有可能导致过度拟合 , 所以我们必须在合适的点上停止这个算法 。
试着想象一个分类问题请看下图:
从最左侧的图开始看 , 那条垂直的线表示我们运用算法所构建的分类器 , 可以发现在这幅图中有3/10的观测值的分类情况是错误的 。接着 , 我们给予那三个被误分的“+”型的观测值更高的权重 , 使得它们在构建分类器时的地位非常重要 。这样一来 , 垂直线就直接移动到了接近图形右边界的位置 。反复这样的过程之后 , 我们在通过合适的权重组合将所有的模型进行合并 。
算法的理论基础我们该如何分配观测值的权重呢?
通常来说 , 我们从一个均匀分布假设出发 , 我们把它称为D1 , 在这里 , n个观测值分别被分配了1/n的权重 。
步骤1:假设一个α(t);
步骤2:得到弱分类器h(t);
步骤3:更新总体分布 ,
其中 ,
步骤4:再次运用新的总体分布去得到下一个分类器;
觉得步骤3中的数学很可怕吗?让我们来一起击破这种恐惧 。首先 , 我们简单看一下指数里的参数 , α表示一种学习率 , y是实际的回应值(+1或-1) , 而h(x)则是分类器所预测的类别 。简单来说 , 如果分类器预测错了 , 这个指数的幂就变成了1 *α , 反之则是-1*α 。也就是说 , 如果某观测值在上一次预测中被预测错误 , 那么它对应的权重可能会增加 。那么 , 接下来该做什么呢?
步骤5:不断重复步骤1-步骤4 , 直到无法发现任何可以改进的地方;
步骤6:对所有在上面步骤中出现过的分类器或是学习算法进行加权平均 , 权重如下所示:
案例练习最近我参加了由Analytics Vidhya组织的在线hackathon活动 。为了使变量变换变得容易 , 在complete_data中我们合并了测试集与训练集中的所有数据 。我们将数据导入 , 并且进行抽样和分类 。
library(caret)rm(list=ls())setwd("C:Usersts93856DesktopAV")library(Metrics)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%
接下来 , 就是构建一个梯度推进模型(Gradient Boosting Model)所要做的:
fitControl <- trainControl(method = "repeatedcv", number = 4, repeats = 4)trainData$outcome1 <- ifelse(trainData$Disbursed == 1, "Yes","No")set.seed(33)gbmFit1 <- train(as.factor(outcome1) ~ ., data = http://www.cn-tt.com/kx/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(trainData$Disbursed,gbm_dev)auc(trainData_ens1$Disbursed,gbm_ITV1)auc(testData_ens1$Disbursed,gbm_ITV2)
在上述案例中 , 运行代码后所看到的所有AUC值将会非常接近0.84 。我们随时欢迎你对这段代码进行进一步的完善 。在这个领域 , 梯度推进模型(GBM)是最为广泛运用的方法 , 在未来的文章里 , 我们可能会对GXBoost等一些更加快捷的Boosting算法进行介绍 。
结束语笔者曾不止一次见识过Boosting算法的迅捷与高效 , 在Kaggle或是其他平台的竞赛中 , 它的得分能力从未令人失望 , 当然了 , 也许这要取决于你能够把特征工程(feature engineering)做得多好了 。
【如何在R语言中使用Logistic回归模型:R语言对回归模型建模结果看相关性】以上是小编为大家分享的关于基于R语言的梯度推进算法介绍的相关内容 , 更多信息可以关注环球青藤分享更多干货
如何用R语言编出一个多元线性回归模型的方
)attach(byu)lm(salary~age exper)lm(salary~.,byu)#利用全变量做线性回归lm()只出回归系数 , 得为详尽的回归信息 , 应结果作为数据保存或者使用“拟合模型”(fittedmodel)result<-lm(salary~age exper age*exper,data=http://www.cn-tt.com/kx/byu)summary(result)myresid<-result$resid#获得残差vcov(result)#针对于拟合后的模型计算方差-协方差矩阵shapiro.test(b)#做残差的正太性检验norm(bres);line(bres)#做残差
怎么用R语言表示一个有协变量的线性回归模型?
既然是随机么我然就是要用到lua的随机函数了 , 但是lua的随机函点小毛病 , 如果时间太短 , 那么取到的随机数可能是一样的 , 如果随机的数字太小也有点毛病 , 谁用谁知道埃全是眼泪埃 。所以我们的第一步是构造一个我们自己的随机函数 。
多元线性回归模型用r语言怎么来实现
)attach(byu)
lm(salary ~ age exper)
lm(salary~.,byu)#利用全部自变量做线性回归
lm()只能回归系数 , 要想得为详尽的回归信息该将结果作为数据或者使用“拟合模型”(fitted model)
result<-lm(salary~ageexperage*exper, data=http://www.cn-tt.com/kx/byu)
summary(result)
myresid<-result$resid #获得残差
vcov(result) #针对于拟合后的模型计算方差-协方差矩阵
shapiro.test(b) #做残差的正太性检验
norm(bres);line(bres) #做残差
如何在R语言中使用Logistic回归模型
logit=glm(y~x1 x2,data=http://www.cn-tt.com/kx/data,family=binomial(link='logit'))
glm表示广义线性 , data表示y,x1,x2所在据集 , family中的link用来回归 , logit表示选择logistic回归
r语言怎么计算回归模型的置信区间
用predict就能做到 。
predict的用法:
predict(object, newdata, se.fit = FALSE, scale = NULL, df = Inf,
interval = c("none", "confidence", "prediction"),
level = 0.95, type = c("response", "terms"),
terms = NULL, na.action = na.pass,
pred.var = res.var/weights, weights = 1, ...)
只要注意其中的object , newdata , interval , level , type就行 。
object是你的回归模型 。
newdata是使用的数据 。
interval选confidence或者"c" 。
level是置信水平 。
type在计算响应变量时使用response , 对变量计算使用terms 。如果是terms , 需要用后面的terms参数指定变量名(character类型向量形式) 。
response的话返回一个数据框 , 三列 , 分别是预测值 , 区间下限和上限 。
terms返回一个list 。
- 八字命理学教你如何交到益友?
- 风水教你如何弥补男主人的财气!
- 下学期如何提高你的孩子成绩!赶紧看看吧!
- 带舍本的成语
- 2020年犯太岁?如何破解并提高运势?
- 最打动女生的道歉话语,给女朋友道歉感动到哭
- 如何算生辰八字婚姻配对分析,算姻缘婚姻,八字合婚,看正缘桃花
- 算命大师如何看婚姻八字查询幸福与否,算姻缘感情,看正缘桃花
- 算命大师,八字预测,如何从女人八字算命 姻缘婚姻运势,看正缘桃花
- 解说老公桃花运旺如何破解,算婚姻,看事业财运