在weka中过滤器分为无监督过滤器和有监督过滤器两种,每种类型又细分为属性过滤器和实例过滤器,
前者作用于数据中的属性,后者作用于数据集中的实例。
有监督过滤器使用时,会出现以下情况:测试集数据在有监督过滤器使用时已经使用,必然造成如同先偷看答案再考试的效果。
所以,对于模型的评价是有问题的。要合理地评估有监督离散化,最好使用weka的元学习器FilterClassifier。它仅使用训练数据来构造过滤器,
然后,使用训练数据计算得到的离散间隔来离散化测试数据,并予以评估。(这种方法在后期介绍)
本阶段,我们打算分4个部分研究无监督属性过滤器。
本部分先研究3个方法:Add,Copy,Addid
import java.io.BufferedReader;
import java.io.FileReader;
import weka.core.Instances;
import weka.filters.unsupervised.attribute.Add;
import weka.filters.unsupervised.attribute.AddID;
import weka.filters.unsupervised.attribute.Copy;
public class AddCopyAddid_test {
public static void main(String[] args) throws Exception{
// 读入数据
Instances data=new Instances(new BufferedReader
(new FileReader("data\\weather.numeric.arff")));
System.out.println("==========原始数据============");
for(int i=0;i<data.numInstances();i++)
System.out.println(data.instance(i));
System.out.println("======Add使用后数据(2,3列新增)=====");
// 1,选择Add类,设置实例的参数
Add f=new Add();
/*
* -T 表示生成的属性类型(STR字符型,NOM名义型,DAT时间型,NUM默认数值型)
* -N 表示 插入列的名字
* -L 表示 插入列是名义型变量的情况下,取值情况
* -C 表示插在哪个列的位置上
* -F 表示时间格式,默认:yyyy-MM-dd'T'HH:mm:ss
*/
f.setOptions(new String[]{"-T","NOM","-N","nomtest","-L","good,bad","-C","2"});
f.setInputFormat(data);
Instances newdata=weka.filters.Filter.useFilter(data, f);
f.setOptions(new String[]{"-T","DAT","-N","timetest","-C","3","-F","2016-6-27"});
f.setInputFormat(newdata);
newdata=weka.filters.Filter.useFilter(newdata, f);
for(int i=0;i<newdata.numInstances();i++)
System.out.println(newdata.instance(i));
System.out.println("=========Copy使用后数据(最后列)=========");
// 2,选择Copy类,设置实例的参数
Copy c=new Copy();
/*
* -R 表示 1,3复制的列,复制后依次在最后
*/
c.setOptions(new String[]{"-R","1,3"});
c.setInputFormat(data);
newdata=weka.filters.Filter.useFilter(data, c);
for(int i=0;i<newdata.numInstances();i++)
System.out.println(newdata.instance(i));
System.out.println("=========AddID使用后数据(第3列)=============");
// 3,选择AddId类,设置实例的参数
AddID ad=new AddID();
/*
* -R 表示 1,3复制的列,复制后依次在最后
*/
ad.setOptions(new String[]{"-C","3","-N","ID"});
ad.setInputFormat(data);
newdata=weka.filters.Filter.useFilter(data, ad);
for(int i=0;i<newdata.numInstances();i++)
System.out.println(newdata.instance(i));
}
}