接上文的思路,我们研究如何使用weka的方法,选择样本
目前有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));
}
}
}
结果如图: