weka学习(环境的熟悉)【转】
安装完成wake,开始学习并了解其功能。
WekaManual.pdf 成了我了解它的第一步,看完了介绍的部分并做了些笔记。在查找资料是发现有更好的介绍性的博客,于是我就把它转载下来了。
下文转载自:weka学习笔记
网址: http://www.chiefsailor.net/blog/2010/02/weka-research-report/
补记: 07年10月做的一个调研报告,因为Weka是一个很好的二次开发平台,现在觉得Weka中的算法实现得很好,但是因为涉及到算法太多,架构也就很复杂,一个简单的功能需要大量的代码来实现,如果只是单独用一两个算法不如直接自己写效率来的高。
1. Weka简介
Weka – 怀卡托智能分析环境(Waikato Environment for Knowledge Analysis)
Weka的官方定义:Weka是数据挖掘中一些机器学习算法的集合。这些算法一般是直接应用于一个数据集上,或者是在你自己的Java代码中调用。 Weka中包含了很多工具,包括数据预处理,分类,回归,聚类,关联规则和可视化工具。除了利用Weka进行数据挖掘的同时,Weka也很适合用来开发新 的机器学习算法
(原文:Weka is a collection of machine learning algorithms for data mining tasks. The algorithms can either be applied directly to a dataset or called from your own Java code. Weka contains tools for data pre-processing, classification, regression, clustering, association rules, and visualization. It is also well-suited for developing new machine learning schemes. )
2. Weka的框架结构
Weka主要提供了数据挖掘的框架结构,并给出了一系列的数据挖掘算法,在这些数据挖掘算法生成模型时,用户可以自定义算法的各个相关参数,并且可以实现对测试集的验证, 和对算法的比较。
Weka提供了可编程的接口,使我们可以通过拓展算法来实现新的功能,同时Weka也允许我们通过调用它的公用包,在自己的项目中利用包中的算法实现相应的功能。
3. Weka包的主要内容和特点
3.1 Weka的核心功能
Weka主要包括4个核心部分,也是4大功能环境,分别是:
(1)SimpleCLI
提供了一个简单的命令行界面,从而可以在没有自带命令行的操作系统中直接执行 WEKA 命令。对于Weka的命令详细,我们可以参考Wiki[1]。
使用命令行有两个好处:一个是可以把模型保存下来,这样有新的待预测数据出现时,不用每次重新建模,直接应用保存好的模型即可。另一个是对预测结果给出了置信度,我们可以有选择的采纳预测结果,例如,只考虑那些置信度在85%以上的结果。
(2)Explorer
使用 WEKA 探索数据的环境。在这个环境中,Weka提供了数据的预处理,数据格式的转化(从CSV格式到ARFF格式的转化,详见第4部分),各种数据挖掘算法(包括分类与回归算法,聚类算法,关联规则等),并提供了结果的可视化工具。
对于一个数据集,通过简单的数据的预处理,并对数据挖掘算法进行选择(在Weka3.5版本之后,加入了算法的过滤功能,可以过滤掉那些不适合当前数据集类型的算法),接着通过窗口界面对算法的参数进行配置,最后点击“Start”按钮就可以运行了。
可视化工具分为对数据集的可视化和对部分结果的可视化(详情可以参考 4.2 Weka的输出格式),并且我们可以通过属性选择工具(Select Attribute),通过搜索数据集中所有属性的可能组合,找出预测效果最好的那一组属性。
(3)Experimenter
运行算法试验、管理算法方案之间的统计检验的环境。Experiment环境可以让用户创建,运行,修改和分析算法试验,这也许比单独的分析各个算 法更加方便。例如,用户可创建一次试验,在一系列数据集上运行多个算法(schemes),然后分析结果以判断是否某个算法比其他算法(在统计意义下)更 好。
Explorermenter主要包括简单模式,复杂模式和远程模式。复杂模式是对简单模式的基本功能的扩充,而远程模式允许我们通过分布式的方法进行实验。
就功能模块而言,分为设置模块,运行模块和分析模块。在设置模块中我们可以自定义实验,加入多个算法和多方的源数据(支持ARFF文件,CSV文件 和数据库),在运行模块中我们可以运行我们的实验,而在分析模块中,我们可以分析各种算法的的准确性,并提供了各种统计方法对结果进行检验比较。
值得一提的是,我们可以把实验的各种参数,包括算法,数据集等,保存以方便下一次相同实验的进行;也可以把各种算法保存,方便应用在不同的数据集 上;如果数据集来源于数据库的话,实验在过程中可以中止并继续(原因可以是被中止或者是扩展了实验),这样就不用重新运行那些已实验过的算法/数据集祝 贺,而仅计算还没有被实验的那些。
(4)KnowledgeFlow
这个环境本质上和 Explorer所支持的功能是一样的,但是它有一个可以拖放的界面。它有一个优势,就是支持增量学习(incremental learning)。
KnowledgeFlow 为Weka 提供了一个"数据流"形式的界面.用户可以从一个工具栏中选择组件,把它们放置在面板上并按一定的顺序连接起来,这样组成一个"知识流" (knowledge flow)来处理和分析数据.目前,所有的Weka 分类器(classifier)、筛选器(filter)、聚类器(clusterer)、载入器(loader)、保存器(saver),以及一些其他 的功能可以在KnowledgeFlow 中使用。
KnowledgeFlow 可以使用增量模式(incrementally)或者批量模式(inbatches)来处理数据(Explorer 只能使用批量模式).当然对数据进行增量学习要求分类器能够根据各实例逐个逐个的更新.现在Weka 中有五个分类器能够增量地处理数据:NaiveBayesUpdateable,IB1,IBk,LWR(局部加权回归).还有一个meta 分类器RacedIncrementalLogitBoost 可以使用任意基于回归的学习器来增量地学习离散的分类任务。
KnowledgeFlow相对于Explorer的几个特性:
(a)直观的数据流式布局
(b)批量或增量地处理数据
(c)并行处理多批数据或流程(每个流在各自的线程中执行)
(d)筛选器可链接在一起
(e)可以查看分类器在交叉验证的各折所产生的模型
(f)可以对处理中的增量分类器的效果进行可视化(为分类准确度、RMS误差、预测等作图)
下面是一个用C4.5算法对Bank-data-final.arff文件进行挖掘后的截图。各个组件根据属性关联起来,实现了一个数据流。
注:这4个功能是Weka的核心功能,在Weka发行版本3.5以后,Weka的界面有所变化,这四个功能集成在Application菜单下。
3.2 Weka的可视化工具
3.2.1 查看数据的Tools
(1)ArffViewer
一个 MDI 应用程序,使用电子表格的形式来查看 ARFF 文件。
(2)SqlViewer
一个 SQL 工作表,用来通过JDBC 查询数据库。
(3)EnsembleLibrary
生成集成式选择(Ensemble Selection)所需设置的界面。
这些功能在3.5版本后被集成到了Tools菜单下。
3.2.2 数据可视化
(1)Plot 作出数据集的二维散点图。
(2)ROC 示预先保存的ROC曲线
(3)TreeVisualizer 显示一个有向图,例如一个决策树
(4)GraphVisualizer 显示XML、BIG或DOT格式的图片,例如贝叶斯网络
(5)BoundaryVisualizer 允许在二维空间对分类齐的决策边进行可视化。
(3)(4)的具体使用情况可以参照4.2节weka的输出格式。
在Weka的3.5版本以后这些可是化工具被整理到了Visualization菜单下。
4. Weka的数据格式
4.1 Weka的输入格式
4.1.1 ARFF格式
Weka中自定义了一种数据格式“ARFF”,这种格式的典型例子可以从Weka安装目录\data\下看到,以其中的weather.arff为例[7]。
@relation weather @attribute outlook {sunny, overcast, rainy} @attribute temperature real @attribute humidity real @attribute windy {TRUE, FALSE} @attribute play {yes, no} @data sunny,85,85,FALSE,no sunny,80,90,TRUE,no overcast,83,86,FALSE,yes rainy,70,96,FALSE,yes rainy,68,80,FALSE,yes rainy,65,70,TRUE,no overcast,64,65,TRUE,yes sunny,72,95,FALSE,no sunny,69,70,FALSE,yes rainy,75,80,FALSE,yes sunny,75,70,TRUE,yes overcast,72,90,TRUE,yes overcast,81,75,FALSE,yes rainy,71,91,TRUE,no |
对应的二维表格的样子是
表格里的一个横行称作一个实例(Instance),相当于统计学中的一个样本,或者数据库中的一条记录。竖行称作一个属性(Attrbute), 相当于统计学中的一个变量,或者数据库中的一个字段。其中最后一个属性叫做类属性(Class属性)。这样一个表格,或者 叫数据集,在WEKA看来,呈现了属性之间的一种关系(Relation)。图1中一共有14个实例,5个属性,关系名称为“weather”。
WEKA存储数据的格式是ARFF(Attribute-Relation File Format)文件,这是一种ASCII文本文件。图1所示的二维表格存储在如下的ARFF文件中。这也就是WEKA自带的“weather.arff” 文件,在WEKA安装目录的“data”子目录下可以找到。
需要注意的是,在Windows记事本打开这个文件时,可能会因为回车符定义不一致而导致分行不正常。推荐使用UltraEdit这样的字符编辑软件察看ARFF文件的内容。
其他文件格式如何转化成为ARFF格式?
除了ARFF格式,Weka还支持另外一种常见格式,CSV格式。CSV同样是一种二进制保存的文本格式,我们可以 在Weka中直接打开CSV格式的文件,并保存为ARFF格式。这样就给我提供了把常见的数据格式转换为ARFF格式的方法,如对于Excel文件,我们 可以通过把每张表保存为CSV格式,进而保存为ARFF格式,与此同时,我们可以利用filter对数据进行相应的预处理。
而对于Matlab格式的数据,我们可以通过命令csvwrite把数据转化成CSV格式的文件,进而转化为ARFF格式文件。
对于海量数据,一般保存在数据库中,Weka同时支持JDBC访问数据库,详细请参照本文中的“Weka如何连接数据库”部分。
4.1.2 XRFF格式
在Weka3.5中增加了一种文件的支持XRFF (eXtensible attribute-Relation File Format) 格式。XRFF格式是基于XML的对ARFF格式的扩展。同时也增加了一种对应的格式.xrff.gz,这种格式是XRFF格式的压缩版本,在Weka 3.5版本以后中可以直接打开和保存。
对于一个ARFF格式的文件如下:
@relation iris @attribute sepallength numeric @attribute sepalwidth numeric @attribute petallength numeric @attribute petalwidth numeric @attribute class {Iris-setosa,Iris-versicolor,Iris-virginica} @data 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3,1.4,0.2,Iris-setosa … |
它对应的XRFF文件
<?xml version=”1.0″ encoding=”utf-8″?> <dataset name=”iris” version=”3.5.3″> <header> <attributes> <attribute name=”sepallength” type=”numeric”/> <attribute name=”sepalwidth” type=”numeric”/> <attribute name=”petallength” type=”numeric”/> <attribute name=”petalwidth” type=”numeric”/> <attribute class=”yes” name=”class” type=”nominal”> <labels> <label>Iris-setosa</label> <label>Iris-versicolor</label> <label>Iris-virginica</label> </labels> </attribute> </attributes> </header> <body> <instances> <instance> <value>5.1</value> <value>3.5</value> <value>1.4</value> <value>0.2</value> <value>Iris-setosa</value> </instance> <instance> <value>4.9</value> <value>3</value> <value>1.4</value> <value>0.2</value> <value>Iris-setosa</value> </instance> … </instances> </body> </dataset> |
需要注意的是XRFF同样支持稀疏矩阵(Sparse Matrix)的表示,可以在XML中加上“<instance type=”sparse”>”声明为稀疏矩阵格式。同时对于每一个实例(Intance)的某个属性值,我们都需要给它一个唯一的Index值, 以表示它在矩阵中的位置“<value index=”1″>5.1</value>”
4.1.3 ARFF与XRFF格式的比较
- 文件大小:显然,XRFF格式比ARFF格式占了更大的空间,但是在Weka中支持它的压缩格式,也就是.xrff.gz格式。Weka可以自动识别后缀是.xrff.gz的文件。同时在Weka中可以打开和保存是XRFF文件及XRFF.GZ文件[7]。
- 相对于ARFF格式,XRFF格式中新增了如下几个功能:
- 可以指定某个属性为类。通过在属性标签中增加 class=”yes” 可以制定某个属性为类。而在ARFF中,最后一个属性为系统识别为类属性。
- 可以对属性指定权重。通过在属性标签中增加 meta-data 标签。
- 可以对实例(Instance)指定权重。直接在实例的标签中增加 weight 属性
下面是对上述三种新的功能的代码演示:
##定义某属性为Class <attribute class=”yes” name=”class” type=”nominal”> ##为属性petalwidth指定权重 <attribute name=”petalwidth” type=”numeric”> <metadata> <property name=”weight”>0.9</property> </metadata> </attribute> ##为该条记录增加权重 <instance weight=”0.75″> <value>5.1</value> <value>3.5</value> <value>1.4</value> <value>0.2</value> <value>Iris-setosa</value> </instance> |
4.2 Weka的输出格式
Weka中常见的输出是通过结果数据和可视化来实现的,对于结果数据,在不同的算法中会给出不同的结果格式,部分实现了可视化,而且效果很好,如在C4.5分类算法下,我们可以形成树状的结构,而在K均值聚类算法中,我们可以看到哪些点被聚到了一起。
下面以关联规则和C4.5分类算法为例,给出输出的格式。在关联规则中,会给出适合的规则:
Best rules found: 1. age=52_max save_act=YES current_act=YES 113 ==> income=43759_max 61 conf:(0.54) < lift:(4.05)> lev:(0.08) [45] conv:(1.85)2. income=43759_max 80 ==> age=52_max save_act=YES current_act=YES 61 conf:(0.76) < lift:(4.05)> lev:(0.08) [45] conv:(3.25)3. income=43759_max current_act=YES 63 ==> age=52_max save_act=YES 61 conf:(0.97) < lift:(3.85)> lev:(0.08) [45] conv:(15.72) |
而在分类算法中,会给出符合什么样的条件的会分到某个类别中,下面是C4.5算法的输出结果。
J48 pruned tree——————children = YES
| income <= 30099.3 | | car = YES: NO (50.0/15.0) | | car = NO | | | married = YES | | | | income <= 13106.6: NO (9.0/2.0) | | | | income > 13106.6 | | | | | mortgage = YES: YES (12.0/3.0) | | | | | mortgage = NO | | | | | | income <= 18923: YES (9.0/3.0) | | | | | | income > 18923: NO (10.0/3.0) | | | married = NO: NO (22.0/6.0) | income > 30099.3: YES (59.0/7.0) children = NO | married = YES | | mortgage = YES | | | region = INNER_CITY | | | | income <= 39547.8: YES (12.0/3.0) | | | | income > 39547.8: NO (4.0) | | | region = RURAL: NO (3.0/1.0) | | | region = TOWN: NO (9.0/2.0) | | | region = SUBURBAN: NO (4.0/1.0) | | mortgage = NO: NO (57.0/9.0) | married = NO | | mortgage = YES | | | age <= 39 | | | | age <= 28: NO (4.0) | | | | age > 28: YES (5.0/1.0) | | | age > 39: NO (11.0) | | mortgage = NO: YES (20.0/1.0) Number of Leaves : 17 Size of the tree : 31 |
对应的可视化效果如下图所示(部分):
注意这里,我们可以选择保存这个模型(model),并在以后的研究中调用这个模型来预测其他数据,或者是和其他模型进行比较。值得一提的是,目前这种保存模型的方法在命令行下得到更好的支持,建议使用命令行来实现。
4.3 Weka如何连接数据库
列出需要注意的几点:
(1)主要使用JDBC进行连接,支持常见的数据库如 Mysql, SQL Server, Oracle等
(2)具体的配置步骤主要是配置好数据库的类型和数据库的地址
(3)可以使用存储过程以提高效率
5. 如何给Weka添加新算法
对于给weka添加新的算法,有两种方法,一种是将算法编译后放入weka.jar包中,它的基本步骤:
(1)编写算法程序[2]
在编写算法的时候,需要注意符合weka的接口,并且能接收prepare面板的数据。这里使用一个开源项目提供的包--WEKA Classification Algorithms[9]为例。在这个开源的分类算法插件中,提供了神经网络和人工免疫两种数据挖掘算法。
(2)将算法加入对应目录
因为新的算法的包结构和weka的目录是一致的,我们只需要把新的算法的对应目录和文件(主要为.class文件)加入到weka.jar包中。
(3)修改weka启动时加载的系统配置文件[3]。
Weka启动的时候的配置文件在3.4.4版本以后,由GenericObjectEditor.props(GOE)文件变为 GenericPropertiesCreator.props(GPC,一般在weka/gui目录下),我们只要把加入的算法按照对应格式添加进去即 可。对于这个分类算法来说,我们对于分类那部分的配置修改成如下形式:
# Lists the Classifiers-Packages I want to choose fromweka.classifiers.Classifier=\weka.classifiers.bayes,\
weka.classifiers.functions,\ weka.classifiers.lazy,\ weka.classifiers.meta,\ weka.classifiers.misc,\ weka.classifiers.trees,\ weka.classifiers.rules,\ weka.classifiers.immune.airs,\ weka.classifiers.immune.clonalg,\ weka.classifiers.immune.immunos,\ weka.classifiers.neural.lvq,\ weka.classifiers.neural.multilayerperceptron,\ weka.classifiers.neural.singlelayerperceptron |
其中红色的部分为添加的部分。
(4)在Weka中调用新的算法。
另外一种方法是将新的算法封装成jar包,并在程序开始的时候通过命令加载。同样是前面的开源分类算法插件为例。
(1)将下载的wekaclassalgos.jar包文件放入weka目录中。
(2)在启动weka时,使用命令加载插件包
windows:java -classpath wekaclassalgos.jar;weka.jar weka.gui.GUIChooserlinux/mac/other:
java -classpath wekaclassalgos.jar:weka.jar weka.gui.GUIChooser |
6. 使用Weka的几种方法
使用weka的几种常见方法:
(1)最常见的方法
即为使用Explorer、Experimenter和KnowledgeFlow进行数据挖掘,对于普通的实验性质的挖掘,Weka已经给我们提供了很好的工具。
(2)利用Weka已有的框架,加入新的算法,如5中所描述的。
(3)在自己的算法中调用Weka中的算法,实现一个目标程序[4][5]。
即我们在程序中包含weka.jar这个包,就可以使用其中的数据挖掘算法。这里面需要注意的是,weka包中不仅仅包含数据挖掘算法,还包括对数据的预处理等很多可以为我们所用的程序部分。
参考资料
[1] Primer – Weka Wiki 链接
[2]《Data Mining Practical Machine Learning Tools and Techniques》Chapter 15:471-485
[3] 在weka中加入自己的算法 链接
[4]《Data Mining Practical Machine Learning Tools and Techniques》Chapter 14:461-469
[5] 在自己的算法中调用Weka实现文本分类的一个例子 链接
[6] Database – Weka Wiki 链接
[7] WEKA入门教程 链接
[8] XRFF – WekaDoc 链接
[9]WEKA Classification Algorithms 链接