weka中的训练和测试集不兼容错误?

Posted

技术标签:

【中文标题】weka中的训练和测试集不兼容错误?【英文标题】:Train and test set are not compatible error in weka? 【发布时间】:2013-07-14 10:36:17 【问题描述】:

我正在尝试使用新数据集测试我的模型。我已经完成了与构建模型相同的预处理步骤。我比较了两个文件,但没有问题。我拥有相同顺序、相同属性名称和数据类型的所有属性(训练与测试数据集)。但我仍然无法解决问题。两个文件 train 和 test 似乎相似,但 weka explorer 给我错误说 Train 和 test set 不兼容。如何解决此错误?有没有办法将 test.arff 文件格式设为 train.arff?请有人帮助我。

【问题讨论】:

我有点难以理解你的问题。能详细介绍一下吗? 您好 AnnieKimless,感谢您的回复。我已经用数据集 train.arff 建立了一个分类模型,现在我正在尝试使用 weka explorer 预测 test.arff 测试文件的结果。两个文件 train 和 test 似乎相似,但 weka explorer 抛出错误,说 Train 和 test set 不兼容。如何解决此错误?有什么办法可以让 test.arf 文件格式为 train.arff? 所有三个属性都是标称属性,后跟“”引用的所有可能值。我的猜测之一是可能的值不一样。例如,RESOURCE 属性在测试文件中没有199,而在训练文件中。你怎么看? 嗨 AnnieKim,非常感谢。你的意见真的很有用。正如您所怀疑的,问题出在标称类型上。请发表您的评论作为答案。非常感谢。 好的,不客气。 【参考方案1】:
    trainPath = ""

    otherPadelPath = ""

    testPath = ""



    trainFile = open(trainPath,"r")

    trainAttributes = trainFile.readlines()[0].split(",")
    trainFile.close()



    otherPadelFile = open(otherPadelPath,"r")


    otherPadelLines = otherPadelFile.readlines()
    otherPadelFile.close()
    otherPadelColumns = []

    testLines = []

    for attribute in trainAttributes:
      if attribute in otherPadelLines[0].split(","):
        otherPadelColumns += [otherPadelLines[0].split(",").index(attribute)]


    for line in otherPadelLines:
      rearrangedLine = []
      for inDex in otherPadelColumns:
        rearrangedLine += [line.split(",")[inDex]]
      testLines += [",".join(rearrangedLine)]




    testFile = open(testPath,"w")
    testFile.writelines(testLines)
    testFile.close()

此脚本可以重新排列您的测试数据集,以在您的训练集中包含相同顺序/数量的属性列,前提是每个属性具有相同的类型和标题。此外,(与 WEKA 的默认设置保持一致),类属性应位于两个数据集的最后一列。

【讨论】:

【参考方案2】:

我刚刚遇到了同样的问题,我找到了一个简单的解决方案。我的文件格式是 .csv,我只需打开我的文件(分别用于训练和测试)并使用 WEKA 预处理面板上的保存按钮将它们保存为 .arff 格式。 那么问题就解决了。

【讨论】:

【参考方案3】:

在同一个问题苦苦挣扎了一天之后。我想出了两种方法让经过训练的模型在提供的测试集上运行。

方法一。 使用知识流。例如如下所示: CSVLoader(用于训练集)-> classAssigner -> TrainingSetMaker -->(您选择的分类器)-> ClassfierPerformanceEvaluator - TextViewer。 CSVLoader(用于测试集)-> classAssigner -> TestgSetMaker -->(与上面相同的分类器实例)-> PredictionAppender -> CSVSaver。 然后从 CSVLoader 或 arffLoder 为训练集加载数据。该模型将被训练。 之后从测试集的加载器加载数据。它将在提供的测试集上评估模型(例如分类器),您可以从 textviewer(连接到 ClassifierPerformanceEvaluator)查看结果,并从连接到 PredictionAppender 的 CSVSaver 或 arffSaver 获取保存的结果。附加列, “分类为”将被添加到输出文件中。 就我而言,我使用了“?”如果类标签不可用,则用于提供的测试集中的类列。

方法二。 将训练集和测试集合并到一个文件中。然后可以将完全相同的过滤器应用于训练集和测试集。然后,您可以通过应用实例过滤器来分离训练集和测试集。因为我使用“?”作为测试集中的类标签。它在实例过滤器索引中不可见。因此,只需选择在应用实例过滤器时可以在要删除的属性值中看到的那些索引。您将只剩下测试数据。保存它并将其加载到分类器页面的供应测试集中。这一次它将起作用。我猜这是导致不兼容的训练和测试集问题的类属性。由于许多分类器需要标称类属性。其中的值被转换为类属性的可用值的索引,根据 http://weka.wikispaces.com/Why+do+I+get+the+error+message+%27training+and+test+set+are+not+compatible%27%3F

【讨论】:

【参考方案4】:

看看相似和相同之间有区别,你的 train.arrf 和 test.arrf 应该有相同的标题,如果没有,那么你应该复制 train.arrf 的标题并将它作为新的粘贴到你的 test.arrf标题。

【讨论】:

【参考方案5】:

与我在问题陈述后留下的评论相同:

所有三个属性都是名义属性,后跟由“”引用的所有可能值。我的猜测之一是可能的值不一样。例如,对于 RESOURCE 属性,test file 中没有 199,而在 training-file 中。

【讨论】:

【参考方案6】:

请参阅以下answer,您的 train.arff 和 test.arff 应该具有相同的标题。根据您的比较,它们相似但不相同。

【讨论】:

嗨 Atilla,我找到了解决方案。问题是标题相似但不相同。我改变并验证了它。非常感谢您的帮助。

以上是关于weka中的训练和测试集不兼容错误?的主要内容,如果未能解决你的问题,请参考以下文章

错误评估分类器训练和测试数据集不兼容

错误:训练和测试中的关卡集不匹配(knncat R)

训练模型时出现不兼容行维度的值错误

weka 中的机器学习分类和预测

如何在 Weka 中对训练和测试数据集进行分类

weka 中的测试文件是不是需要与训练相同或更少的功能?