KNN в R: "поезд и класс имеют разную длину"?

Вот мой код:

train_points <- read.table("kaggle_train_points.txt", sep="\t")
train_labels <- read.table("kaggle_train_labels.txt", sep="\t")
test_points <- read.table("kaggle_test_points.txt", sep="\t")

#uses package 'class'
library(class)
knn(train_points, test_points, train_labels, k = 5);

dim(train_points) - 42000 x 784
dim(train_labels) - 42000 x 1

Я не вижу проблемы, но получаю ошибку:

Ошибка в knn (train_points, test_points, train_labels, k = 5):
"train" и "class" имеют разную длину.

В чем проблема?

Ответ 1

Без доступа к данным это очень сложно. Однако я подозреваю, что train_labels должен быть вектором. Поэтому попробуйте

cl = train_labels[,1]
knn(train_points, test_points, cl, k = 5)

Также дважды проверьте:

dim(train_points)
dim(test_points)
length(cl)

Ответ 2

Недавно я столкнулся с очень похожим вопросом. Я хотел дать только один столбец в качестве предиктора. В таких случаях, выбирая столбец, вы должны помнить о аргументе drop и устанавливать его в FALSE. Функция knn() принимает только матрицы или фреймы данных в качестве аргументов поезда и теста. Не векторы.

knn(train = trainSet[, 2, drop = FALSE], test = testSet[, 2, drop = FALSE], cl = trainSet$Direction, k = 5)

Ответ 3

Попробуйте преобразовать данные в фрейм данных, используя as.dataframe(). У меня была такая же проблема & после этого все работало нормально:

train_pointsdf <- as.data.frame(train_points)
train_labelsdf <- as.data.frame(train_labels)
test_pointsdf <- as.data.frame(test_points)

Ответ 4

Просто установите drop = TRUE, пока вы исключаете cl из фрейма данных, это приводит к удалению измерения из массива, который имеет только один уровень:

cl = train_labels[,1, drop = TRUE]
knn(train_points, test_points, cl, k = 5)

Ответ 5

У меня была та же проблема при попытке применить knn для диагностики рака молочной железы из набора данных Висконсин, я обнаружил, что проблема была связана с тем фактом, что аргумент cl должен быть векторным фактором (моя ошибка заключалась в том, чтобы написать cl = метки, я думал, что это было прогнозируемый вектор на самом деле представлял собой фрейм данных из одного столбца), поэтому решение было использовать следующий синтаксис: knn (train, test, cl = метки $ диагноз, k = 21) диагноз был заголовком одного столбца метки фрейма данных, и это работало хорошо  Надеюсь, это поможет!