在下面的代码中,我试图使用K个最近邻居和一个预测器。
据我所知,train.X
中的示例数量不需要与test.X
中的示例数相匹配,但R
似乎无法正确解析我的输入。< / p>
library(ISLR)
library(class)
train=(Weekly$Year<2009)
train.X = Weekly$Lag2[train]
test.X = Weekly$Lag2[!train]
train.Direction = Weekly$Direction[train]
knn.pred = knn(train.X, test.X, train.Direction, k=1)
运行上面的代码时,会出现错误
Error in knn(train.X, test.X, train.Direction, k = 1) :
dims of 'test' and 'train' differ
如何修复train.X
和test.X
以便R
正确解析它们?
答案 0 :(得分:14)
knn
函数将矩阵或数据帧作为训练集和测试集的参数。你传入一个向量,它被解释为一个矩阵,但不是你想要的方式。具体而言,您传入的数据被解释为单个数据点,其中不同的值表示要素。这意味着列车和测试的功能数量不同,正如错误消息所示。
要修复,只需明确转换,例如
knn.pred = knn(data.frame(train.X), data.frame(test.X), train.Direction, k=1)
答案 1 :(得分:3)
这是因为在对矩阵,数组或数据帧进行子集化时,R会自动尝试强制使用最少的维数。为了防止丢弃数据帧的维度,您可以使用默认为drop=FALSE
的子集函数。
train.X <- subset(Weekly[train],select="Lag2")
您还可以使用逻辑表达式作为参数来指示要保留的行或元素:
train.X <- subset(Weekly,Year<2009,select="Lag2")
子集函数还保持列名完整,让您使用train.X$Lag2
作为有效列。使用另一个答案中建议的data.frame或as.data.frame将会错过原始名称信息。
> names(train.X)
[1] "Lag2"