Ошибка «поезд» и «класс» имеют разную длину - PullRequest
0 голосов
/ 23 февраля 2019

Я пытался использовать функцию KNN для запуска моих прогнозов, однако, когда я запускаю код, он выдает ошибку:

Ошибка в knn (data.frame (tr5_train), data.frame (tr5_test), cl = pred_train_labels,: 'train' и 'class' имеют разную длину

Я проверил, что все наборы данных являются data.frame, и попытался использовать метку в качестве вектора сбезуспешно

Ниже приведен код, который я использовал:

test_tr5_no_target<- test_tr5[-2]


tr5_train<- test_tr5_no_target[1:74475, , drop = FALSE]

tr5_test<- test_tr5_no_target[74476:93094, , drop = FALSE]

pred_train_labels<- test_tr5[1:74475, 2] 

pred_test_labels<- test_tr5[74476:93094, 2]


#install.packages("class")

library(class)

##ensure all data is a dataframe

as.data.frame(tr5_train)

as.data.frame(tr5_test)

as.data.frame(pred_train_labels)


pred1<- knn(data.frame(tr5_train), data.frame(tr5_test), cl = pred_train_labels, k = 5)

Имейте в виду, что для метки столбец 2 - это числовая целевая функция. Я исследовал все, и не былсмог найти что выдает эту ошибку, есть ли что-то, что я могу делать неправильно?

Спасибо за помощь, очень признателен! (К сожалению, я не могу поделиться данными сам, так как они ограничены)

-Хосе С.

1 Ответ

0 голосов
/ 23 февраля 2019

Чтобы ответить на ваш вопрос напрямую: вы хотите, чтобы ваша метка (здесь pred_train_labels) была вектором, а НЕ кадром данных.Мы можем воссоздать вашу ошибку, используя набор данных mtcars.

library('tidyverse')
library('class')
set.seed(1)

x <- mtcars
target <- x[-1]

size <- floor(0.75 * nrow(x))

train_ind <- sample(seq_len(nrow(x)), size = size)

train <- x[train_ind, ]
test <- x[-train_ind, ]

label <- as.data.frame(x[1][train_ind, ]) #problem is here

 test <- knn(train,test,cl = label, k = 5)

 test

 Error in knn(train, test, cl = label, k = 5) : 
     'train' and 'class' have different lengths

Позволяя метке быть вектором, а затем вызывая атрибуты из нового объекта knn, мы можем получить вывод:

train_ind <- sample(seq_len(nrow(x)), size = size)

train <- x[train_ind, ]
test <- x[-train_ind, ]

label <- x[1][train_ind, ] #NOT a dataframe

test <- knn(train,test,cl = label, k = 5, prob = TRUE)
attributes(test)

$`levels`
 [1] "10.4" "14.3" "14.7" "15"   "15.2" "15.8" "16.4" "17.3"
 [9] "17.8" "18.7" "19.2" "19.7" "21"   "21.4" "22.8" "24.4"
 [17] "26"   "30.4" "32.4"

Исследование примера в ??knn также показывает это.

...