【问题标题】:SVM Is working on Training set but not on testing set in RSVM 正在处理训练集,但不在 R 中的测试集上
【发布时间】:2015-01-21 07:00:17
【问题描述】:

我使用 SVM 进行分类,我将我的数据集分为两个 CSV 文件,一个是训练集(70% 的数据),另一个是测试集(30% 的数据)。 当我在训练集上使用预测时,我得到了答案,但在测试集上显示错误 我正在使用 e1071 包

程序如下

Train <- read.csv("Train.csv")
Test <- read.csv("Test.csv")

x_Train <- subset(Train,select=-Class)
y_Train <- Train$Class

model <- svm(Class ~., data=Train)


pred=predict(model, x_Train) #working well
table(pred,y_Train)  


 x_Test <- subset(Test,select=-Class)
 y_Test <- Test$Class

pred <- predict(model, x_Test) #getting_error

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'

请您找出问题所在...?

【问题讨论】:

  • 在您的示例中,您创建了 x_Test 对象,但您在 x_test 对象上进行了预测。大写字母会有所不同。
  • 随着更改也出现错误:scale.default(newdata[, object$scaled, drop = FALSE], center = object$x.scale$"scaled:center", : 'center' 的长度必须等于 'x' 的列数
  • 没有数据很难找出问题所在。

标签: r svm


【解决方案1】:

删除测试数据中的缺失数据或在预测模型中添加 na.action = na.omit。或者你可以使用 na.action = na.exclude

model <- svm(Class ~., data=Train, na.action = na.exclude)

【讨论】:

    【解决方案2】:

    如果训练集中预测变量的类别与测试集中相同变量的类别不同,那么您将遇到此问题。

    例如,如果您使用class(x) = numeric 和测试集class(x) = character 训练了具有预测变量x 的模型,那么您应该在预测之前将x 转换为numeric

    data$x &lt;- as.numeric(data$x)

    话虽如此,它可以是不严格意义上的characternumeric 的任何类,也可以是factor 变量。

    【讨论】:

      【解决方案3】:

      这是因为输出包含比例变量,而这些比例变量与“newdata”变量不匹配。

      假设您针对称为 PC2: PC6 的 5 个变量训练了 SVM 模型

      svm_model$x.scale
      $`scaled:center`
                PC2           PC3           PC4           PC5           PC6           
       5.445380e-16  2.507442e-16 -7.655441e-16 -5.730488e-16 -3.283584e-16 
      
      $`scaled:scale`
            PC2       PC3       PC4       PC5       PC6       
      17.774403 13.571134  7.911114  6.541206  3.608903  
      

      如果变量的长度为 >5 在您的 newdata 中,您将收到此错误。在您的情况下,x_Test &lt;- subset(Test,select=-Class) 很可能会更改要缩放的变量数量。

      【讨论】:

        【解决方案4】:

        好的,对于那些遇到此错误但这些解决方案都不像我的人:我所做的是稍微增加测试数据的大小,它就像一个魅力。我第一次遇到错误时,我将 2 组拆分为 80-20,尝试以 75-25 进行,并且效果很好。我不知道为什么,但它奏效了。

        【讨论】:

          猜你喜欢
          • 2018-12-29
          • 1970-01-01
          • 1970-01-01
          • 2013-12-16
          • 2018-04-22
          • 2019-01-19
          • 2015-01-17
          • 2019-08-15
          • 2019-11-04
          相关资源
          最近更新 更多