参考
http://bbs.middleware123.com/thread-24052-1-1.html 使用Weka进行数据挖掘
http://quweiprotoss.blog.163.com/blog/static/4088288320104311521703 Weka开发
简介
WEKA是由新西兰怀卡托大学用Java开发的数据挖掘常用软件,WEKA是怀卡托智能分析系统(Waikato Environment for Knowledge Analysis)的缩写。WEKA限制在GNU通用公众证书的条件下发布,它几乎可以运行在所有操作系统平台上,包括Linux、Windows、OS X等。
WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归、聚类、关联规则以及在新的交互式界面上的可视化。
如果想自己实现数据挖掘算法的话,可以参考WEKA的接口文档。在WEKA中集成自己的算法甚至借鉴它的方法自己实现可视化工具,并不是件很困难的事情。
- 横行(row)—— 实例(Instance)、样本、记录
- 竖行(col)—— 属性(Attribute)、变量、字段
数据格式
ARFF(Attribute-Relation File Format)文件,一种ASCII文本文件。
- 识别ARFF文件的重要依据是分行,因此不能在这种文件里随意的断行。
- 注释:以“%”开始的行
第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。
关系声明
关系名称在ARFF文件的第一个有效行来定义,格式为@relation 声明字符串。如果这个字符串包含空格,它必须加上引号(指英文标点的单引号或双引号)。
属性声明
属性声明的格式为@attribute <attribute-name> <datatype>
数据集中的每一个属性都有它对应的“@attribute”语句,来定义它的属性名称和数据类型。
这些声明语句的顺序很重要。首先它表明了该项属性在数据部分的位置。其次,最后一个声明的属性被称作class属性,在分类或回归任务中,它是默认的目标变量。
WEKA支持的有四种,分别是
l numeric 数值型
l {<nominal- name1>, <nominal-name2>, ...} 分类(nominal)型
l string 字符串型
l date [<date-format>] 日期和时间型
注意 :“integer”,“real”,“numeric”,“date”,“string”这些关键字是区分大小写的,而 “relation”,“attribute ”和“data”则不区分。
第二部分给出了数据信息(Data information),即数据集中给出的数据。
数值属性
数值型属性可以是整数或者实数,但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”。数据信息部分表达日期的字符串,必须符合声明中规定的格式要求。
数据信息
数据信息中“@data”标记独占一行,剩下的是各个实例的数据。每个实例占一行。实例的各属性值用逗号“,”隔开。如果某个属性的值是缺失值(missing value),用问号“?”表示,且这个问号不能省略。
例如:
@data
Sunny, 85, 85, FALSE, no
? ,78,90,?,yes
稀疏数据
有的时候数据集中含有大量的0值(比如购物篮分析),这个时候用稀疏格式的数据存贮更加省空间。稀疏格式是针对数据信息中某个实例的表示而言,不需要修改ARFF文件的其它部分。
例:
@data
0, X, 0, Y, "class A"
0, 0, W, 0, "class B"
用稀疏格式表达的话就是
@data
{1 X, 3 Y, 4 "class A"}
{2 W, 4 "class B"}
注意:在稀疏格式中没有注明的属性值不是缺失值,而是0值。若要表示缺失值,必须显式的用问号表示出来。
Relational型属性
在WEKA 3.5版中增加了一种属性类型叫做Relational,有了这种类型我们可以像关系型数据库那样处理多个维度了。但是这种类型目前还不见广泛应用,暂不作介绍。
数据准备
(一).* ---> .csv(注意第一行是“属性名”)
a) Excel的XLS文件另存为CSV文件。
b) 在Matlab中的二维表格是一个矩阵,我们通过这条命令把一个矩阵存成CSV格式:
csvwrite('filename',matrixname)
(二)下载地址:http://sourceforge.net/projects/weka/files
(三) WEKA所带的命令行工具
(四) “Explorer”界面
(五)预处理
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 after the last mailing
(YES/NO)
1、通常对于数据挖掘任务来说,ID这样的信息是无用的,我们将之删除。在区域5勾选属性“id”,并点击“Remove”。
有些算法,只能处理所有的属性都是分类型的情况。这时候我们就需要对数值型的属性进行离散化。在这个数据集中有3个变量是数值型的,分别是“age”,“income”和“children”。
2、其中“children”只有4个取值:0,1,2,3。这时我们在Ultra-Edit中直接修改ARFF文件,把
@attribute children numeric
改为
@attribute children {0,1, 2, 3}
3、“age”和“income”的离散化我们需要借助WEKA中名为“Discretize”的Filter来完成。
“weka.filters.unsupervised.attribute.Discretize”
点击“Choose”旁边的文本框,会弹出新窗口以修改离散化的参数。关于它们的意思可以点“More”查看。若想放弃离散化可以点区域2的“Undo”。
如果对“"(-inf-34.333333]"”这样晦涩的标识不满,我们可以用Ultra-Edit打开保存后的ARFF文件,把所有的“'\'(-inf-34.333333]\''”替换成“0_34”。其它标识做类似地手动替换。
(六)分类与回归
一般的,若Class属性是分类型时我们的任务才叫分类,Class属性是数值型时我们的任务叫回归。
这里我们解释一下“Confusion Matrix”(混淆矩阵)的含义。
这个矩阵对角线上的数字越大,说明预测得越好。
模型应用
注意:待预测数据集和训练用数据集各个属性的设置必须是一致的。
右键点击“Result list”中刚产生的那一项,选择“Re-evaluate model on current test set”。 现在点击右键菜单中的“Visualize classifier
errors”,将弹出一个新窗口显示一些有关预测误差的散点图。
打开这个被保存的文件,可以看到在倒数第二个位置多了一个属性,这个属性上的值就是模型对每个实例的预测值。
使用命令行(推荐)
1、“J48”算法的命令格式为:
java weka.classifiers.trees.J48 -C 0.25 -M 2 -t
directory-path\bank.arff -d directory-path \bank.model
“ -C 0.25”和“-M 2”是和图形界面中所设的一样的
“-t ”后面跟着的是训练数据集的完整路径(包括目录和文件名)
“-d ”后面跟着的是保存模型的完整路径。注意!这里我们可以把模型保存下来。
输入上述命令后,所得到树模型和误差分析会在“Simple CLI”上方显示,可以复制下来保存在文本文件里。误差是把模型应用到训练集上给出的。
2、把这个模型应用到“bank-new.arff”所用命令的格式为:
java weka.classifiers.trees.J48 -p 9 -l directory-path\bank.model -T
directory-path \bank-new.arff
“-p 9”说的是模型中的待预测属性的真实值存在第9个(也就是“pep”)属性中,这里它们全部未知因此全部用缺失值代替。
“-l”后面是模型的完整路径。
“-T”后面是待预测数据集的完整路径。
输入上述命令后,在“Simple
CLI”上方会有这样一些结果:
0 YES 0.75 ?
1 NO
0.7272727272727273 ?
2 YES 0.95 ?
3 YES
0.8813559322033898 ?
4 NO
0.8421052631578947 ?
这里的第一列就是我们提到过的“Instance number”,第二列就是刚才的“predicted pep” ,第三列对预测结果的置信度(confidence ),第四列则是“bank-new. Arff”中原来的“pep”值(这里都是“?”缺失值)。比如说对于实例0,我们有75%的把握说它的“pep”的值会是“YES”,对实例4我们有84.2%的把握说它的“pep”值会是“NO”
(七)选择相关性属性
算法说明
1) 数据输入和输出
WOW():查看Weka函数的参数。
Weka_control():设置Weka函数的参数。
read.arff():读Weka Attribute-Relation File Format (ARFF)格式的数据。
write.arff:将数据写入Weka Attribute-Relation File Format (ARFF)格式的文件。
2) 数据预处理
Normalize():无监督的标准化连续性数据。
Discretize():用MDL(Minimum Description Length)方法,有监督的离散化连续性数值数据。
3) 分类和回归
IBk():k最近邻分类
LBR():naive Bayes法分类
J48():C4.5决策树算法(决策树在分析各个属性时,是完全独立的)。
LMT():组合树结构和Logistic回归模型,每个叶子节点是一个Logistic回归模型,准确性比单独的决策树和Logistic回归方法要好。
M5P():M5 模型数算法,组合了树结构和线性回归模型,每个叶子节点是一个线性回归模型,因而可用于连续数据的回归。
DecisionStump():单层决策树算法,常被作为boosting的基本学习器。
SMO():支持向量机分类
AdaBoostM1():Adaboost M1方法。-W参数指定弱学习器的算法。
Bagging():通过从原始数据取样(用替换方法),创建多个模型。
LogitBoost():弱学习器采用了对数回归方法,学习到的是实数值
MultiBoostAB():AdaBoost 方法的改进,可看作AdaBoost 和 “wagging”的组合。
Stacking():用于不同的基本分类器集成的算法。
LinearRegression():建立合适的线性回归模型。
Logistic():建立logistic回归模型。
JRip():一种规则学习方法。
M5Rules():用M5方法产生回归问题的决策规则。
OneR():简单的1-R分类法。
PART():产生PART决策规则。
4) 聚类
Cobweb():这是种基于模型方法,它假设每个聚类的模型并发现适合相应模型的数据。不适合对大数据库进行聚类处理。
FarthestFirst():快速的近似的k均值聚类算法
SimpleKMeans():k均值聚类算法
XMeans():改进的k均值法,能自动决定类别数
DBScan():基于密度的聚类方法,它根据对象周围的密度不断增长聚类。它能从含有噪声的空间数据库中发现任意形状的聚类。此方法将一个聚类定义为一组“密度连接”的点集。
5)关联规则
Apriori():Apriori是关联规则领域里最具影响力的基础算法,是一种广度优先算法,通过多次扫描数据库来获取支持度大于最小支持度的频繁项集。它的理论基础是频繁项集的两个单调性原则:频繁项集的任一子集一定是频繁的;非频繁项集的任一超集一定是非频繁的。在海量数据的情况下,Apriori 算法的时间和空间成本非常高。
Tertius():Tertius算法。
6)预测和评估:
predict():根据分类或聚类结果预测新数据的类别
table():比较两个因子对象
evaluate_Weka_classifier():评估模型的执行,如:TP Rate,FP Rate,Precision,Recall,F-Measure。