我正在使用我的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
我还尝试从列车和测试数据中删除“票证”预测器 . 但仍然是同样的错误 . 问题是什么?
4 回答
“测试”数据集中某个因素的级别数可能存在差异 .
运行str(test)并检查因子变量与'train'数据集中的对应变量具有相同的级别 .
即下面的例子显示 my.test$foo 只有4个级别.....
多数民众赞成正确的列车数据包含2个空白,因为这有空白的一个额外的分类值,你得到这个错误
$已启用:因子w / 4级“”,“C”,“Q”,“S”:4 2 4 4 4 3 4 4 4 2 ...
第一个是空白的
我今天遇到了同样的问题 . 原来,
e1071
包中的svm
模型只能使用行作为对象,这意味着一行是一个样本,而不是列 . 如果使用列作为样本并使用行作为变量,则会发生此错误 .我一直在玩这个数据集 . 我知道这是很久以前的事了,但你可以做的事情之一是明确地只包括你认为会添加到模型中的列,例如:
这消除了我的问题,通过消除没有任何贡献的列(如票号)没有相关数据 .