为什么weka Instance没有将名义属性设置为第一个值(索引:0)

时间:2015-06-01 12:21:31

标签: java weka

我在设置Instance对象的目标类时遇到了问题。 想象一下这种情况:我有两个回归结果(包含斜率和截距) 鉴于此,我将前四个属性设置为一些双精度,最后一个属性,即目标属性由索引设置,而不是由值设置。

以下是代码中的样子:

for (RegressionArffRow row : input) {
        Instance record = new SparseInstance(attrInfo.size());
        int attrIdx = 0;
        for (RegressionResult regResult : row.getRegressionResults()) {
            record.setValue(attrIdx++, regResult.getSlope());
            record.setValue(attrIdx++, regResult.getIntercept());
        }

        record.setValue(attrIdx, row.getDestinationClass());            
        instances.add(record);
    }

返回的目标类实际上是一个类索引。我有两节课: 由下面的代码片段创建的“flower”和“tree”:

FastVector destValues = new FastVector();
destValues.addElement("tree");
destValues.addElement("flower");
Attribute destClassAttribute = new Attribute("destClass", destValues);

问题就出现了 - 当我将记录目标类设置为'1'时,我的实例设置为"flower"。但是当我将记录设置为'0'时,根本没有设置最后一个属性。

看起来很简单:

record.setValue(attrIdx, 0);

在调试器中给出了这样的结果:

{0 0.07017,1 -1.338295,2 -0.252162,3 1.377695}

和此:

record.setValue(attrIdx, 1);

给出以下内容:

{0 0.07017,1 -1.338295,2 -0.252162,3 1.377695, 4 "flower"}

1 个答案:

答案 0 :(得分:1)

好的,这里的问题是我在这里使用SparseInstance,它正在削减等于0的值。我直觉地认为它只涉及数字属性 - 只有它们的值被删除 - 对名义属性没有影响。但是我在documentation中错过了这个片段:

  

这还包括名义属性 - 第一个名义价值(即   索引为0的那个不需要显式存储,所以   如有必要,重新排列您的名义属性值排序

在我的示例中,未插入"tree"值,因为其索引等于0

如果您想保留每个名义价值,请确保您将克服它(如果您仍想使用SparseInstance

您可能希望以这种方式实现它:

FastVector destValues = new FastVector();
destValues.addElement("dummy");
destValues.addElement("tree");
destValues.addElement("flower");
Attribute destClassAttribute = new Attribute("destClass", destValues);

然后你永远不会使用"dummy"目的地类。

正如您所看到的那样,“零切割”也会在目标类属性上执行。