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

时间:2019-08-25 19:49:26

标签: r

我尝试使用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可能不适用于测试数据。

谢谢。

1 个答案:

答案 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