简述lasso估计以及调节参数的CV与BIC准则

本文介绍了Lasso方法及其系数压缩特性,包括基本的Lasso估计和自适应Lasso的区别。重点讨论了调节参数的选择,如CV准则和BIC准则,并通过实际案例演示了如何在R语言中运用。最后展示了Lasso在人体健康数据中的应用,展示了其在变量筛选和防止过拟合方面的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Lasso

Lasso方法是系数压缩法中的一种,基于最小二乘方法的Lasso方法是基础,下面对最小二乘下的Lasso进行阐述。

1.1 Lasso估计

Lasso估计最先是由斯坦福大学的著名统计学家Tibshirani[2]提出的,其思想就是加一项惩罚函数,然后进行变量选择和参数估计,其可以表示为:

 (1)

即Lasso估计就是寻找最小的\beta,其中,\lambda是调节参数,n为样本容量,满足 (1)式的称为正则化Lasso估计。Lasso是一种系数压缩的方法,它最大的优点就是它能够连续缩减、压缩,并且是一种正则化估计,它能够准确选择出那些系数不为0的变量,即重要变量;同时,它也能够准确将一些不相关的变量系数压缩为0,从而实现变量选择。另外它也能给出线性回归模型系数的估计值。也正是基于Lasso估计的提出Efron等前辈提出了有效的角回归算法,Friedman等前辈提出了坐标下降算法等,这些算法的提出使得基于Lasso方法的变量选择方法迅速发展,且应用于各个领域。

1.2 自适应Lasso估计

由于不同的回归系数对模型的影响程度是不同的,而在 (1)式中,我们可以看见对于模型中不同的回归系数选择了同一个惩罚参数,显然这是不科学、不合理的。因此,为了解决这一问题,Zou[5]提出了自适应Lasso(adaptive Lasso)估计方法,其具体形式表示为:                         

   (2)

其中,\omega为权重,即通过设置不同的权重,对不同回归系数实行不同程度的惩罚,那些对因变量影响较大的自变量的系数进行较小的惩罚,而对那些对因变量影响较小或者不相关变量的自变量的系数进行较大的惩罚,从而实现自适应的变量选择。

2.调节参数的选择

关于调节参数的选择,也有很多学者研究,有不同的判断准则,但是应用最为广泛的是CV准则和BIC准则。下面对这两种准则做一简单介绍。

(a)CV准则

CV准则最简单的是留一交叉验证方法,它的思想就是把我们的数据集分成两部分,一部分是训练集,另一部分是测试集,如果数据集总共有n个样本,那将其中一个作为测试集,其余(n-1)个当做训练集,然后我们用训练集去拟合得到一个模型,再将测试集的自变量代入,可以得到其对应的因变量y的值。我们从第一个样本开始作为测试集,即第一次去掉(x1,y1),也就是把(x1,y1)当做测试集,剩余的{(x2,y2),...(xn,yn)}这个作为训练集,在这个训练集上去进行拟合线性回归模型,再将x1代入拟合完的线性回归模型中得出y1的拟合值

作为训练集,在这个训练集上去进行拟合线性回归模型,再将xi代入拟合好的模型中求得yi的拟合值\hat{^{y_{i}}},再计算

,就这样一直计算n次,得到n个均方误差MSEi,i=1,2,...n于是我们就可以得到n个均方误差的均值为:

 这个是在一个\lambda下对应的CV值,我们要选最优的,首先要给予一个初始\lambdamax,再采用格子点方法,可以采用100个格子点,将其分为100个\lambda

^{\lambda _{i }}=\frac{1}{100} * \lambda _{max}

,i=1,2,....100,,这样在100个\lambda下,我们可以对每一个\lambdai都求一个CV(\lambdai),然后我们再根据CV值最小原则选取最优的,即:

 基于CV准则下,将留一交叉验证法改进,我们有k折交叉验证法,两者本质思想是一样的,k折交叉验证法只是将样本分成了k个小组,然后每次留一组去进行测试,其余(k-1)组作为训练集,同理我们每次都可以计算出一个均方误差MSE,这样我们就可以得到kMSE,它们k个均方误差的均值是:

 同理,继续采用格子点方法,求出使得CV值最小的那个\lambda。显而易见,当k=n时候,k折交叉验证法就是留一交叉验证法。

 (b)BIC准则

所谓BIC准则,就是基于贝叶斯方法下的准则,和CV准则一样,首先要给予一个初始值 \lambdamax,再采用格子点方法,将初始值分割,可以采用100个格子点,将其分为100个,

^{\lambda _{i }}=\frac{1}{100} * \lambda _{max}

,i=1,2,....100,这样在这100个下,根据(1)式和(2)式,我们可以对每一个\lambdai都求一个\hat{\beta _{\lambda _{i}}},进而可以求出 \lambdai此对应的BIC( \lambdai), 我们再选择最小的 BIC( \lambdai)对应的 \lambdai,即

 其中df是在 \lambdai下求得的回归系数\hat{\beta _{\lambda _{i}}}中系数不为0的个数。这样我们就可以选出最优的调节参数。

3.一个例子

   为了了解和预测人体吸入氧气的效率,收集了31名中年男性的健康状况调查资料,共调查了7项指标:吸氧效率(Y)、年龄(x1,单位:岁)、体重(x2,单位:千克)、跑1.5千米所需要时间(x3,单位:分钟)、休息时的心率(x4,次/分钟)、跑步时的心率(x5,次/分钟)和最高心率(x6,次/分钟),数据见附录,在该资料中吸氧效率Y作为响应变量,其他六个变量作为协变量,建立多元回归模型并统计分析。

    把数据用文件data.csv保存,放在R语言的工作目录下,读数据并建立多元线性回归模型,用函数lm()计算,summary()提取信息[6],输出结果如下:

 (1)经验回归方程为:

 (2)回归系数的显著性检验:从各个回归系数的p值看出,变量x1,x3,x5和x6的p值小于显著性水平,可以认为它们是线性回归显著的,而变量x2和x4的p值大于显著性水平,认为它们是不显著的变量。进一步可以使用lasso方法压缩变量。

 lasso变量选择

用程序包glmnet中的函数对上述数据进行lasso回归分析,输出的结果如下:

 从上面的结果可以看出,采用“一个标准差”准则的\lambda = 0.5836时,可以产生稀疏解,使得x2,x4和x6 的系数为0,使得模型更为简单,不易导致过拟合。

自适应lasso变量选择

用程序包msgps中的函数对上述数据进行lasso回归分析,输出的结果如下:

 从上面结果可以看出,当采用BIC方法选取调节参数时,把x2和x4变量的系数被压缩成0, 使得模型更为简单,不易导致过拟合。

R中实现代码:

library(glmnet)
library(MASS)
library(Matrix)
library(latex2exp)
library(msgps)
W=read.csv('C:/Users/ASUS/Desktop/data.csv') 
lm.reg=lm(W$Y~W$X1+W$X2+W$X3+W$X4+W$X5+W$X6)
summary(lm.reg)
x=cbind(W$X1,W$X2,W$X3,W$X4,W$X5,W$X6)
y=c(W$Y)
fit_lasso=glmnet(x,y,alpha=1,nlambda=100)
lam=fit_lasso$lambda
cv.lasso=cv.glmnet(x,y,alpha=1)
coef(cv.lasso,S="lambda.lse")
alasso_fit=msgps(x,y,penalty="alasso",gamma=1)
summary(alasso_fit)

数据

Y

X1

X2

X3

X4

X5

X6

44.609

44

89.47

11.37

62

178

182

45.313

40

75.05

10.07

62

185

185

54.297

44

85.84

8.65

45

156

168

59.571

42

68.15

8.17

40

166

172

49.874

38

89.02

9.22

55

178

180

44.811

47

77.45

11.63

58

176

176

45.681

40

75.98

11.95

70

176

180

49.091

43

81.19

10.85

64

162

170

39.442

44

81.42

13.08

63

174

176

60.055

38

81.87

8.63

48

170

186

50.541

44

73.03

10.13

45

168

168

37.388

45

87.66

14.03

56

186

192

44.754

45

66.45

11.12

51

176

176

47.273

47

79.15

10.6

47

162

164

51.855

54

83.12

10.33

50

166

170

49.156

49

81.42

8.95

44

180

185

40.836

51

69.63

10.95

57

168

172

46.672

51

77.91

10

48

162

168

46.774

48

91.63

10.25

48

162

164

50.388

49

73.57

10.08

67

168

168

39.407

57

73.37

12.63

58

174

176

46.08

54

79.38

11.17

62

156

165

45.441

56

76.32

9.63

48

164

166

54.625

50

70.87

8.92

48

146

155

45.118

51

67.25

11.08

48

172

172

39.203

54

91.63

12.88

44

168

172

45.79

51

73.71

10.47

59

186

188

50.545

57

59.08

9.93

49

148

155

48.673

49

76.32

9.4

56

186

188

47.92

48

61.24

11.5

52

170

176

47.467

52

82.78

10.5

53

170

172

好的,我很乐意为您提供一个使用AIC和BIC准则来选择Lasso模型λ值的Python代码示例,并交叉验证(CV)方法进行比较。这个示例将使用scikit-learn和statsmodels库。 ```python import numpy as np import pandas as pd from sklearn.linear_model import LassoCV, Lasso from sklearn.model_selection import train_test_split from sklearn.datasets import make_regression import statsmodels.api as sm # 生成模拟数据 X, y = make_regression(n_samples=100, n_features=10, noise=0.1, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 使用交叉验证选择λ lasso_cv = LassoCV(cv=5, random_state=42) lasso_cv.fit(X_train, y_train) lambda_cv = lasso_cv.alpha_ # 使用AIC和BIC选择λ def aic_bic_selection(X, y): alphas = np.logspace(-4, 0, 50) results = [] for alpha in alphas: lasso = Lasso(alpha=alpha) lasso.fit(X, y) preds = lasso.predict(X) residuals = y - preds n = len(y) p = np.count_nonzero(lasso.coef_) + 1 # +1 for intercept # 计算AIC aic = n * np.log(np.sum(residuals**2) / n) + 2 * p # 计算BIC bic = n * np.log(np.sum(residuals**2) / n) + np.log(n) * p results.append({'alpha': alpha, 'aic': aic, 'bic': bic}) results_df = pd.DataFrame(results) best_aic = results_df.loc[results_df['aic'].idxmin()] best_bic = results_df.loc[results_df['bic'].idxmin()] return best_aic, best_bic best_aic, best_bic = aic_bic_selection(X_train, y_train) print(f"交叉验证选择的λ: {lambda_cv}") print(f"AIC选择的λ: {best_aic['alpha']}") print(f"BIC选择的λ: {best_bic['alpha']}") # 比较模型性能 lasso_cv_model = Lasso(alpha=lambda_cv) lasso_cv_model.fit(X_train, y_train) cv_score = lasso_cv_model.score(X_test, y_test) lasso_aic_model = Lasso(alpha=best_aic['alpha']) lasso_aic_model.fit(X_train, y_train) aic_score = lasso_aic_model.score(X_test, y_test) lasso_bic_model = Lasso(alpha=best_bic['alpha']) lasso_bic_model.fit(X_train, y_train) bic_score = lasso_bic_model.score(X_test, y_test) print(f"交叉验证模型的测试集R^2: {cv_score}") print(f"AIC模型的测试集R^2: {aic_score}") print(f"BIC模型的测试集R^2: {bic_score}") ``` 这段代码做了以下几件事: 1. 生成模拟数据。 2. 使用交叉验证选择Lasso模型的λ值。 3. 定义一个函数来使用AIC和BIC选择λ值。 4. 分别使用交叉验证、AIC和BIC选择的λ值训练Lasso模型。 5. 比较三者在测试集上的R^2分数。 通过运行这段代码,你可以看到使用不同方法选择的λ值以及相应的模型性能。这有助于我们理解AIC、BIC和交叉验证方法在模型选择中的表现。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值