如何在 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
我尝试使用 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