R 中的插入符号和 KNN:预测函数给出错误
Caret and KNN in R: predict function gives error
我尝试使用 R 中的 caret 包使用简化的 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) :
选择了未定义的列
在没有目标变量 y 的情况下定义更真实的测试数据集"b"...
#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) :
选择了未定义的列
我知道列名很重要,但在这里它们是相同的。这里有什么问题?谢谢!
问题出在您的 y 变量上。当您要求 class 概率时,训练和/或预测函数将它们放入一个数据框中,每个 class 有一列。如果因子水平不是有效的变量名称,它们会自动更改(例如,“0”变为 "X0")。另见 post.
如果您更改代码中的这一行,它应该可以工作:
a[,1] = factor(a[,1], labels = c("no", "yes"))
我尝试使用 R 中的 caret 包使用简化的 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) :
选择了未定义的列
在没有目标变量 y 的情况下定义更真实的测试数据集"b"...
#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) :
选择了未定义的列
我知道列名很重要,但在这里它们是相同的。这里有什么问题?谢谢!
问题出在您的 y 变量上。当您要求 class 概率时,训练和/或预测函数将它们放入一个数据框中,每个 class 有一列。如果因子水平不是有效的变量名称,它们会自动更改(例如,“0”变为 "X0")。另见 post.
如果您更改代码中的这一行,它应该可以工作:
a[,1] = factor(a[,1], labels = c("no", "yes"))