三、boosting回归 Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。他是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。他可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于Boosting 框架中,通过Boosting框架对训练样本集的操作,得到不同的训练样本子集,用该样本子集去训练生成基分类器;每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n 后,就可产生 n 个基分类器,然后Boosting框架算法将这 n个基分类器进行加权融合,产生一个最后的结果分类器,在这 n个基分类器中,每个单个的分类器的识别率不一定很高,但他们联合后的结果有很高的识别率,这样便提高了该弱分类算法的识别率。 Boosting方法简而言之就是采取少数服从多数的原理,他的合理性在于如果每个回归树的出错率为40%,那么1000棵决策树犯错误的概率就降到了4.40753e-11,这就比较小了。 对diabetes数据做boosting回归,使用到的函数包为mboost,使用函数为mboost.用法如下: mboost(formula, data = list(), baselearner = c("bbs", "bols", "btree", "bss", "bns"), ...) 其中formular需要使用到函数btree(): btree(..., tree_controls = ctree_control(stump = TRUE, mincriterion = 0, savesplitstats = FALSE)) 试运行下列代码: - <p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">[plain] view plaincopyprint?</p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">library(mboost) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">reg<-mboost(y~btree(x2.ltg)+btree(x2.bmi)+btree(x2.bmi.ltg), <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">data=w,control=boost_control(nu=0.1)) </p>
复制代码
我们可以得到boosting回归的信息,通过plot函数还有可视化结果。 这里值得一提的是我在做boosting回归时为了减少工作量直接做了变量选择(这个选择与回归树的最终选择是一致的,所以也有一定的道理)。最后交叉验证的结果为:测试集NMSE为0.5513152,训练集NMSE为0.4656569。比起上次计算的回归树模型测试集NMSE为0.7036484,训练集NMSE为0.518876好了不少。 四、bagging回归 与boosting回归想法类似,bagging回归的做法就是不断放回地对训练样本进行再抽样,对每个自助样本都建立一棵回归树,对于每一个观测,每棵树给一个预测,最后将其平均。 对diabetes数据做bagging回归,使用到的函数包为ipred,使用函数为bagging(),用法如下: bagging(formula, data, subset, na.action=na.rpart, ...) 主要参数介绍: Formula:回归方程形式 Data:数据集 Control:对树枝的控制,使用函数rpart.control(),可以控制诸如cp值,xval等参量。 输入代码: - <p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">[plain] view plaincopyprint?</p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">library(ipred) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">reg<-bagging(y~.,data=w,coob=TRUE,control=rpart.control(cp=0.025)) </p>
复制代码
结果为: Baggingregression trees with 25 bootstrap replications Call:bagging.data.fr ame(formula = y ~ ., data = w, coob = TRUE, control =rpart.control(cp = 0.025)) Out-of-bagestimate of root mean squared error: 58.3648 使用交叉验证(代码略),得到结果:测试集NMSE为0.5705753,训练集NMSE为0.3906232。比起上次计算的回归树模型测试集NMSE为0.7036484,训练集NMSE为0.518876好了不少。 五、随机森林回归 与bagging回归相比,随机森林则更进一步,不仅对样本进行抽样,还对变量进行抽样。 对diabetes数据做随机森林回归,使用到的函数包为randomForest,使用函数为randomForest(),用法如下: randomForest(formula, data=NULL, ..., subset, na.action=na.fail) 这里值得一提的是,随机森林有个十分牛逼的性质,不会出现过拟合现象,这也省去了我们确定树的分类程度等一系列麻烦的事情。得到结果:测试集NMSE为0.08992529,训练集NMSE为0.08835731,效果显著提升。随机森林还可以输出自变量重要性度量,试运行代码: - <p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">[plain] view plaincopyprint?</p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">library(randomForest) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">reg<-randomForest(y~.,data=w,importance=TRUE) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">reg$importance </p>
复制代码
得到结果: %IncMSE IncNodePurity x.glu 68.8034199 42207.351 x2.age 22.6784331 18569.370 x2.sex 6.2735713 2808.346 x2.bmi 1379.0675134 371372.494 x2.map 331.3925059 113411.547 x2.tc 18.6080948 14990.179 x2.ldl 24.3690847 17457.214 x2.hdl 216.2741620 64627.209 x2.tch 419.0451857 93688.855 x2.ltg 1514.0912885 379235.430 x2.glu 81.7568020 51984.121 x2.age.2 1.5242836 19364.582 x2.bmi.2 75.6345112 53635.024 x2.map.2 5.9156799 23049.475 x2.tc.2 1.6792683 15631.426 (省略部分输出) 其中第二列为均方误差递减意义下的重要性,第三列为精确度递减意义下的重要性。 六、其他的回归方法 除去我们所说的以上4种方法外,还有人工神经网络回归,SVM回归,他们可以通过nnet,rminer包中有关函数实现,这里我们从略。 在结束本文之前,我想我们可以做一件更有意义的事。在介绍diabetes数据集时,我们提到了这个数据最早是一个关于偏最小二乘的例子。那么想必他与这个模型的契合度还是不错的,我们可以尝试去算算利用偏最小二乘得到的训练集与测试集的NMSE。 代码如下: - <p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">[plain] view plaincopyprint?</p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">library(lars) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">library(pls) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">NMSE<-rep(0,5) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">NMSE0<-NMSE <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">for(i in 1:5){ <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">m<-index1[index2==i] <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">reg.pls <- plsr(y ~ x2, 64, data = diabetes[-m,], validation ="CV") <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">y0<-predict(reg.pls,diabetes[-m,]) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">y1<-predict(reg.pls,diabetes[m,]) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">NMSE0[i]<-mean((diabetes$y[-m]-y0)^2)/mean((diabetes$y[-m]-mean(diabetes$y[-m]))^2) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">NMSE[i]<-mean((diabetes$y[m]-y1)^2)/mean((diabetes$y[m]-mean(diabetes$y[m]))^2) <wbr></p><p style="margin-bottom: 10px; word-wrap: normal; border: 0px; list-style: none; word-break: normal; line-height: 28px; box-sizing: border-box; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei'; font-size: 16px; text-indent: 2em;">} </p>
复制代码
运行结果:测试集NMSE为0.6094071,训练集NMSE为0.4031211。这里也仅仅是得到了一个优于回归树,与bagging回归相当,不如随机森林的一个结果。也说明了机器学习方法在实际问题中还是有一定优势的。但这绝不意味着这样的回归可以代替OLS,毕竟这些数据挖掘的方法在表达式的简洁程度,计算量等诸多方面还是存在着或多或少的不足。 转正:http://blog.sina.com.cn/s/blog_67a8b77e0102w47v.html
|