随机数据生成导致对随机标签的良好预测
Posted
技术标签:
【中文标题】随机数据生成导致对随机标签的良好预测【英文标题】:Random data generation leading to good prediction on random labels 【发布时间】:2018-02-04 15:34:27 【问题描述】:我一直在尝试在 R 中实现 CV,但遇到了一个奇怪的问题,即 LOOCV 中折叠的返回值。
首先我会随机生成数据和标签,然后我会在应该只是噪声的地方拟合一个 randomForest。从返回的循环中,我不仅获得了良好的 AUC,而且还从 t 检验中获得了显着的 p 值。我不明白这在理论上是如何发生的,所以我很好奇我尝试生成数据/标签的方式是否最好?
这是显示我的问题的代码 sn-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的问题吗?
【问题讨论】:
@ChiPak 和set.seed(1)
我得到的 p 值约为 0.68,但 set.seed(3)
我得到的 p 值约为 0.00095。 roc
来自pROC
,我将编辑我的帖子以将其包含在代码中
我真的不知道 R,所以也许我完全不知道,但尺寸对于创建好的随机数很重要。一条线上的随机数与球面上的随机数不同。随机样本位置也不仅仅是随机数。也许您至少需要分层抽样?
您的小样本量可能是个问题。试试更大的n
,比如 500。
在玩了更多之后,当您增加 n
或将其从 LOOCV 更改为 K-fold(使用 k != n
)时,问题似乎消失了。 @user 对于这个例子,我可以增加 n
但如果我要分析真正的高维小观察计数数据,这个问题仍然会困扰我
已知小样本会以这种方式运行。它完全是随机的和预期的。
【参考方案1】:
这是部分答案:我修改了您的 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
【讨论】:
以上是关于随机数据生成导致对随机标签的良好预测的主要内容,如果未能解决你的问题,请参考以下文章
当训练数据居中时,XGBoost 和随机森林导致对测试集的持续预测