如何将两组Weka实例合并在一起

fod*_*don 2 java merge set weka

目前,我一次将一个实例从一个数据集复制到另一个。有没有一种方法可以使字符串映射保持不变?mergeInstances是水平工作的,是否有等效的垂直合并?

这是循环的一个步骤,我从多个arff文件中读取具有相同结构的数据集,将其读取到一个大数据集中。必须有一个更简单的方法。

Instances iNew = new ConverterUtils.DataSource(name).getDataSet();
for (int i = 0; i < iNew.numInstances(); i++) {
    Instance nInst = iNew.instance(i);
    inst.add(nInst);
}
Run Code Online (Sandbox Code Playgroud)

mou*_*rix 5

如果您想要一种完全自动化的方法,该方法也可以正确复制字符串和名义属性,则可以使用以下函数:

public static Instances merge(Instances data1, Instances data2)
    throws Exception
{
    // Check where are the string attributes
    int asize = data1.numAttributes();
    boolean strings_pos[] = new boolean[asize];
    for(int i=0; i<asize; i++)
    {
        Attribute att = data1.attribute(i);
        strings_pos[i] = ((att.type() == Attribute.STRING) ||
                          (att.type() == Attribute.NOMINAL));
    }

    // Create a new dataset
    Instances dest = new Instances(data1);
    dest.setRelationName(data1.relationName() + "+" + data2.relationName());

    DataSource source = new DataSource(data2);
    Instances instances = source.getStructure();
    Instance instance = null;
    while (source.hasMoreElements(instances)) {
        instance = source.nextElement(instances);
        dest.add(instance);

        // Copy string attributes
        for(int i=0; i<asize; i++) {
            if(strings_pos[i]) {
                dest.instance(dest.numInstances()-1)
                    .setValue(i,instance.stringValue(i));
            }
        }
    }

    return dest;
}
Run Code Online (Sandbox Code Playgroud)

请注意,应满足以下条件(该功能未选中):

  • 数据集必须具有相同的属性结构(属性数量,属性类型)
  • 类索引必须相同
  • 标称值必须完全对应

要即时修改data2的名义属性的值以匹配data1的名义属性,可以使用:

data2.renameAttributeValue(
    data2.attribute("att_name_in_data2"),
    "att_value_in_data2",
    "att_value_in_data1");
Run Code Online (Sandbox Code Playgroud)