Weka 并不是真正的文档示例,但您仍然可以在他们的网站上找到有关它的有价值的信息。你应该从Primer开始。我知道您想对文本文件进行分类,因此您还应该看看Text categorization with WEKA。还有一个新的Weka 文档站点。
[编辑:Wikispaces 已经关闭,Weka 还没有在其他地方打开这些站点,所以我修改了指向 Google 缓存的链接。如果有人阅读了这篇文章并且新的 Weka Wiki 已经上线,请随时编辑链接并删除此注释。]
您在问题中发布的命令行包含错误。我知道,您从我对另一个问题的回答中复制了它,但我也刚刚注意到它。您必须省略-- -c last
,因为ReplaceMissingValue
过滤器不喜欢它。
在 Primer 中它说:
weka.filters.监督
类层次结构中低于 weka.filters.supervised 的类用于监督过滤,即利用类信息。必须通过 -c 分配一个类,以便 WEKA 默认行为使用-c last
。
butReplaceMissingValue
是一个无监督过滤器,和 一样StringToWordVector
。
多个过滤器
添加多个过滤器也没有问题,这就是MultiFilter
它的用途。不过,命令行可能会有点混乱:(我选择了RandomForest
这里,因为它比 NN 快得多)。
java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
-t ~/weka-3-7-9/data/ReutersCorn-train.arff \
-T ~/weka-3-7-9/data/ReutersCorn-test.arff \
-F "weka.filters.MultiFilter \
-F weka.filters.unsupervised.attribute.StringToWordVector \
-F weka.filters.unsupervised.attribute.Standardize" \
-W weka.classifiers.trees.RandomForest -- -I 100 \
做出预测
以下是 Primer 关于获得预测的内容:
但是,如果需要有关分类器预测的更详细信息,-p # 仅输出每个测试实例的预测,以及一系列从 1 开始的属性 id(0 表示无)。
将这些常规选项-p 0
直接放在您调用的类之后是一个很好的约定,因此命令行将是
java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
-t ~/weka-3-7-9/data/ReutersCorn-train.arff \
-T ~/weka-3-7-9/data/ReutersCorn-test.arff \
-p 0 \
-F "weka.filters.MultiFilter \
-F weka.filters.unsupervised.attribute.StringToWordVector \
-F weka.filters.unsupervised.attribute.Standardize" \
-W weka.classifiers.trees.RandomForest -- -I 100 \
WEKA 分类器/过滤器的结构
但是正如你所看到的,从命令行调用 WEKA 会变得非常复杂。这是由于 WEKA 分类器和过滤器的树形结构。虽然每个命令行只能运行一个分类器/过滤器,但它的结构可以任意复杂。对于上述命令,结构如下所示:
FilteredClassifier 将在训练数据集上初始化一个过滤器,过滤训练和测试数据,然后在训练数据上训练一个模型并对给定的测试数据进行分类。
FilteredClassifier
|
+ Filter
|
+ Classifier
如果我们想要多个过滤器,我们使用 MultiFilter,它只是一个过滤器,但它会按照给定的顺序调用多个其他过滤器。
FilteredClassifier
|
+ MultiFilter
| |
| + StringToWordVector
| |
| + Standardize
|
+ RandomForest
从命令行运行这样的事情的困难部分是将所需的选项分配给正确的类,因为通常选项名称是相同的。例如,该-F
选项也用于 theFilteredClassifier
和 the MultiFilter
,因此我必须使用引号来明确哪个 -F 属于哪个过滤器。
在最后一行中,您会看到-I 100
属于的选项RandomForest
不能直接附加,因为那样它将被分配给FilteredClassifier
并且您将得到Illegal options: -I 100
。因此,您必须--
在它之前添加。
将预测添加到数据文件
添加预测的类标签也是可能的,但更复杂。AFAIK 这不能一步完成,但您必须先训练和保存模型,然后使用这个模型来预测和分配新的类标签。
训练和保存模型:
java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
-t ~/weka-3-7-9/data/ReutersCorn-train.arff \
-d rf.model \
-F "weka.filters.MultiFilter \
-F weka.filters.unsupervised.attribute.StringToWordVector \
-F weka.filters.unsupervised.attribute.Standardize" \
-W weka.classifiers.trees.RandomForest -- -I 100 \
这会将训练的模型序列化FilteredClassifier
到文件rf.model
中。这里重要的是初始化的过滤器也会被序列化,否则过滤后测试集将不兼容。
加载模型,进行预测并保存:
java -classpath weka.jar weka.filters.supervised.attribute.AddClassification \
-serialized rf.model \
-classification \
-remove-old-class \
-i ~/weka-3-7-9/data/ReutersCorn-test.arff \
-o pred.arff \
-c last