2013-03-15 110 views
14

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

我该怎么做?

我有这样的代码为出发块

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过滤器(可能还有重新排序过滤器以使该类成为最后一个而不是第一个属性)。

然后我怎么得到它实际上输出每个类的预测标签?然后将这些数据与初始数据一起存储起来。

回答

34

Weka实际上并不是文档的光辉榜样,但您仍然可以在其网站上找到有用的信息。你应该从Primer开始。我知道你想分类文本文件,所以你也应该看看Text categorization with WEKA

您在问题中发布的命令行包含错误。我知道,你从我的回答中复制了另一个问题,但我也注意到了它。您必须省略-- -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那些常规选项你调用类后直接一个良好的习惯,所以命令行是WEKA分类的

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分类器和过滤器的树结构。虽然每个命令行只能运行一个分类器/筛选器,但它可以按照您的喜好进行构建。对于以上命令,结构如下所示:

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 

注:

我想在这里写这个答案之前,补充一点,我还没有收到有关的命令进行预测知识无论如何。我GOOGLE了你的问题,然后通过试验和错误来到这个答案;)

+1

这是开始使用WEKA进行预测的最有帮助的“指南”之一 - 谢谢! – SPi 2013-11-11 23:37:18

+2

你是一个绝对的圣人。有什么方法可以给你更多的信用而不是加分?你应该得到1k分。 – Gthoma2 2014-04-26 00:58:50

-1

更好的方法来完成所有你想使用GUI Explorer。这里是如何做你想做的一切:

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

使用“预处理”选项卡下的“打开文件”选择您的训练文件。 使用“分类”选项卡下的“提供的测试仪”无线电选择您的测试文件。

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

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

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

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

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

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

+0

您的答案(1)的问题是,当我这样做时,我得到的错误,他们不兼容。这是因为它们具有不同的特征,并且不允许我测试它们。这就是为什么我相信我需要使用命令行来让它们具有相同的功能。 – 2013-03-15 22:26:52

+0

@JoshWeissbock这就是问题所在,它们必须具有相同的功能。或者您必须以具有相同功能的方式对它们进行过滤。 – Sentry 2013-03-16 00:23:26