Weka入门教程(1)巧妇难为无米之炊。首先我们来看看WEKA所用的数据应是什么样的格式。跟很多电子表格或数据分析软件一样,WEKA所处理的数据集是图1那样的一个二维的表格。图1新窗口打开这里我们要介绍一下WEKA中的术语。表格里的一个横行称作一个实例(Instance),相当于统计学中的一个样本,或者数据库中的一条记录。竖行称作一个属性(Attrbute),相当于统计学中的一个变量,或者数据库中的一个字段。这样一个表格,或者叫数据集,在WEKA看来,呈现了属性之间的一种关系(Relation)。图1中一共有14个实例,5个属性,关系名称为“weather”。WEKA存储数据的格式是ARFF(Attribute-RelationFileFormat)文件,这是一种ASCII文本文件。图1所示的二维表格存储在如下的ARFF文件中。这也就是WEKA自带的“weather.arff”文件,在WEKA安装目录的“data”子目录下可以找到。代码:%ARFFfilefortheweatherdatawithsomenumricfeatures%@relationweather@attributeoutlook{sunny,overcast,rainy}@attributetemperaturereal@attributehumidityreal@attributewindy{TRUE,FALSE}@attributeplay{yes,no}@data%%14instances%sunny,85,85,FALSE,nosunny,80,90,TRUE,noovercast,83,86,FALSE,yesrainy,70,96,FALSE,yesrainy,68,80,FALSE,yesrainy,65,70,TRUE,noovercast,64,65,TRUE,yessunny,72,95,FALSE,nosunny,69,70,FALSE,yesrainy,75,80,FALSE,yessunny,75,70,TRUE,yesovercast,72,90,TRUE,yesovercast,81,75,FALSE,yesrainy,71,91,TRUE,no需要注意的是,在Windows记事本打开这个文件时,可能会因为回车符定义不一致而导致分行不正常。推荐使用UltraEdit这样的字符编辑软件察看ARFF文件的内容。下面我们来对这个文件的内容进行说明。识别ARFF文件的重要依据是分行,因此不能在这种文件里随意的断行。空行(或全是空格的行)将被忽略。以“%”开始的行是注释,WEKA将忽略这些行。如果你看到的“weather.arff”文件多了或少了些“%”开始的行,是没有影响的。除去注释后,整个ARFF文件可以分为两个部分。第一部分给出了头信息(Headinformation),包括了对关系的声明和对属性的声明。第二部分给出了数据信息(Datainformation),即数据集中给出的数据。从“@data”标记开始,后面的就是数据信息了。关系声明关系名称在ARFF文件的第一个有效行来定义,格式为@relationrelation-namerelation-name是一个字符串。如果这个字符串包含空格,它必须加上引号(指英文标点的单引号或双引号)。属性声明属性声明用一列以“@attribute”开头的语句表示。数据集中的每一个属性都有它对应的“@attribute”语句,来定义它的属性名称和数据类型。这些声明语句的顺序很重要。首先它表明了该项属性在数据部分的位置。例如,“humidity”是第三个被声明的属性,这说明数据部分那些被逗号分开的列中,第三列数据85908696...是相应的“humidity”值。其次,最后一个声明的属性被称作class属性,在分类或回归任务中,它是默认的目标变量。属性声明的格式为@attributeattribute-namedatatype其中attribute-name是必须以字母开头的字符串。和关系名称一样,如果这个字符串包含空格,它必须加上引号。WEKA支持的datatype有四种,分别是numeric-------------------------数值型nominal-specification-----分类(nominal)型string----------------------------字符串型date[date-format]--------日期和时间型其中nominal-specification和date-format将在下面说明。还可以使用两个类型“integer”和“real”,但是WEKA把它们都当作“numeric”看待。注意“integer”,“real”,“numeric”,“date”,“string”这些关键字是区分大小写的,而“relation”“attribute”和“date”则不区分。数值属性数值型属性可以是整数或者实数,但WEKA把它们都当作实数看待。分类属性分类属性由nominal-specification列出一系列可能的类别名称并放在花括号中:{nominal-name1,nominal-name2,nominal-name3,...}。数据集中该属性的值只能是其中一种类别。例如如下的属性声明说明“outlook”属性有三种类别:“sunny”,“overcast”和“rainy”。而数据集中每个实例对应的“outlook”值必是这三者之一。@attributeoutlook{sunny,overcast,rainy}如果类别名称带有空格,仍需要将之放入引号中。字符串属性字符串属性中可以包含任意的文本。这种类型的属性在文本挖掘中非常有用。示例:@ATTRIBUTELCCstring日期和时间属性日期和时间属性统一用“date”类型表示,它的格式是@attributenamedate[date-format]其中name是这个属性的名称,date-format是一个字符串,来规定该怎样解析和显示日期或时间的格式,默认的字符串是ISO-8601所给的日期时间组合格式“yyyy-MM-ddTHH:mm:ss”。数据信息部分表达日期的字符串必须符合声明中规定的格式要求(下文有例子)。数据信息数据信息中“@data”标记独占一行,剩下的是各个实例的数据。每个实例占一行。实例的各属性值用逗号“,”隔开。如果某个属性的值是缺失值(missingvalue),用问号“?”表示,且这个问号不能省略。例如:@datasunny,85,85,FALSE,no?,78,90,?,yes字符串属性和分类属性的值是区分大小写的。若值中含有空格,必须被引号括起来。例如:@relationLCCvsLCSH@attributeLCCstring@attributeLCSHstring@dataAG5,'Encyclopediasanddictionaries.;Twentiethcentury.'AS262,'Science--SovietUnion--History.'日期属性的值必须与属性声明中给定的相一致。例如:@RELATIONTimestamps@ATTRIBUTEtimestampDATEyyyy-MM-ddHH:mm:ss@DATA2001-04-0312:12:122001-05-0312:59:55稀疏数据有的时候数据集中含有大量的0值(比如购物篮分析),这个时候用稀疏格式的数据存贮更加省空间。稀疏格式是针对数据信息中某个实例的表示而言,不需要修改ARFF文件的其它部分。看如下的数据:@data0,X,0,Y,classA0,0,W,0,classB用稀疏格式表达的话就是@data{1X,3Y,4classA}{2W,4classB}每个实例用花括号括起来。实例中每一个非0的属性值用index空格value表示。index是属性的序号,从0开始计;value是属性值。属性值之间仍用逗号隔开。注意在稀疏格式中没有注明的属性值不是缺失值,而是0值。若要表示缺失值必须显式的用问号表示出来。Relational型属性在WEKA3.5版中增加了一种属性类型叫做Relational,有了这种类型我们可以像关系型数据库那样处理多个维度了。但是这种类型目前还不见广泛应用,暂不作介绍。3.数据准备使用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后可以点击下方按钮进入相应的模块。我们点击进入“SimpleCLI”模块提供的命令行功能。在新窗口的最下方(上方是不能写字的)输入框写上javaweka.core.converters.CSVLoaderfilename.csvfilename.arff即可完成转换。在WEKA3.5中提供了一个“ArffViewer”模块,我们可以用它打开一个CSV文件将进行浏览,然后另存为ARFF文件。进入“Exploer”模块,从上方的按钮中打开CSV文件然后另存为ARFF文件亦可。“Exploer”界面我们应该注意到,“Exploer”还提供了很多功能,实际上可以说这是WEKA使用最多的模块。现在我们先来熟悉它的界面,然后利用它对数据进行预处理。图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中选中属性的直方图。若数