• R语言统计学
  • R语言不同的set.seed(),LASSO得出不同的结果,是因为算法不稳定吗?

R语言小白,第一次使用LASSO做特征选择,在使用过程中发现每次设置不同的随机数种子(即set.seed(n),每次用不同的n),lasso选出的变量会不同,是因为该算法针对我的数据不稳定,还是别的原因?请问有什么方法可以解决?
(变量=27,样本量=57)
代码如下:

library(glmnet)
set.seed(111)
cvfit_trainT <- cv.glmnet(as.matrix(train_Tdif_data[,3:28]) , as.matrix(train_Tdif_data$group) , 
      family = "binomial" , type.measure = "auc" , nlambda = 50 , alpha = 1 , nfolds = 5)
coef_trainT <- coef(cvfit_trainT,s = cvfit_trainT$lambda.1se)
T_LASSO_metabo <- rownames(coef_trainT)[which(coef_trainT!=0)][-1]
T_LASSO_metabo

希望得到各位大佬的解答,不胜感激。

因为 cv.glmnet() 中的数据分折情况改变了,按交叉验证误差最小选出的 lambda 就会有所不同。所以相同的种子应该得到相同的结果,不同的种子应该得到不同的结果。如果只是想让结果可重复,使用一个固定的种子就行了。

如果说考虑不同种子可以得到很多不同的模型,最后在大样本下可能总会有那么一些特征总被稳定选择的问题,那就是 stability selection 了。

    nan.xiao 谢谢老师解答!我用set.seed(1:5000)做了lasso特征选择,代码如下:

    library(glmnet)
    number_metabo <- data.frame(ID  = 1:5000 , number = NA)
    T_LASSO_metabo=list(); length(T_LASSO_metabo)=5000
    for(i in 1:5000){
      set.seed(i)
      cvfit_trainT <- cv.glmnet(as.matrix(train_Tdif_data[,3:28]) , as.matrix(train_Tdif_data$group) , family = "binomial" , type.measure = "auc" , nlambda = 50 , alpha = 1 , nfolds = 5)
      coef_trainT <- coef(cvfit_trainT,s = cvfit_trainT$lambda.1se)
      T_LASSO_metabo[[i]] <- rownames(coef_trainT)[which(coef_trainT!=0)][-1]
      number_metabo[i,2] <- length(T_LASSO_metabo[[i]])
    }
    plot(number_metabo)

    大概能得出10种不同的结果,但是stability selection 只有包含一个变量,如果使用只含有这一个变量的模型,在独立的test set中,求出的曲线下面积(AUC)效果不好。请问我可以选择独立test set的AUC结果较好的变量群写进文章,作为区分两组的markers吗?

    还有第二个问题,希望老师解答:我使用Boruta做特征选择,Boruta()建立模型后,使用predict()计算预测值,报错如下:

    library(Boruta)
    set.seed(111)
    boruta_trainT <- Boruta(group~.,data = train_Tdif_data[,2:22], doTrace = 2)
    library(pROC)
    Tboruta_predict <- predict(boruta_trainT,test_Tboruta_dvc)
    
    Error in UseMethod("predict") : 
      no applicable method for 'predict' applied to an object of class "Boruta"

    请问我应该如何采用Boruta选择的变量计算predictor?

    谢谢老师!

    如果你看过 Stability Selection 的原始文章的就会发现它的理论和选择结果其实过于保守,所以得到1个变量很正常。1个变量的预测性能肯定没有用更多变量那么好(虽然这些更多的变量中可能有 false positive),直接就体现在了 AUC 上。

    写文章的模型一般得是多个变量组成的一组 marker,在预测性能和数量之间取得一个平衡:预测性能尽量高的前提下,变量数量尽量少。至于选了哪个模型写进去,只要结果不是非常不稳定,那就是见仁见智,自圆其说了。

    Boruta 只是做了一个选择,本身不自带模型,所以没法做预测。按照它的流程,需要先选变量,再把选出来的变量放进一个模型里。

      nan.xiao 非常感谢老师耐心回答,解开了我心中的疑惑。
      还想请问,Boruta选出的变量,只能用randomForest()建模然后计算AUC吗?还是说可代入其他的模型中,比如binary Logistic回归、lasso回归等。谢谢老师

        感觉问题还是模型效果不好,导致的结果不稳定。

        1、模型算法中有随机化的处理(例如:随机梯度下降法),所以seed的设置肯定会导致结果的略微不同;
        2、lasso法的损失函数通过超参数lambda来控制模型的复杂程度,也就是模型包含的特征数量;
        3、再交叉验证选取超参数

        结果不稳定,说明seed的设置对模型的影响与超参数的选择的影响基本等价啦,也就是说seed对损失函数的影响不小,或者超参数的选择对模型损失函数的影响不大。

          5 年 后

          nan.xiao 老师您好,如果方便的话,能否请教您两个问题:1、像您提到的Boruta以及本帖提到的Lasso算法能够不依靠学习器(模型)就能识别出一个初步的变量的组合,还有其他比较流行的用于文章的类似的模型吗? 2、小样本情况下不同的种子导致Lasso算法会识别到多个不同的变量组合,那除了Stability Selection这个方法之外,还有比较流行的方法得到一个比较稳定的变量组合吗? 如能解答,万分感谢!