R 中的 KNN -- 所有参数必须具有相同的长度,test.X 为空
KNN in R -- All arguments must have the same length, test.X is empty
我正在尝试在 R 中对数据框执行 KNN,按照车辆类型(汽车、船、飞机)的 3 向分类,使用 mpg、成本等列作为特征。
开始,当我运行:
knn.pred=knn(train.X,test.X,train.VehicleType,k=3)
然后
knn.pred
returns
factor(0) Levels: car boat plane
和
table(knn.pred,VehicleType.All)
returns
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) returns 正确,但是当我对 test.X:
尝试相同时
test.X = cbind(DATA$mpg,DATA$cost)[!train,]
当我尝试打印 test.X 它 returns 一个像这样的空矩阵时:
[,1] [,2]
对于这么长的问题深表歉意,我可能没有包括所有相关信息。如果有人知道这里出了什么问题,或者为什么我的 test.X 没有加载任何数据,我将不胜感激!
没有关于您数据的任何信息,很难猜出问题出在哪里。你应该 post 一个 minimal reproducible example
或者至少 dput
您的数据或其中的一部分。然而,在这里我展示了 2 种训练 knn
模型的方法,使用 2 个不同的包(class
和 caret
)和 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 次 bootstrap 交叉验证,以在我在 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<=200)
您可以处理这些示例以自行发现错误。如果你不能 post 一个重现你的情况的例子。
我正在尝试在 R 中对数据框执行 KNN,按照车辆类型(汽车、船、飞机)的 3 向分类,使用 mpg、成本等列作为特征。
开始,当我运行:
knn.pred=knn(train.X,test.X,train.VehicleType,k=3)
然后
knn.pred
returns
factor(0) Levels: car boat plane
和
table(knn.pred,VehicleType.All)
returns
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) returns 正确,但是当我对 test.X:
尝试相同时test.X = cbind(DATA$mpg,DATA$cost)[!train,]
当我尝试打印 test.X 它 returns 一个像这样的空矩阵时:
[,1] [,2]
对于这么长的问题深表歉意,我可能没有包括所有相关信息。如果有人知道这里出了什么问题,或者为什么我的 test.X 没有加载任何数据,我将不胜感激!
没有关于您数据的任何信息,很难猜出问题出在哪里。你应该 post 一个 minimal reproducible example
或者至少 dput
您的数据或其中的一部分。然而,在这里我展示了 2 种训练 knn
模型的方法,使用 2 个不同的包(class
和 caret
)和 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 次 bootstrap 交叉验证,以在我在 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<=200)
您可以处理这些示例以自行发现错误。如果你不能 post 一个重现你的情况的例子。