【问题标题】:Options added to StringToNominal have no effect添加到 StringToNominal 的选项无效
【发布时间】:2015-11-18 08:42:27
【问题描述】:

问题陈述

我一直在尝试使用StringToNominal 将几个 Weka String 属性更改为 Nominal 属性。

使用不带选项的过滤器会为类属性生成所需的结果。 StringToNominal 默认使用 last 属性,类成功转换为 Nominal

StringToNominal stringFilter = new StringToNominal();
stringFilter.setInputFormat(insts);
Instances filteredInsts = Filter.useFilter(insts, stringFilter); 

但是,如果我尝试通过传递一个选项来做同样的事情,类属性仍然是一个字符串

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。它产生输出“真,假”。正确的输出是“真,真”

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

}

【问题讨论】:

    标签: java weka


    【解决方案1】:

    我在任何地方都找不到此文档,但Instances 似乎使用从零开始的索引,而StringToNominal 似乎使用从一开始的索引。

    变化

    options[1] = Integer.toString(insts.classIndex());
    

    options[1] = Integer.toString(insts.classIndex() + 1);
    

    产生所需的“真,真”输出

    这不是很明显的原因是StringToNominal 对非字符串类型的属性没有影响,所以在示例中,它作用于第零个属性,一个数字类型,没有任何明显的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多