我被下一个问题困住了。我将我的数据分成 10 份。每次,我使用 1 折作为测试集,另外 9 折作为训练集(我这样做十次)。在每个训练集上,我进行特征选择(使用 chi.squared 过滤方法),然后使用我的训练集和所选特征制作 SVM 模型。
所以最后,我变成了 10 个不同的模型(因为特征选择)。但是现在我想从这个过滤器方法中制作 R 中的 ROC 曲线。我怎样才能做到这一点?
丝绸
我被下一个问题困住了。我将我的数据分成 10 份。每次,我使用 1 折作为测试集,另外 9 折作为训练集(我这样做十次)。在每个训练集上,我进行特征选择(使用 chi.squared 过滤方法),然后使用我的训练集和所选特征制作 SVM 模型。
所以最后,我变成了 10 个不同的模型(因为特征选择)。但是现在我想从这个过滤器方法中制作 R 中的 ROC 曲线。我怎样才能做到这一点?
丝绸
如果它们都在相同的范围内,您确实可以存储预测(在执行特征选择时要特别小心......某些方法可能会产生取决于特征数量的分数)并使用它们来构建 ROC 曲线. 这是我用于最近一篇论文的代码:
library(pROC)
data(aSAH)
k <- 10
n <- dim(aSAH)[1]
indices <- sample(rep(1:k, ceiling(n/k))[1:n])
all.response <- all.predictor <- aucs <- c()
for (i in 1:k) {
test = aSAH[indices==i,]
learn = aSAH[indices!=i,]
model <- glm(as.numeric(outcome)-1 ~ s100b + ndka + as.numeric(wfns), data = learn, family=binomial(link = "logit"))
model.pred <- predict(model, newdata=test)
aucs <- c(aucs, roc(test$outcome, model.pred)$auc)
all.response <- c(all.response, test$outcome)
all.predictor <- c(all.predictor, model.pred)
}
roc(all.response, all.predictor)
mean(aucs)
roc 曲线是由每一步更新的all.response
。all.predictor
此代码还存储每个步骤的 AUC 以auc
进行比较。当样本量足够大时,这两个结果应该非常相似,但是交叉验证中的小样本可能会导致 AUC 被低估,因为所有数据的 ROC 曲线将趋于更平滑,并且被梯形规则低估。