Java Weka中如何对单个Instance进行标准化处理?
在Weka中对单个Instance使用已训练的Standardize过滤器标准化
你完全不用自己实现标准化逻辑!Weka的Filter本身就支持处理单个Instance,只是需要用正确的方法,而不是直接调用Filter.useFilter(它确实只接受Instances集合)。
这里有两种靠谱的实现方式,你可以根据习惯选择:
方法一:直接使用Filter的输入输出API(更高效)
这种方式不需要创建临时的Instances集合,直接和过滤器交互处理单个实例:
public double classifyInstance(Instance instance) throws Exception { if (this.stdAtt) { // 传入待处理实例到过滤器 this.standardize.input(instance); // 通知过滤器当前批次处理完成(哪怕只有一个实例) this.standardize.batchFinished(); // 获取标准化后的实例 Instance standardizedInstance = this.standardize.output(); // 用标准化后的实例执行分类 return super.classifyInstance(standardizedInstance); } return super.classifyInstance(instance); }
方法二:创建临时Instances集合(更直观)
如果你觉得直接操作过滤器API有点绕,可以把单个Instance包装成临时的Instances集合,再用你熟悉的Filter.useFilter处理:
public double classifyInstance(Instance instance) throws Exception { if (this.stdAtt) { // 创建和训练集结构完全一致的临时集合,容量设为1 Instances tempInstances = new Instances(instance.dataset(), 1); // 将待处理实例加入临时集合 tempInstances.add(instance); // 用已训练好的过滤器处理临时集合 tempInstances = Filter.useFilter(tempInstances, this.standardize); // 取出处理后的实例 Instance standardizedInstance = tempInstances.firstInstance(); // 执行分类 return super.classifyInstance(standardizedInstance); } return super.classifyInstance(instance); }
关键注意事项
- 务必确保
standardize过滤器已经在buildClassifier方法中完成初始化(也就是调用过setInputFormat和useFilter),这样过滤器才保存了训练集的均值、标准差等关键统计量,标准化时会沿用训练集的参数,而不是重新计算临时集合的参数。 - 待分类的单个Instance的属性结构(数量、类型、顺序)必须和训练时的Instances完全一致,否则过滤器会报错。
内容的提问来源于stack exchange,提问作者Daniil Andreyevich Baunov
相关产品推荐
相关产品推荐

