CSV文件转ARFF文件时如何指定名义属性值的排列顺序
可以通过手动重定义目标名义属性的取值顺序实现,无需调整原有实例的排列顺序,操作如下:
在你原有代码的var instances = loader.getDataSet();之后,创建ArffSaver之前插入以下逻辑:
import java.util.Arrays; import java.util.List; import weka.core.Attribute; import weka.core.Instance; // 定位目标名义属性的索引,此处替换为你实际的属性名 int targetAttrIndex = instances.attribute("nominal_attr").index(); // 按你需要的顺序定义属性取值列表 List<String> customValueOrder = Arrays.asList("yes", "no"); // 生成使用自定义顺序的新名义属性 Attribute newNominalAttr = new Attribute("nominal_attr", customValueOrder); // 替换数据集原有属性结构 instances.replaceAttributeAt(newNominalAttr, targetAttrIndex); // 遍历所有实例,同步值映射(不会修改实例实际取值和排列顺序) for (int i = 0; i < instances.numInstances(); i++) { Instance ins = instances.instance(i); String rawValue = ins.stringValue(targetAttrIndex); ins.setValue(targetAttrIndex, rawValue); }
Weka的ArffSaver输出属性声明时,会直接取NominalAttribute对象构造时传入的取值列表顺序,上述操作仅修改了属性的结构定义,没有调整任何实例的排列顺序,也不会改变实例的实际取值,最终输出的ARFF头就会按照你指定的顺序生成@attribute nominal_attr {yes,no}。如果有多个需要自定义顺序的名义属性,重复上述逻辑逐个处理即可。
内容的提问来源于stack exchange,提问作者ma4stro
相关产品推荐
相关产品推荐

