【发布时间】:2017-07-18 05:48:30
【问题描述】:
上下文和错误信息
我尝试在插入符号中使用 glmnet 来拟合二分类预测模型。使用插入符号默认调谐网格时出现错误。我不认为这是由于数据格式错误,因为在指定我自己的调整网格时,没有问题。 错误信息是:
Error in loop$lambda[loop$alpha == alph[i]] <- np[which.max(np)] :
replacement has length zero
在检查发生错误的行时,可以看到 R 试图在 NA 的向量 np(由 caret/glmnet 选择的 lambda 值?)上找到最大值 which.na()。我未能正确调试此问题,因为在调用 train() 后我找不到单步执行每一行代码的方法。希望有经验的大侠能帮帮我。
最小的工作示例
我创建了一个最小的工作示例,方法是让我的数据集尽可能小(它从 ~200 行和 ~40 列开始)同时保留错误。请注意,manualModelFit 工作正常,但无法计算 modelFit:
library(caret)
library(glmnet)
# create data frame of features
var1 <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1)
var2 <- c(1,1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,1)
trainData <- data.frame(v1 = var1, v2 = var2)
# create fature vector of outcomes
trainClass <- as.factor(c('event','event','event','event','event','event','event','event','event','event','nonEvent','event','event','event','event','event','nonEvent'))
# set k for k-fold CV
kInner = 5
# set randomization seed
mySeed = 1622017
# set options for caret in fitControl
fitControl <- trainControl( method = 'cv', number = kInner, classProbs = TRUE, allowParallel = FALSE, summaryFunction = twoClassSummary, verboseIter = FALSE)
# run parameter tuning with a user-specified tuning grid
set.seed(mySeed)
myTuneGrid <- expand.grid(alpha = c(0,0.5,1), lambda = c(0,0.5,1))
manualModelFit <- train(x = trainData, y = trainClass, method = 'glmnet' , trControl = fitControl, metric = 'ROC', tuneGrid = myTuneGrid)
# run default parameter tuning
set.seed(mySeed)
modelFit <- train(x = trainData, y = trainClass, method = 'glmnet' , trControl = fitControl, metric = 'ROC')
问题
失败的原因是什么? 这是插入符号/glmnet 中的错误还是由于我忽略的数据集的属性?这个错误发生在我分析的多个数据集中。
【问题讨论】:
-
嗨,我在 glmnet 上遇到了同样的问题。就我而言,我有 1079 x 180 数据集和三个类。如果我使用 PCA 将描述 90% 方差的变量从 180 个维度减少到 16 个,那么问题就消失了。不知道会发生什么...
-
@R Kiselev 这解决了您的问题的原因可能是因为它删除了通常导致此问题的因素变量。你能检查一下吗?