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) диагноз был заголовком одного столбца метки фрейма данных, и это работало хорошо
Надеюсь, это поможет!