16.1 选项处理 数组
配置一个对象,例如一个分类器, 能够经过调用咱们想要改变的属性的 get/set 方法来实现,就像搜索者(Explorer)作的。或者,若是类实现了 weka.core.OptionHandler 接口,咱们就能够经过setOptions(String[]) 方法使用该对象的能力来解析命令行选项,(对应的方法是 getOptions(),其返回一个String[] 数组)。这两种方法之间的区别是,不能使用 setOptions(String[]) 方法来递增地设置选项。选项数组中没有明确指定的选项将使用默认值。 lua
最基本的方法是手动聚集(assemble) String 数组。下面的示例建立一个只包含一个选项(“-R”)的数组, 它接受一个参数(“1”)而且使用此选项初始化Remove过滤器: spa
import weka.filters.unsupervised.attribute.Remove; ... 命令行
String[] options = new String[2]; options[0] = "-R"; 翻译
options[1] = "1"; code
Remove rm = new Remove(); rm.setOptions(options); 对象
因为 setOptions(String[]) 方法须要一个全面解析,并正确分隔的数组(经过控制台/命令提示符实现),这种方法的一些常见的陷阱是: 接口
• 选项和参数的组合-使用 “-R 1”做为String数组的一个元素会失败,Weka将提示一个错误消息:未知选项 “R 1” 字符串
• 尾随空白-使用“-R ”也将失败,由于尾随空格没删除,所以选项“R”将没法识别。 get
避免这些问题最简单的方法,是提供一个 String 数组,此数组是使用 weka.core.Utils 类的 splitOptions(String) 方法从一个单一的命令行字符串自动生成的。这里是一个示例:
import weka.core.Utils; ...
String[] options = Utils.splitOptions("-R 1 ");
因为该方法将忽略空格,所以使用 "-R 1"或"-R 1 "将返回相同的结果为“-R 1”。
含有不少嵌套选项的复杂命令行是个棘手的问题,例如,支持向量机分类器SMO(package weka.classifiers.functions)的选项,其包括一个内核设置。由于你须要对Java String内的双引号和反斜线进行转义。Weka Wiki文章(译者注:因翻译时从pdf转到doc格式问题,连接就不添加了)“Use Weka in your Java code”引用了Java类 OptionsToCode,它能够将任何命令行转成相应的Java源代码。这个例子也可从Weka Examples collection:weka.core.OptionsToCode得到。
为了与使用Remove过滤器的setOptions(String[])方法对比,如下代码段使用
import weka.filters.unsupervised.attribute.Remove; ...
Remove rm = new Remove(); rm.setAttributeIndices("1");
为了找出哪一个选项属于哪一个属性,即get/set方法,最好是看看 setOptions(String[]) 与 getOptions()方法。若是这些方法直接使用成员变量,咱们只须要寻找这些方法,这些方法使外界能够访问成员变量。
使用 set方法,咱们可能常常遇到须要提供weka.core.SelectedTag做为参数。其中一个例子是, 元分类器 GridSearch的setEvaluation 方法(位于weka.classifiers.meta包中)。SelectedTag 类在GUI中使用,用于显示下拉列表,使用户可以从预约义值列表中选择。GridSearch 容许用户选择效果评估的统计度量。
一个 SelectedTag 使用全部能被选择的 weka.core.Tag 元素组成的数组和Tag的整型或字符串ID来构造。例如,GridSearch 的 setOptions(String[]) 方法使用提供的字符串ID来设置评价类型(例如“ACC”表明准确性),或者,若是评估选项丢失了,使用默认的整型ID EVALUATION_ACC。在这两种状况下,数组 TAGS_EVALUATION 将被使用,它定义了全部可能的选项:
import weka.core.SelectedTag; ...
String tmpStr = Utils.getOption(’E’, options);
if (tmpStr.length() != 0)
setEvaluation(new SelectedTag(tmpStr, TAGS_EVALUATION)) ;
else
setEvaluation(new SelectedTag(EVALUATION_CC, TAGS_EVALUATION));