我在设置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"}
答案 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"
目的地类。
正如您所看到的那样,“零切割”也会在目标类属性上执行。