【问题标题】:How to predict in kknn function? library(kknn)如何在 kknn 函数中进行预测?图书馆(kknn)
【发布时间】:2019-08-25 19:49:26
【问题描述】:

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

这是错误信息:

开关错误(类型,原始 = object$fit,prob = object$prob, stop("invalid type for prediction")) : EXPR 的长度必须为 1 向量

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

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

2) intrain.kknn:我将数据拆分并使用整个数据的 80%,并打算将剩余的 20% 用于预测。这是正确的惯例吗?

2) 还是应该将原始数据(整个数据集)用于train.kknn,并创建一个循环:data[-i,] 用于训练,data[i,] 用于在kknn 中进行验证?那么他们会是对手吗?

我发现如果我使用train.kknn函数中的训练数据并在测试数据集上使用预测,则选择最佳k和内核直接用于基于测试数据集生成预测值。

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

谢谢。

【问题讨论】:

    标签: r knn nearest-neighbor


    【解决方案1】:

    对于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
    

    【讨论】:

    • 谢谢你,马可。在您建议的 kknn 解决方案中,预测值/概率基于validation.data。我还有两个问题:1)是否可以使用另一组数据作为测试数据来查看 knn.fit 预测?实际上,我尝试比较 train.kknn 和 kknn+loop 来比较留一个 CV 的结果。我拆分数据并使用train.kknn中全部数据的80%; 2)或者我应该只使用train.kknn的原始数据(整个数据集),但将80%的数据用于训练,20%用于kknn的验证?所以他们会是对手?
    • @vcai01 train.kknn 使用留一法。因此,它是一种非常接近您的 kknn+loop 的算法。您应该从这两种方法中得到类似的预测。我编辑了我的答案,添加了一个说明性示例。我希望它可以帮助你。如果您觉得有用,请点赞并接受答案。谢谢。
    • 感谢您的回答,马可!它帮助我更好地理解 train.kknn 和 kknn 之间的区别。
    猜你喜欢
    • 2019-08-21
    • 2020-09-07
    • 2021-06-16
    • 2017-11-10
    • 2021-04-15
    • 1970-01-01
    • 2013-09-13
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多