Java中WEKA 3.8.5过采样欠采样过滤器的使用问题
Java调用WEKA3.8.5过滤器实现对照实验方案
实现逻辑说明
- 将交叉验证评估逻辑封装为独立方法,三组测试仅变更输入数据集,保证变量唯一,方便多次运行对比
- 有监督类过滤器执行前需确保数据集已设置类别索引,否则会抛出格式错误
- 参数配置完全对应要求取值,适配WEKA3.8.5版本的参数规则
过滤器配置规则
- 测试2(欠采样):
SpreadSubsample参数设置为-M 1.0,实现正负样本比例1:1欠采样 - 测试3(过采样):
Resample参数设置为-B 1.0 -Z 130.3,实现偏向少数类的过采样
完整可运行代码
import java.io.BufferedReader; import java.io.FileReader; import java.util.Random; import weka.classifiers.Evaluation; import weka.classifiers.trees.J48; import weka.core.Instances; import weka.filters.Filter; import weka.filters.supervised.instance.Resample; import weka.filters.supervised.instance.SpreadSubsample; public class Fraud { // 抽取公共评估方法,传入数据集和测试名称直接输出结果 public static void evaluateModel(Instances dataset, String testName) throws Exception { J48 j48Classifier = new J48(); Evaluation evaluation = new Evaluation(dataset); // 固定随机种子为1保证实验可复现 evaluation.crossValidateModel(j48Classifier, dataset, 10, new Random(1)); System.out.println("\n==========" + testName + "结果=========="); System.out.println(evaluation.toSummaryString("", false)); } public static void main(String args[]) { try { // 仅加载一次原始数据集,复用给三组测试 String fraudDatasetPath = "C:\\Users\\Owner\\Desktop\\CreditCard\\CreditCard.arff"; BufferedReader bufferedReader = new BufferedReader(new FileReader(fraudDatasetPath)); Instances originalDataset = new Instances(bufferedReader); originalDataset.setClassIndex(originalDataset.numAttributes() - 1); // 测试1:无过滤器基准测试 evaluateModel(originalDataset, "无过滤器基准测试"); // 测试2:SpreadSubsample欠采样 SpreadSubsample spreadSubsample = new SpreadSubsample(); spreadSubsample.setOptions(new String[]{"-M", "1.0"}); spreadSubsample.setInputFormat(originalDataset); Instances underSampledDataset = Filter.useFilter(originalDataset, spreadSubsample); evaluateModel(underSampledDataset, "SpreadSubsample欠采样测试"); // 测试3:Resample过采样 Resample resample = new Resample(); resample.setOptions(new String[]{"-B", "1.0", "-Z", "130.3"}); resample.setInputFormat(originalDataset); Instances overSampledDataset = Filter.useFilter(originalDataset, resample); evaluateModel(overSampledDataset, "Resample过采样测试"); System.out.println("\n所有测试执行完成"); } catch (Exception e) { System.out.println("执行出错:\n" + e.getMessage()); e.printStackTrace(); } } }
运行说明
代码运行后会依次输出三组测试的评估结果,可直接对比Kappa统计量、分类正确率等指标选择最优方案。如果需要调整参数,直接修改对应过滤器的setOptions入参数组即可。
内容的提问来源于stack exchange,提问作者Jr.
相关产品推荐
相关产品推荐

