从R中的e1071包训练SVM时获得错误“(下标)逻辑下标太长”

时间:2013-06-14 13:07:36

标签: r svm

我正在使用我的traindata训练svm。 (E1071包装在R中)。以下是有关我的数据的信息。

> str(train)
'data.frame':   891 obs. of  10 variables:
$ survived: int  0 1 1 1 0 0 0 0 1 1 ...
$ pclass  : int  3 1 3 1 3 3 1 3 3 2 ...
$ name    : Factor w/ 15 levels "capt","col","countess",..: 12 13 9 13 12 12 12 8 13 13 
$ sex     : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
$ age     : num  22 38 26 35 35 ...
$ ticket  : Factor w/ 533 levels "110152","110413",..: 516 522 531 50 473 276 86 396 
$ fare    : num  7.25 71.28 7.92 53.1 8.05 ...
$ cabin   : Factor w/ 9 levels "a","b","c","d",..: 9 3 9 3 9 9 5 9 9 9 ...
$ embarked: Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...
$ family  : int  1 1 0 1 0 0 0 4 2 1 ...

我训练如下。

library(e1071)
model1 <- svm(survived~.,data=train, type="C-classification")

这里没问题。但是当我预测为:

pred <- predict(model1,test)

我收到以下错误:

Error in newdata[, object$scaled, drop = FALSE] : 
(subscript) logical subscript too long

我还尝试从列车和测试数据中删除“票证”预测器。但仍然是同样的错误。有什么问题?

6 个答案:

答案 0 :(得分:16)

“测试”数据集中某个因素的级别数可能存在差异。

运行str(test)并检查因子变量与“train”数据集中相应变量的级别是否相同。

即下面的示例显示 my.test $ foo 只有4个等级.....

str(my.train)
'data.frame':   554 obs. of  7 variables:
 ....
 $ foo: Factor w/ 5 levels "C","Q","S","X","Z": 2 2 4 3 4 4 4 4 4 4 ...

str(my.test)
'data.frame':   200 obs. of  7 variables:
 ...
 $ foo: Factor w/ 4 levels "C","Q","S","X": 3 3 3 3 1 3 3 3 3 3 ...

答案 1 :(得分:2)

多数民众赞成正确的列车数据包含2个空白,因此有空白的一个额外分类值,您将收到此错误

$已启用:因子w / 4级“”,“C”,“Q”,“S”:4 2 4 4 4 3 4 4 4 2 ...

第一个是空白

答案 2 :(得分:1)

我今天遇到了同样的问题。事实证明,svm包中的e1071模型只能使用行作为对象,这意味着一行是一个样本,而不是列。如果使用列作为样本并使用行作为变量,则会发生此错误。

答案 3 :(得分:1)

可能您的数据很好(测试数据中没有新的水平),您只需要一个小技巧,然后就可以进行预测了。

test.df = rbind(train.df[1,],test.df)
test.df = test.df[-1,]

此技巧来自R Random Forest - type of predictors in new data do not match。 今天我遇到了这个问题,使用上面的技巧,然后解决了这个问题。

答案 4 :(得分:0)

我也一直在玩这个数据集。我知道这是很久以前的事了,但你可以做的事情之一是明确地只包括你认为会添加到模型中的列,例如:

fit <- svm(Survived~Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, data=train)

通过消除没有任何贡献的列(如票号),这消除了我的问题。

答案 5 :(得分:0)

解决我的代码的另一个可能问题是我很难忘记将一些自变量作为因子。