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

Posted

技术标签:

【中文标题】从 R 中的 e1071 包训练 SVM 时出现错误“(下标)逻辑下标太长”【英文标题】:Getting an error "(subscript) logical subscript too long" while training SVM from e1071 package in R 【发布时间】:2013-06-11 03:30:25 【问题描述】:

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

> 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

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

【问题讨论】:

如果没有可重现的例子,很难回答。该错误表明您的 newdata(test here) 没有包含足够的列。 【参考方案1】:

“测试”数据集中的一个因子中的级别数可能有所不同。

运行 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 ...

【讨论】:

用 data = factor(data, levels = c(std levels)) 更改了级别。而且效果很好【参考方案2】:

那是正确的火车数据包含 2 个用于登机的空白,因为这个空白有一个额外的分类值,您会收到此错误

$ Embarked : 因子 w/ 4 个级别 "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...

第一个是空白

【讨论】:

【参考方案3】:

我今天遇到了同样的问题。原来e1071包中的svm模型只能使用行作为对象,这意味着一行是一个样本,而不是列。如果使用 column 作为样本,row 作为变量,就会出现这个错误。

【讨论】:

【参考方案4】:

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

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。 今天遇到这个问题,用了上面的技巧,然后就解决了。

【讨论】:

【参考方案5】:

我也一直在使用该数据集。我知道这是很久以前的事了,但您可以做的一件事就是明确地只包含您认为会添加到模型中的列,如下所示:

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

这消除了我的问题,消除了没有相关数据的无贡献的列(如票号)。

【讨论】:

【参考方案6】:

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

【讨论】:

这是问题的答案吗?还是只是提出另一个问题?

以上是关于从 R 中的 e1071 包训练 SVM 时出现错误“(下标)逻辑下标太长”的主要内容,如果未能解决你的问题,请参考以下文章

R:调整 SVM 参数 - e1071 包中的 class.weights

R(e1071) 中是不是有直接实现多类 SVM

R中的一类SVM分类

R e1071 预测与 libsvm 不同

如何在 R 中使用 libSVM(包 e1071)获得概率?

R 中的 SVM (e1071):赋予最近的数据更高的影响力(支持向量机的权重?)