我是相当新的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。
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
选项用于FilteredClassifier
和MultiFilter
一样,所以我不得不使用引号,以明确其-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
一个更好的方式做所有你想使用的GUI管理器。 以下是如何做的一切你想要的:
1)取两个单独的文件进行训练和测试。
使用“打开文件”预处理选项卡下选择你的培训档案。 使用“提供的测试设置”单选的分类选项卡下选择你的测试文件。
2)输出的预测失踪的标签。
使用“更多选项”,然后选择“输出预测”的分类标签下看到的预测。
3)使用一个以上的过滤器
使用“过滤器”的预处理选项卡下,你以前分类要应用尽可能多的过滤器。
4)使类中的最后一个属性
这实际上是不必要的。 你可以选择任何属性是类。 一类是你想要的分类预测任何属性。 使用分类选项卡上的标称值(类)下拉菜单选择哪个属性是你的类。