2015-10-29 5 views
1

Я пытаюсь использовать функцию knn (из пакета классов) в моем наборе данных. Он имеет 5 столбцов функций, а 6-й - это то, что я хочу предсказать. Я занимаюсь сексом 70/30.Ошибка в knn 'train' и 'class' имеют разную длину

Вот мой код:

> ind <- createDataPartition(CSD$Caesarian, p=0.70, list=FALSE) 
> csd_train <- CSD[ ind,] 
> csd_test <- CSD[-ind,] 
> c1 <- CSD[1:6,-c(1,2,3,4,5)] 
> knn(train, test, c1, k=2, prob=TRUE) 

Но я получаю эту ошибку.

Error in knn(train, test, c1, k = 2, prob = TRUE) : 
    'train' and 'class' have different lengths 

Я посмотрел на других потоков и пытается их предлагались пути решения (KNN in R: 'train and class have different lengths'?)

и попытался следующие, но я все еще получаю ошибки

> c1 = as.factor(c1) 
> dim(csd_train) 
[1] 57 6 
> dim(csd_test) 
[1] 23 6 
> length(c1) 
[1] 6 
> knn(train, test, c1, k=2, prob=TRUE) 
Error in knn(train, test, c1, k = 2, prob = TRUE) : 
    'train' and 'class' have different lengths 

Я также попробовал это, и до сих пор получение ошибки.

> c1 = as.factor(CSD[['Caesarian']]) 
> knn(train, test, c1, k=2, prob=TRUE) 
Error in knn(train, test, c1, k = 2, prob = TRUE) : 
    'train' and 'class' have different lengths 

Я потерян относительно того, как исправить это.

Вот пример моих данных, если это помогает:

> dput(head(CSD)) 
structure(list(Age = c(22L, 26L, 26L, 28L, 22L, 26L), Delivery.NO = c(1L, 
2L, 2L, 1L, 2L, 1L), Delivery.NO.1 = c(1L, 1L, 0L, 1L, 1L, 0L 
), BP = c(2L, 1L, 1L, 2L, 1L, 0L), Heart.Problem = c(1L, 1L, 
1L, 1L, 1L, 1L), Caesarian = structure(c(1L, 2L, 1L, 1L, 2L, 
1L), .Label = c("N", "Y"), class = "factor")), .Names = c("Age", 
"Delivery.NO", "Delivery.NO.1", "BP", "Heart.Problem", "Caesarian" 
), row.names = c(NA, 6L), class = "data.frame") 

EDIT Я сделал

c1 <- csd_train[, 6] 

и длина (c1) теперь 57, и это хорошо. Однако, когда я бегу Knn линию, я теперь получаю эту новую ошибку:

Error in knn(csd_train, csd_test, c1, k = 2, prob = TRUE) : NA/NaN/Inf in `foreign function call (arg 6) In addition: Warning messages: 1: In` `knn(csd_train, csd_test, c1, k = 2, prob = TRUE) : NAs introduced by coercion 2:` `In knn(csd_train, csd_test, c1, k = 2, prob = TRUE) : NAs introduced by coercion` 

Все мои предикторов являются числовыми, и нет пропущенных значений.

+0

Можете ли вы предоставить воспроизводимый пример вашей ошибки? – Alex

+0

Что вы делаете в строке 4 ('> c1 <- CSD [1: 6, -c (1,2,3,4,5)]'? – Alex

+0

Я хочу, чтобы c1 был только последним столбцом - строка четыре включает cols 1-6, но исключает cols 1-5, оставив только столбец 6. –

ответ

1

У меня есть ответ.

Ниже приведен пример работы с использованием набора данных iris. Вы должны оставить целевую переменную в своем поезде и тестовом наборе. Передайте целевую переменную для вашего набора поездов в аргумент cl по вызову knn. Тогда это должно сработать. В этом примере целевая переменная находится в столбце 5.

Ошибка возникает, когда длина cl не равна количеству строк в вашем тестовом наборе.

library(class) 
library(caret) 

dat<-iris 

ind <- createDataPartition(dat$Species, p=0.70, list=FALSE) 
dat_train <- dat[ ind,-5]   #leave your target variable out 
dat_test <- dat[-ind,-5]   #leave your target variable out 
cl<-dat[ind,5]     #your target variable for the train set 
knn(dat_train, dat_test, cl, k=2, prob=TRUE) 

* редактировать

Я нашел ошибку в коде. Если ваши данные выглядят следующим образом:

> dim(csd_train) 
[1] 57 6 
> dim(csd_test) 
[1] 23 6 
> length(c1) 
[1] 6 

она не может работать, так как длина c1 (6) не совпадает с числом строк csd_train (57).

** Другой редактировать:

Попробуйте именно это:

ind <- createDataPartition(CSD$Caesarian, p=0.70, list=FALSE) 
csd_train <- CSD[ ind,-6] 
csd_test <- CSD[-ind,-6] 
c1 <- CSD[ ind,6] 
knn(csd_train , csd_test, c1, k=2, prob=TRUE) 
+0

Итак, я попробую' c1 <- csd_train [6] ', который должен (если я правильно понял) дать мне целевую переменную для набора тренировок длиной 57. –

+0

Если ваша целевая переменная находится в 6-м столбце 'csd_train', то это будет' c1 <- csd_train [, 6] '. – Alex

+0

Я сделал' c1 <- csd_train [, 6] 'и' length (c1) ' теперь 57. Это хорошо, но когда я запускаю строку knn, я получаю эту новую ошибку: 'Ошибка в knn (csd_train, csd_test, c1, k = 2, prob = TRUE): NA/NaN/Inf в вызове внешней функции (arg 6) Дополнительно: Предупреждающие сообщения: 1: В knn (csd_train, csd_test, c1, k = 2, prob = TRUE): NAs, введенные принуждением 2: В knn (csd_train, csd_test, c1, k = 2, prob = TRUE): НС, введенные принуждением' –

Смежные вопросы