在命令行学习Weka

时间:2013-03-15 20:21:10

标签: machine-learning classification weka

我是Weka的新手,在命令行上对Weka来说更新。我发现文档很差,我正在努力弄清楚要做的一些事情。例如,想要获取两个.arff文件,一个用于训练,一个用于测试,并获得测试数据中缺失标签的预测输出。

我该怎么做?

我将此代码作为起始块

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier
-t "training_file_with_missing_values.arff"
-T "test_file_with_missing_values.arff"
-F weka.filters.unsupervised.attribute.ReplaceMissingValues -- -c last
-W weka.classifiers.functions.MultilayerPerceptron -- -L 0.3 -M 0.2 -H a

运行该代码给了我“非法选项-c last”,我不知道为什么。我也不会使用MLP,因为当我从文本数据中获得几千个特征时,NN往往太慢。我知道如何将它更改为另一个分类器(如NB或libSVM,这样很好)。

但我不确定如何在一次调用中添加多个过滤器,因为我还需要添加StringToWordVector过滤器(可能还有重新排序过滤器以使类成为最后一个,而不是第一个属性)。

然后如何让它实际输出每个类的预测标签?然后用初始数据存储在arff中。

2 个答案:

答案 0 :(得分:39)

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#只输出每个测试实例的预测,以及一系列基于一个的属性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选项也用于FilteredClassifierMultiFilter,因此我必须使用引号来明确哪个-F属于哪个过滤器。

在最后一行中,您看到属于-I 100的选项RandomForest无法直接追加,因为它会被分配给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

答案 1 :(得分:-1)

更好的方法来执行您想要使用GUI Explorer的所有内容。以下是如何做你想做的一切:

1)选择两个单独的文件进行培训和测试。

使用“预处理”选项卡下的“打开文件”选择您的培训文件。 使用“分类”选项卡下的“提供的测试集”单选择选择您的测试文件。

2)输出缺失标签的预测。

使用“更多选项”并选择“分类”选项卡下的“输出预测”以查看预测。

3)使用多个过滤器

使用“预处理”选项卡下的“过滤器”可以在分类之前应用尽可能多的过滤器。

4)将类设为最后一个属性

这实际上是不必要的。您可以选择任何属性作为您的班级。类是您希望分类器预测的任何属性。使用“分类”选项卡上的“Nom(类)”下拉列表选择您的类的属性。