一、实验室名称:

二、实验项目名称:

认识数据与数据预处理

三、实验学时:

6

四、实验原理:

1、数据属性最小最大归一化(可尝试其它方法:如 ZSCORE)

其中v是属性A的某个观测值,minA和maxA分别是属性A的最小值和最大值

上述公式将A属性的取值映射到区间[new_minA,new_maxA]

如果令new_maxA = 1, new_minA = 0,则将A属性映射到区间[0,1],实现了数据归一化

2、缺失值处理

对于数据中属性的缺失值,使用该属性的平均值来填补缺失值

3、特征筛选

信息增益是用来进行特征筛选的常用算法,基本思想是选择那些特征对分类变量Y信息增益大,删除那些对分类无用的特征。

五、实验目的:

1、了解Weka工具包及Eclipse编程平台

2、认识和了解数据

3、对数据能进行简单的预处理

六、实验内容:

1、安装并配置Java、Eclipse和Weka(已配置)

2、使用图形界面的Weka工具包,完成数据归一化、缺失值处理、特征筛选的数据预处理操作

3、在Eclipse下调用Weka.jar包,完成数据归一化、缺失值处理、特征筛选的数据预处理操作

七、实验器材(设备、元器件):

Windows eclipse

八、实验步骤:

1.      配置实验环境

2.      使用Weka图形界面工具完成数据归一化,缺失值处理,特征筛选

  1. 打开Weka GUI工具
    • 选择Explorer
    • 点击Open file
    • 选择数据文件iris.arff
    • 在Filter栏目下,选择Choose
    • 选择weka->filters->unsupervised->attribute->Normalize
    • 点击“Normalize –S 1.0 –T 0.0”所在区域可以调整参数,由于本例选择将数据归一化到[0,1],使用默认的参数即可实现,点击Apply将数据归一化
    • 查看数据各个属性的值,已经归一化到[0,1](注:其中class不是数据属性,而是数据类别标签,不会被归一化),将实验结果截图放入实验报告中

使用Weka图形界面工具完成数据缺失值处理

使用Weka图形界面工具完成特征筛选

3.      在Eclipse下调用Weka.jar包完成数据归一化,缺失值处理,特征筛选

完整代码如下:

package shuwa1;
import weka.core.Attribute;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSink;
import weka.core.converters.ConverterUtils.DataSource;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Normalize;
public class test {
	public static void main(String[] args)throws Exception{
		//读取数据
		System.out.println("1. read:");
		DataSource source=new DataSource("D:/study_godforename/数据挖掘/Weka-3-8-4/data/iris.arff");
		Instances instances=source.getDataSet();
		//归一化
		System.out.println("2. one:");
		Normalize norm=new Normalize();
		norm.setInputFormat(instances);
		Instances newInstances=Filter.useFilter(instances,norm);
		//打印属性名
		int numOfAttributes=newInstances.numAttributes();
		for(int i=0;i<numOfAttributes;++i) {
			Attribute attribute=newInstances.attribute(i);
			System.out.println(attribute.name()+"	");
		}
		System.out.println();
		//打印实例
		int numOfInstance=newInstances.numInstances();
		for(int i=0;i<numOfAttributes;++i) {
			Instance instance=newInstances.instance(i);
			System.out.println(instance.toString()+"	");
			System.out.println();
		}
		//save
		DataSink.write("D:/1.arff", newInstances);
	}
}

在Eclipse下调用Weka.jar包完成数据缺失值处理

源数据:

处理后数据:

源代码:

package shuwa1;
import weka.core.Attribute;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSink;
import weka.core.converters.ConverterUtils.DataSource;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Normalize;
public class test {
	public static void main(String[] args)throws Exception{
		//读取数据
		System.out.println("1. read:");
		String fn="D:/study_godforename/数据挖掘/Weka-3-8-4/data/laborMissing.arff";
		DataSource source=new DataSource(fn);
		Instances instances=source.getDataSet();
		int dim=instances.numAttributes();
		int num=instances.numInstances();
		//缺失数据处理
		double[] meanV=new double[dim];
		for(int i=0;i<dim;i++) {
			meanV[i]=0;
			int count=0;
			for(int j=0;j<num;j++) {
				if(!instances.instance(j).isMissing(i)) {
					meanV[i]+=instances.instance(j).value(i);
					count++;
				}
			}
			meanV[i]=meanV[i]/count;
		}
		//全局平均代表缺失值
		for(int i=0;i<dim;i++) {
			for(int j=0;j<num;j++) {
				if(instances.instance(j).isMissing(i)) {
					instances.instance(j).setValue(i, meanV[i]);
				}
			}
		}
		System.out.println("3. save");
		DataSink.write(fn.substring(0,fn.length()-6)+"_handle.arff", instances);
		
	}
}

特征筛选

源数据:

处理后数据:

源代码:

package shuwa1;
import weka.attributeSelection.ASEvaluation;
import weka.attributeSelection.InfoGainAttributeEval;
import weka.attributeSelection.Ranker;
import weka.classifiers.meta.AttributeSelectedClassifier;
import weka.core.Attribute;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSink;
import weka.core.converters.ConverterUtils.DataSource;
import weka.filters.Filter;
import weka.filters.supervised.attribute.AttributeSelection;
import weka.filters.unsupervised.attribute.Normalize;
public class test {
	public static void main(String[] args)throws Exception{
		//读取数据
		System.out.println("1. read:");
		String fn="D:/study_godforename/数据挖掘/Weka-3-8-4/data/iris.arff";
		DataSource source=new DataSource(fn);
		Instances instances=source.getDataSet();
		//特征筛选
		System.out.println("2. 特征筛选");
		int k=2;
		AttributeSelection as=new AttributeSelection();
		Ranker rank=new Ranker();
		rank.setThreshold(0.0);
		rank.setNumToSelect(k);
		ASEvaluation ae=new InfoGainAttributeEval();
		as.setEvaluator(ae);
		as.setSearch(rank);
		as.setInputFormat(instances);
		Instances reductdata=Filter.useFilter(instances, as);
		
		System.out.println("3. save");
		DataSink.write(fn.substring(0,fn.length()-6)+"_reducted.arff", reductdata);
		System.out.println("Finsh");
	}
}

九、实验数据及结果分析:

归一化数据:

缺失值处理如实验步骤图

特征筛选如实验步骤图

十、实验结论:

十一、总结及心得体会:

较为熟练的掌握了weka的图形化处理和java调用处理,进行数据归一化,缺失值处理,特征筛选的方法

十二、对本实验过程及方法、手段的改进建议: