1

我一直在尝试在 R 中实现 CV,但遇到了一个奇怪的问题,即 LOOCV 中折叠之间的返回值。

首先我会随机生成数据和标签,然后我会在应该只是噪声的地方拟合一个 randomForest。从返回的循环中,我不仅获得了良好的 AUC,而且还从 t 检验中获得了显着的 p 值。我不明白这在理论上是如何发生的,所以我很好奇我尝试生成数据/标签的方式是否最好?

这是一个显示我的问题的代码片段。

library(randomForest)
library(pROC)
n=30
p=900

set.seed(3)
XX=matrix(rnorm(n*p, 0, 1) , nrow=n)
YY=as.factor(sample(c('P', 'C'), n, replace=T))
resp = vector()

for(i in 1:n){
  fit = randomForest(XX[-i,], YY[-i])
  pred = predict(fit, XX[i,], type = "prob")[2]
  resp[i] <- pred
}

t.test(resp~YY)$p.value

roc(YY, resp)$auc

我尝试了多种生成数据的方法,所有这些都导致相同的结果

XX=matrix(runif(n*p), nrow=n)
XX=matrix(rnorm(n*p, 0, 1) , nrow=n)

random_data=matrix(0, n, p)
for(i in 1:n){
  random_data[i,]=jitter(runif(p), factor = 1, amount = 10)
}
XX=as.matrix(random_data)

由于 randomForest 在这种情况下找到了相关的预测变量,这让我相信数据可能不是真正随机的。有没有更好的方法可以生成数据或生成随机标签?这可能是R的问题吗?

4

1 回答 1

0

这是部分答案:我修改了您的 roc 函数调用,以确保 AUC 值的分布在 0 和 1 之间。然后我运行了 20 次。平均 AUC 和 p 值分别为 0.73 和 0.12。改进但仍然比随机更好...

library(ROCR)
library(randomForest)
library(pROC)
n=30
p=900

pvs=vector()
aucs=vector()
for (j in seq(20)){
    XX=matrix(rnorm(n*p, 0, 1) , nrow=n)
    YY=as.factor(sample(c('C', 'P'), n, replace=T))
    resp = vector()
    for(i in 1:n){
        fit = randomForest(XX[-i,], YY[-i])
        pred = predict(fit, XX[i,], type = "prob")[2]
        resp[i] <- pred
    }  
    pvs[j]=t.test(resp~YY)$p.value
    aucs[j]=roc(YY, resp, direction='>')$auc
}
于 2017-10-05T15:17:10.487 回答