1

我们有一个包含 15k 条分类推文的数据集,我们需要使用这些推文进行情绪分析。我想针对 5k 分类推文的测试集进行测试。由于 Weka 在测试集的标头中需要与训练集标头中存在的相同属性,如果我希望能够针对这个 5k 测试集运行我的分类器,我将不得不使用批量过滤。

但是,我需要通过几个过滤器来运行我的训练集,所以我认为针对训练集运行一个多重过滤器是一个好主意。不运行批处理参数时,多重过滤器工作正常,但是当我尝试批处理过滤时,我从 CLI 收到错误,因为它试图在多重过滤器中执行第一个过滤器:

带有批处理参数的 CLI multiFilter 命令:

java weka.filters.MultiFilter -F "weka.filters.supervised.instance.Resample -B 1.0 -S 1 -Z 15.0 -no-replacement" \
-F "weka.filters.unsupervised.attribute.StringToWordVector -R first-last -W 100000 -prune-rate -1.0 -N 0 -S -stemmer weka.core.stemmers.NullStemmer -M 2 -tokenizer weka.core.tokenizers.AlphabeticTokenizer" \
-F "weka.filters.unsupervised.attribute.Reorder -R 2-last,first"\
-F "weka.filters.supervised.attribute.AttributeSelection -E \"weka.attributeSelection.InfoGainAttributeEval \" -S \"weka.attributeSelection.Ranker -T 0.0 -N -1\"" \
-F weka.filters.AllFilter \
-b -i input\Train.arff -o output\Train_b_out.arff -r input\Test.arff -s output\Test_b_out.arff

这是来自 CLI 的结果错误:

weka.core.UnassignedClassException: weka.filters.supervised.instance.Resample: Class attribute not set!
at weka.core.Capabilities.test(Capabilities.java:1091)
at weka.core.Capabilities.test(Capabilities.java:1023)
at weka.core.Capabilities.testWithFail(Capabilities.java:1302)
at weka.filters.Filter.testInputFormat(Filter.java:434)
at weka.filters.Filter.setInputFormat(Filter.java:452)
at weka.filters.SimpleFilter.setInputFormat(SimpleFilter.java:195)
at weka.filters.Filter.batchFilterFile(Filter.java:1243)
at weka.filters.Filter.runFilter(Filter.java:1319)
at weka.filters.MultiFilter.main(MultiFilter.java:425)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at weka.gui.SimpleCLIPanel$ClassRunner.run(SimpleCLIPanel.java:265)

以下是训练和测试输入 arffs的部分数据的标题:

训练:

@RELATION classifiedTweets
@ATTRIBUTE @@sentence@@ string
@ATTRIBUTE @@class@@ {1,-1,0}
@DATA
"Conditioning be very important for curly dry hair",0
"Combine with Sunday paper coupon and",0
"Price may vary by store",0
"Oil be not really moisturizers",-1

测试:

@RELATION classifiedTweets
@ATTRIBUTE @@sentence@@ string
@ATTRIBUTE @@class@@ {1,-1,0}
@DATA
"5",0
"I give the curl a good form and discipline",1
"I have be cowashing every day",0
"LOL",0
"TITLETITLE Walgreens Weekly and Midweek Deal",0
"And then they walk away",0

我在这里做错了吗?我知道有监督的重采样要求类属性位于标题中属性列表的底部,并且它是......在测试和训练输入文件中。

编辑:

进一步的测试表明,此错误不会与批量过滤有关,每当我从 CLI 运行监督重采样过滤器时就会发生此错误......我使用的数据适用于我在 CLI 中尝试过的所有其他过滤器,所以我不明白为什么这个过滤器有什么不同......在 GUI 中重新采样数据也可以正常工作......

更新:

这也发生在 SMOTE 过滤器而不是重采样过滤器上

4

2 回答 2

0

无法使批处理过滤器与任何重采样过滤器一起使用。但是,我们的解决方法是在步骤 1 中简单地重新采样(然后随机化)训练数据。从这个简化的集合中,我们对测试集上我们想要的所有其他内容运行批处理过滤器。这似乎工作正常。

于 2014-05-06T17:19:21.340 回答
0

您可以使用multifilterClassAssigner方法来使其工作:

java -classpath $jcp weka.filters.MultiFilter
     -F "weka.filters.unsupervised.attribute.ClassAssigner -C last"
     -F "weka.filters.supervised.instance.Resample -B 1.0 -S 1 -Z 66.0"
于 2019-05-28T01:59:01.793 回答