在命令行学习的Weka(Learning Weka on the Command Line)

2019-07-21 17:18发布

我是相当新的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最后一个”,我不知道为什么。 我也不会被使用MLP为NN往往是太慢了,当我从文本数据几千功能。 我知道如何将其更改为另一个分类虽然(如NB或LIBSVM所以这是好的)。

但我不知道如何添加多个过滤器中的一个电话,因为我还需要添加StringToWordVector过滤器(以及可能的重新排序过滤器,以使课堂的最后,而不是第一个属性)。

然后,我怎么得到它的实际输出我的每类的预测标签? 然后存储所以那些与初始数据的ARFF。

Answer 1:

Weka中是不是真的文档的光辉榜样,但你仍然可以找到它在其网站上有价值的信息。 你应该在开始入门 。 我知道你要的文本文件进行分类,所以你也应该看看文本分类与WEKA 。 还有一个新的Weka文档站点 。

[ 编辑 :Wikispaces关闭后Weka中并没有带来了网站其他地方,还,所以我修改了链接在谷歌的缓存指向。 如果有人读这和新Weka的Wiki是向上,随意编辑的联系,并删除此说明。]

你在你的问题发布的命令行包含一个错误。 我知道,你从我的回答另一个问题时复制它,但我也只是注意到了这一点。 你必须忽略-- -c last ,因为ReplaceMissingValue过滤器不喜欢它。

在底漆,它说:

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 \

进行预测

以下是底漆说,关于获取的预测:

然而,如果对分类器的预测更详细的信息是必要的,-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 。 因此,你必须添加--之前它。

添加预测,以数据文件

将预测类标签也是可以的,但更加复杂。 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


Answer 2:

一个更好的方式做所有你想使用的GUI管理器。 以下是如何做的一切你想要的:

1)取两个单独的文件进行训练和测试。

使用“打开文件”预处理选项卡下选择你的培训档案。 使用“提供的测试设置”单选的分类选项卡下选择你的测试文件。

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

使用“更多选项”,然后选择“输出预测”的分类标签下看到的预测。

3)使用一个以上的过滤器

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

4)使类中的最后一个属性

这实际上是不必要的。 你可以选择任何属性是类。 一类是你想要的分类预测任何属性。 使用分类选项卡上的标称值(类)下拉菜单选择哪个属性是你的类。



文章来源: Learning Weka on the Command Line