R 中不允许有缺失值 kNN

No missing values are allows kNN in R

我有 17 列的 45212 个元素的数据集,我想使用 kNN 算法找到最后一列的 class 标签,根据我的说法一切正常,但我总是想出错误

"Error in knn(train = data_train, test = data_test, cl = data_train_labels,  : 
  no missing values are allowed"

这是我的代码

> data_train <-data[1:25000,]
> data_test <-data[25001:45212,]
> data_train_labels <- data[1:25000, 17]
> data_test_labels <- data[1:25000, 17]
> install.package("class")
> library(class)
> data_test_pred <- knn(train=data_train, test=data_test, cl=data_train_labels, k=10)

这是我的数据集的样子:

age,job,marital,education,default,balance,housing,loan,contact,day,month,duration,campaign,pdays,previous,poutcome,y
58,management,married,tertiary,no,2143,yes,no,unknown,5,may,261,1,-1,0,unknown,no
44,technician,single,secondary,no,29,yes,no,unknown,5,may,151,1,-1,0,unknown,no
33,entrepreneur,married,secondary,no,2,yes,yes,unknown,5,may,76,1,-1,0,unknown,no
47,blue-collar,married,unknown,no,1506,yes,no,unknown,5,may,92,1,-1,0,unknown,no
33,unknown,single,unknown,no,1,no,no,unknown,5,may,198,1,-1,0,unknown,no
35,management,married,tertiary,no,231,yes,no,unknown,5,may,139,1,-1,0,unknown,no
28,management,single,tertiary,no,447,yes,yes,unknown,5,may,217,1,-1,0,unknown,no
42,entrepreneur,divorced,tertiary,yes,2,yes,no,unknown,5,may,380,1,-1,0,unknown,no
58,retired,married,primary,no,121,yes,no,unknown,5,may,50,1,-1,0,unknown,no
43,technician,single,secondary,no,593,yes,no,unknown,5,may,55,1,-1,0,unknown,no
41,admin.,divorced,secondary,no,270,yes,no,unknown,5,may,222,1,-1,0,unknown,no

我认为你的问题是你数据中的所有因素。 knn 文档说它使用欧氏距离,这对因子没有意义。如果你真的想使用 knn,这里有一个可能的解决方案。您可以使用集群包中的 daisy 获得点之间的距离矩阵。 R 中有几种 knn 实现,但我不知道接受距离矩阵的实现。您可以自己编写(不是那么困难),也可以使用 cmdscale 将距离矩阵映射到欧几里德 space。然后在投影 space.

上使用 knn

我认为你的错误是:data_train <-data[1:25000,]

您包含了尚未规范化的 header。我能够重现同样的错误。但是当我更改为 data_train <-data[2:25000,] 时 运行 很好。