'train' 和 'class' 在 R 中有不同的长度错误

'train' and 'class' have different lengths error in R

我只是想在k为3的情况下进行kNN分类。我想使用训练集预测有效集中的因变量“糖尿病”并计算准确性。

但我遇到了

的错误消息

Error in knn(train = TrainXNormDF, test = ValidXNormDF, cl = MLdata2[, : 'train' and 'class' have different lengths

我无法通过

的 get 方法解决此问题
for(i in ((length(MLValidY) + 1):length(TrainXNormDF)))+(MLValidY = c(MLValidY, 0))

我能为它做什么?请帮忙。

我的代码如下

install.packages("mlbench")
install.packages("gbm")

library(mlbench)
library(gbm)

data("PimaIndiansDiabetes2")
head(PimaIndiansDiabetes2)

MLdata <- as.data.frame(PimaIndiansDiabetes2)
head(MLdata)
str(MLdata)
View(MLdata)

any(is.na(MLdata))
sum(is.na(MLdata))

MLdata2 <- na.omit(MLdata)
any(is.na(MLdata2))
sum(is.na(MLdata2))
View(MLdata2)

MLIdx <- sample(1:3, size = nrow(MLdata2), prob = c(0.6, 0.2, 0.2), replace = TRUE)

MLTrain <- MLdata2[MLIdx == 1,]
MLValid <- MLdata2[MLIdx == 2,]
MLTest <- MLdata2[MLIdx == 3,]

head(MLTrain)
head(MLValid)
head(MLTest)

str(MLTrain)
str(MLValid)
str(MLTest)

View(MLTestY)


MLTrainX <- MLTrain[ , -9]
MLValidX <- MLValid[ , -9]
MLTestX <- MLTest[ , -9]

MLTrainY <- as.data.frame(MLTrain[ , 9])
MLValidY <- as.data.frame(MLValid[ , 9])
MLTestY <- as.data.frame(MLTest[ , 9])

View(MLTrainX)
View(MLTrainY)

library(caret)

NormValues <- preProcess(MLTrainX, method = c("center", "scale"))

TrainXNormDF <- predict(NormValues, MLTrainX)
ValidXNormDF <- predict(NormValues, MLValidX)
TestXNormDF <- predict(NormValues, MLTestX)

head(TrainXNormDF)
head(ValidXNormDF)
head(TestXNormDF)


install.packages('FNN')
library(FNN)
library(class)

NN <- knn(train = TrainXNormDF, 
      test = ValidXNormDF,
      cl = MLValidY,
      k = 3)

谢谢

您的 cl 变量与 train 变量的长度不同。 MLValidY 只有 74 个观测值,而 TrainXNormDF 有 224 个。

cl 应该为训练集中的每一行提供真实的分类。

此外,cl 是一个 data.frame 而不是向量。

尝试以下操作:

NN <- knn(train = TrainXNormDF, 
      test = ValidXNormDF,
      cl = MLTrainY$`MLTrain[, 9]`,
      k = 3)

如@rw2 所述,它是 cl 的长度。我认为您打算使用 MLtrainY,而不是 MLvalidY。当你有一个单列数据框时,你仍然可以 运行 进入形状问题(将其转换为向量)。您可以返回以确保您在此处使用了正确的内容,如下所示:

NN <- knn(train = TrainXNormDF, 
          test = ValidXNormDF,
          cl = MLdata2[MLIdx == 1,]$diabetes, # shape no longer an issue
          k = 3)