最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
2018-04-11 18:16
1851 查看
Lasso回归模型,是常用线性回归的模型,当模型维度较高时,Lasso算法通过求解稀疏解对模型进行变量选择。Lars算法则提供了一种快速求解该模型的方法。Lars算法的基本原理有许多其他文章可以参考,这里不过多赘述, 这里主要简介如何在R中利用lars算法包求解线性回归问题以及参数的选择方法。
以下的的一些用法参照lars包的帮助文件,再加上自己的使用心得。所用的示例数据diabetes是Efron在其论文中“Least Angle Regression”中用到的,可以在加载lars包后直接获得library(lars)
data(diabetes)
attach(diabetes) 该数据中含有三个变量x,x2,y, 其中x是一个有422X10维的矩阵,y是一422维个向量 ,x2是由x得到的 422X64维矩阵(compressive).
该函数提供了通过回归变量x和因变量y求解其回归解路径的功能。其中,
type ---- 表示所使用的回归方法,包括(lasso, lar, forward.stagewise, stepwise),选择不同的回归方法将得到不同的解路径;
normalize ---- 表示是否对变量进行归一化,当为TRUE时,程序将对x和y进行L2正则化;
intercept ---- 表示是否对变量进行中心化,当为TRUE时,程序将对x和y分别减去其均值。
下面使用四种不同的回归方法对其进行回归分析object1 <- lars(x,y,type="lasso")
object2 <- lars(x,y,type="lar")
object3 <- lars(x,y,type="forward.stagewise")
object4 <- lars(x,y,type="stepwise") 返回参数是一个list,其中包含了每次迭代得到的回归系数beta以及lambda等16个返回值。
可以分别对返回参数用plot( )画出其solution path的图像.
可以看到lars算法,算法的步数较少即迭代次数较少,且与参数个数相同,当数据维数非常高的时候lars算法相较于其他回归算法速度非常快。
此时就需要用到lars包中的cv.lars函数,
cv.lars(x, y, K = 10, index, trace = FALSE, plot.it = TRUE, se = TRUE,type = c("lasso", "lar", "forward.stagewise", "stepwise"), mode=c("fraction", "step"), ...)
K ----- 表示在进行交叉验证时,将数据随机分为K份,每次使用其中K-1份作为训练数据,用剩下的一份进行验证,最后计算这K次验证的均方误差;
mode ----- 表示用到的参数指标, step即按步数step去选择所需的参数,fraction即按照path中的横坐标|beta|/max|beta|去选择所需变量,fraction默认为0:100:1即 index=seq(from=0,to=1,length=100).
其他的type等参数与lars()中的意义相同,下面我们以type="lar"时为例,以x2为自变量,演示确定回归参数的方法.
首先为方便描述,我们先单独画出使用该方法得到的solution path
然后利用lars.cv来确定其参数,首先使用的index为mode="step"data(diabetes)
attach(diabetes)
cvsol1<-cv.lars(x2,y,type="lar",mode="step")
detach(diabetes)得到交叉验证的均方误差MSE分析结果图如下,
我可以看到由交叉验证得到的最优回归系数(使得均方误差MSE最小)是稀疏的,然后用以下语句得出最优解对应地的step步数为15,
> cvsol1$index[which.min(cvsol1$cv)]
[1] 15相应地,第15步对应的的回归系数以及其饱和度|bata|/max|beta|为
得到的回归系数beta的稀疏度为14与真实稀疏度相近, 此处计算其饱和度是为了接下来与用饱和度为 index确定回归系数做对比。
接下来我们用饱和度作为inedx来确定最优, 此处我们已知最优的饱和度大致在0在0.1之间,为便于对比,因此这里设置饱和度的区间为0:100:0.1data(diabetes)
attach(diabetes)
cvsol2<-cv.lars(x2,y,type="lar",mode="fraction", index=seq(from=0,to=0.1,length=100) )detach(diabetes)得到的均方误差MSE分析图为
然后同样是提取其中使得均方误差最小的饱和度,得到的结果为0.03232323
cvsol2$index[which.min(cvsol2$cv)]
[1] 0.03232323
与前面用step作为index的结果相似, 不过由于交叉验证每次都是随机分组,因此交叉验证的结果可能会由于分组的不同而不同.
predict(object, newx, s, type = c("fit", "coefficients"), mode = c("step",
"fraction", "norm", "lambda"), ...)
bject ---- 表示我们在1.中得到的包含了解路径信息的返回参数;
type ---- 当type为"fit"时, 可以给定一个新的样本newx,则该函数返回通过lars回归模型得到的预测值;
当type为"coefficient"时,则不需要输入newx, 该函数返回模型的回归系数;
mode ---- 表示我们输入的模型的参数类型,包括如2.中使用的步数step和饱和度fraction,还有罚项中的lambda等;
(注意若原模型没有给定的lambda, 此处的最优lambda同样可以用交叉验证得到)
当mode选定以后, 就可以在 s 中输入给定的参数值.(可以用向量的形式输入多个参数)
下面给出两组包含求解路径、选定参数、预测的完整代码示例。
首先是用饱和度为参数指标得到模型的回归系数的例子,这里通过交叉验证得到使得MSE最小的beta饱和度为0.2828283,因此,在进行预测时, 选择mode=“fraction”,s=0.2828283:
然后是用步数作为参数指标来,并对给定的样本进行预测的例子:
(这里以x2的前十行即前十个训练样本作为newx带入模型)
此处通过交叉验证得到使得MSE最小的步数为17,因此,在进行预测时, 选择mode=“step”,s=17, 输入样本数据后将 type 选为"fit", 即可得到相应的预测值 y. https://blog.csdn.net/nya0731/
以下的的一些用法参照lars包的帮助文件,再加上自己的使用心得。所用的示例数据diabetes是Efron在其论文中“Least Angle Regression”中用到的,可以在加载lars包后直接获得library(lars)
data(diabetes)
attach(diabetes) 该数据中含有三个变量x,x2,y, 其中x是一个有422X10维的矩阵,y是一422维个向量 ,x2是由x得到的 422X64维矩阵(compressive).
1. 求解路径solution path
lars(x, y, type = c("lasso", "lar", "forward.stagewise", "stepwise"), trace = FALSE, normalize = TRUE, intercept = TRUE, Gram, eps = .Machine$double.eps, max.steps, use.Gram = TRUE)该函数提供了通过回归变量x和因变量y求解其回归解路径的功能。其中,
type ---- 表示所使用的回归方法,包括(lasso, lar, forward.stagewise, stepwise),选择不同的回归方法将得到不同的解路径;
normalize ---- 表示是否对变量进行归一化,当为TRUE时,程序将对x和y进行L2正则化;
intercept ---- 表示是否对变量进行中心化,当为TRUE时,程序将对x和y分别减去其均值。
下面使用四种不同的回归方法对其进行回归分析object1 <- lars(x,y,type="lasso")
object2 <- lars(x,y,type="lar")
object3 <- lars(x,y,type="forward.stagewise")
object4 <- lars(x,y,type="stepwise") 返回参数是一个list,其中包含了每次迭代得到的回归系数beta以及lambda等16个返回值。
可以分别对返回参数用plot( )画出其solution path的图像.
可以看到lars算法,算法的步数较少即迭代次数较少,且与参数个数相同,当数据维数非常高的时候lars算法相较于其他回归算法速度非常快。
2. 利用交叉验证(Cross Validtion)确认参数
在上一步我们可以看到lars一次给了其solution path上的所有解,我们需要确定其中哪个解是我们真正要用到的. 在lasso模型中,罚项由参数lambda进行控制,当给定了lambda模型才能够确定下来。一个好的回归模型,需要给定一个合适的lambda,但是lamda的范围往往比较大。注意到lars算法给出的解路径上的解个数是有限的,不同的解即不同的beta就对应了不同的lambda, 从solution path的图可以看到, 我们可以通过选定算法的step步数或者选定beta饱和度|beta|/max|beta|(此处| |表示一范数,饱和度同样也表征了解的稀疏度)来选定模型的参数.此时就需要用到lars包中的cv.lars函数,
cv.lars(x, y, K = 10, index, trace = FALSE, plot.it = TRUE, se = TRUE,type = c("lasso", "lar", "forward.stagewise", "stepwise"), mode=c("fraction", "step"), ...)
K ----- 表示在进行交叉验证时,将数据随机分为K份,每次使用其中K-1份作为训练数据,用剩下的一份进行验证,最后计算这K次验证的均方误差;
mode ----- 表示用到的参数指标, step即按步数step去选择所需的参数,fraction即按照path中的横坐标|beta|/max|beta|去选择所需变量,fraction默认为0:100:1即 index=seq(from=0,to=1,length=100).
其他的type等参数与lars()中的意义相同,下面我们以type="lar"时为例,以x2为自变量,演示确定回归参数的方法.
首先为方便描述,我们先单独画出使用该方法得到的solution path
然后利用lars.cv来确定其参数,首先使用的index为mode="step"data(diabetes)
attach(diabetes)
cvsol1<-cv.lars(x2,y,type="lar",mode="step")
detach(diabetes)得到交叉验证的均方误差MSE分析结果图如下,
我可以看到由交叉验证得到的最优回归系数(使得均方误差MSE最小)是稀疏的,然后用以下语句得出最优解对应地的step步数为15,
> cvsol1$index[which.min(cvsol1$cv)]
[1] 15相应地,第15步对应的的回归系数以及其饱和度|bata|/max|beta|为
得到的回归系数beta的稀疏度为14与真实稀疏度相近, 此处计算其饱和度是为了接下来与用饱和度为 index确定回归系数做对比。
接下来我们用饱和度作为inedx来确定最优, 此处我们已知最优的饱和度大致在0在0.1之间,为便于对比,因此这里设置饱和度的区间为0:100:0.1data(diabetes)
attach(diabetes)
cvsol2<-cv.lars(x2,y,type="lar",mode="fraction", index=seq(from=0,to=0.1,length=100) )detach(diabetes)得到的均方误差MSE分析图为
然后同样是提取其中使得均方误差最小的饱和度,得到的结果为0.03232323
cvsol2$index[which.min(cvsol2$cv)]
[1] 0.03232323
与前面用step作为index的结果相似, 不过由于交叉验证每次都是随机分组,因此交叉验证的结果可能会由于分组的不同而不同.
3. 利用回归模型进行预测
在利用上述方法确定了模型中的参数后,就可以使用predict来进行预测predict(object, newx, s, type = c("fit", "coefficients"), mode = c("step",
"fraction", "norm", "lambda"), ...)
bject ---- 表示我们在1.中得到的包含了解路径信息的返回参数;
type ---- 当type为"fit"时, 可以给定一个新的样本newx,则该函数返回通过lars回归模型得到的预测值;
当type为"coefficient"时,则不需要输入newx, 该函数返回模型的回归系数;
mode ---- 表示我们输入的模型的参数类型,包括如2.中使用的步数step和饱和度fraction,还有罚项中的lambda等;
(注意若原模型没有给定的lambda, 此处的最优lambda同样可以用交叉验证得到)
当mode选定以后, 就可以在 s 中输入给定的参数值.(可以用向量的形式输入多个参数)
下面给出两组包含求解路径、选定参数、预测的完整代码示例。
首先是用饱和度为参数指标得到模型的回归系数的例子,这里通过交叉验证得到使得MSE最小的beta饱和度为0.2828283,因此,在进行预测时, 选择mode=“fraction”,s=0.2828283:
然后是用步数作为参数指标来,并对给定的样本进行预测的例子:
(这里以x2的前十行即前十个训练样本作为newx带入模型)
此处通过交叉验证得到使得MSE最小的步数为17,因此,在进行预测时, 选择mode=“step”,s=17, 输入样本数据后将 type 选为"fit", 即可得到相应的预测值 y. https://blog.csdn.net/nya0731/
相关文章推荐
- 生存分析cox回归R语言与SAS以及STATA参数估计结果不同
- 以调整复决定系数和AIC为模型选择标准,建立前进法、后退法、逐步回归法的r语言代码
- python机器学习库sklearn——数据归一化、标准化、特征选择、逻辑回归、贝叶斯分类器、KNN模型、支持向量机、参数优化
- 《Spark机器学习》笔记——Spark回归模型(最小二乘回归、决策树回归,模型性能评估、目标变量变换、参数调优)
- 【scikit-learn】如何进行模型参数的选择
- nlssort函数的用法以及参数
- Wget用法以及参数解释
- 自回归模型(AR)、移动平均模型(MA)、自回归移动平均模型(ARMA)以及差分自回归移动平均模型(ARIMA)辨析
- MVC4 ViewModel 存入多个Model,以及前台的显示用法。具体类名可以参数代替
- js中sort()方法的用法,参数以及排序原理
- 【Scikit-Learn 中文文档】模型选择:选择估计量及其参数 - 关于科学数据处理的统计学习教程 - scikit-learn 教程 | ApacheCN
- tensorflow学习(4):保存模型Saver.save()的参数命名机制以及restore并创建手写字体识别引擎
- 【Scikit-Learn 中文文档】模型选择:选择估计量及其参数 - 关于科学数据处理的统计学习教程 - scikit-learn 教程 | ApacheCN
- 用Intent传递参数以及菜单的用法
- 画笔的用法以及其参数
- 2.9 线性回归算法学习——kNN模型解决回归问题及网格搜索最优参数
- 两种模型选择和超参数调整方法及Spark MLlib使用示例(Scala/Java/Python)
- JS知识点:sort()方法的用法,参数以及排序原理
- 【Scikit-Learn 中文文档】优化估计器的超参数 - 模型选择和评估 - 用户指南 | ApacheCN
- R in action读书笔记(11)-第八章:回归-- 选择“最佳”的回归模型