我正在尝试使用新数据集测试我的模型。我已经完成了与构建模型相同的预处理步骤。我比较了两个文件,但没有问题。我具有相同顺序,相同属性名称和数据类型的所有属性(训练与测试数据集)。但我仍然无法解决问题。两个文件训练和测试似乎相似,但weka资源管理器给我的错误说火车和测试集不兼容。如何解决此错误?有没有办法让test.arff文件格式为train.arff?请有人帮助我。
答案 0 :(得分:7)
与我在问题陈述后留下的评论相同:
所有这三个属性都是名义属性,后跟“{}”引用的所有可能值。我的一个猜测是可能的值不一样。例如,对于RESOURCE属性,测试文件中没有199,而它位于training-file中。
答案 1 :(得分:3)
在与同样的问题挣扎了一天之后。我想出了两种方法可以使训练好的模型在提供的测试集上运行。
方法1。 使用知识流。例如下面的内容: CSVLoader(用于火车组) - > classAssigner - > TrainingSetMaker - >(您选择的分类器) - > ClassfierPerformanceEvaluator - TextViewer。 CSVLoader(用于测试集) - > classAssigner - > TestgSetMaker - >(上面相同的分类器实例) - > PredictionAppender - > CSVSaver。 然后从CSVLoader或arffLoder加载训练集的数据。该模型将接受培训。 之后从加载器加载测试集的数据。它将在提供的测试集上评估模型(例如分类器),您可以从textviewer(连接到ClassifierPerformanceEvaluator)查看结果,并从连接到PredictionAppender.An附加列的CSVSaver或arffSaver获取保存的结果, "分类为"将被添加到输出文件中。 在我的情况下,我使用"?"如果类标签不可用,则为提供的测试集中的类列提供。
方法2。 将Training和Test集合到一个文件中。然后,完全相同的过滤器可以应用于训练和测试集。然后,您可以通过应用实例过滤器来分离训练集和测试集。因为我使用"?"作为测试集中的类标签。它在实例过滤器索引中不可见。因此,只需选择在应用实例过滤器时要在要删除的属性值中看到的那些索引。您只能获得测试数据。保存并将其加载到分类器页面的供应测试集中。这次它将起作用。我想这是类属性导致NOT兼容列车和测试集问题。因为许多classfier需要名义类属性。根据的值将其值转换为类属性的可用值的索引 http://weka.wikispaces.com/Why+do+I+get+the+error+message+%27training+and+test+set+are+not+compatible%27%3F
答案 2 :(得分:2)
请参阅以下answer,您的train.arff和test.arff应该具有相同的标头。根据你的比较,它们相似但不相同。
答案 3 :(得分:0)
看看类似和相同之间有区别,你的train.arrf和test.arrf应该有相同的标题,如果没有,那么你应该复制train.arrf的标题并将其粘贴到你的test.arrf中作为一个新的报头中。
答案 4 :(得分:0)
我刚刚遇到了同样的问题,并且找到了一个基本的解决方案。我的文件格式为.csv,我只需打开文件(分别用于培训和测试),然后使用WEKA的“预处理”面板上的“保存”按钮将它们保存为.arff格式。 然后问题解决了。
答案 5 :(得分:0)
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的默认设置相同),两个数据集的class属性都应位于最后一列。