如何在python-weka-wrapper3中重命名并转换Instances对象的NUMDEFECTS列?
解决方案
方法一:使用Weka的MathExpression过滤器(推荐)
这种方法利用Weka内置过滤器一次性完成数值转换和属性重命名,代码简洁且符合Weka操作规范:
from weka.filters import Filter # 获取类属性的1-based索引(Weka列索引从1开始) class_idx = kc1_class_arff.class_index() + 1 # 初始化MathExpression过滤器 math_filter = Filter(classname="weka.filters.unsupervised.attribute.MathExpression") # 设置过滤器参数:指定目标列、转换规则、新属性名 filter_options = [ "-R", str(class_idx), # 选择最后一列(类属性) "-E", "if (NUMDEFECTS != 0) then 1 else 0", # 非0转1,0保持0 "-N", "DEFECTS" # 属性重命名为DEFECTS ] math_filter.set_options(filter_options) # 应用过滤器处理数据集 math_filter.inputformat(kc1_class_arff) processed_data = math_filter.filter(kc1_class_arff) # 确保类属性仍为最后一列(可选) processed_data.class_is_last()
方法二:手动遍历实例处理
如果需要更灵活的自定义逻辑,可以手动修改每个实例的取值,再替换属性名称:
from weka.core.dataset import Attribute, Instances # 获取类属性的0-based索引 class_idx = kc1_class_arff.class_index() # 遍历所有实例,转换NUMDEFECTS的值 for inst in kc1_class_arff: original_val = inst.value(class_idx) new_val = 1.0 if original_val != 0 else 0.0 inst.set_value(class_idx, new_val) # 创建新的数值型属性,命名为DEFECTS new_attr = Attribute.create_numeric("DEFECTS") # 替换原属性列表的最后一项 attrs = kc1_class_arff.attributes() attrs[-1] = new_attr # 构建新的数据集并添加处理后的实例 processed_data = Instances(kc1_class_arff.relation_name(), attrs, kc1_class_arff.num_instances()) for inst in kc1_class_arff: processed_data.add_instance(inst) # 设置类属性为最后一列 processed_data.class_is_last()
说明
两种方法最终都会得到处理后的数据集processed_data,原NUMDEFECTS列已重命名为DEFECTS,且值为0或1的数值型整数(符合Weka数据存储规范)。方法一依赖官方过滤器,稳定性更强;方法二适合需要复杂自定义转换逻辑的场景。
内容的提问来源于stack exchange,提问作者AliceC
相关产品推荐
相关产品推荐

