R语言与机器学习中的回归方法学习笔记

2023-11-02

 机器学习中的一些方法如决策树,随机森林,SVM,神经网络由于对数据没有分布的假定等普通线性回归模型的一些约束,预测效果也比较不错,交叉验证结果也能被接受。下面以R中lars包包含数据集diabetes为例说明机器学习中的回归方法。

一、数据集及交叉验证办法描述

          Diabetes数据集包含在R的lars包中,数据分为x,y,x2三个部分,因变量为y,数据是关于糖尿病的血液化验等指标。这个数据集最早被用在偏最小二乘回归的文章里。

         交叉验证采用指标NMSE来评价模型好坏。这一统计量是计算模型预测性能和基准模型的预测性能之间的比率。通常采用目标变量的平均值来作为基准模型。其取值范围通常为0~1。如果模型表现优于这个非常简单的基准模型预测,那么NMSE应明显小于1。NMSE的值越小,模型的性能就越好。NMSE的值大于1,意味着模型预测还不如简单地把所有个案的平均值作为预测值!

       交叉验证办法为将数据集分为5份,取4份作为训练集,1份作为测试集,共作5次,把误差平均起来作为衡量标准。选取代码如下:

 

[plain]  view plain copy print ?
  1. n<-length(dataset)  
  2. index1<-1:n  
  3. index2<-rep(1:5,ceiling(n/5))[1:n]  
  4. index2<-sample(index2,n)  


 

二、回归树

        决策树是通过一系列规则对数据进行分类的过程。它提供一种在什么条件下会得到什么值的类似规则的方法。决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。

      基本算法:

1.选择一个属性放置在根节点,为每个可能的属性值产生一个分支

2.将样本划分成多个子集,一个子集对应于一个分支

3.在每个分支上递归地重复这个过程,仅使用真正到达这个分支的样本

4.如果在一个节点上的所有样本拥有相同的类别,即停止该部分树的扩展

      构造决策树(集合划分)时选择属性:

1.ID3:Information Gain

2.C4.5:Gain Ratio

3.CART:Gini Index

         在R中我们使用rpart包中的rpart()函数实现树回归。我们先把rpart包中的两个十分重要的函数介绍如下:

        构建回归树的函数:rpart()用法如下:

rpart(formula, data, weights, subset,na.action = na.rpart, method,

     model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)

主要参数说明:

fomula回归方程形式:例如 y~x1+x2+x3。

data数据:包含前面方程中变量的数据框(dataframe)。

na.action缺失数据的处理办法:默认办法是删除因变量缺失的观测而保留自变量缺失的观测。

method根据树末端的数据类型选择相应变量分割方法,本参数有四种取值:连续型“anova”;离散型“class”;计数型(泊松过程)“poisson”;生存分析型“exp”。程序会根据因变量的类型自动选择方法,但一般情况下最好还是指明本参数,以便让程序清楚做哪一种树模型。

parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法。

control控制每个节点上的最小样本量、交叉验证的次数、复杂性参量:即cp:complexitypamemeter,这个参数意味着对每一步拆分,模型的拟合优度必须提高的程度,等等。

          进行剪枝的函数:prune()用法如下:

prune(tree, cp, ...)

主要参数说明:

tree一个回归树对象,常是rpart()的结果对象。

cp复杂性参量,指定剪枝采用的阈值。cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度,用来节省剪枝浪费的不必要的时间,R内部是怎么计算的我不知道,希望读者能够补充。

 

运行代码:

 

[plain]  view plain copy print ?
  1. library(rpart.plot)  
  2. reg<-rpart(y~.,w)  
  3. rpart.plot(reg,type=2,faclen=T)  


 

        得到回归树:


 

          我们可以通过print(reg)来看到树的各个节点的细节。

          我们来进行交叉验证,运行代码如下:

 

