【问题标题】:Error in knn 'train' and 'class' have different lengthsknn'train'和'class'中的错误有不同的长度
【发布时间】:2015-10-29 18:49:07
【问题描述】:

我正在尝试在我的数据集上使用 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 行时,我现在收到了这个新错误:

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`

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

【问题讨论】:

  • 您能否提供一个可重现的错误示例?
  • 第 4 行你在做什么 (&gt; c1 &lt;- CSD[1:6,-c(1,2,3,4,5)]?
  • 我希望 c1 只是最后一列 - 第四行包括第 1-6 列但不包括第 1-5 列,只留下第 6 列。
  • @Alex 你所说的“可重现的例子”是什么意思?
  • 获取一些可供所有人使用的数据,并使用这些数据重现您的错误。例如,我使用 iris 数据得到了您的错误。

标签: r nearest-neighbor knn


【解决方案1】:

我想我有一个答案。

这是一个使用 iris 数据集的工作示例。您必须在训练和测试集中忽略目标变量。将您的火车集的目标变量传递给knn 调用中的参数cl。然后它应该工作。 在此示例中,目标变量位于第 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)

【讨论】:

  • 好的,嗯。所以我会尝试c1 &lt;- csd_train[6],它应该(如果我理解正确的话)给我长度为 57 的训练集的目标变量。
  • 如果您的目标变量在csd_train 的第 6 列,那么它将是c1 &lt;- csd_train[ ,6]
  • 我做了c1 &lt;- csd_train[, 6]length(c1) 现在是57,这很好。但是,当我运行 knn 行时,我现在收到了这个新错误: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
  • 所有预测变量都是数字的吗?它们是否包含缺失值?
  • 我认为这里有一个解决这个问题的方法:stackoverflow.com/questions/16874038/error-with-knn-function
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2014-01-29
相关资源
最近更新 更多