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));