【发布时间】:2018-01-17 10:36:13
【问题描述】:
我正在使用 glmnet 包,我需要针对一个因变量运行多个 LASSO 分析,以校准大量变量(整个光谱中每个波长的反射率百分比)。我对程序和我希望解决的结果有一些疑问。我在下面显示我的临时代码:
-
首先,我将数据分为训练集(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, ] -
然后我将每个集合的目标特征 (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 -
之后,我为训练集运行了一个经过交叉验证的 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") -
最后,我使用函数“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。我是这个分析的新手,所以我将不胜感激。