我们知道广义线性模型包括了一维连续因变量、多维连续因变量、非负次数因变量、二元离散因变量、多元离散因变等的回归模型。然而LASSO对以上的数据类型都适合,也可以说LASSO 回归的特点是在拟合广义线性模型的同时进行变量筛选(variable selection)和复杂度调整(regularization)。变量筛选是指不把所有的变量都放入模型中进行拟合,而是有选择的把变量放入模型从而得到更好的性能参数。复杂度调整是指通过一系列参数控制模型的复杂度,从而避免过度拟合(Overfitting)。总的来说LASSO对数据的要求很低。对于线性模型来说,复杂度与模型的变量数有直接关系,变量数越多,模型复杂度就越高。 更多的变量在拟合时往往可以给出一个看似更好的模型,但是同时也面临过度拟合的危险。此时如果用全新的数据去验证模型(validation),通常效果很差。 一般来说,变量数大于数据点数量很多,或者某一个离散变量有太多独特值时,都有可能过度拟合。
今天我们给大家介绍下在R语言如何实现LASSO模型构建,其中有两个包是可以实现的(glmnet和lars)。因为glmnet涉及范围涉及广义线性模型,我们就主要介绍下lars是怎么实现LASSO的。包的安装我就不多讲了,install.pacakges(),你懂的。
首先我们看下其函数lars()。该函数提供了通过回归变量x和因变量y求解其回归模型。
其中主要的参数:
1. type 模型的类型。Lar-最小角回归,forward.stagewise-无穷小逐步回归,stagewise-逐步回归。
2. normalize 表示是否对变量进行归一化,当为TRUE时,程序将对x和y进行L2正则化。
3. intercept表示是否对变量进行中心化,当为TRUE时,程序将对x和y分别减去其均值。
diabetes数据中含有三个变量x,x2,y,其中x是一个有422X10维的矩阵,y是一422维个向量 ,x2是由x得到的 422X64维矩阵。
示例程序:
library(lars)
data(diabetes)
attach(diabetes)
object1
plot(object)
图中横坐标代表的beta值或者步数,竖坐标代表的变量的参数。
接下来就是模型的优化,用到的函数是cv.lars()。其主要的功能是确定最优解的步数,或者beta值。
其中主要的参数:
K 交叉验证的次数,默认10倍交叉验证。
type同lars指的模型的类型。
mode 指用到的参数指标。step即按步数step去选择所需的参数,fraction即按照path中的横坐标|beta|/max|beta|去选择所需变量,fraction默认为0:100:1即 index=seq(from=0,to=1,length=100)。
程序实例:
cv_sol
均方误差MSE分析图为:
然后就是获取最优最优回归系数(使得均方误差MSE最小)。
fra=cv_sol$index[which.min(cv_sol$cv)]
接下来就是通过上面得到的fra,获取对应的参数值
object$beta[fra,]
最后就是模型的预测功能,我们用到的函数是predict。
其主要参数:
object表示我们通过lars计算得到的包含了解路径信息的返回参数;
type当type为"fit"时, 可以给定一个新预测样本自变量数据,则该函数返回通过lars回归模型得到的预测值;当type为"coefficient"时,则不需要输入新数据, 该函数返回模型的回归系数相当于cv.lars。
mode表示我们输入的模型的参数类型,同cv.lars函数。
S表示通过cv.lars确定的最优解步数或者beta值。
示例程序:
res=predict(object,newx=x[1:5,],s=fra,type="fit", mode="step")
如上图得到我们想要的预测结果。
欢迎大家学习交流!