特征选择+交叉验证,但如何在R中制作ROC曲线

时间:2013-12-03 08:51:47

标签: r feature-selection cross-validation roc

我遇到了下一个问题。我将数据分成10倍。每次,我使用1倍作为测试集,另外9作为训练集(我这样做十次)。在每个训练集上,我进行特征选择(使用chi.squared过滤方法),然后使用我的训练集和所选特征制作SVM模型。
所以最后,我成为10个不同的模型(因为功能选择)。但是现在我想通过这个过滤器方法在R中制作ROC曲线。我怎么能这样做?

西尔克

1 个答案:

答案 0 :(得分:2)

你确实可以存储预测,如果它们都在同一规模上(在执行特征选择时要特别小心......某些方法可能会产生依赖于数量的分数功能)并使用它们来构建ROC曲线。以下是我用于a recent paper的代码:

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.responseall.predictor构建,每个步骤都会更新。此代码还存储auc中每个步骤的AUC以进行比较。当样本量足够大时,两个结果应该非常相似,但是交叉验证中的小样本可能导致低估的AUC,因为具有所有数据的ROC曲线将趋向于更平滑并且更少被梯形规则低估。