Blog信息 |
|
blog名称:IDMer (数据挖掘者) 日志总数:175 评论数量:848 留言数量:119 访问次数:2496726 建立时间:2005年6月24日 |
我的相册 |
|

|
联系方式 |
 |
|
| |
公告 |
“数据挖掘者”博客已经搬家,欢迎光临新博客网址:http://idmer.blog.sohu.com 我的新浪微博:@张磊IDMer |
网络日志 |
|
Weka入门教程(2) |
|
|
|
|
|
数据挖掘者 发表于 2007/1/18 22:33:01 |
|
|
|
转自:http://bbs.wekacn.org/viewtopic.php?t=93.数据准备 使用WEKA作数据挖掘,面临的第一个问题往往是我们的数据不是ARFF格式的。幸好,WEKA还提供了对CSV文件的支持,而这种格式是被很多其他软件所支持的。此外,WEKA还提供了通过JDBC访问数据库的功能。 在这一节里,我们先以Excel和Matlab为例,说明如何获得CSV文件。然后我们将知道CSV文件如何转化成ARFF文件,毕竟后者才是WEKA支持得最好的文件格式。面对一个ARFF文件,我们仍有一些预处理要做,才能进行挖掘任务。 .* -> .csv 我们给出一个CSV文件的例子(bank-data.csv)。用UltraEdit打开它可以看到,这种格式也是一种逗号分割数据的文本文件,储存了一个二维表格。 Excel的XLS文件可以让多个二维表格放到不同的工作表(Sheet)中,我们只能把每个工作表存成不同的CSV文件。打开一个XLS文件并切换到需要转换的工作表,另存为CSV类型,点“确定”、“是”忽略提示即可完成操作。 在Matlab中的二维表格是一个矩阵,我们通过这条命令把一个矩阵存成CSV格式。 csvwrite('filename',matrixname) 需要注意的是,Matllab给出的CSV文件往往没有属性名(Excel给出的也有可能没有)。而WEKA必须从CSV文件的第一行读取属性名,否则就会把第一行的各属性值读成变量名。因此我们对于Matllab给出的CSV文件需要用UltraEdit打开,手工添加一行属性名。注意属性名的个数要跟数据属性的个数一致,仍用逗号隔开。 .csv -> .arff 将CSV转换为ARFF最迅捷的办法是使用WEKA所带的命令行工具。 运行WEKA的主程序,出现GUI后可以点击下方按钮进入相应的模块。我们点击进入“Simple CLI”模块提供的命令行功能。在新窗口的最下方(上方是不能写字的)输入框写上 java weka.core.converters.CSVLoader filename.csv > filename.arff 即可完成转换。 在WEKA 3.5中提供了一个“Arff Viewer”模块,我们可以用它打开一个CSV文件将进行浏览,然后另存为ARFF文件。 进入“Exploer”模块,从上方的按钮中打开CSV文件然后另存为ARFF文件亦可。 “Exploer”界面 我们应该注意到,“Exploer”还提供了很多功能,实际上可以说这是WEKA使用最多的模块。现在我们先来熟悉它的界面,然后利用它对数据进行预处理。 500)this.width=500'> 图2 新窗口打开 图2显示的是使用3.5版"Exploer"打开"bank-data.csv"的情况。我们根据不同的功能把这个界面分成8个区域。 区域1的几个选项卡是用来切换不同的挖掘任务面板。这一节用到的只有“Preprocess”,其他面板的功能将在以后介绍。 区域2是一些常用按钮。包括打开数据,保存及编辑功能。我们在这里把"bank-data.csv"另存为"bank-data.arff"。 在区域3中“Choose”某个“Filter”,可以实现筛选数据或者对数据进行某种变换。数据预处理主要就利用它来实现。 区域4展示了数据集的一些基本情况。 区域5中列出了数据集的所有属性。勾选一些属性并“Remove”就可以删除它们,删除后还可以利用区域2的“Undo”按钮找回。区域5上方的一排按钮是用来实现快速勾选的。 在区域5中选中某个属性,则区域6中有关于这个属性的摘要。注意对于数值属性和分类属性,摘要的方式是不一样的。图中显示的是对数值属性“income”的摘要。 区域7是区域5中选中属性的直方图。若数据集的最后一个属性(我们说过这是分类或回归任务的默认目标变量)是分类变量(这里的“pep”正好是),直方图中的每个长方形就会按照该变量的比例分成不同颜色的段。要想换个分段的依据,在区域7上方的下拉框中选个不同的分类属性就可以了。下拉框里选上“No Class”或者一个数值属性会变成黑白的直方图。 区域8是状态栏,可以查看Log以判断是否有错。右边的weka鸟在动的话说明WEKA正在执行挖掘任务。右键点击状态栏还可以执行JAVA内存的垃圾回收。 预处理 bank-data数据各属性的含义如下: id a unique identification number age age of customer in years (numeric) sex MALE / FEMALE region inner_city/rural/suburban/town income income of customer (numeric) married is the customer married (YES/NO) children number of children (numeric) car does the customer own a car (YES/NO) save_acct does the customer have a saving account (YES/NO) current_acct does the customer have a current account (YES/NO) mortgage does the customer have a mortgage (YES/NO) pep did the customer buy a PEP (Personal Equity Plan) after the last mailing (YES/NO) 通常对于数据挖掘任务来说,ID这样的信息是无用的,我们将之删除。在区域5勾选属性“id”,并点击“Remove”。将新的数据集保存一次,并用UltraEdit打开这个ARFF文件。我们发现,在属性声明部分,WEKA已经为每个属性选好了合适的类型。 我们知道,有些算法,只能处理所有的属性都是分类型的情况。这时候我们就需要对数值型的属性进行离散化。在这个数据集中有3个变量是数值型的,分别是“age”,“income”和“children”。 其中“children”只有4个取值:0,1,2,3。这时我们在UltraEdit中直接修改ARFF文件,把 @attribute children numeric 改为 @attribute children {0,1,2,3} 就可以了。 在“Explorer”中重新打开“bank-data.arff”,看看选中“children”属性后,区域6那里显示的“Type”是不是变成“Nominal”了? “age”和“income”的离散化我们需要借助WEKA中名为“Discretize”的Filter来完成。在区域2中点“Choose”,出现一棵“Filter树”,逐级找到“weka.filters.unsupervised.attribute.Discretize”,点击。若无法关闭这个树,在树之外的地方点击“Explorer”面板即可。 现在“Choose”旁边的文本框应该显示“Discretize -B 10 -M -0.1 -R first-last”。 点击这个文本框会弹出新窗口以修改离散化的参数。 我们不打算对所有的属性离散化,只是针对对第1个和第4个属性(见区域5属性名左边的数字),故把attributeIndices右边改成“1,4”。计划把这两个属性都分成3段,于是把“bins”改成“3”。其它框里不用更改,关于它们的意思可以点“More”查看。点“OK”回到“Explorer”,可以看到“age”和“income”已经被离散化成分类型的属性。若想放弃离散化可以点区域2的“Undo”。 如果对“"(-inf-34.333333]"”这样晦涩的标识不满,我们可以用UltraEdit打开保存后的ARFF文件,把所有的“'\'(-inf-34.333333]\''”替换成“0_34”。其它标识做类似地手动替换。 经过上述操作得到的数据集我们保存为bank-data-final.arff。 ----整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/preprocess.html 4. 关联规则(购物篮分析) 注意:目前,WEKA的关联规则分析功能仅能用来作示范,不适合用来挖掘大型数据集。 我们打算对前面的“bank-data”数据作关联规则的分析。用“Explorer”打开“bank-data-final.arff”后,切换到“Associate”选项卡。默认关联规则分析是用Apriori算法,我们就用这个算法,但是点“Choose”右边的文本框修改默认的参数,弹出的窗口中点“More”可以看到各参数的说明。 背景知识 首先我们来温习一下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”设为100。其他选项保持默认即可。“OK” 之后在“Explorer”中点击“Start”开始运行算法,在右边窗口显示数据集摘要和挖掘结果。 下面是挖掘出来的lift排前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.0500)this.width=500'> [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.0500)this.width=500'> [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.0500)this.width=500'> [45] conv:(15.72) 4. age=52_max save_act=YES 151 ==> income=43759_max current_act=YES 61 conf:(0.4) < lift:(3.85)> lev:(0.0500)this.width=500'> [45] conv:(1.49) 5. age=52_max save_act=YES 151 ==> income=43759_max 76 conf:(0.5) < lift:(3.77)> lev:(0.09) [55] conv:(1.72) 对于挖掘出的每条规则,WEKA列出了它们关联程度的四项指标。 命令行方式 我们也可以利用命令行来完成挖掘任务,在“Simlpe CLI”模块中输入如下格式的命令: java weka.associations.Apriori options -t directory-path\bank-data-final.arff 即可完成Apriori算法。注意,“-t”参数后的文件路径中不能含有空格。 在前面我们使用的option为 -N 100 -T 1 -C 1.5 -D 0.05 -U 1.0 -M 0.1 -S -1.0 命令行中使用这些参数得到的结果和前面利用GUI得到的一样。 我们还可以加上“- I”参数,得到不同项数的频繁项集。我用的命令如下: 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:\weka\bank-data-final.arff 挖掘结果在上方显示,应是这个文件的样子。 ----整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/associate.html |
|
|
|
阅读全文(24372) | 回复(6) | 编辑 | 精华 |
|
|
|
|
|
|
|
回复:Weka入门教程(2) |
|
|
|
|
|
1(游客)发表评论于2010/3/16 9:25:19 |
|
|
|
hao! |
|
|
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
|
|
|
|
|
|
|
回复:Weka入门教程(2) |
|
|
|
|
|
Olivia(游客)发表评论于2008/12/20 1:49:18 |
|
|
|
我有一个问题,我离散化的时候,参数里没有“bins”,我需要分成3段,怎么办呀?能发到我的邮箱吗?mssim1205@126.com,谢谢 |
|
|
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
|
|
|
|
|
|
|
回复:Weka入门教程(2) |
|
|
|
|
|
之手(游客)发表评论于2007/10/22 21:37:58 |
|
|
|
今天刚上weka的实验课,听的很迷糊,用的也莫名其妙.特别上来看看,,谢谢!学多很多... |
|
|
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
|
|
|
|
|
|
|
回复:Weka入门教程(2) |
|
|
|
|
|
小可(游客)发表评论于2007/5/9 15:43:44 |
|
|
|
讲得很好,对我很有启发。 |
|
|
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
|
|
|
|
|
|
|
回复:Weka入门教程(2) |
|
|
|
|
|
小可(游客)发表评论于2007/5/9 15:43:44 |
|
|
|
讲得很好,对我很有启发。 |
|
|
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
|
|
|
|
|
| » 1 »
| |