WEKA使用

参考

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支持的有四种,分别是

numeric       数值型

{<nominal- name1>, <nominal-name2>, ...} 分类(nominal)型

string         字符串型

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。

 

 

posted @ 2016-01-04 11:02  sweetyu  阅读(2449)  评论(0编辑  收藏  举报