【问题标题】:SVM Predict Levels not matching between test and training dataSVM 预测水平在测试和训练数据之间不匹配
【发布时间】:2018-08-26 20:34:26
【问题描述】:

我正在尝试预测处理推荐电影的二元分类问题。

我有一个 50 行(电影)和 6 列(5 个电影属性和对电影的共识)的训练数据集。

然后我有一个包含相同列的 20 部电影的测试数据集。

然后我跑

pred<-predict(svm_model, test)

并接收

predict.svm(svm_model, test) 中的错误:测试数据与模型不匹配!。

从类似的帖子来看,错误似乎是因为训练数据集和测试数据集之间的级别不匹配。这是真的,我通过比较str(test)str(train) 证明了这一点。但是,这两个数据集都来自随机选择的电影,并且它们的分类属性总是具有不同的级别。正在做

levels(test$Attr1) <- levels(train$Attr1)

更改测试中的实际列数据,从而使预测器不正确。有谁知道如何解决这个问题?

我的训练集的前半打行在以下链接中。 https://justpaste.it/1ifsx

【问题讨论】:

    标签: r svm


    【解决方案1】:

    假设 Attr1 是一个字符,你可以这样做:

    1. 使用来自 test 和 train 的 attribute1 的唯一值创建一个级别属性。
    2. 在训练和测试属性1上创建一个因子,其中包含第 1 点中找到的所有级别。

      levels <- unique(c(train$Attr1, test$Attr1))
      test$Attr1  <- factor(test$Attr1, levels=levels)
      train$Attr1 <- factor(train$Attr1, levels=levels)
      

    如果您不想要因子,请将as.integer 添加到部分代码中,您将得到数字而不是因子。这有时在 xgboost 等模型中更方便,并且节省了一次热编码。

    as.integer(factor(test$Attr1, levels=levels))

    【讨论】:

    • 我的属性是字符。执行您的代码会导致 test$Attr1 和 train$Attr1 对于所有值都是“”。另外,我注意到运行 unique 返回所有整数而不是字符(不确定这是否意味着)。有什么见解吗?
    • @user2402616 unique(train$attr1) 的值是多少?你有定义为字符的数字吗?否则,将 dput(head(train, 6)) 放入您的问题中。这将有助于更好地了解您要做什么。
    • 我所有属性的值都是字符串。在这种情况下,它们是人名的字符串。此外,您的代码确实解决了我的错误,因为我现在能够成功使用 predict 函数。然而,结果只是“因子(0)”,我的标签列的级别被打印出来。我已将 dput 命令的结果附加到我的问题中。
    • 您读取数据的方式会将每一列转换为因子。尝试使用选项stringsAsFactors = FALSE 读取数据。我在 kaggle 比赛中使用的带有 as.integer 选项的代码并没有让我失望。
    • 删除 stringsAsFactors 然后使用您的代码做到了。谢谢
    猜你喜欢
    • 2017-06-21
    • 2017-03-24
    • 1970-01-01
    • 2013-08-05
    • 2018-05-17
    • 2020-06-26
    • 2013-11-30
    • 2013-08-13
    • 2018-11-20
    相关资源
    最近更新 更多