knn' train'和'班级'有不同的长度

时间:2015-10-29 18:49:07

标签: r nearest-neighbor knn

我试图在我的数据集上使用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`

我的所有预测变量都是数字,并且没有缺失值。

1 个答案:

答案 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)