ROC 使用 k=10 折交叉验证给出错误

问题描述 投票:0回答:1

为了检查我的模拟 logistic glm,我想使用 roc (auc) 应用 10 折交叉验证。 也就是说,计算所有折叠的 auc,然后取 aucs 的平均值。但是,当我尝试这样做时,出现了错误。 因为对于某些折叠,测试数据仅包含 1 或仅包含 0.

这是我的代码

set.seed(1234)
library(pROC)
X1=runif(50)
X2=rnorm(50,2)
y=rbinom(50,1,(1.6*X1+2.9*X2)/(1+exp(1.6*X1+2.9*X2))) #response variable#
dta=data.frame(y=y,X1=X1,X2=X2)
 
#10 fold cross validation#
set.seed(1234)
all.samp <- sample(1:10, length(y), replace = TRUE)  
fold <- unique(all.samp)  
save.auc=NULL
for(j in fold)
{ 
trainData = dta[!all.samp==j,]
testData = dta[all.samp==j,]
mod = glm(y~.,family=binomial,data=trainData)
mod.pred = predict(mod, newdata= testData,type="response")
rocauc=auc(roc(testData$y,mod.pred,plot=FALSE))
save.auc = c(save.auc,rocauc) #saving all AUCs#
}

现在,我收到以下错误

Error in roc.default(testData$y, mod.pred, plot = FALSE) :  'response' must have two levels
我该如何解决这个问题?我在
Cross Validated
中发布了这个问题,但是问题被关闭了,有人建议我在这里发布。 我真的需要尽快解决这个问题。因此,我真的很感激建议。

error-handling roc auc k-fold
1个回答
0
投票

那是因为你的数据集规模小且不平衡。里面很少有阳性案例:

> y
 [1] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
[39] 0 0 0 1 0 0 0 0 0 0 0 0

结果,一些交叉验证拆分不包含任何积极的观察:

> testData$y
[1] 0 0 0 0 0 0 0 0

您将需要增加样本量或重新平衡您的数据,以便在每次拆分中始终至少有一个积极的观察。

或者,您应该设置一个分层交叉验证方案,其中正面和负面分开并保留余额。

© www.soinside.com 2019 - 2024. All rights reserved.