【问题标题】:LASSO analysis (glmnet package). Can I loop the analysis and the results extraction?LASSO 分析(glmnet 包)。我可以循环分析和结果提取吗?
【发布时间】:2018-01-17 10:36:13
【问题描述】:

我正在使用 glmnet 包,我需要针对一个因变量运行多个 LASSO 分析,以校准大量变量(整个光谱中每个波长的反射率百分比)。我对程序和我希望解决的结果有一些疑问。我在下面显示我的临时代码:

  1. 首先,我将数据分为训练集(n 的 70%)和测试集。

    smp_size <- floor(0.70 * nrow(mydata))
    set.seed(123)
    train_ind <- sample(seq_len(nrow(mydata)), size = smp_size)
    train <- mydata[train_ind, ]
    test <- mydata[-train_ind, ]
    
  2. 然后我将每个集合的目标特征 (y) 和自变量 (x) 分开如下:

    vars.train <- train[3:2153]
    vars.test <- test[3:2153]
    
    x.train <- data.matrix(vars.train)
    x.test <- data.matrix(vars.test)
    y.train <- train$X1
    y.test <- test$X1
    
  3. 之后,我为训练集运行了一个经过交叉验证的 LASSO 模型,并提取并写入了 lambdamin 的非零系数。这是因为我在这里关注的一个问题是注意模型选择了哪些变量(反射光谱的波段)。

    install.packages("glmnet")
    library(glmnet)
    cv.lasso.1 <- cv.glmnet(y=y.train, x= x.train, family="gaussian", nfolds = 
    5, standardize=TRUE, alpha=1)
    
    coef(cv.lasso.1,s=cv.lasso.1$lambda.min) # Using lambda min.
    (cv.lasso.1)
    
    install.packages("broom")
    library(broom)
    c <- tidy(coef(cv.lasso.1, s="lambda.min"))
    write.csv(c, file = "results") 
    
  4. 最后,我使用函数“predict”并将对象“cv.lasso1”(之前获得的模型)应用于测试集(x.2)的变量,以便得到变量的预测,我运行测试集 Y 的预测值和实际值之间的相关性。

    predict.1.2 <- predict(cv.lasso.1, newx=x.2, type = "response", s = 
    "lambda.min")
    cor.test(x=c(predict.1.2), y=c(y.2))  
    

这是一个简化的代码,到目前为止没有问题,关键是我想对整个代码进行循环(一百次重复)并获得交叉验证模型的非零系数为以及每次重复的预测值与实际值(对于测试集)的相关系数。我已经尝试过,但没有得到任何明确的结果。有人可以给我一些提示吗? 谢谢!

【问题讨论】:

  • 那么,您希望引导 100 个训练变量和拟合样本,并取 100 个预测结果的平均值?或者您是否希望这样做 100 次并使用最好的一次?如果是后者,你会增加过拟合的几率,如果是第一个,你会增加过拟合的几率……那么这样做的目的是什么?
  • 感谢@sconfluentus 的回复,我们的想法是重复 100 次拆分数据(分为训练集和测试集)和接下来的步骤(拟合模型、提取系数并最终得到预测值与实际值之间的 R2 的预测精度)。首先,我想知道模型几乎总是根据非零系数(例如 80% 的时间)选择哪些变量。其次,我想平均所有模型的 R2。我是这个分析的新手,所以我将不胜感激。

标签: r glmnet


【解决方案1】:

通常,对相同数据反复运行相同类型的重复分析可能会很棘手。在您的情况下,可能不需要您概述它的方式。

如果您试图找到最具预测性的变量,您可以使用主成分分析来选择在 a 变量内和变量之间变化最大的变量,但它根本不考虑您的结果,所以如果您模型设计不佳,它将选择存储库中相关性最低的数据,但它可能无法预测。所以你应该非常了解集合中的所有变量。这将是一种减少数据维度以进行某种线性或逻辑回归的方法。

You can read about it here

yourPCA <- prcomp(yourData, center = TRUE, scale. = TRUE)

缩放和居中对于使这些模型正常工作至关重要,方法是将您的各种变量设置均值设置为 0 并将标准差设置为 1。除非您知道自己在做什么,否则我会保持原样。如果您有偏斜或峰态数据,您可能需要在 PCA 之前解决这个问题。仅在您的预测变量上运行此操作...将您的目标/结果变量保留在数据集中。

如果您希望使用大量数据解决分类问题,请尝试 LDA(线性判别分析),该分析旨在通过优化每个预测变量相对于 OUTCOME 变量的方差来减少变量...它特别考虑了您的结果。

require(MASS) yourLDA =r <- lda(formula = outcome ~ ., data = yourdata)

如果您知道每个类别的全局概率是多少,您也可以在 LDA 中设置先验概率,或者您可以将其省略,R/lda 将从训练集中分配实际类别的概率。你可以在这里阅读:

LDA from MASS package

因此,这使您朝着正确的方向前进,以通过计算可靠的方法中的特征选择来降低数据的复杂性。在寻求通过重复模型构建来构建最稳健的模型时,这被称为交叉验证。 boot 包中有一个 cv.glm 方法,可以帮助您以安全的方式处理此问题。

您可以使用以下内容作为粗略指南:

require(boot) yourCVGLM<- cv.glmnet(y = outcomeVariable, x = allPredictorVariables, family="gaussian", K=100) 。 这里K=100 指定您正在从当前数据 OBSERVATIONS 而不是变量创建 100 个随机抽样模型。

所以过程是双重的,使用上述两种方法之一减少变量,然后使用交叉验证从重复试验中构建单个模型,而无需繁琐的循环!

Read about cv.glm here

尝试从第 41 页开始,但要查看整个内容。您所追求的重复采样称为引导,它功能强大并且可用于许多不同的模型类型。

没有您希望的那么多代码,但会为您指明正确的方向。

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2011-10-31
    • 2023-03-30
    相关资源
    最近更新 更多