添加到 StringToNominal 的选项无效
Options added to StringToNominal have no effect
问题陈述
我一直在尝试使用 StringToNominal
将几个 Weka 字符串属性更改为标称属性。
使用不带选项的过滤器可为 class 属性生成所需的结果。 StringToNominal 默认使用最后一个属性并且 class 成功转换为 Nominal
StringToNominal stringFilter = new StringToNominal();
stringFilter.setInputFormat(insts);
Instances filteredInsts = Filter.useFilter(insts, stringFilter);
但是,如果我尝试通过传递一个选项来做同样的事情,class 属性仍然是一个字符串
StringToNominal stringFilter = new StringToNominal();
String[] options = new String[2];
options[0] = "-R"; //Range option
options[1] = Integer.toString(insts.classIndex()); //The class attribute index
stringFilter.setOptions(options);
stringFilter.setInputFormat(insts);
Instances filteredInstsWOpts = Filter.useFilter(insts, stringFilter);
MCVE
这是错误的 MCVE。它产生输出 "true, false"。正确的输出是 "true, true"
import java.util.ArrayList;
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.StringToNominal;
public class TestStringToNominal {
public static void main(String[] args) throws Exception {
ArrayList<Attribute> attInfo = new ArrayList<Attribute>();
attInfo.add(new Attribute("val"));
attInfo.add(new Attribute("class", (ArrayList<String>) null));
Instances insts = new Instances("test instances", attInfo, 1);
insts.setClassIndex(1);
Instance i1 = new DenseInstance(2);
i1.setValue(attInfo.get(0), 0);
i1.setValue(attInfo.get(1), "first");
insts.add(i1);
Instance i2 = new DenseInstance(2);
i2.setValue(attInfo.get(0), 1);
i2.setValue(attInfo.get(1), "second");
insts.add(i2);
StringToNominal stringFilter = new StringToNominal();
stringFilter.setInputFormat(insts);
Instances filteredInsts = Filter.useFilter(insts, stringFilter);
System.out.println(filteredInsts.classAttribute().isNominal());
StringToNominal stringFilterWOpts = new StringToNominal();
String[] options = new String[2];
options[0] = "-R";
options[1] = Integer.toString(insts.classIndex());
stringFilterWOpts.setOptions(options);
stringFilterWOpts.setInputFormat(insts);
Instances filteredInstsWOpts = Filter.useFilter(insts, stringFilterWOpts);
System.out.println(filteredInstsWOpts.classAttribute().isNominal());
}
}
我在任何地方都找不到这个文档,但是 Instances
似乎使用从零开始的索引,而 StringToNominal
似乎使用从一开始的索引。
改变
options[1] = Integer.toString(insts.classIndex());
到
options[1] = Integer.toString(insts.classIndex() + 1);
产生 "true, true"
所需的输出
这不是很明显的原因是 StringToNominal
对非字符串类型的属性没有影响,所以在这个例子中,它作用于第零个属性,一个数字类型,没有任何明显的影响.
问题陈述
我一直在尝试使用 StringToNominal
将几个 Weka 字符串属性更改为标称属性。
使用不带选项的过滤器可为 class 属性生成所需的结果。 StringToNominal 默认使用最后一个属性并且 class 成功转换为 Nominal
StringToNominal stringFilter = new StringToNominal();
stringFilter.setInputFormat(insts);
Instances filteredInsts = Filter.useFilter(insts, stringFilter);
但是,如果我尝试通过传递一个选项来做同样的事情,class 属性仍然是一个字符串
StringToNominal stringFilter = new StringToNominal();
String[] options = new String[2];
options[0] = "-R"; //Range option
options[1] = Integer.toString(insts.classIndex()); //The class attribute index
stringFilter.setOptions(options);
stringFilter.setInputFormat(insts);
Instances filteredInstsWOpts = Filter.useFilter(insts, stringFilter);
MCVE
这是错误的 MCVE。它产生输出 "true, false"。正确的输出是 "true, true"
import java.util.ArrayList;
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.StringToNominal;
public class TestStringToNominal {
public static void main(String[] args) throws Exception {
ArrayList<Attribute> attInfo = new ArrayList<Attribute>();
attInfo.add(new Attribute("val"));
attInfo.add(new Attribute("class", (ArrayList<String>) null));
Instances insts = new Instances("test instances", attInfo, 1);
insts.setClassIndex(1);
Instance i1 = new DenseInstance(2);
i1.setValue(attInfo.get(0), 0);
i1.setValue(attInfo.get(1), "first");
insts.add(i1);
Instance i2 = new DenseInstance(2);
i2.setValue(attInfo.get(0), 1);
i2.setValue(attInfo.get(1), "second");
insts.add(i2);
StringToNominal stringFilter = new StringToNominal();
stringFilter.setInputFormat(insts);
Instances filteredInsts = Filter.useFilter(insts, stringFilter);
System.out.println(filteredInsts.classAttribute().isNominal());
StringToNominal stringFilterWOpts = new StringToNominal();
String[] options = new String[2];
options[0] = "-R";
options[1] = Integer.toString(insts.classIndex());
stringFilterWOpts.setOptions(options);
stringFilterWOpts.setInputFormat(insts);
Instances filteredInstsWOpts = Filter.useFilter(insts, stringFilterWOpts);
System.out.println(filteredInstsWOpts.classAttribute().isNominal());
}
}
我在任何地方都找不到这个文档,但是 Instances
似乎使用从零开始的索引,而 StringToNominal
似乎使用从一开始的索引。
改变
options[1] = Integer.toString(insts.classIndex());
到
options[1] = Integer.toString(insts.classIndex() + 1);
产生 "true, true"
所需的输出这不是很明显的原因是 StringToNominal
对非字符串类型的属性没有影响,所以在这个例子中,它作用于第零个属性,一个数字类型,没有任何明显的影响.