我正在尝试学习如何在 R 中使用 KNN,并在 nycflights13 包中的航班数据集上进行练习。运行下面的代码时,我得到了一个错误,错误信息如下:
‘train’ 和 ‘class’ 的长度不同
我的代码如下:
library(nycflights13)library(class)deparr <- na.omit(flights[c(4, 7, 16)])classframe <- deparr[3]flights %>% ggvis(~dep_time, ~arr_time, fill = ~distance) %>% layer_points()set.seed(1234)ind <- sample(2, nrow(deparr), replace=TRUE, prob=c(0.67, 0.33))flights.training <- deparr[ind==1, 1:2]flights.test <- deparr[ind==2, 1:2]flights.trainlabels <- deparr[ind==1, 3]flights.testlabels <- deparr[ind==2, 3]predictions <- knn(train = flights.training, test = flights.test, cl = flights.trainlabels[,1], k = 3)
回答:
这里是根据百分比划分训练集和测试集的代码。如果你想以不同的方式划分这两个子集,你可以从这个代码出发进行修改,但这证明了它是有效的。
deparr <- na.omit(flights[c(4, 7, 16)])set.seed(1234)# 准备将完整数据集分为两组,65%/35%n <- nrow(deparr)train_n <- round(0.65 * n)# 随机化我们的数据 deparr <- deparr[sample(n)]# 分割实际数据。我们将这些作为 knn 的输入flights.train <- deparr[1:train_n, ]flights.test <- deparr[(train_n + 1):n, ]# 目标变量,$distance,在第3列,所以从训练集和测试集中排除predictions <- knn(train = flights.train[, 1:2], test = flights.test[, 1:2], cl = flights.train$distance, k = 10)
这段代码运行后,我得到的结果如下:
> str(predictions)Factor w/ 209 levels "80","94","96",..: 121 159 18 54 207 18 94 55 159 136 ...