R中的KNN——所有参数必须具有相同的长度,test.X为空

Posted

技术标签:

【中文标题】R中的KNN——所有参数必须具有相同的长度,test.X为空【英文标题】:KNN in R -- All arguments must have the same length, test.X is empty 【发布时间】:2021-07-20 01:09:11 【问题描述】:

我正在尝试在 R 中对数据框执行 KNN,遵循车辆类型(汽车、船、飞机)的 3 路分类,使用 mpg、成本等列作为特征。

开始,当我跑步时:

knn.pred=knn(train.X,test.X,train.VehicleType,k=3)

然后

knn.pred

返回

factor(0) Levels: car boat plane

table(knn.pred,VehicleType.All)

返回

Error in table(knn.pred, VehicleType.All) : 
  all arguments must have the same length 

我认为我的问题是我可以使用 cbind() 成功加载 train.X,但是当我尝试对 test.X 进行相同操作时,它仍然是一个空矩阵。我的代码如下所示:

train=(DATA$Values<=200) # to train for all 200 entries including cars, boats and planes
train.X = cbind(DATA$mpg,DATA$cost)[train,]
summary(train.X)

在这里,summary(train.X) 返回正确,但是当我尝试对 test.X 进行相同操作时:

test.X = cbind(DATA$mpg,DATA$cost)[!train,]

当我尝试打印 test.X 时,它会返回一个空矩阵,如下所示:

[,1] [,2]

对于这么长的问题,我很抱歉,我可能没有包括所有相关信息。如果有人知道这里出了什么问题或为什么我的 test.X 没有加载任何数据,我将不胜感激!

【问题讨论】:

【参考方案1】:

如果没有关于您的数据的任何信息,很难猜测问题出在哪里。你应该发一个minimal reproducible example 或至少dput您的数据或其中的一部分。然而,这里我展示了 2 种方法来训练 knn 模型,使用 2 个不同的包(classcaret)和 mtcars 内置数据集。

class

library(class)

data("mtcars")
str(mtcars)
mtcars$gear <- as.factor(mtcars$gear)
ind <- sample(1:nrow(mtcars),20)
train.X <- mtcars[ind,]
test.X <- mtcars[-ind,]
train.VehicleType <- train.X[,"gear"]
VehicleType.All <- test.X[,"gear"]
knn.pred=knn(train.X,test.X,train.VehicleType,k=3)

table(knn.pred,VehicleType.All)

caret

library(caret)

ind <- createDataPartition(mtcars$gear,p=0.60,list=F)
train.X <- mtcars[ind,]
test.X <- mtcars[-ind,]
control <-trainControl(method = "cv",number = 10)
grid <- expand.grid(k=2:10)
knn.pred <- train(gear~.,data=train.X,method="knn",tuneGrid=grid)
pred <- predict(knn.pred,test.X[,-10])
cm <- confusionMatrix(pred,test.X$gear)

caret 包允许在模型拟合期间以简单的方式对参数调整执行交叉验证。默认情况下,train 执行 25 次自举交叉验证,以在 grid 对象中提供的值中找到 k 的最佳值。

从您的示例来看,您的测试对象似乎是空的,因此knn 的结果是一个长度为 0 的向量。可能您的问题在于数据读取。但是,将DATA 子集化的更好方法是:

#insetad of
train.X = cbind(DATA$mpg,DATA$cost)[train,]

#you should do:
train.X <- DATA[train,c("mpg","cost")]
test.X <- DATA[-train,c("mpg","cost")]

但是,我不明白 DATA$Values 是什么变量,一开始我以为这是结果,但是,这行让我很困惑:

train=(DATA$Values&lt;=200)

您可以处理这些示例以自行发现错误。如果您无法发布重现您的情况的示例。

【讨论】:

以上是关于R中的KNN——所有参数必须具有相同的长度,test.X为空的主要内容,如果未能解决你的问题,请参考以下文章

“survival”包中的 survfit 函数出错:“strata(mf[ll]) 中的错误:所有参数的长度必须相同”

所有参数都应具有相同的长度。参数 `y` 的长度是 6,而前面的参数 ['year'] 的长度是 100

r - 错误:`data` 和 `reference` 应该是具有相同级别的因素

Dash Plotly 如何修复“所有参数应具有相同的长度。x 和 y”

在R中将具有不同长度和两个条件的不同数据帧的列相乘

Kruskal 测试 kruskal.test.default(e, f) 中的错误:“x”和“g”必须具有相同的长度