Lasso回归(Least Absolute Shrinkage and Selection Operator Regression)是一种线性回归模型,通过引入L1正则化(即Lasso惩罚项),对模型中的系数进行压缩,使某些系数缩减至零,从而实现特征选择和模型稀疏性。Lasso回归由Robert Tibshirani提出,主要用于处理变量过多而样本量较少的情况,能够有效防止过拟合并解决多重共线性问题。
Lasso回归的基本原理
Lasso回归通过在目标函数中添加一项L1正则化项,即变量系数的绝对值之和,来压缩模型。这使得一些系数变为零,从而实现特征选择和模型稀疏性。具体来说,Lasso回归的优化目标函数如下:
[ \min_{\beta} \left( \sum_{i=1}^n (y_i - x_i^T \beta)^2 + \alpha \sum_{j=1}^p |\beta_j| \right) ]
其中,( n ) 是样本数量,( p ) 是特征数量,( y_i ) 是实际观测值,( x_i^T \beta ) 是预测值,( \beta ) 是模型参数(系数),( \alpha ) 是L1正则化项的权重。
Lasso回归的应用场景和优缺点
应用场景:
一、特征选择:Lasso回归可以用于选择最重要的特征,通过将不重要的特征系数缩减为零,简化模型并提高模型的泛化能力。
二、多重共线性问题:在存在多重共线性的情况下,Lasso回归可以通过将相关变量的系数变为零来降低其对回归结果的影响。
三、预测建模:在医学研究中,Lasso回归可以选择最相关的指标和变量,建立高效的预测模型。
Lasso回归的优点:
1.特征选择:能够有效进行变量选择,特别是在预测变量数量远大于样本量的情况下。
2.防止过拟合:通过压缩系数,避免模型过于复杂,提高模型的泛化能力。
Lasso回归的缺点:
1.计算复杂度较高:由于L1正则化的非光滑性,优化过程较为复杂,计算成本较高。
2.稳定性问题:由于某些系数可能完全为零,模型的稳定性可能受到影响。
岭回归(Ridge Regression)是一种用于处理多重共线性的有偏估计回归方法,它通过在普通最小二乘法的基础上加入L2正则化项来解决多重共线性问题,从而提高模型的泛化能力和鲁棒性。
基本概念和原理
岭回归通过在最小二乘损失函数中加入L2范数的惩罚项,即模型参数的平方和乘以一个称为岭参数的λ值。这个惩罚项确保了模型参数不会变得过大,从而减少过拟合的风险,提高模型的稳定性和泛化能力。岭回归的损失函数包括两部分:一部分是残差平方和,另一部分是模型参数平方和乘以λ值。
应用场景
岭回归特别适用于那些特征之间高度相关(即多重共线性问题)的数据集。在这种情况下,普通的线性回归模型可能会变得不稳定,并且模型的系数可能会变得非常大。岭回归通过惩罚模型参数,使其保持较小的值,从而使得模型更加稳健。
岭回归的优点:
1.处理多重共线性:岭回归能够有效处理特征之间的强相关性,避免参数估计的不稳定。
2.减少过拟合:通过惩罚大参数,岭回归能够提高模型的泛化能力,减少过拟合的风险。
3.计算简单:岭回归的实现相对简单,不需要复杂的计算过程。
岭回归的缺点:
1.有偏估计:岭回归通过牺牲无偏性来获得更稳定的估计,可能会导致模型预测的偏差。
2.参数选择:选择合适的λ值是一个挑战,不同的λ值会影响模型的性能。
岭回归的实际应用案例
在实际应用中,岭回归常用于生物信息学、金融数据分析等领域,特别是在处理具有高度相关特征的数据时表现出色。例如,在基因表达数据分析中,基因之间的相关性可能导致普通线性回归模型不稳定,此时岭回归可以提供更稳定的参数估计。
今天我们仍以熟悉的示例数据集为例,演示一下R语言glmnet包分别拟合二分类logistic模型的lasso回归和岭回归的简单示例。
我们先整理一下Rstudio的环境并加载数据
rm(list=ls()) #移除所有变量数据
install.packages("") #安装包
library() #加载包
#1.数据及包准备
#读取Excel数据
library(readxl) #加载包
data <- read_excel("C:/Users/hyy/Desktop/示例数据.xlsx")
data
#2.Lasso回归,加载所需的包
library(glmnet)
library(Matrix)
#设置自变量与因变量
lambdas <- seq(0,5, length.out = 1000)
X <- as.matrix(data[,3:9]) #指标1至7
Y <- as.matrix(data[,2]) #结局
set.seed(12345)
lassofit <- glmnet(X, Y, family = "binomial",alpha = 1)
plot(lassofit,label = T)
plot(lassofit, xvar = "lambda", label = TRUE)
plot(lassofit, xvar = "dev", label = TRUE)
print(lassofit)
#交叉验证
set.seed(12345)
lasso_model <- cv.glmnet(X,Y,alpha = 1,lambda = lambdas,nfolds =3)
plot(lasso_model)
plot(lasso_model$glmnet.fit, "lambda", label = T)
#查看具体筛选的变量系数值和Lambda值(lambda.min处)
coef<-coef(lasso_model,s="lambda.min")
coef
#查出lambda.min处的Lambda值
Lambda<-lasso_model$lambda.min
Lambda
#lambda.min处保留的变量的个数,也就是系数不为0
bl.index<-which(coef!=0)
bl.index
#lambda.min处保留的各变量的系数
bl.coef<-coef[bl.index]
bl.coef
#列出lambda.min处保留的各变量的变量名
rownames(coef)[bl.index]
#岭回归
set.seed(12345)
ridgefit <- glmnet(X, Y, family = "binomial",alpha = 0)
plot(ridgefit,label = T)
plot(ridgefit, xvar = "lambda", label = TRUE)
plot(ridgefit, xvar = "dev", label = TRUE)
print(ridgefit)
#交叉验证
set.seed(12345)
ridge_model <- cv.glmnet(X,Y,alpha = 0,lambda = lambdas,nfolds =3)
plot(ridge_model)
plot(ridge_model$glmnet.fit, "lambda", label = T)
#查看具体筛选的变量系数值和Lambda值(lambda.min处)
coefridge<-coef(ridge_model,s="lambda.min")
coefridge
#查出lambda.min处的Lambda值
Lambdaridge<-ridge_model$lambda.min
Lambdaridge
#lambda.min处保留的变量的个数,也就是系数不为0
ridge.index<-which(coefridge!=0)
ridge.index
#lambda.min处保留的各变量的系数
ridge.coef<-coef[ridge.index]
ridge.coef
#列出lambda.min处保留的各变量的变量名
rownames(coef)[ridge.index]
Lasso回归和岭回归(Ridge Regression)的主要区别在于正则化项的形式和应用场景。
一、正则化项的区别
Lasso回归采用L1正则化,即在损失函数中加入权重的绝对值之和作为惩罚项。其损失函数可以表示为:
[
J(\theta) = \frac{1}{2n} \sum_{i=1}^{n} (y_i - x_i^T \theta)^2 + \alpha |\theta|
]
其中,∥θ∥1是θ的L1范数,即θ中各元素的绝对值之和。L1正则化会导致一些权重严格为0,从而实现特征选择。
岭回归采用L2正则化,即在损失函数中加入权重的平方和作为惩罚项。其损失函数可以表示为:
[
J(\theta) = \frac{1}{2n} \sum_{i=1}^{n} (y_i - x_i^T \theta)^2 + \alpha |\theta|^2
]
其中,∥θ∥2是θ的L2范数,即θ中各元素的平方和。L2正则化会使所有权重趋近于0,但不会严格为0,这有助于处理多重共线性问题。
二、应用场景的区别
Lasso回归通过将一些权重压缩为0来实现特征选择,适合于特征之间有关联的情况,能够有效剔除无关特征,适用于特征选择和变量压缩。
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!