Я получаю ошибку NA, введенную coercionNAs при попытке запустить kNN в R? - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь запустить 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, а также для цели.Я начинаю строку с 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, поэтому нет никаких значений NA, прежде чем я передам его в функцию kNN.

РЕДАКТИРОВАТЬ

Исправлена ​​проблема путем преобразования в числовое значение, например:

train $ Road_Type <- as.numeric (as.integer (factor (train $ Road_Type))) </p>

Спасибо всем, кто помог!

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Вы должны всегда смотреть на данные.Это поможет вам и другим ответить на вопрос.

Если мы проверим ваши данные, они будут выглядеть так:

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)

Поскольку вы еще не показали, как выглядят ваши данные после импорта в RI, возможно, вы ошиблись.Я использовал функцию read.csv.

0 голосов
/ 06 апреля 2019

Вы уверены, что преобразовали свои данные в числовые? as.numeric () не работает на месте, вы должны назначить его результат, как вы сделали это с помощью cl.

...