数据挖掘WEKA实验报告
数据挖掘-WAKA 实验 报告
一、A 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://java.sun.com/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 1 、 .csv - - > .arff
将 CSV 转换为 ARFF 最迅捷的办法是使用 WEKA 所带的命令行工具。
运行 WEKA 的主程序,出现 GUI 后可以点击下方按钮进入相应的模块。我们点击进入“Simple CLI”模块提供的命令行功能。由于 weka 暂不支持中文输入,所以挑选了在 D 盘下进行转换,在新窗口的最下方(上方是不能写字的)输入框写上
java weka.core.converters.CSVLoader D:/Fund-data.csv > D:/Fund-data.csv.arff
即可完成转换,生成文件“D:/Fund-data.csv.arff”。见下图 5:
图 5
进入“Exploer”模块,从上方的按钮中打开 CSV 文件然后另存为 ARFF文件亦可。我们应该注意到,“Exploer”还提供了很多功能,实际上可以说这是 WEKA 使用最多的模块。现在我们先来熟悉它的界面,然后利用它对数据进行预处理。界面展现见下图 6:
图中显示的是使用“Exploer”打开“Fund-data.csv.csv”的情况。
图 6
2 2 、预处理
通常对于 WEKA 来说并不支持中文,所以我们将一些涉及中文的字段删除。勾选属性“fund_name”、“company”、“business_name”、“remark”,并点击“Remove”。将新的数据集保存一次。其中“fares_type”只有 2个取值:全额结算和净额结算。这时我们在 UltraEdit 中直接修改 ARFF 文件,把 @attribute fares_type {全额结算,净额结算} 改为 @attribute fares_type {Full,Net} @attribute date {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 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 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 的结果。
图 11 6 、属性分析 用“Explorer”打开刚才得到的“Fund-data-normal.arff”,并切换到“Selectattributes”。点“Attribute Evaluator”中的“Choose”按钮选择“ClassifierSubsetEval”,点“Search Method”中的“Choose”按 钮 选 择 “ RaceSearch ” 。
在 “ Attribute Selection ” 中 选 中“Cross-validation”项,参数默认 Folds=10 和 Seed=1。点击“start”见图 12
图 12 7 、可视化分析 用“Explorer”打开刚才得到的“Fund-data-normal.arff”,并切换到“Visualize”。见图 13
图 13
四、分析结果 1 1 、分类与回归
我们看到“J48”算法交叉验证的结果之一为 Correctly Classified Instances
730
99.455
% Incorrectly Classified Instances
4
0.545
% === Confusion Matrix ===
a
b
c
d
e
f
g
h
i
j
<-- classified as
730
0
0
0
0
0
0
0
0
0 |
a = "(0_1430078.883]"
1
0
0
0
0
0
0
0
0
0 |
b = "(1430078.883-2860157.766]"
1
0
0
0
0
0
0
0
0
0 |
c = "(2860157.766-4290236.649]"
0
0
0
0
0
0
0
0
0
0 |
d =
"(4290236.649-5720315.532]"
0
0
0
0
0
0
0
0
0
0 |
e = "(5720315.532-7150394.415]"
0
0
0
0
0
0
0
0
0
0 |
f = "(7150394.415-8580473.298]"
0
0
0
0
0
0
0
0
0
0 |
g = "(8580473.298-10010552.181]"
0
0
0
0
0
0
0
0
0
0 |
h = "(10010552.181-11440631.064]"
1
0
0
0
0
0
0
0
0
0 |
i = "(11440631.064-12870709.947]"
1
0
0
0
0
0
0
0
0
0 |
j = "(12870709.947-inf)" 通过矩阵分析,看到正确的分类实例达到了 99.445% 2 、聚类分析 在“Cluster centroids:”之后列出了各个簇中心的位置。而“Clustered Instances”是各个簇中实例的数目及百分比。为了观察可视化的聚类结果,我们在左下方“Result list”列出的结果上右击,点“Visualize cluster assignments”。弹出的窗口给出了各实例的散点图,见图 14。最上方的两个框是选择横坐标和纵坐标,第二行的“color”是散点图着色的依据,默认是根据不同的簇“Cluster”给实例标上不同的颜色。可以在这里点“Save”把聚类结果保存成 ARFF 文件。在这个新的 ARFF 文件中, “instance_number”属性表示某实例的编号,“Cluster”属性表示聚类算法给出的该实例所在的簇。
图 14 3 3 、关联规则
由于本文所用的样本关系,实力中的数据不能通过关联规则分析出结果。
4 、属性分析 这种分析主要是通过选择各种方法对单个属性进行分析。
5 、可视化分析 从可视化图中基本可以直观判断各类数据的关系。
五. . 总结
以上实验只是对券商的基金某一个时段交易业务数据做了一些分析,通过本次数据挖掘实验,重新学习了一下数据挖掘的相关概念和知识,理解了数据挖掘的用途和使用步骤;进一步学习了 WEKA 开源数据挖掘工具在数据挖掘学习中的使用方法。并且对 WEKA 的分类与回归、聚类分析、关联规则、属性分析和可视化分析几个模块化的基本分析方式进行了操作实验。在此过程中学会了运用各个模块的分析方法。由于是初次实验 WEKA 分析软件,对 WEKA 的运用和最终的数据结果运用还不熟悉,需要在以后的工作实验中加以着重研究。通过本次实验,也认识到了数据挖掘对大量的数据进行探索后,能揭示出其中隐藏着的规律性内
容,并且由此进一步形成模型化的分析方法。可以建立整体或某个业务过程局部的不同类型的模型,可以描述发展的现状和规律性,而且可以用来预测当条件变化后可能发生的状况。这可以为公司开发新的产品和服务提供决策支持依据。
上一篇:C语言猜数游戏实验报告
下一篇:现役军人述职报告