【问题标题】:I get the error NAs introduced by coercionNAs when trying to run kNN in R?尝试在 R 中运行 kNN 时出现由 coercionNAs 引入的错误 NA?
【发布时间】:2019-08-27 16:50:04
【问题描述】:

我正在尝试在数据集上运行 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

感谢所有帮助过的人!

【问题讨论】:

    标签: r algorithm machine-learning knn


    【解决方案1】:

    您确定已将数据转换为数字吗? as.numeric() 不起作用,您必须分配其结果,就像您使用 cl 完成的那样。

    【讨论】:

    • 我实际上确实尝试将 as.numeric() 函数分配给数据框中的相应列,但我得到类似这样的结果:$tmp i>, Road_Type, value = c(NA_real_, : 替换有16行,数据有56420
    【解决方案2】:

    您需要始终查看数据。这有助于您和其他人回答问题。

    如果我们检查您的数据,它看起来像这样:

    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 函数。

    【讨论】:

    • 实际上我在做 as.numeric() 之前确实转换了因子。我还使用 read.csv 来导入数据。正如另一个人所建议的那样,我实际上确实尝试将 as.numeric() 函数分配给数据框中的相应列,但我得到了如下内容:$&lt;-.data.frame(*tmp*, Road_Type, value = c(NA_real_, 中的错误):替换有16行,数据有56420
    • 你能分享你的完整代码吗?这将有助于找到错误。否则,会涉及很多猜测。
    猜你喜欢
    • 2019-06-11
    • 2016-04-30
    • 1970-01-01
    • 2013-01-17
    • 2013-09-17
    • 2017-04-04
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多