数据挖掘-WAKA
实验报告
一、WEKA软件简介
在我所从事的证券行业中,存在着海量的信息和数据,但是这些数据日常知识发挥了一小部分的作用,其包含了大量的隐性的信息并不为所用,但是却可以为一些公司的决策和对客户的服务提供不小的价值。因此,我们可以通过一些数据采集、数据挖掘来获得潜在的有价值的信息。
数据挖掘就是通过分析存在于数据库里的数据来解决问题。在数据挖掘中计算机以电子化的形式存储数据,并且能自动的查询数据,通过关联规则、分类于回归、聚类分析等算法对数据进行一系列的处理,寻找和描述数据里的结构模式,进而挖掘出潜在的有用的信息。数据挖掘就是通过分析存在于数据库里的数据来解决问题。WEKA的出现让我们把数据挖掘无需编程即可轻松搞定。
WEKA是由新西兰怀卡托大学开发的开源项目,全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis)。WEKA是由JAVA编写的,它的源代码可通过http://www.cs.waikato.ac.nz/ml/WEKA得到,并且限制在GBU通用公众证书的条件下发布,可以运行在所有的操作系统中。是一款免费的,非商业化的机器学习以及数据挖掘软件
WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归、聚类、关联规则以及在新的交互式界面上的可视化。如果想自己实现数据挖掘算法的话,可以看一看WEKA的接口文档。在WEKA中集成自己的算法甚至借鉴它的方法自己实现可视化工具并不是件很困难的事情。
安装WEKA也十分简单,首相要下载安装JDK环境,JDK在这个页面可以找到它的下载http:///javase/downloads/index.jsp。点击JDK 6之后的Download按钮,转到下载页面。选择Accepct,过一会儿页面会刷新。我们需要的是这个Windows Offline Installation, Multi-language jdk-6-windows-i586.exe 53.16 MB ,点击它下载。也可以右键点击它上面的链接,在Flashget等工具中下载。安装它和一般软件没什么区别。不过中间会中断一下提示你安装JRE,一并装上即可。之后就是安装WEKA软件,这个在网上很多地方都有。同样简单地按默认方法安装后即可使用。
点击启动运行WEKA软件后,我门发现WEKA存储数据的格式是ARFF
(Attribute-Relation File Format)文件,这是一种ASCII文本文件。我们如图1通过软件的Tools菜单进入ArffViewer可以在安装目录下查看软件自带的几个ARFF文件。
图1
图2
如图2,打开文件后选择data自目录下的任意一张表,我们都可以看到如图3所示的二维表格存储在如下的ARFF文件中。这也就是WEKA自带的
“contact-lenses.arff”文件。这里我们要介绍一下WEKA中的术语。表格里的一个横行称作一个实例(Instance),相当于统计学中的一个样本,或者数据库中的一条记录。竖行称作一个属性(Attrbute),相当于统计学中的一个变量,或者数据库中的一个字段。这样一个表格,或者叫数据集,在WEKA看来,呈现了属性之间的一种关系(Relation)。图1中一共有22个实例,5个属性,关系名称为“contact-lenses”。
除了ARFF格式,WEKA还支持另外一种常见格式,CSV格式。CSV同样是一种二进制保存的文本格式,我们可以在WEKA中直接打开CSV格式的文件,并保存为ARFF格式。这样就给我提供了把常见的数据格式转换为ARFF格式的方法,如对于Excel文件,我们可以通过把每张表保存为CSV格式,进而保存为ARFF格式,与此同时,我们可以利用filter对数据进行相应的预处理。而对于Matlab格式的数据,我们可以通过命令csvwrite把数据转化成CSV格式的文件,进而转化为ARFF格式文件。对于海量数据,一般保存在数据库中,WEKA同时支持JDBC访问数据库。
图3
打开WEKA,首先出现一个命令行窗口。原以为要在这个命令行下写java语句呢,不过稍等一秒,WEKA GUI Chooser的出现了。这是一个很简单的窗体,提供四个按钮:Simple CLI、Explorer、Experimenter、KnowledgeFlow。Simple CLI应该是一个使用命令行的界面,有点像SAS的编辑器;Explorer是则是视窗模式下的数据挖掘工具;Experimenter和KnowledgeFlow的使用有待进一步摸索....
图4
(1) Explorer
使用 WEKA 探索数据的环境。在这个环境中,WEKA提供了数据的预处理,数据格式的转化(从CSV格式到ARFF格式的转化),各种数据挖掘算法(包括分类与回归算法,聚类算法,关联规则等),并提供了结果的可视化工具。对于一个数据集,通过简单的数据的预处理,并对数据挖掘算法进行选择(在WEKA3.5版本之后,加入了算法的过滤功能,可以过滤掉那些不适合当前数据集类型的算法),接着通过窗口界面对算法的参数进行配置。可视化工具分为对数据集的可视化和对部分结果的可视化,并且我们可以通过属性选择工具(Select Attribute),通过搜索数据集中所有属性的可能组合,找出预测效果最好的那一组属性。
Explorer是普通用户最常用的一个界面。用户可以从ARFF文件(Weka使用的一种文本文件格式)、网页或数据库中读取数据集。打开数据文件后,可以选择算法对数据进行预处理。这时窗体上给出了这个数据集的一些基本特征,如含有多少属性,各属性的一些简单统计量,右下方还给出一些可视化效果图。这些都是比较直观的分析,如果想发现隐藏在数据集背后的关系,还需要选择
Weka
提供的各种分类、聚类或关联规则的算法。所有设置完成后,点击Start按钮,就可以安心地等待weka带来最终的结果。哪些结果是真正有用的还要靠经验来判断。
(2)Experimenter
运行算法试验、管理算法方案之间的统计检验的环境。Experiment环境可以让用户创建,运行,修改和分析算法试验,这也许比单独的分析各个算法更加方便。例如,用户可创建一次试验,在一系列数据集上运行多个算法(schemes),然后分析结果以判断是否某个算法比其他算法(在统计意义下)更好。
Explorermenter主要包括简单模式,复杂模式和远程模式。复杂模式是对简单模式的基本功能的扩充,而远程模式允许我们通过分布式的方法进行实验。 就功能模块而言,分为设置模块,运行模块和分析模块。在设置模块中我们可以自定义实验,加入多个算法和多方的源数据(支持ARFF文件,CSV文件和数据库),在运行模块中我们可以运行我们的实验,而在分析模块中,我们可以分析各种算法的的准确性,并提供了各种统计方法对结果进行检验比较。
值得一提的是,我们可以把实验的各种参数,包括算法,数据集等,保存以方便下一次相同实验的进行;也可以把各种算法保存,方便应用在不同的数据集上;如果数据集来源于数据库的话,实验在过程中可以中止并继续(原因可以是被中止或者是扩展了实验),这样就不用重新运行那些已实验过的算法/数据集祝贺,而仅计算还没有被实验的那些。
(2)KnowledgeFlow
Explorer的一个不足在于,当用户打开一个数据集时,所有数据将全部被读入到主存当中,随着任务规模的增大,普通配置的计算机很难满足要求。
Knowledge Flow提供了一个用于处理大型数据集的递增算法,专门处理这一问题。这个环境本质上和 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可以使用任意基于回归的学习器来增量地学习离散的分类任务。
(4)SimpleCLI
提供了一个简单的命令行界面,能通过键入文本命令的方式来实现其他三个用户界面所提供的所有功能,从而可以在没有自带命令行的操作系统中直接执行 WEKA 命令。
使用命令行有两个好处:一个是可以把模型保存下来,这样有新的待预测数据出现时,不用每次重新建模,直接应用保存好的模型即可。另一个是对预测结果给出了置信度,我们可以有选择的采纳预测结果,例如,只考虑那些置信度在85%以上的结果。
二、实验案例介绍
本文用WEKA 软件作为工具,结合券商的基金某一个时段交易业务数据进行分析。实验的数据是一个交易周的基金交易业务数据。该表含有date(日期)、fund_code(基金代码)、fund_name(基金名称)、company_code(基金公司代码)、company(基金公司名称)、business_code(业务代码)、business_name(业务名称)、shares(基金份额)、balance(资金金额)、fares(手续费)、fares_type(手续费类型)、internet_shares(网上交易基金份额)、internet_balance(网上交易资金金额)、remark(备注)等字段,通过实验,希望能找出客户的基金交易分布情况。
该数据的数据属性如下:
date (numeric),交易发生日期;
fund_code (numeric),基金代码;
fund_name(character),基金名称;
company_code(numeric),用于报送的基金公司代码;
company (character),所属的基金公司;
business_code (numeric) ,交易业务代码;
business_name(character),交易业务名称;
shares(numeric),基金交易份额;
balance(numeric),资金交易金额;
fares(numeric),交易手续费;
fares_type(enum),手续费类型,取值范围“全额结算”/“净额结算”; internet_shares(numeric),网上交易基金份额;
internet_balance(numeric) ,网上交易资金金额;
remark(character),备注;
三、数据分析
我们给出一个CSV文件的例子(Fund-data.csv)。用UltraEdit打开它可以看到,这种格式也是一种逗号分割数据的文本文件,储存了一个二维表格。
Excel的XLS文件可以让多个二维表格放到不同的工作表(Sheet)中,我们只能把每个工作表存成不同的CSV文件。打开一个XLS文件并切换到需要转换的工作表,另存为CSV类型,点“确定”、“是”忽略提示即可完成操作。
需要注意的是,Matllab给出的CSV文件往往没有属性名(Excel给出的也有可能没有)。而WEKA必须从CSV文件的第一行读取属性名,否则就会把第一行的各属性值读成变量名。因此我们对于Matllab给出的CSV文件需要用UltraEdit打开,手工添加一行属性名。注意属性名的个数要跟数据属性的个数一致,仍用逗号隔开。
1、.csv -> .arff
将CSV转换为ARFF最迅捷的办法是使用WEKA所带的命令行工具。
运行WEKA的主程序,出现GUI后可以点击下方按钮进入相应的模块。我们点击进入“Simple CLI”模块提供的命令行功能。由于weka暂不支持中文输入,所以挑选了在D盘下进行转换,在新窗口的最下方(上方是不能写字的)输入框写上
javaweka.core.converters.CSVLoader
D:/Fund-data.csv.arff D:/Fund-data.csv >
即可完成转换,生成文件“D:/Fund-data.csv.arff”。见下图5:
图5
进入“Exploer”模块,从上方的按钮中打开CSV文件然后另存为ARFF文件亦可。我们应该注意到,“Exploer”还提供了很多功能,实际上可以说这是WEKA使用最多的模块。现在我们先来熟悉它的界面,然后利用它对数据进行预处理。界面展现见下图6:
图中显示的是使用“Exploer”打开“Fund-data.csv.csv”的情况。
图6
2、预处理
通常对于WEKA来说并不支持中文,所以我们将一些涉及中文的字段删除。勾选属性“fund_name”、“company”、“business_name”、“remark”,并点击“Remove”。将新的数据集保存一次。其中“fares_type”只有2个取值:全额结算和净额结算。这时我们在UltraEdit中直接修改ARFF文件,把
@attribute fares_type{全额结算,净额结算}
改为
@attribute fares_type {Full,Net}
@attributedate {numeric}
改为
@attribut
date {2009/8/24,2009/8/25,2009/8/26,2009/8/27,2009/8/28}
就可以了。
在“Explorer”中重新打开“fund-data.arff”,选中“date”和“fund_type”,看到属性已经变成“Nominal”了。
WEKA支持的<datatype>有四种,分别是:numeric--数值型,<nominal-specification>--分类(nominal)型,string--字符串型,date
[<date-format>]--日期和时间型
而本表只有nemeric和nominal两种类型,数值属性(nemeric) 数值型属性可以是整数或者实数,但WEKA把它们都当作实数看待。分类属性(nominal)分类属性由<nominal-specification>列出一系列可能的类别名称并放在花括号中:{<nominal- name1>, <nominal-name2>, ...} 。数据集中该属性的值只能是其中一种类别。如果类别名称带有空格,仍需要将之放入引号中。
“shares”,“banlance”,“fares”,“internet_shares”和“internet_banlance”的离散化我们需要借助WEKA中名为“Discretize”的Filter来完成。在区域2中点“Choose”,出现一棵“Filter树”,逐级找到“weka.filters.unsupervised.attribute.Discretize”,点击。若无法关闭这个树,在树之外的地方点击“Explorer”面板即可。
现在“Choose”旁边的文本框应该显示“Discretize -B 10 -M -0.1 -R first-last”。点击这个文本框会弹出新窗口以修改离散化的参数。
我们不打算对所有的属性离散化,只是针对对第4,5,6,8,9个,故把attributeIndices右边改成“4,5,6,8,9”。我们把这两个属性都分成10段,于是把“bins”改成“10”。其它不变。点“OK”回到“Explorer”,可以看到“shares”,“banlance”,“fares”,“internet_shares”和“internet_banlance”已经被离散化成分类型的属性。同时我们可以用UltraEdit打开保存后的ARFF文件,把所有的类似“'\'(-inf-1464805.884]\''”替换成“0_1464805.884”。其它标识做类似地手动替换。
经删减后,保留date、shares、balance、fares、fares_type、internet_shares、internet_balance7个属性,如图7
图7
在进行数据搜集和整理的过程中,我们发现如果属性的类型为数值型的话,在做关联分析时将不能得到结果,因为关联分析无法处理数值型数据。因此,我们进行了数据离散处理后使得需要分析的数据变为分类型,这样就可以关联分析得以顺利进行。因此通过预处理数据可以提高原数据的质量,清除数据噪声和与挖掘目标无关的数据,为进一步的挖掘工作莫定可靠的基础。
3、分类与回归
WEKA中的“Classify”选项卡中包含了分类(Classification)和回归(Regression),在这两个任务中,都有一个共同的目标属性(输出变量)。可以根据一个样本(WEKA中称作实例)的一组特征(输入变量),对目标进行预测。为了实现这一目的,我们需要有一个训练数据集,这个数据集中每个实例的输入和输出都是已知的。观察训练集中的实例,可以建立起预测的模型。有了这个模型,我们就可以新的输出未知的实例进行预测了。衡量模型的好坏就在于预测的准确程度。在WEKA中,待预测的目标(输出)被称作Class属性,这应该是来自分类任务的“类”。一般的,若
Class
属性是分类型时我们的任务才叫分类,Class属性是数值型时我们的任务叫回归。而我们使用决策树算法C4.5对Fund-data-normal建立起分类模型。因此我们制作分类不做回归。
我们用“Explorer”打开训练集“Fund-data-normal.arff”,。切换到“Classify”选项卡,点击“Choose”按钮后可以看到很多分类或者回归的算法分门别类的列在一个树型框里。树型框下方有一个“Filter...”按钮,点击后勾选“Binary attributes”“Numeric attributes”和“Binary class”。点“OK”后回到树形图,可以发现一些算法名称变灰了,说明它们不能用。选择“trees”下的“J48”,这就是我们需要的C4.5算法。
点击“Choose”右边的文本框,弹出新窗口为该算法设置各种参数。我们把参数保持默认。
选上“Cross-validation”并在“Folds”框填上“10”。点“Start”按钮开始让算法生成决策树模型。很快,用文本表示的一棵决策树以及对这个决策树的误差分析结果出现在右边“Classifier output”中。见图8。
图
8
4、聚类分析
聚类的任务是把所有的实例分配到若干的簇,使得同一个簇的实例聚集在一个簇中心的周围,它们之间距离的比较近;而不同簇实例之间的距离比较远。现在我们对前面的“Fund-data-normal”作聚类分析,使用最常见的K均值(K-means)算法。
用“Explorer”打开刚才得到的“Fund-data-normal.arff”,并切换到“Cluster”。点“Choose”按钮选择“SimpleKMeans”,这是WEKA中实现K均值的算法。点击旁边的文本框,修改“numClusters”为6,说明我们希望把这734条实例聚成6类,即K=5。下面的“seed”参数是要设置一个随机种子,依此产生一个随机数,用来得到K均值算法中第一次给出的K个簇中心的位置。我们不妨暂时让它就为10。
选中“Cluster Mode”的“Use training set”,点击“Start”按钮,观察右边“Clusterer output”给出的聚类结果。见下图9:
图9
5、关联规则
我们打算对前面的“Fund-data-normal”数据作关联规则的分析。用“Explorer”打开“Fund-data-normal.arff”后,切换到“Associate”选项卡。默认关联规则分析是用Apriori算法,我们就用这个算法,但是点“Choose”右边的文本框修改默认的参数。
从网上获得的Apriori有关知识:对于一条关联规则L->R,我们常用支持度(Support)和置信度(Confidence)来衡量它的重要性。规则的支持度是用来估计在一个购物篮中同时观察到L和R的概率P(L,R),而规则的置信度是估计购物栏中出现了L时也出会现R的条件概率P(R|L)。关联规则的目标一般是产生支持度和置信度都较高的规则。
有几个类似的度量代替置信度来衡量规则的关联程度,它们分别是
Lift(提升度?): P(L,R)/(P(L)P(R))
Lift=1时表示L和R独立。这个数越大,越表明L和R存在在一个购物篮中不是偶然现象。
Leverage(不知道怎么翻译):P(L,R)-P(L)P(R)
它和Lift的含义差不多。Leverage=0时L和R独立,Leverage越大L和R的关系越密切。
Conviction(更不知道译了):P(L)P(!R)/P(L,!R) (!R表示R没有发生)
Conviction也是用来衡量L和R的独立性。从它和lift的关系(对R取反,代入Lift公式后求倒数)可以看出,我们也希望这个值越大越好。
值得注意的是,用Lift和Leverage作标准时,L和R是对称的,Confidence和Conviction则不然。
现在我们计划挖掘出支持度在10%到100%之间,并且lift值超过1.5且lift值排在前100位的那些关联规则。我们把“lowerBoundMinSupport”和“upperBoundMinSupport”分别设为0.1和1,“metricType”设为lift,“minMetric”设为1.5,“numRules”设为10,其他参数不变。点击“start”见图10
图10
我们也可以利用命令行来完成挖掘任务,在“Simlpe CLI”模块中输入如下格式的命令:java weka.associations.Apriori -N 100 -T 1 -C 1.5 -D 0.05 -U 1.0 -M 0.1 -S -1.0 -I -t d:\ fund-data-normal.arff即可得到如图11的结果。