Sunday, 21 September 2014

Weka学习笔记.md

Weka简介

WEKA的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),其源代码可 从http://www.cs.waikato.ac.nz/ml/weka/得到。同时weka也是新西兰的一种鸟名,而WEKA的主要开发者来自新西兰。

005年8月,在第11届ACM SIGKDD国际会议上,怀卡托大学的WEKA小组荣获了数据挖掘和知识探索领域的最高服务奖, WEKA系统得到了广泛的认可,被誉为数据挖掘和机器学习历史上的里程碑,是现今最完备的数据挖掘工具之一。 WEKA的每月下载次数已超过万次.

作为一个大众化的数据挖掘工作平台, WEKA集成了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理、分类、回归、聚类、关联分析以及在新的交互式界面上的可视化等等。通过其接口,可在其基础上实现自己的数据挖掘算法。

简单来说,Weka是一种数据挖掘工具.

Weka的数据

数据的格式

WEKA所用的数据格式(跟Excel一样),也就是xxx.csv格式文件.

enter image description here

表格里的一个横行称作一个实例Instance),相当于统计学中的一个样本,或者数据库中的一条记录。竖行称作一个属性Attribute),相当于统计学中的一个变量,或者数据库中的一个字段。这样一个表格,或者叫数据集,在WEKA看来,呈现了属性之间的一种关系(Relation)。上图中一共
有14个实例,5个属性,关系名称为“weather”。

总结:

横: Instance 实例 === 统计学一个样本 或是 DB一条记录
纵: Attribute 属性 === 统计学一个变量 或者 DB一个字段
表格: Relation 关系 === 数据集

WEKA存储数据的格式是ARFF(Attribute-Relation File Format)文件,这是一种ASCII文本文件。上图所示的二维表格存储在如下的ARFF文件中。这也就是WEKA自带的“weather.arff”文件,在WEKA安装目录的“data”子目录下可以找到。

@relation weather

@attribute outlook {sunny, overcast, rainy}
@attribute temperature numeric
@attribute humidity numeric
@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

通过上面的文件可以得知arff文件的格式.

识别ARFF文件的重要依据是分行,因此不能在这种文件里随意的断行。空行(或全是空格的行)将被忽略。

注释: 以“%”开始的行是注释,WEKA将忽略这些行。如果你看到的“weather.arff”文件多了或少了些“%”开始的行,是没有影响的。

除去注释后,整个ARFF文件可以分为两个部分。
 第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。
 第二部分给出了数据信息(Data information),即数据集中给出的数据。从“@data”标记开始,后面的就是数据信息了。

关系声明

关系名称在ARFF文件的第一个有效行来定义,格式为

@relation <relation-name> 

<relation-name>是一个字符串。如果这个字符串包含空格,它必须加上引号(指英文标点的单引号或双引号)。

属性声明

属性声明用一系列以“@attribute”开头的语句表示。数据集中的每一个属性都有它对应的“@attribute”语句,来定义它的属性名称和数据类型。
这些声明语句的顺序很重要。首先它表明了该项属性在数据部分的位置。例如,“humidity”是第三个被声明的属性,这说明数据部分那些被逗号分开的列中,第三列数据 85 90 86 96 … 是相应的“humidity”值。其次,最后一个声明的属性被称作class属性,在分类或回归任务中,它是默认的目标变量。

属性声明的格式为

@attribute <attribute-name> <datatype> 

其中<attribute-name>是必须以字母开头的字符串。和关系名称一
样,如果这个字符串包含空格,它必须加上引号。

数据信息

数据信息中“@data”标记独占一行,剩下的是各个实例的数据。每个实例占一行。实例的各属性值用逗号“,”隔开。如果某个属性的值是缺失值(missing value),用问号“?”表示,且这个问号不能省略。例如:

@data 
sunny,85,85,FALSE,no 
?,78,90,?,yes

数据类型

WEKA支持的有四种

表达式 含义
 numeric 数值型
<nominal-specification> 标称(nominal)型
string 字符串型
date [<date-format>] 日期和时间型

其中<nominal-specification><date-format> 将在下面说明。还可以使用两个类型“integer”和“real”,但是WEKA把它们都当作“numeric”看待。注意 “integer”, “real”, “numeric”, “date”, “string”这些关键字是区分大小写的,而“relation”,“attribute”,“data”则不区分。

数值属性

数值型属性可以是整数或者实数,但WEKA把它们都当作实数看待。

标称属性

标称属性由<nominal-specification>列出一系列可能的类别名称并
放在花括号中: {<nominal-name1>, <nominal-name2>, <nominal-name3>, ...} 数据集中该属性的值只能是其中一种类别。
例如如下的属性声明说明“outlook”属性有三种类别:“sunny”, “overcast”, “rainy”。而数据集中每个实例对应的“outlook”值必是这三者之一。

@attribute outlook {sunny, overcast, rainy} 

如果类别名称带有空格,仍需要将之放入引号中。

字符串属性

字符串属性中可以包含任意的文本。这种类型的属性在文本挖掘中非常有用。
示例:

@ATTRIBUTE LCC string 

日期和时间属性

日期和时间属性统一用“date”类型表示,它的格式是

@attribute <name> date [<date-format>] 

其中<name>是这个属性的名称,<date-format>是一个字符串,来规定该怎样解析和显示日期或时间的格式,默认的字符串是ISO-8601所给的日期时间组合格式“yyyy-MM-ddTHH:mm:ss”。数据信息部分表达日期的字符串必须符合声明中规定的格式要求(下文有例子)。

注意点

字符串属性和标称属性的值是区分大小写的。若值中含有空格,必须被引号括起来。例如:

@relation LCCvsLCSH
@attribute LCC string 
@attribute LCSH string 
@data 
AG5, 'Encyclopedias and dictionaries.;Twentieth century.' 
AS262, 'Science -- Soviet Union -- History.'

日期属性的值必须与属性声明中给定的相一致。例如:

@RELATION Timestamps 
@ATTRIBUTE timestamp DATE "yyyy-MM-dd HH:mm:ss" 
@DATA 
"2001-04-03 12:12:12" 
"2001-05-03 12:59:55"

数据准备

数据文件格式转换使用WEKA作数据挖掘,面临的第一个问题往往是我们的数据不是ARFF格式的。幸好,WEKA还提供了对CSV文件的支持,而这种格式是被很多其他软件,比如Excel,所支持的。现在我们打开“bank-data.csv”。

利用WEKA可以将CSV文件格式转化成ARFF文件格式。ARFF格式是WEKA支持得最好的文件格式。此外,WEKA还提供了通过JDBC访问数据库的功能。

使用Explorer

enter image description here

该图显示的是 “Explorer”打开“bank-data.csv”(测试文件,文件介绍见附录1:)的情况。我
们根据不同的功能把这个界面分成8个区域。
1. 区域1的几个选项卡是用来切换不同的挖掘任务面板。
2. 区域2是一些常用按钮. 包括打开数据, 保存及编辑功能. 另存为 “bankdata.arff”。
3. 在区域3中“Choose”某个“Filter”,可以实现筛选数据或者对数据进行某种变换。数据预处理主要就利用它来实现。
4. 区域4展示了数据集的一些基本情况。
5. 区域5中列出了数据集的所有属性。勾选一些属性并“Remove”就可以删除它们,删除后还可以利用区域2的“Undo”按钮找回。区域5上方的一排按钮是用来实现快速勾选的。
6. 在区域5中选中某个属性,则区域6中有关于这个属性的摘要。注意对于数值属性和标称属性,摘要的方式是不一样的。图中显示的是对数值属性“income”的摘要。
7. 区域7是区域5中选中属性的直方图。若数据集的某个属性是目标变量,直方图中的每个长方形就会按照该变量的比例分成不同颜色的段。默认地,分类或回归任务的默认目标变量是数据集的最后一个属性(这里的“pep”正好是)。要想换个分段的依据,即目标变量,在区域7上方的下拉框中选个不同的分类属性就可以了。下拉框里选上“No Class”或者一个数值属性会变成黑白的直方图。
8. 区域8是状态栏,可以查看Log以判断是否有错。右边的weka鸟在动的话说明WEKA正在执行挖掘任务。右键点击状态栏还可以执行JAVA内存的垃圾回收.

数据预处理

删除无用属性

通常对于数据挖掘任务来说,ID这样的信息是无用的,我们将之删除。在区域5勾选属性“id”,并点击“Remove”。将新的数据集保存为“bank-data.arff”,重新打开。 此外,我们可以通过名为“RemoveType”的Filter删除某一类型的属性。

离散化

我们知道,有些算法(如关联分析),只能处理所有的属性都是标称型的情况。这时候我们就需要对数值型的属性进行离散化。在这个数据集中有3个变量是数值型的,分别是“age”,“income”和“children”。使用filter

NumericToNominal
其中“children”只有4个取值:0,1,2,3。这时我们可以通过名“NumericToNominal”的Filter将children的类型变成Nominal。也就是说 所有的children属性都是从0,1,2,3四个值中取出的.

Discretize
“age”和“income”的离散化可借助WEKA中名为“Discretize”的Filter来完成。

现在“Choose”旁边的文本框应该显示“Discretize -B 10 -M -0.1 -R first-last”。 点击这个文本框会弹出新窗口以修改离散化的参数。

我们不打算对所有的属性离散化,只是针对对第1个和第4个属性(见区域5属性名左边的数字),故把attributeIndices右边改成“1,4”。计划把这两个属性都分成3段,于是把“bins”改成“3”。其它框里不用更改。点“OK”回到“Explorer”,可以看到“age”和“income”已经被离散化成分类型的属性。若想放弃离散化可以点区域2的“Undo”。

属性类型转换

NominalToBinary过滤器将所有nominal类型的属性转为binary(0,1二值)属性,一个可取k个值的nominal类型的属性转为k个二值属性,这样可将数据中所有属性转为数值(numeric)属性。以下是weather.arff转换后的结果。可以看到,实质上就是使用2进制位来表示数据值.

enter image description here

增加一个表达式属性

AddExpression: An instance filter that creates a new attribute by applying a athematical expression to existing attributes. The expression can contain attribute references and numeric constants. Supported operators are : +,-, *, /, ^, log, abs, cos, exp, sqrt, floor, ceil, rint, tan, sin, (, ) Attributes are specified by prefixing with ‘a’, eg.a7 is attribute number 7 (starting from 1).

Example expression : a1^2*a5/log(a7*4.0).

以下命令在weather.arff中增加了一个temp/hum属性,其值为第二个属性temperature)除以第三个属性(humidity)的值。

AddExpression –E a2/a3 –N temp/hum
采样

使用weka.filters.supervised.instance.Resample对整个数据集进行分层的采样(stratified subsample,采样所得数据仍保持原来的类分布)。以下Filter命令从soybean.arff中采样了5%的数据。

Resample –B 0.0 –S 1 –Z 5.0

使用weka.filters.unsupervised.instance.Resample进行不分层的采样,即与类信息无关。以下Filter命令从soybean.arff中采样了5%的数据。

Resample –S 1 –Z 5.0

属性选择

两种属性子集选择模式
属性子集评估器 + 搜索方法
单一属性评估器 + 排序方法

属性子集评估器
CfsSubsetEval: 综合考虑单一属性的预测值和属性间的重复度
ClassifierSubsetEval: 用分类器评估属性集
ConsistencySubsetEval: 将训练数据集映射到属性集上来检测类值的一致性
WrapperSubsetEval: 使用分类器和交叉验证(包装方法)

搜索方法
BestFirst: 回溯的贪婪搜索
ExhaustiveSearch: 穷举搜索(穷举方法)
GeneticSearch: 使用遗传算法搜索
GreedyStepwise: 不回溯的贪婪搜索
RandomSearch: 随机搜索
RankSearch: 排列属性并使用属性子集评估器将有潜力的属性进行排序

单一属性评估器
ChiSquaredAttributeEval: 以基于类的X2为依据的属性评估
GainRationAttributeEval: 以增益率为依据的属性评估
InfoGainAttributeEval: 以信息增益为依据的属性评估
OneRAttributeEval: 以OneR的方法论来评估属性
PrincipleComponents: 进行主成分的分析和转换
ReliefAttributeEval: 基于实例的属性评估器
SymmetricalUncertAttributeEval: 以对称不确定性为依据的属性评估
排序方法
Ranker: 按照属性的评估对它们进行排序

可视化分析

二维散列图
选择类标
1. 标称类标:数据点的颜色是离散的
2. 数值类标:数据点的颜色用色谱(蓝色到橙色)表示
改变点阵的大小和点的大小
改变抖动度,使互相重叠的点分开
选择属性子集和采样
注意:必须点击Update按钮上述改动才能生效

分类预测

WEKA把分类(Classification)和回归(Regression)都放在“Classify”选项卡中。

这里主要介绍了Weka进行预测也就是回归的方法

在这两个任务中,都有一个目标属性(即输出变量或类标)。我们希望根据一个样本(WEKA中称作实例)的一组特征(输入变量),对目标进行预测。为了实现这一目的,我们需要有一个训练数据集,这个数据集中每个实例的输入和输出都是已知的。观察训练集中的实例,可以建立起预测的模型。有了这个模型,我们就可以对新的未知实例进行预测了。衡量模型的好坏主要在于预测的准确率。

WEKA中的典型分类算法

Bayes: 贝叶斯分类器
BayesNet: 贝叶斯信念网络
NaïveBayes: 朴素贝叶斯网络
Functions: 人工神经网络和支持向量机
MultilayerPerceptron: 多层前馈人工神经网络
SMO: 支持向量机(采用顺序最优化学习方法)
Lazy: 基于实例的分类器
IB1: 1-最近邻分类器
IBk: k-最近邻分类器

选择分类算法

Meta: 组合方法
AdaBoostM1: AdaBoost M1方法
Bagging: 袋装方法
Rules: 基于规则的分类器
JRip: 直接方法-Ripper算法
Part: 间接方法-从J48产生的决策树抽取规则(不是C4.5规则算法)
Trees: 决策树分类器
Id3: ID3决策树学习算法(不支持连续属性)
J48: C4.5决策树学习算法(第8版本)
RandomForest: 基于决策树的组合方法


  1. 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_act: does the customer have a saving account (YES/NO)
    current_act: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)*.

No comments:

Post a Comment