我尝试使用kknn
+循环为模型创建省略一交叉验证,并将其与train.kknn进行比较。
我将数据分为两部分:训练(80%的数据)和测试(20%的数据)。在训练数据中,我排除了循环中的一点来手动创建LOOCV。
我认为predict(knn.fit, data.test)
中出现问题。我试图通过kknn程序包说明和在线查找如何在kknn
中进行预测,但是所有示例均为“ summary(model)”和“ table(validation ...)”,而不是针对单独测试的预测数据。代码predict(model, dataset)
在train.kknn
函数中成功运行,所以我认为我可以在kknn中使用类似的参数。
我不确定kknn
中是否有这样的预测功能。如果是,我应该提出哪些论点?
期待您的建议。谢谢。
library(kknn)
for (i in 1:nrow(data.train)) {
train.data <- data.train[-i,]
validation.data <- data.train[i,]
knn.fit <- kknn(as.factor(R1)~., train.data, validation.data, k = 40,
kernel = "rectangular", scale = TRUE)
# train.data + validation.data is the 80% data I split.
}
pred.knn <- predict(knn.fit, data.test) # data.test is 20% data.
这是错误消息:
switch中的错误(类型,raw = object $ fit,prob = object $ prob, stop(“无效的预测类型”)):EXPR必须为长度1 向量
实际上,我尝试比较train.kknn和kknn + loop来比较遗漏一式CV的结果。我还有两个问题:
kknn
中的1):是否可以使用另一组数据作为测试数据来查看knn.fit预测?
train.kknn
中的2):我拆分了数据,并使用了全部数据的80%,并打算将其余20%用于预测。这是正确的常规做法吗?
2)或者我应该只将train.kknn
使用原始数据(整个数据集),然后创建一个循环:data[-i,]
用于训练,data[i,]
用于在{{1 }}?那么他们将成为同行吗?
我发现,如果我在kknn
函数中使用训练数据并对测试数据集使用预测,则将选择最佳k和内核,并将其直接用于基于测试数据集生成预测值。
相比之下,如果我使用train.kknn
函数并构建一个具有不同k值的循环,则该模型将基于以下内容生成相应的预测结果:
每次更改k值时设置的测试数据。最后,在kknn
+循环中,根据测试数据的最佳实际预测准确率选择最佳k。简而言之,选择的最佳k kknn
可能不适用于测试数据。
谢谢。
答案 0 :(得分:0)
对于kknn
返回的对象,predict
给出R1
中包含的单行的预测值或validation.data
的预测概率:
predict(knn.fit)
predict(knn.fit, type="prob")
predict
命令也可用于train.knn
返回的对象。
例如:
train.kknn.fit <- train.kknn(as.factor(R1)~., data.train, ks = 10,
kernel = "rectangular", scale = TRUE)
class(train.kknn.fit)
# [1] "train.kknn" "kknn"
pred.train.kknn <- predict(train.kknn.fit, data.test)
table(pred.train.kknn, as.factor(data.test$R1))
train.kknn
命令实现了一个留一法,非常接近@ vcai01开发的循环。请参见以下示例:
set.seed(43210)
n <- 500
data.train <- data.frame(R1=rbinom(n,1,0.5), matrix(rnorm(n*10), ncol=10))
library(kknn)
pred.kknn <- array(0, nrow(data.train))
for (i in 1:nrow(data.train)) {
train.data <- data.train[-i,]
validation.data <- data.train[i,]
knn.fit <- kknn(as.factor(R1)~., train.data, validation.data, k = 40,
kernel = "rectangular", scale = TRUE)
pred.kknn[i] <- predict(knn.fit)
}
knn.fit <- train.kknn(as.factor(R1)~., data.train, ks = 40,
kernel = "rectangular", scale = TRUE)
pred.train.kknn <- predict(knn.fit, data.train)
table(pred.train.kknn, pred.kknn)
# pred.kknn
# pred.train.kknn 1 2
# 0 374 14
# 1 9 103