利用DM工具Weka进行数据挖掘(分类)的完整过程:
(有关Weka的使用详见:ML 与 DM 工具 Weka 的使用)
0 问题背景
- 任务:根据给定数据集创建分类器。
- 训练数据集:100 predictive attributes A1,…,A100和一个类标C。每一个属性是介于0-1之间的浮点数。类标C有三个可能的值{0,1,2}。给定的数据文件有101列,6270行。
- 测试数据集:100 predictive attributes A1,…,A100 ,每一个属性是介于0-1之间的浮点数。给定的数据文件有10列,500行。
训练数据如下图所示:
测试数据如下图所示:
1 使用平台
Weka 3-8-1 + Eclipse
2 数据预处理
对于数据挖掘的数据预处理部分,一般有数据清理、数据集成、数据集成和数据规约等处理。由于实验提供的数据已经进行了归一化处理,不存在缺失值,异常值等情况,不需要进行数据清理和集成等工作。
(1)实验数据为txt格式,需要转换成weka支持的arff格式,利用Java编程实现简单的数据格式转换,具体代码见txt2arff.Java。
package dmtask1; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class txt2arff { public static void main(String[] args) { // TODO Auto-generated method stub try { BufferedReader br=new BufferedReader(new FileReader("./ExperimentalData/kddtest2017.txt")); // BufferedReader br=new BufferedReader(new FileReader("./ExperimentalData/kddtrain2017.txt")); String line=null; BufferedWriter bw=new BufferedWriter(new FileWriter("./ExperimentalData/kddtest2017.arff")); // BufferedWriter bw=new BufferedWriter(new FileWriter("./ExperimentalData/kddtrain2017.arff")); bw.write("@relation kddtest2017"); // bw.write("@relation kddtrain2017"); bw.newLine(); for(int i=0;i<100;i++){ bw.write("@attribute Feature"+i+" real"); bw.newLine(); } bw.write("@attribute class {0,1,2}"); bw.newLine(); bw.write("@data"); bw.newLine(); while((line=br.readLine() )!= null){ //------------------------test-- String[] str=line.split("\t");//test 文件是\t分割 for(int i=0;i<str.length;i++){ bw.write(str[i]+","); } bw.write("?"); //------------------------test-- //------------------------train-- // String[] str=line.split("\n");//train 文件是空格分割 // for(int i=0;i<str.length;i++){ // if (i == 0){ // bw.write(str[i]); // } // else{ // bw.write(","+str[i]); // } // } //------------------------train-- bw.newLine(); } br.close(); bw.close(); System.out.println("OK! Finished!!"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } }