比较 OLS、岭和套索

机器算法验证 r 最小二乘 套索 岭回归
2022-03-27 17:16:24

我正在尝试在我的情况下比较 OLR、山脊和套索。我可以计算 OLR 和 lasso 的 SE,但不能计算 ridge。以下是包中的Prostrate数据lasso2

require(lasso2)
require(MASS)
data(Prostate)

fit.lm = lm(lpsa~.,data=Prostate)
summary(fit.lm)$coefficients
               Estimate  Std. Error    t value     Pr(>|t|)
(Intercept)  0.669399027 1.296381277  0.5163597 6.068984e-01
lcavol       0.587022881 0.087920374  6.6767560 2.110634e-09
lweight      0.454460641 0.170012071  2.6731081 8.956206e-03
age         -0.019637208 0.011172743 -1.7575995 8.229321e-02
lbph         0.107054351 0.058449332  1.8315753 7.039819e-02
svi          0.766155885 0.244309492  3.1360054 2.328823e-03
lcp         -0.105473570 0.091013484 -1.1588785 2.496408e-01
gleason      0.045135964 0.157464467  0.2866422 7.750601e-01
pgg45        0.004525324 0.004421185  1.0235545 3.088513e-01

fit.rd = lm.ridge(lpsa~.,data=Prostate, lamda = 6.0012)
#summary(fit.rd)$coefficients, doesnot provide SE 

lfit = l1ce(lpsa~.,data=Prostate,bound=(1:500)/500)
summary(lfit[[10]])$coefficients
                 Value  Std. Error   Z score  Pr(>|Z|)
(Intercept) 2.43614448 2.130515543 1.1434530 0.2528505
lcavol      0.03129045 0.125288320 0.2497475 0.8027826
lweight     0.00000000 0.274549270 0.0000000 1.0000000
age         0.00000000 0.018287840 0.0000000 1.0000000
lbph        0.00000000 0.095587974 0.0000000 1.0000000
svi         0.00000000 0.390936045 0.0000000 1.0000000
lcp         0.00000000 0.149824868 0.0000000 1.0000000
gleason     0.00000000 0.260274039 0.0000000 1.0000000
pgg45       0.00000000 0.007285054 0.0000000 1.0000000

我有一些问题:

(1) 我们如何计算 Std。岭回归的错误?

(2) 比较标准是否有效。决定使用哪个 ( ridge,lassoOLS) 方法时出错?还是有其他方法?如果是这样,我怎样才能得到它们?

1个回答

由于目标是预测,您可以选择一些距离度量,然后计算预测与真实值之间的距离,选择距离最小的方法。此设置最常见的距离测量是均方误差:MSE =最难的部分是适当地选择您的训练和测试集,然后执行 Lasso 和 Ridge 正则化所需的模型选择过程。Y^Yi=1n(Yi^Yi)2

首先,将您的数据分成两部分:训练和测试一个常见的选择是 66% 的训练,34% 的测试,但比例的选择受数据集大小的影响。现在暂时忘记测试集。仅使用训练数据训练或拟合这三个模型。的模型选择应该通过交叉验证来选择,因为预测是您的目标。最后,使用最好的对测试数据进行预测,以获得的值。我没有使用正则化回归的or实现,但是XtrainingXtestingλλY^Lasso2MASSglmnetpackage 使该过程非常简单,因为它提供了交叉验证功能。这里有一些 R 代码可以对Prostate数据执行此操作:

require(glmnet)
data(Prostate, package = "lasso2")
## Split into training and test
n_obs = dim(Prostate)[1]
proportion_split = 0.66
train_index = sample(1:n_obs, round(n_obs * proportion_split))
y = Prostate$lpsa
X = as.matrix(Prostate[setdiff(colnames(Prostate), "lpsa")])
Xtr = X[train_index,]
Xte = X[-train_index,]
ytr = y[train_index]
yte = y[-train_index]
## Train models
ols = lm(ytr ~ Xtr)
lasso = cv.glmnet(Xtr, ytr, alpha = 1)
ridge = cv.glmnet(Xtr, ytr, alpha = 0)
## Test models
y_hat_ols = cbind(rep(1, n_obs - length(train_index)), Xte) %*% coef(ols)
y_hat_lasso = predict(lasso, Xte)
y_hat_ridge = predict(ridge, Xte)
## compare
sum((yte - y_hat_ols)^2)
sum((yte - y_hat_lasso)^2)
sum((yte - y_hat_ridge)^2)

请注意,该sample()函数会随机选择行进行训练和测试,因此每次运行时 MSE 都会发生变化。而且由于这些Prostate数据实际上只是作为一个演示数据集,因此不太可能出现明显的赢家。