在命令行学习Weka

Rei*_*rne 15 classification machine-learning 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sen*_*try 40

Weka并不是文档的光辉典范,但您仍可以在其网站上找到有关它的有价值的信息.你应该从入门开始.我知道您要对文本文件进行分类,因此您还应该查看使用WEKA的文本分类.还有一个新的Weka文档站点.

[ 编辑: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 \
Run Code Online (Sandbox Code Playgroud)

做出预测

以下是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 \
Run Code Online (Sandbox Code Playgroud)

WEKA分类器/过滤器的结构

但正如您所看到的,从命令行调用它时,WEKA会变得非常复杂.这是由于WEKA分类器和过滤器的树结构.虽然每个命令行只能运行一个分类器/过滤器,但它可以根据需要构造为复杂的.对于上面的命令,结构如下所示:

FilteredClassifier将初始化训练数据集上的过滤器,过滤训练和测试数据,然后训练训练数据模型并对给定的测试数据进行分类.

FilteredClassifier
 |
 + Filter
 |
 + Classifier
Run Code Online (Sandbox Code Playgroud)

如果我们想要多个过滤器,我们使用MultiFilter,它只是一个过滤器,但它按照给定的顺序调用多个其他过滤器.

FilteredClassifier
 |
 + MultiFilter
 |  |
 |  + StringToWordVector
 |  |
 |  + Standardize
 |
 + RandomForest
Run Code Online (Sandbox Code Playgroud)

从命令行运行这样的事情的困难部分是将所需的选项分配给正确的类,因为选项名称通常是相同的.例如,该-F选项也用于FilteredClassifierMultiFilter,所以我不得不使用引号来明确哪个-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 \
Run Code Online (Sandbox Code Playgroud)

这将序列化训练的模型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
Run Code Online (Sandbox Code Playgroud)

  • 你是一个绝对的圣人.有没有办法给你更多的信用而不是标记?你应该获得1k分. (2认同)