两个参数的交叉验证:elastic net case

机器算法验证 交叉验证 正则化 弹性网
2022-03-10 12:47:14

我想知道交叉验证过程,以在前列腺数据集上找到Zou 和 Hastie提出的弹性网的两个参数作为示例。当我使用弹性网时,我无法使用 k-fold 提高错误率套索。

3个回答

在这种情况下使用的方法是完全相同的,尽管例如glmnet包没有提供开箱即用的方法。

现在,您不再处理一组离散的参数值 (lambda),而是对一组参数值 (lambda 和 alpha) 进行交叉验证,然后选择最佳值 (lambda.min 和 alpha.min),然后选择 lambda 和alpha,因此 lambda 是最大可能的,但其预测度量在 lambda.min 和 alpha.min 的 1 SE 以内。

如果您使用 R,您可能可以执行以下操作:

alphasOfInterest<-seq(0,1,by=0.1) #or something similar
#step 1: do all crossvalidations for each alpha
cvs<-lapply(alphasOfInterest, function(curAlpha){
  cv.glmnet(myX, myY, alpha=curAlpha, some more parameters)
})
#step 2: collect the optimum lambda for each alpha
optimumPerAlpha<-sapply(seq_along(alphasOfInterest), function(curi){
  curcvs<-cvs[[curi]]
  curAlpha<-alphasOfInterest[curi]
  indOfMin<-match(curcvs$lambda.min, curcvs$lambda)
  c(lam=curcvs$lambda.min, alph=curAlpha, cvup=curcvs$cvup[indOfMin])
})
#step 3: find the overall optimum
posOfOptimum<-which.min(optimumPerAlpha["lam",])
overall.lambda.min<-optimumPerAlpha["lam",posOfOptimum]
overall.alpha.min<-optimumPerAlpha["alph",posOfOptimum]
overall.criterionthreshold<-optimumPerAlpha["cvup",posOfOptimum]
#step 4: now check for each alpha which lambda is the best within the threshold
corrected1se<-sapply(seq_along(alphasOfInterest), function(curi){
  curcvs<-cvs[[curi]]
  lams<-curcvs$lambda
  lams[lams<overall.lambda.min]<-NA
  lams[curcvs$cvm > overall.criterionthreshold]<-NA
  lam1se<-max(lams, na.rm=TRUE)
  c(lam=lam1se, alph=alphasOfInterest[curi])
})
#step 5: find the best (lowest) of these lambdas
overall.lambda.1se<-max(corrected1se["lam", ])
pos<-match(overall.lambda.1se, corrected1se["lam", ])
overall.alpha.&se<-corrected1se["alph", pos]

所有这些代码都未经测试 + 如果您使用 auc 作为标准,则需要注意(因为您需要寻找标准的最大值和其他一些细节更改),但想法就在那里。

注意:在最后一步中,您可以找到具有最简约模型的模型,而不是寻找最高的 lambda(因为更高的 lambda 并不能保证在不同的 alpha 上更简约)

您可能还想预先收集所有 lambda,并将所有这些的集合传递给每个交叉验证,以便您可以确保每个交叉验证使用相同的 lambda 集。这很容易做到,但需要一些额外的步骤。我不确定是否有必要...

如果错误率是指通常的错误率(正确分类的比例),则这是一个不连续的不正确评分规则。虚假的模型优化了不正确的评分规则。它将导致您选择错误的特征并丢弃具有预测性的特征。最好使用最敏感的度量来评估模型,这将基于偏差或惩罚偏差。在我只使用二次惩罚的更简单情况下,我使用有效 AIC 求解最佳惩罚。我的《回归建模策略》一书中有一个例子。这种方法的模拟研究在http://biostat.mc.vanderbilt.edu/rms上。

与其使用网格搜索,不如使用数值优化例程,例如 Nelder-Mead 单纯形算法。这通常比网格搜索更有效,从长远来看,这将是值得的。在 MATLAB 中,这是由工具箱的fminsearch例程实现的optimisation,但我希望也有一个 R 实现。优化的成本函数只是交叉验证的性能估计。

最好先重新参数化问题,以实现无约束优化问题(正则化参数必须为正)。我通过优化正则化参数的对数来做到这一点,并且发现它通常效果很好。