我试图在我的数据集上使用knn函数(来自类包)。它有5列功能,第6列是我想要预测的。我正在进行70/30的分割。
这是我的代码:
> ind <- createDataPartition(CSD$Caesarian, p=0.70, list=FALSE)
> csd_train <- CSD[ ind,]
> csd_test <- CSD[-ind,]
> c1 <- CSD[1:6,-c(1,2,3,4,5)]
> knn(train, test, c1, k=2, prob=TRUE)
但是我收到了这个错误。
Error in knn(train, test, c1, k = 2, prob = TRUE) :
'train' and 'class' have different lengths
我查看了其他主题并尝试了他们建议的解决方案(KNN in R: 'train and class have different lengths'?)
并尝试了以下内容,但我仍然遇到错误
> c1 = as.factor(c1)
> dim(csd_train)
[1] 57 6
> dim(csd_test)
[1] 23 6
> length(c1)
[1] 6
> knn(train, test, c1, k=2, prob=TRUE)
Error in knn(train, test, c1, k = 2, prob = TRUE) :
'train' and 'class' have different lengths
我也试过这个,但仍然出错。
> c1 = as.factor(CSD[['Caesarian']])
> knn(train, test, c1, k=2, prob=TRUE)
Error in knn(train, test, c1, k = 2, prob = TRUE) :
'train' and 'class' have different lengths
我迷失了如何解决这个问题。
以下是我的数据样本,如果有帮助的话:
> dput(head(CSD))
structure(list(Age = c(22L, 26L, 26L, 28L, 22L, 26L), Delivery.NO = c(1L,
2L, 2L, 1L, 2L, 1L), Delivery.NO.1 = c(1L, 1L, 0L, 1L, 1L, 0L
), BP = c(2L, 1L, 1L, 2L, 1L, 0L), Heart.Problem = c(1L, 1L,
1L, 1L, 1L, 1L), Caesarian = structure(c(1L, 2L, 1L, 1L, 2L,
1L), .Label = c("N", "Y"), class = "factor")), .Names = c("Age",
"Delivery.NO", "Delivery.NO.1", "BP", "Heart.Problem", "Caesarian"
), row.names = c(NA, 6L), class = "data.frame")
修改 我做了
c1 <- csd_train[, 6]
,长度(c1)现在为57,这很好。但是,当我运行knn line时,我现在收到这个新错误:
Error in knn(csd_train, csd_test, c1, k = 2, prob = TRUE) : NA/NaN/Inf in `foreign function call (arg 6) In addition: Warning messages: 1: In` `knn(csd_train, csd_test, c1, k = 2, prob = TRUE) : NAs introduced by coercion 2:` `In knn(csd_train, csd_test, c1, k = 2, prob = TRUE) : NAs introduced by coercion`
我的所有预测变量都是数字,并且没有缺失值。
答案 0 :(得分:1)
我想我有一个答案。
以下是使用iris
数据集的工作示例。您必须在列车和测试集中省略目标变量。将列车集的目标变量传递给cl
调用中的参数knn
。然后它应该工作。
在此示例中,目标变量位于第5列。
当cl
的长度不等于测试集中的行数时,会发生错误。
library(class)
library(caret)
dat<-iris
ind <- createDataPartition(dat$Species, p=0.70, list=FALSE)
dat_train <- dat[ ind,-5] #leave your target variable out
dat_test <- dat[-ind,-5] #leave your target variable out
cl<-dat[ind,5] #your target variable for the train set
knn(dat_train, dat_test, cl, k=2, prob=TRUE)
*修改
我在你的代码中发现了错误。如果您的数据如下所示:
> dim(csd_train)
[1] 57 6
> dim(csd_test)
[1] 23 6
> length(c1)
[1] 6
它不能工作,因为c1(6)的长度与csd_train(57)的行数不匹配。
**另一个编辑:
试试这个:
ind <- createDataPartition(CSD$Caesarian, p=0.70, list=FALSE)
csd_train <- CSD[ ind,-6]
csd_test <- CSD[-ind,-6]
c1 <- CSD[ ind,6]
knn(csd_train , csd_test, c1, k=2, prob=TRUE)