Weka 并不是真正的文档示例,但您仍然可以在他们的网站上找到有关它的有价值的信息。您应该从Primer 开始。我知道你想对文本文件进行分类,所以你也应该看看Text categorization with WEKA。还有一个新的Weka documentation site。
[编辑:Wikispaces 已经关闭,Weka 还没有在其他地方打开网站,所以我修改了指向 Google 缓存的链接。如果有人阅读了这篇文章并且新的 Weka Wiki 已经上线,请随时编辑链接并删除此注释。]
您在问题中发布的命令行包含错误。我知道,您从我对另一个问题的回答中复制了它,但我也刚刚注意到它。您必须省略-- -c last,因为ReplaceMissingValue 过滤器不喜欢它。
在 Primer 中它说:
weka.filters.supervised
类层次结构中 weka.filters.supervised 之下的类用于监督过滤,即利用类信息。必须通过 -c 分配一个类,对于 WEKA 默认行为,使用 -c last。
但ReplaceMissingValue 是一个无监督过滤器,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 选项用于FilteredClassifier 和MultiFilter,因此我必须使用引号来明确哪个 -F 属于哪个过滤器。
在最后一行中,您可以看到属于RandomForest 的选项-I 100 不能直接附加,因为这样它将分配给FilteredClassifier,您将得到Illegal options: -I 100。因此,您必须在其前面添加--。
向数据文件添加预测
Adding the predicted class label 也是可能的,但更复杂。 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