如何在 kknn 函数中进行预测?图书馆(kknn)

How to predict in kknn function? library(kknn)

我尝试使用 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.

错误信息如下:

Error in switch(type, raw = object$fit, prob = object$prob, stop("invalid type for prediction")) : EXPR must be a length 1 vector

其实我尝试比较train.kknn和kknn+loop来比较leave-out-one CV的结果。我还有两个问题:

1) in kknn:是否可以使用另一组数据作为测试数据来查看knn.fit预测?

2) in train.kknn:我拆分数据并使用整个数据的 80%,并打算使用剩余的 20% 进行预测。这是正确的常见做法吗?

2) 或者我应该只使用 train.kknn 的原始数据(整个数据集)并创建一个循环:data[-i,] 用于训练,data[i,] 用于验证 kknn?那么他们会是对口的吗?

我发现如果我在 train.kknn 函数中使用训练数据并对测试数据集进行预测,则选择最佳 k 和 kernel 并直接用于根据测试数据集生成预测值.

相比之下,如果我使用kknn函数并构建一个不同k值的循环,模型会根据 每次改变k值时的测试数据集。最后在kknn+循环中,根据测试数据实际预测准确率最好的k选出最好的k。简而言之,选择的最佳 k train.kknn 在测试数据上可能效果不佳。

谢谢。

对于 kknn 返回的对象,predict 给出 validation.data 中包含的单个行的预测值或 R1 的预测概率:

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