[plain]  view plain copy print ?
  1. w<-diabetes[,2:3]  
  2. n<-length(w$y)  
  3. index1<-1:n  
  4. index2<-rep(1:5,ceiling(n/5))[1:n]  
  5. index2<-sample(index2,n)  
  6. NMSE<-rep(0,5)  
  7. NMSE0<-NMSE  
  8. for(i in 1:5){  
  9. m<-index1[index2==i]  
  10. reg<-rpart(y~.,w[-m,])  
  11. y0<-predict(reg,w[-m,])  
  12. y1<-predict(reg,w[m,])  
  13. NMSE0[i]<-mean((w$y[-m]-y0)^2)/mean((w$y[-m]-mean(w$y[-m]))^2)  
  14. NMSE[i]<-mean((w$y[m]-y1)^2)/mean((w$y[m]-mean(w$y[m]))^2)  
  15.  


 

         R中输出结果:

> NMSE

[1] 0.7892592 0.8857756 0.8619379 1.0072968 0.7238316

> NMSE0

[1] 0.3503767 0.3417909 0.3400387 0.3192845 0.3467186

         明显出现了过拟合现象,应该使用剪枝函数,对模型进行修正。

> reg$cptable

           CP              n       split relerror    xerror       xstd

 0.29154165      0 1.0000000 1.0040015 0.05033316

 0.08785891      1 0.7084583 0.8040962 0.04896667

 0.05660089      2 0.6205994 0.7227529 0.04657623

 0.02169615      3 0.5639986 0.6424826 0.04302580

 0.02093950      4 0.5423024 0.6591446 0.04376777

 0.01723601      50.5213629 0.6749867 0.04578783

 0.01678503      6 0.5041269 0.6841483 0.04554068

 0.01349365      8 0.4705568 0.6845580 0.04429950

 0.01166564      9 0.4570632 0.7370893 0.04829371

10 0.01089168     11 0.43373190.7452419 0.05041336

11 0.01070564     12 0.42284020.7417955 0.05054043

12 0.01042308     14 0.40142890.7399988 0.05088835

13 0.01003363     15 0.39100580.7566972 0.05143535

14 0.01000000     17 0.37093860.7650728 0.05110011

        参照上述结果,选择合适的cp值。故修正为:

 

[plain]  view plain copy print ?
  1. reg2<-prune(reg,cp=0.025)  
  2. rpart.plot(reg2,type=2,faclen=T)  

         结果为:

 


 

          再次进行交叉验证(代码略)可以看到:

> NMSE

[1] 0.5982049 0.6995054 0.6826815 0.8970573 0.6407927

> NMSE0

[1] 0.5559462 0.5177565 0.4953384 0.5019682 0.5233709

          过拟合现象基本消除。

 

三、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))
       试运行下列代码:
 
[plain]  view plain copy print ?
  1. library(mboost)  
  2. reg<-mboost(y~btree(x2.ltg)+btree(x2.bmi)+btree(x2.bmi.ltg),  
  3. data=w,control=boost_control(nu=0.1))  
 
        我们可以得到boosting回归的信息,通过plot函数还有可视化结果。


 

        这里值得一提的是我在做boosting回归时为了减少工作量直接做了变量选择(这个选择与回归树的最终选择是一致的,所以也有一定的道理)。最后交叉验证的结果为:测试集NMSE0.5513152,训练集NMSE0.4656569。比起上次计算的回归树模型测试集NMSE0.7036484,训练集NMSE0.518876好了不少。
 
四、bagging回归

       与boosting回归想法类似,bagging回归的做法就是不断放回地对训练样本进行再抽样,对每个自助样本都建立一棵回归树,对于每一个观测,每棵树给一个预测,最后将其平均。

       对diabetes数据做bagging回归,使用到的函数包为ipred,使用函数为bagging(),用法如下:
bagging(formula, data, subset, na.action=na.rpart, ...)
主要参数介绍:
Formula:回归方程形式
Data:数据集
Control:对树枝的控制,使用函数rpart.control(),可以控制诸如cp值,xval等参量。
输入代码:
[plain]  view plain copy print ?
  1. library(ipred)  
  2. reg<-bagging(y~.,data=w,coob=TRUE,control=rpart.control(cp=0.025))  
结果为:

