当我尝试使用训练数据对新测试数据进行分类时,我在Weka Explorer中收到以下消息:
Problem evaluating classifier:
Train and test set are not compatible
Attributed differ at position 6:
Labels differ at position 1: TRUE != FALSE
我正在使用J48分类器根据布尔形式和数字上的关键字的流行度对RSS提要进行分类。只有布尔变量才会出现此问题。我的训练数据是这样的:
@relation _dm_3793_855329_11032013_1362993476361_Boolean-weka.filters.unsupervised.attribute.NumericToNominal-R65
@attribute bin {FALSE,TRUE}
@attribute kill {FALSE,TRUE}
@attribute laden {FALSE,TRUE}
@attribute video {FALSE,TRUE}
@attribute pakistan {FALSE,TRUE}
@attribute imf {TRUE,FALSE}
…
而等效的测试数据是:
@relation _dm_4993_179211_18032013_1363611143017_Boolean-weka.filters.unsupervised.attribute.NumericToNominal-R65
@attribute bin {FALSE,TRUE}
@attribute kill {FALSE,TRUE}
@attribute laden {FALSE,TRUE}
@attribute video {FALSE,TRUE}
@attribute pakistan {FALSE,TRUE}
@attribute imf {FALSE,TRUE}
…
对于属性为‘imf’
的最后一行,标签是相反的,所以我认为这是问题的原因:但我该如何解决呢?
标记了训练和测试数据,典型的行类似于以下内容:
@data
FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE, …, ‘Name of class’
我的.arff
文件是用Java代码动态创建的,如下所示:
// Create .arff file.
CSVLoader loader = new CSVLoader();
loader.setSource(new File(cf.getCsvFile()));
Instances data = loader.getDataSet();
NumericToNominal numToNom = new NumericToNominal();
String[] options = Utils.splitOptions("-R " + columnNames.length + ""); // Class attribute, if numeric, must be 'discretized'.
numToNom.setOptions(options);
numToNom.setInputFormat(data);
data = NumericToNominal.useFilter(data, numToNom);
ArffSaver saver = new ArffSaver();
saver.setInstances(data);
saver.setFile(new File(cf.getArffFile()));
saver.writeBatch();
所以有人可以告诉我,如果我使用过滤器错误或丢失了什么?通过相同代码生成的数字频率的等效.arff
文件是兼容的。
由于
摩根先生。答案 0 :(得分:0)
For the last line with attribute ‘imf’, the labels are reversed
so I assume that this is the cause of the problem:
but how can I solve it?
更改测试arff文件,使其与训练文件具有相同的标题。除了关系名称之外,训练和测试文件都应具有相同的标题信息。使它最后一行标题是
@attribute imf {TRUE,FALSE}
我有同样的问题,请看question and answer。基本上,您决定标题信息并将其放到另一个文件中。然后您的每个数据集使用相同的标头信息。要么使用编码,要么手工创建arff文件。
答案 1 :(得分:0)
我昨天与Weka的Eibe Frank进行了电子邮件交流。谈话可以在这里看到:
https://list.scms.waikato.ac.nz/pipermail/wekalist/2013-April/057698.html
他提出了一些建议,包括对训练和测试数据集使用相同的Weka NumericToNominal对象,或者如果在不同时间生成训练和测试数据集,则通过序列化保留相同的对象。
然而,在我的情况下,最好的解决方案是分别使用整数1和0代替TRUE和FALSE,并重新生成受影响的数据集。
感谢Atilla Ozgur。
答案 2 :(得分:0)
如果我们用0和1代替TRUE和FALSE。我们不能使用一些基于名义结果的算法。