我试图在数据集上运行kNN但我不断收到一些NA错误。我已经耗尽了堆栈溢出,试图找到解决这个问题的方法。我找不到任何有用的东西。
这是我正在使用的数据集:https://www.kaggle.com/tsiaras/uk-road-safety-accidents-and-vehicles
我已将每个因子变量和整数变量转换为我的预测变量和目标数字,因此它可以进行欧几里德距离。我删除了所有NA,但kNN不断抛出以下错误消息:
NAs introduced by coercionNAs introduced by coercionError in knn(train[2:nrow(train), c(11, 22, 23, 25, 27, 28)], test[(2:nrow(test)), :
NA/NaN/Inf in foreign function call (arg 6)
这是我如何转换所有预测变量并运行kNN的一个示例:
as.numeric(levels(test$Road_Type))[levels(test$Road_Type)]
as.numeric(levels(train$Road_Type))[levels(train$Road_Type)]
train <- na.exclude(train)
test <- na.exclude(test)
cl=as.numeric(train[2:nrow(train),5])
cl <- na.exclude(cl)
knn0 <- knn(train[2:nrow(train),c(11,22,23,25,27,28)], test[(2:nrow(test)),c(11,22,23,25,27,28)], cl)
我正在为所有列11,22,23,25,27,28以及目标执行as.numeric。我在2开始行,所以它不包括标签。我还尝试在将参数传递给kNN函数之前运行以下代码:
sum(is.na(train[2:nrow(train),c(11,22,23,25,27,28)]))
sum(is.na(test[2:nrow(test),c(11,22,23,25,27,28)]))
sum(is.na(cl))
其中所有3个都返回0,因此在将其传递给kNN函数之前没有NA值。
编辑
通过转换为数字来修复此问题,如下所示:
train $ Road_Type < - as.numeric(as.integer(factor(train $ Road_Type)))
感谢所有帮助过的人!
您确定已将数据转换为数字吗? as.numeric()不能正常工作,你必须分配其结果,就像你用cl做的那样。
您需要始终查看数据。这有助于您和其他人回答这个问题。
如果我们检查您的数据,它看起来像这样:
str(df[, c(11, 22, 23, 25, 27, 28)])
'data.frame': 2047256 obs. of 6 variables:
$ Junction_Control : chr "Data missing or out of range" "Auto traffic signal" "Data missing or out of range" "Data missing or out of range" ...
$ Number_of_Vehicles : int 1 1 2 1 1 2 2 1 2 2 ...
$ Pedestrian_Crossing.Human_Control: int 0 0 0 0 0 0 0 0 0 0 ...
$ Police_Force : chr "Metropolitan Police" "Metropolitan Police" "Metropolitan Police" "Metropolitan Police" ...
$ Road_Type : chr "Single carriageway" "Dual carriageway" "Single carriageway" "Single carriageway" ...
$ Special_Conditions_at_Site : chr "None" "None" "None" "None" ...
如果我们将一个字符转换为数字会发生什么:
df$Police_Force <- as.numeric(df$Police_Forc)
df$Police_Force
[1] NA NA NA NA NA NA NA ....
Warning message:
NAs introduced by coercion
这在R中不起作用。但是,如果我们将它们设置为因子,然后将它们更改为数字,问题就解决了。
df$Police_Force <- as.numeric(as.factor(df$Police_Forc))
df$Police_Force
[1] 30 30 30 30 30 30 30 ...
您的方法不起作用,因为变量不是因素而是字符。
levels(df$Road_Type)
NULL
as.numeric(levels(df$Road_Type))[levels(df$Road_Type)]
numeric(0)
由于您没有显示导入R后数据的外观,我可能错了。我使用了read.csv
功能。