Baggingregression trees with 25 bootstrap replications 
Call:bagging.data.frame(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,效果显著提升。随机森林还可以输出自变量重要性度量,试运行代码:
[plain]  view plain copy print ?
  1. library(randomForest)  
  2. reg<-randomForest(y~.,data=w,importance=TRUE)  
  3. reg$importance  
得到结果:
                %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。
代码如下:
[plain]  view plain copy print ?
  1. library(lars)  
  2. library(pls)  
  3. NMSE<-rep(0,5)  
  4. NMSE0<-NMSE  
  5. for(i in 1:5){  
  6. m<-index1[index2==i]  
  7. reg.pls <- plsr(y x2, 64, data diabetes[-m,], validation ="CV")  
  8. y0<-predict(reg.pls,diabetes[-m,])  
  9. y1<-predict(reg.pls,diabetes[m,])  
  10. NMSE0[i]<-mean((diabetes$y[-m]-y0)^2)/mean((diabetes$y[-m]-mean(diabetes$y[-m]))^2)  
  11. NMSE[i]<-mean((diabetes$y[m]-y1)^2)/mean((diabetes$y[m]-mean(diabetes$y[m]))^2)  
  12.  
运行结果:测试集NMSE为0.6094071,训练集NMSE为0.4031211。这里也仅仅是得到了一个优于回归树,与bagging回归相当,不如随机森林的一个结果。也说明了机器学习方法在实际问题中还是有一定优势的。但这绝不意味着这样的回归可以代替OLS,毕竟这些数据挖掘的方法在表达式的简洁程度,计算量等诸多方面还是存在着或多或少的不足。

原文地址:

 机器学习中的一些方法如决策树,随机森林,SVM,神经网络由于对数据没有分布的假定等普通线性回归模型的一些约束,预测效果也比较不错,交叉验证结果也能被接受。下面以R中lars包包含数据集diabetes为例说明机器学习中的回归方法。

一、数据集及交叉验证办法描述

          Diabetes数据集包含在R的lars包中,数据分为x,y,x2三个部分,因变量为y,数据是关于糖尿病的血液化验等指标。这个数据集最早被用在偏最小二乘回归的文章里。

         交叉验证采用指标NMSE来评价模型好坏。这一统计量是计算模型预测性能和基准模型的预测性能之间的比率。通常采用目标变量的平均值来作为基准模型。其取值范围通常为0~1。如果模型表现优于这个非常简单的基准模型预测,那么NMSE应明显小于1。NMSE的值越小,模型的性能就越好。NMSE的值大于1,意味着模型预测还不如简单地把所有个案的平均值作为预测值!

       交叉验证办法为将数据集分为5份,取4份作为训练集,1份作为测试集,共作5次,把误差平均起来作为衡量标准。选取代码如下:

 

[plain]  view plain copy print ?
  1. n<-length(dataset)  
  2. index1<-1:n  
  3. index2<-rep(1:5,ceiling(n/5))[1:n]  
  4. index2<-sample(index2,n)  


 

二、回归树

        决策树是通过一系列规则对数据进行分类的过程。它提供一种在什么条件下会得到什么值的类似规则的方法。决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。

      基本算法:

1.选择一个属性放置在根节点,为每个可能的属性值产生一个分支

2.将样本划分成多个子集,一个子集对应于一个分支

3.在每个分支上递归地重复这个过程,仅使用真正到达这个分支的样本

4.如果在一个节点上的所有样本拥有相同的类别,即停止该部分树的扩展

      构造决策树(集合划分)时选择属性:

1.ID3:Information Gain

2.C4.5:Gain Ratio

3.CART:Gini Index

         在R中我们使用rpart包中的rpart()函数实现树回归。我们先把rpart包中的两个十分重要的函数介绍如下:

        构建回归树的函数:rpart()用法如下:

rpart(formula, data, weights, subset,na.action = na.rpart, method,

     model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)

主要参数说明:

fomula回归方程形式:例如 y~x1+x2+x3。

data数据:包含前面方程中变量的数据框(dataframe)。

na.action缺失数据的处理办法:默认办法是删除因变量缺失的观测而保留自变量缺失的观测。

method根据树末端的数据类型选择相应变量分割方法,本参数有四种取值:连续型“anova”;离散型“class”;计数型(泊松过程)“poisson”;生存分析型“exp”。程序会根据因变量的类型自动选择方法,但一般情况下最好还是指明本参数,以便让程序清楚做哪一种树模型。

parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法。

control控制每个节点上的最小样本量、交叉验证的次数、复杂性参量:即cp:complexitypamemeter,这个参数意味着对每一步拆分,模型的拟合优度必须提高的程度,等等。

          进行剪枝的函数:prune()用法如下:

prune(tree, cp, ...)

主要参数说明:

tree一个回归树对象,常是rpart()的结果对象。

cp复杂性参量,指定剪枝采用的阈值。cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度,用来节省剪枝浪费的不必要的时间,R内部是怎么计算的我不知道,希望读者能够补充。

 

运行代码:

 

[plain]  view plain copy print ?
  1. library(rpart.plot)  
  2. reg<-rpart(y~.,w)  
  3. rpart.plot(reg,type=2,faclen=T)  


 

        得到回归树:


 

          我们可以通过print(reg)来看到树的各个节点的细节。

          我们来进行交叉验证,运行代码如下:

 

[plain]  view plain copy print ?
  1. w<-diabetes[,2:3]  
  2. n<-length(w$y)  
  3. index1<-1:n  
  4. index2<-rep(1:5,ceiling(n/5))[1:n]  
  5. index2<-sample(index2,n)  
  6. NMSE<-rep(0,5)  
  7. NMSE0<-NMSE  
  8. for(i in 1:5){  
  9. m<-index1[index2==i]  
  10. reg<-rpart(y~.,w[-m,])  
  11. y0<-predict(reg,w[-m,])  
  12. y1<-predict(reg,w[m,])  
  13. NMSE0[i]<-mean((w$y[-m]-y0)^2)/mean((w$y[-m]-mean(w$y[-m]))^2)  
  14. NMSE[i]<-mean((w$y[m]-y1)^2)/mean((w$y[m]-mean(w$y[m]))^2)  
  15.  


 

         R中输出结果:

> NMSE

[1] 0.7892592 0.8857756 0.8619379 1.0072968 0.7238316

> NMSE0

[1] 0.3503767 0.3417909 0.3400387 0.3192845 0.3467186

         明显出现了过拟合现象,应该使用剪枝函数,对模型进行修正。

> reg$cptable

           CP              n       split relerror    xerror       xstd

 0.29154165      0 1.0000000 1.0040015 0.05033316

 0.08785891      1 0.7084583 0.8040962 0.04896667

 0.05660089      2 0.6205994 0.7227529 0.04657623

 0.02169615      3 0.5639986 0.6424826 0.04302580

 0.02093950      4 0.5423024 0.6591446 0.04376777

 0.01723601      50.5213629 0.6749867 0.04578783

 0.01678503      6 0.5041269 0.6841483 0.04554068

 0.01349365      8 0.4705568 0.6845580 0.04429950

 0.01166564      9 0.4570632 0.7370893 0.04829371

10 0.01089168     11 0.43373190.7452419 0.05041336

11 0.01070564     12 0.42284020.7417955 0.05054043

12 0.01042308     14 0.40142890.7399988 0.05088835

13 0.01003363     15 0.39100580.7566972 0.05143535

14 0.01000000     17 0.37093860.7650728 0.05110011

        参照上述结果,选择合适的cp值。故修正为:

 

[plain]  view plain copy print ?
  1. reg2<-prune(reg,cp=0.025)  
  2. rpart.plot(reg2,type=2,faclen=T)  

        结果为:

 


 

          再次进行交叉验证(代码略)可以看到:

> NMSE

[1] 0.5982049 0.6995054 0.6826815 0.8970573 0.6407927

> NMSE0

[1] 0.5559462 0.5177565 0.4953384 0.5019682 0.5233709

          过拟合现象基本消除。

 

三、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))
       试运行下列代码:

 
 
[plain]  view plain copy print ?
  1. library(mboost)  
  2. reg<-mboost(y~btree(x2.ltg)+btree(x2.bmi)+btree(x2.bmi.ltg),  
  3. data=w,control=boost_control(nu=0.1))  
        我们可以得到boosting回归的信息,通过plot函数还有可视化结果。


 

        这里值得一提的是我在做boosting回归时为了减少工作量直接做了变量选择(这个选择与回归树的最终选择是一致的,所以也有一定的道理)。最后交叉验证的结果为:测试集NMSE0.5513152,训练集NMSE0.4656569。比起上次计算的回归树模型测试集NMSE0.7036484,训练集NMSE0.518876好了不少。
四、bagging回归

       与boosting回归想法类似,bagging回归的做法就是不断放回地对训练样本进行再抽样,对每个自助样本都建立一棵回归树,对于每一个观测,每棵树给一个预测,最后将其平均。

       对diabetes数据做bagging回归,使用到的函数包为ipred,使用函数为bagging(),用法如下:
bagging(formula, data, subset, na.action=na.rpart, ...)
主要参数介绍:
Formula:回归方程形式
Data:数据集
Control:对树枝的控制,使用函数rpart.control(),可以控制诸如cp值,xval等参量。
输入代码:
[plain]  view plain copy print ?
  1. library(ipred)  
  2. reg<-bagging(y~.,data=w,coob=TRUE,control=rpart.control(cp=0.025))  
结果为:

Baggingregression trees with 25 bootstrap replications 
Call:bagging.data.frame(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,效果显著提升。随机森林还可以输出自变量重要性度量,试运行代码:
[plain]  view plain copy print ?
  1. library(randomForest)  
  2. reg<-randomForest(y~.,data=w,importance=TRUE)  
  3. reg$importance  
得到结果:
                %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。
代码如下:
[plain]  view plain copy print ?
  1. library(lars)  
  2. library(pls)  
  3. NMSE<-rep(0,5)  
  4. NMSE0<-NMSE  
  5. for(i in 1:5){  
  6. m<-index1[index2==i]  
  7. reg.pls <- plsr(y x2, 64, data diabetes[-m,], validation ="CV")  
  8. y0<-predict(reg.pls,diabetes[-m,])  
  9. y1<-predict(reg.pls,diabetes[m,])  
  10. NMSE0[i]<-mean((diabetes$y[-m]-y0)^2)/mean((diabetes$y[-m]-mean(diabetes$y[-m]))^2)  
  11. NMSE[i]<-mean((diabetes$y[m]-y1)^2)/mean((diabetes$y[m]-mean(diabetes$y[m]))^2)  
  12.  
运行结果:测试集NMSE为0.6094071,训练集NMSE为0.4031211。这里也仅仅是得到了一个优于回归树,与bagging回归相当,不如随机森林的一个结果。也说明了机器学习方法在实际问题中还是有一定优势的。但这绝不意味着这样的回归可以代替OLS,毕竟这些数据挖掘的方法在表达式的简洁程度,计算量等诸多方面还是存在着或多或少的不足。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R语言与机器学习中的回归方法学习笔记 的相关文章

随机推荐

  • apk部分手机安装失败_安卓手机安装软件失败的4种常见原因和解决办法

    安卓手机安装软件是普通人都会做的事情 不过这也是有可能会出现问题的 比如安卓手机安装软件失败了 这要怎么解决 安卓手机安装软件失败是一些新手用户可能会遇到的问题 虽然有很多方面的原因 不过大体上分为软件和硬件2种情况 下面就整理一些解决方法
  • Unity初学者对物体移动的总结

    Unity小白笔记文章 请大家多多指教 关于Unity3D控制物体移动的常用方法 首先控制物体移动即控制物体的空间坐标变化 在这里首先我们要知道Input输入事件 一般大家先想到的都是按一个按键去控制物体移动 Unity里也给我们提供了这种
  • Web前端之如何描述自己做过的项目

    在面试时 经过寒暄后 一般面试官会让介绍项目经验 常见的问法是 说下你最近的 或最拿得 出手的 一个项目 根据我们的面试经验 发现有不少候选人对此没准备 说起来磕磕巴巴 甚至有人说出项目经验从时间 段或技术等方面和简历上的不匹配 这样就会造
  • Unity 弓箭射靶游戏实践

    一 实现思路 根据之前的飞碟工厂进行改变 在射出弓箭手上没有弓箭之后重新生成新的弓箭 并将射出的弓箭在一定时间后进行回收 在右下角通过小窗口展示靶子的情况 射中不同的环数给予不同得分 二 主要涉及技术 物理引擎的使用 游戏对象的生产与回收
  • 关于autorelease pool一个较好的理解

    如果你能够真正的理解autorelease 那么你才是理解了Objective c的内存管理 Autorelease实际上只是把对release的调用延迟了 对于每一个Autorelease 系统只是把该Object放入了当前的Autore
  • 第二十三章 模块代码编写基础

    模块的创建 python中的所有 py文件都能做为模块 模块文件名 模块的命名应该遵循一般变量名的命名规则 模块的使用 import语句 import语句直接列出一个或多个需要加载的模块的名称 以逗号分隔 因为它用一个名称引用整个模块 im
  • Docker配置本地镜像与容器的存储位置

    使用find命令找到大于指定大小的文件 find type f size 10G 排除某个目录 find path media xww type f size 10G 修改Docker本地镜像与容器的存储位置的方法 方法一 软链接 默认情况
  • Qt程序crash信息的捕捉与跟踪(qt-mingw)

    在用qt编写程序时经常会遇到崩溃问题 如果抓取不到crash堆栈信息就会对崩溃问题束手无策 只能对其进行复现 推断 目录 一般解决crash问题时有如下步骤 如何执行以上3步骤 下面我详细介绍如何操作 步骤1 步骤2 步骤3 网友评论 一般
  • js取消默认事件和事件绑定

    1 默认事件 浏览器本事具备的一些功能 如鼠标右键菜单 a标签跳转页面 如果要阻止这些默认行为 可以用return false w3c中定义了ev preventDefault 这个不兼容IE11以下
  • Java 内存可见性与volatile

    在多核系统中 处理器一般有一层或者多层的缓存 这些的缓存通过加速数据访问 因为数据距离处理器更近 和降低共享内存在总线上的通讯 因为本地缓存能够满足许多内存操作 来提高CPU性能 如图 处理器的多层缓存模型 JVM需要实现跨平台的支持 它需
  • Acwing-1112. 迷宫

    include
  • [JavaScript][异步]Promise 构造函数是同步执行还是异步执行,那么 then 方法呢

    JavaScript 异步 Promise 构造函数是同步执行还是异步执行 那么 then 方法呢 const promise new Promise resolve reject gt console log 1 resolve cons
  • MATLAB查看变量的类型

    MATLAB查看变量的类型 gt gt a 100 a 100 gt gt class a ans double gt gt single a ans single 100 gt gt class ans ans single class
  • ubuntu 下 Android系统编译开 发 环境搭建

    官方的搭建android 系统源码 开发环境教程 https source android com source building 这个网址如果打不开 需要翻墙操作 Ubuntu JDK安装配置的详细步骤 Ubuntu JDK安装配置1 下
  • Prophet模型中plot_components四种主要成分含义

    Prophet模型中plot components四种主要成分含义 在Prophet模型中 plot components函数可以对时间序列数据的不同成分进行可视化分析 从而为使用者提供一定的参考依据 其中有四个主要成分 含义如下 tren
  • 多智能体强化学习与博弈论-博弈论基础2

    多智能体强化学习与博弈论 博弈论基础2 Repeated Games 重复博弈 之前我们介绍了一些单次博弈的例子 除了单次博弈外 重复博弈也是经常在我们生活中出现的 在重复博弈中智能体有机会在单次的博弈中占到对手的便宜 但是由于考虑到后来还
  • C语言动态内存管理(malloc,calloc,free,realloc)

    动态内存管理 前言 一 malloc 二 free 三 calloc 四 realloc 五 动态内存管理的常见问题 1 对空指针进行解引用操作 2 对动态开辟的空间越界访问 3 对非动态开辟的内存空间free 4 使用free释放动态内存
  • go语言使用thrift协议实现客户端和服务端报not enough arguments in call to oprot.WriteMessageBegin错误解决方案

    正常步骤 安装golang的Thrift包 go get git apache org thrift git lib go thrift 安装 Thrift 的 IDL 编译工具 http www apache org dyn closer
  • Mybatis学习笔记

    1 概述 MyBatis是一个优秀的持久层框架 它对JDBC操作数据库的过程进行封装 使开发者只需要关注 SQL本身 而不需要花费精力去处理例如注册驱动 创建connection 创建statement 手动设置参数 结果集检索等JDBC繁
  • R语言与机器学习中的回归方法学习笔记

    机器学习中的一些方法如决策树 随机森林 SVM 神经网络由于对数据没有分布的假定等普通线性回归模型的一些约束 预测效果也比较不错 交叉验证结果也能被接受 下面以R中lars包包含数据集diabetes为例说明机器学习中的回归方法 一 数据集