R中的Caret和KNN:预测函数给出错误

时间:2015-10-18 16:00:26

标签: r r-caret knn

我尝试使用R中的插入符号包使用简化的KNN模型进行预测。它总是给出相同的错误,即使在这里非常简单的可重现示例中:

library(caret)
set.seed(1)

#generate training dataset "a" 
n = 10000
a = matrix(rnorm(n*8,sd=1000000),nrow = n)
y = round(runif(n))
a = cbind(y,a)
a = as.data.frame(a)
a[,1] = as.factor(a[,1])
colnames(a) = c("y",paste0("V",1:8))

#estimate simple KNN model
ctrl <- trainControl(method="none",repeats = 1)
knnFit <- train(y ~ ., data = a, method = "knn", trControl = ctrl, preProcess = c("center","scale"),  tuneGrid = data.frame(k = 10))

#predict on the training dataset (=useless, but should work)
knnPredict <- predict(knnFit,newdata = a,  type="prob")

这给出了

[.data.frame出错(out ,, obsLevels,drop = FALSE):   选择了未定义的列

定义更真实的测试数据集&#34; b&#34;没有目标变量y ...

#generate test dataset
b =  matrix(rnorm(n*8,sd=1000000),nrow = n) 
b = as.data.frame(b)
colnames(b) = c(paste0("V",1:8))

#predict on the test datase
knnPredict <- predict(knnFit,newdata = b,  type="prob")

给出相同的错误

[.data.frame出错(out ,, obsLevels,drop = FALSE):   选择了未定义的列

我知道列名很重要,但在这里它们是相同的。这有什么不对?谢谢!

1 个答案:

答案 0 :(得分:1)

问题是你的y变量。当您要求类概率时,列车和/或预测函数将它们放入一个数据框中,每个类都有一列。如果因子级别不是有效的变量名称,则它们会自动更改(例如&#34; 0&#34;变为&#34; X0&#34;)。另请参阅此post

如果您在代码中更改此行,则应该有效:

a[,1] = factor(a[,1], labels = c("no", "yes"))