weka是一个开源的机器学习软件,它的全称为怀卡托只能分析环境(Waikato Environment for Knowledge Analysis), 巧合的是,该全称的首字母缩写正是新西兰所独有的一种很奇特的小鸟weka,说它奇特是因为这种小鸟长着翅膀却不会飞行。weka的开发者就是鼎鼎有名的新西兰怀卡托大学计算机系的Ian H.Witten 和 Eibe Grank。
很早知道weka,却没有使用过,最近在做一个实验,是一个基于数据流的数据挖掘问题,从程序实现的角度看,是一个Active learning的结构,其中的分类算法需要调用weka里面的J48算法(决策树)和NaïveBayes算法,导师建议用Java调用weka里面的算法进行实验,经过一段时间的琢磨,终于跑起来了。现把整个流程写下:
(1) 在sun的网站上下载jdk,安装;
(2) 在weka的网站上下载weka,安装;
(3) 配置环境变量,不要忘记添加JDK的classpath和weka.jar的classpath;
(4) 用记事本编写java程序调用weka算法
(5) 编译执行
上面就是一个完整的java调用weka进行二次开发的过程。现在给出(4)中一些简要的代码作为示例:
import java.io.*;
import weka.classifiers.trees.*; // 加入weka中分类算法的包
import weka.core.*; // 加入weka中一些基本数据结构包
import weka.core.converters.*;
public class Test{
public static Instances getArffData( String fileName) throws Exception{
File inputFile = new File(fileName); //构造一个File对象
ArffLoader atf = new ArffLoader(); //构造一个ArffLoader对象
atf.setFile( inputfile); //设置数据源
return atf.getDataSet( ); //返回数据集
}
public static void main(String[] options) {
try{
J48 m_classifier = new J48( ); // 构造一个类J48的对象
Instances instances = getArffData(“fileLocation”); // 读入文件
instances.setClassIndex(instances.numAttributes()-1); //加入分类标记,这个地方引文中没有,会出错
m_classifier.buildClassifier(instances); // 建立决策树模型
System.out.println(m_classifier.toString( )); // 结果输出
}catch(Exception e){
e.printStackTrace( );
}
}
}
如此简单的程序,自然是少不了假设条件在里面了(我的程序没有假设条件,结果为了完成active learning写了1000多行):(1)假设数据文件就是.arff格式;(2)假设数据文件没有缺失或错误。 如果你的程序不满足以上两点,那么必须调用更多的weka类库来完成任务,在Ian H.Witten和 Eibe Frank的 《Data Mining Practical Machine Learning Tools and Techniques (Second Edition)》第14章有一个很好的范例可以参考,该书的中文版是作者的学生翻译的,质量也相当不错,《数据挖掘------实用机器学习技术》。
没有评论:
发表评论