e1071 SVM:尝试预测时出错

时间:2016-04-06 03:50:43

标签: r svm

我一直收到这个错误,我无法弄清楚原因。

  

scale.default(newdata [,object $ scaled,drop = FALSE],center中的错误   = object $ x.scale $“scaled:center”,:'center'的长度必须等于'x'的列数

我正在使用默认的虹膜数据集,这是我的所有代码。这是尝试使用成对方法实现多类SVM。

# pass in the dataframe & the number of classes
multiclass.svm <- function(data) {
  class.vec = data[,length(data)]
  levels = levels(class.vec)
  pair1 <- data[which(class.vec == levels[1]),]
  pair1 <- droplevels(pair1)
  pair2 <- data[which(class.vec == levels[length(levels)]),]
  pair2 <- droplevels(pair2)
  pairs = list(rbind(pair1, pair2))
#  print(pairs)
  for(i in 2:length(levels)){
    L1 <- data[which(class.vec == levels[i-1]),]
    L1 <- droplevels(L1)
    L2 <- data[which(class.vec == levels[i]),]
    L2 <- droplevels(L2)
    pair <- list(rbind(L1, L2))
    pairs <- c(pairs, pair)
  }
  # now we construct our (n choose 2) binary models
  models = list()
  for(pair in pairs){
    classifier = pair[,length(pair)]
    p.svm = svm(formula=classifier~., data=pair)
    models = c(models, list(p.svm))
  }
  for(model in models){
    test = iris[1,]
    print(predict(model, test))
  }
  return(models)
}

测试/用法:

> h = multiclass.svm(iris)
 Show Traceback

 Rerun with Debug
 Error in scale.default(newdata[, object$scaled, drop = FALSE], center = object$x.scale$"scaled:center",  : 
  length of 'center' must equal the number of columns of 'x' 
> 

非常感谢任何帮助......我在这个主题上找到了一些其他问题但无济于事。谢谢。

2 个答案:

答案 0 :(得分:0)

好的,不幸的是答案非常棘手(取决于您的数据集)。问题是在虹膜数据集中,有三个级别的分类。由于我将这些类分成两组,因此我的每个模型只有两个级别的分类。

使用预测您已经训练过的模型时,您测试的值必须具有相同的级别。因此,棘手的部分(至少在这种情况下)正在删除每对中不必要的级别。

我建议使用库plyr进行重估功能。要删除特定级别(而不是所有未使用的级别功能),您可以使用重估值并将每个不需要的级别重命名为现有级别(基本上将其销毁。)

相信这位波兰博主能​​够引导我朝着正确的方向前进: http://ppiotrow.blogspot.com/2013/04/solved-r-svm-test-data-does-not-match.html

但是,解决我的具体问题的简单方法就是删除所有的droplevels调用哈哈。由于SVM没有找到任何可以在未使用的级别上绘制的点,因此在保留无关级别时没有实际问题。

希望这有助于那里的人。 麦克

答案 1 :(得分:0)

我遇到过同样的问题。我通过将测试集中的所有预测变量转换为正确的类来修复错误,即as.factoras.numeric

例如,如果训练集中的numeric预测变量在内存中作为测试集中的character变量,则会出现此错误。我希望这会有所帮助。