目前有3个方法可以研究下:RemovePercentage,RemoveRange,RemoveWithValues
RemovePercentage:顾名思义,根据百分比选择样本
RemoveRange:根据序号选择样本
RemoveWithValues:根据某字段的设定值选择样本
然后,为减少文章重复的内容,我们先看这几个方法的不同的构造函数部分:
(1)RemovePercentage
- // 第一种方法,在remove类中设置option属性,-P 表示记录百分比,45表示前45%(6条)不选择
- RemovePercentage remove1=new RemovePercentage();
- remove1.setOptions(new String[]{"-P","45"});
- // 第二种方法,直接选择需要剔除的属性
- RemovePercentage remove2=new RemovePercentage();
- remove2.setPercentage(80);
- // 第一种方法,在remove类中设置option属性,-R 表示记录范围,1,5表示第1-5个记录不选择
- RemoveRange remove1=new RemoveRange();
- remove1.setOptions(new String[]{"-R","1,3-10"});
- // 第二种方法,直接选择需要剔除的属性
- RemoveRange remove2=new RemoveRange();
- remove2.setInstancesIndices("1,3-5");
- // RemoveWithValues类,根据 字段属性的值 选择 样本记录
- // 第一种方法,在remove类中设置option属性,-C 表示作用的字段列,2表示第2属性
- RemoveWithValues remove1=new RemoveWithValues();
- remove1.setOptions(new String[]{"-C","2","-S","80"});
- // 第二种方法,直接选择需要剔除的属性
- RemoveWithValues remove2=new RemoveWithValues();
- remove2.setAttributeIndex("2");
- remove2.setSplitPoint(75);
学习了如何使用这3种方法后,我们选择RemoveWithValues方法来演示,完整代码:
- import java.io.FileReader;
- import weka.core.Instances;
- import weka.filters.unsupervised.instance.RemoveWithValues;
- public class Filter4 {
- public static void main(String[] args) throws Exception {
- // RemoveWithValues类,根据 字段属性的值 选择 样本记录
- // 第一种方法,在remove类中设置option属性,-C 表示作用的字段列,2表示第2属性
- RemoveWithValues remove1=new RemoveWithValues();
- remove1.setOptions(new String[]{"-C","2","-S","80"});
- // 第二种方法,直接选择需要剔除的属性
- RemoveWithValues remove2=new RemoveWithValues();
- remove2.setAttributeIndex("2");
- remove2.setSplitPoint(75);
- // 获取一份数据
- Instances data=new Instances(new FileReader("data/weather.numeric.arff"));
- // 显示原数据的容貌
- System.out.println("原数据有:"+data.numInstances()+"记录");
- for(int i=0;i<data.numInstances();i++){
- System.out.println(data.instance(i));
- }
- System.out.println("================================");
- // remove1用一下
- remove1.setInputFormat(data); // 设置remove使用的数据格式,如果不设置会报 No input instance format define 的错误
- Instances newdata=weka.filters.Filter.useFilter(data, remove1); // 应用remove
- System.out.println("第一种方法,根据第2列剔除小于80的样本,剩余"+newdata.numInstances()+"记录");
- for(int i=0;i<newdata.numInstances();i++){
- System.out.println(newdata.instance(i));
- }
- remove1.setInvertSelection(true); // 选择未选择(另一部分)的样本
- remove1.setInputFormat(data);
- newdata=weka.filters.Filter.useFilter(data, remove1);
- System.out.println("未选择的数据有:"+newdata.numInstances()+"记录");
- for(int i=0;i<newdata.numInstances();i++){
- System.out.println(newdata.instance(i));
- }
- System.out.println("================================");
- // remove2用一下
- remove2.setInputFormat(data); //设置remove使用的数据格式,如果不设置会报 No input instance format define 的错误
- newdata=weka.filters.Filter.useFilter(data, remove2); // 应用remove
- System.out.println("第二种方法,根据第2列剔除小于75的样本,剩余"+newdata.numInstances()+"记录");
- for(int i=0;i<newdata.numInstances();i++){
- System.out.println(newdata.instance(i));
- }
- }
- }
结果如图: