Weka的Explorer(探索者)界面,是Weka的主要图形化用户界面,其全部功能都可通过菜单选择或表单填写进行访问。本博客将详细介绍Weka探索者界面的图形化用户界面、预处理界面、分类界面、聚类界面、关联界面、选择属性界面和可视化界面等内容。
一、Weka的Explorer(探索者)界面里的图形化界面
启动WekaGUI选择器窗口之后,用鼠标单击窗口右部最上面的Explorer按钮,启动探索者界面,这时,由于没有加载数据集,除预处理面板外,其他面板都变灰而不可用,可以使用Openfile、OpenURL、OpenDB或者Generate按钮加载或产生数据集,加载数据集之后,其他面板才可以使用。
我这里以打开文件为例进行说明。单击左上部的Openfile按钮,通过弹出的打开文件对话框,选择打开data子目录下的iris.arfT文件,加载数据集后的探索者界面如下图所示。
区域1的几个选项卡是用来切换不同的挖掘任务面板。这一节用到的只有“Preprocess”,其他面板的功能将在以后介绍。区域2是一些常用按钮。包括打开数据,保存及编辑功能。
1、标签页介绍
下图图所示界面的顶部有六个不同的标签页,代表六个不同的面板,分别对应Weka听支持的多种数据挖掘方式。如果刚开始打开探索者界面,那么只有第一个预处理标签页可用,其余的标签文字全部变为灰色而不可用,这是因为必须先打开一个数据集,根据应用需要,或许还需要对数据进行预处理,才能使用其他面板。这六个标签页的介绍如下。
2、状态栏
状态栏位于窗口的最下部,显示ih用户了解现在正在进行到哪一步的状态信息。例如,如果探索者正在忙于加载数据文件,状态栏会显示相应的状态信息。
3、图像输出
Weka中显示的大部分图形,不论是通过GraphVisualizer(图可视化器)或是TreeVisualizer(树可视化器)显示的,都可以保存为图像文件以备将来使用。保存方法是,按下Alt键和Shift键的同时,在要保存的图形上单击,就可启动保存文件对话框。支持的的图像文件格式有BMP、JPEG、PNG和Postscript的EPS,用户可以选择图像文件格式还可以修改输出图像文件的尺寸。
4、手把手教你用
4.1、启动Weka
从Windows左下角的“开始”菜单,依次选择“所有程序”,再找到Weka3.7.8菜单,启动它,如下图所示。
然后,单击窗口右部最上边的Explorer按钮启动Weka探索者,如下图所示。
现在,除了Preprocess标签页可用外,其余标签页都是不可用的。
2、了解标签页
单击上图的Openfile按钮,该按钮位于窗口的左上部。启动“打开”文件窗口,导航到Weka安装目录下的data子目录,选择iris.arff文件,我这里是选择在
D:\SoftWare\Weka-3-7\data。单击打开按钮,打开该文件,如下图所示。
打开文件(或称为加载数据)后的Weka探索者,界面如下如所示,可以看到,加载数据后,六个标签页都变为可用状态。
大家,可以自行去切换标签页,初步了解各个标签页的功能,为后续的学习打下基础。
3、了解状态栏
不论切换到哪个标签页,都可以在探索者窗口下部的状态栏查看到状态信息。在状态栏任意位置右击,在弹出的上下文菜单中选择第一项Memoryinformation(内存信息),状态栏显示用斜杠分隔的内存信息,格式为:空闲内存/全部内存/最大内存,单位字节。如下图所示。
如果选择上下文菜单中的第二项Rungarbagecollector,状态栏会显示ok信息,表示已经启动了垃圾回收器。
单击状态栏右边的Log按钮,可以查看到当前日志。
4、保存图像文件
单击如下图所示的界面右边的VisualizeAll(全部可视化)按钮,打开如下图所示的全部可视化窗口。
同时,按下Alt键+Shift键,并在上图所示任选一图标,在图标的任意位置单击,启动保存文件对话框。输入名称为test,选择文件类型为jpg(或其他格式),保存按钮,就可以保存为图像文件了,如下图所示。(比如,我这里选择用最左上方的那一幅图)
还可以定制图像文件的长、宽尺寸,单位为像素。选中usecustomdimensions(使用自定义尺寸)复选框就可以设置图像尺寸,如果选择keepaspectratio(保持宽高比)复选框,则在修改图像长(或宽)的同时,会按比例自动缩放宽(或长)。
成功!
二、预处理
预处理面板可以从文件、URL或数据库中加载数据集,并且根据应用要求或领域知识过滤掉不需要进行处理或不符合要求的数据。
1、加载数据
预处理标签页的前四个按钮可以让用户将数据加载到Weka系统。
Openfile按钮启动打开文件对话框,用户可以浏览本地文件系统,打开本地数据文件;
OpenURL按钮要求用户提供一个统一资源定位符地址,Weka使用HTTP协议从网络位罝下载数据文件;
OpenDB按钮用于从数据库中读取数据,支持所有能够用JDBC驱动程序读取的数据库,使用SQL语句或存储过程读取数据集。
请注意,必须根据自己的计算机环境配置,相应修改weka/experiment/DatabaseUtils.props配置文件后才能访问数据库,具体参见下面我写的这篇博客;
Generate按钮用于让用户使用不同的DataGenerators(数据生成器)以生成人工数据,适合用于分类功能的人工数据可以由决策列表RDG1、径向基函数网络RandomRBF、贝叶斯网络BayesNet、LED24等算法产生,人工回归数据也可以根据数学表达式生成,用于聚类的人工数据可以使用现成的生成算法产生。
如果使用Openfile按钮,可以读取多种数据格式的文件,包括WekaARFF格式、C4.5数据格式、CSV格式、JSON实例文件格式、libsvm数据文件格式、MatlibASCII文件格式、svm轻量级数据文件格式、XRFF格式,以及序列化实例的格式。
其中,ARFF格式文件的后缀为.arff,C4.5文件的后缀为.data或.names,CSV格式文件的后缀为.csv,JSON实例文件格式的后缀为json,libsvm数据文件格式的后缀为.libsvm,MatlibASCII文件格式的后缀为.m,svm轻量级数据文件格式的后缀为.dat,XRFF格式的后缀为.xrff,序列化实例对象文件的后缀为.bsi。
注意到有的格式后缀还加上.gz,这是对应文件的压缩形式。
另外,使用Save(保存)按钮,可以将已加载的数据保存为Weka支持的所有文件格式。该功能特别适合转换文件格式,以及学习Weka文件格式的细节。
由于有多种数据格式,为了从不同种类的数据源中导入数据,Weka提供实用工具类进行转换,这种工具称为转换器(converters),位于weka.core.converters包中。按照功能的不同,转换器分为加载器和保存器,前者的Java类名以Loader结束,后者以Saver结束。
加载数据后,预处理面板会在Curremrelation(当前关系)子面板显示当前数据集的一些总结信息。Relation(关系)栏显示关系名称,该名称由加载的文件给定,也可通过过滤器来更改名称;Attributes(属性)栏显示数据集中的属性(或特征)个数:Instances(实例)枚显示数据集中的实例(或数据点/记录)个数:Sumofweights(权重和)栏显示全部实例的权重之和。例如,当加载iris数据姐后,当前关系子而板显示关系名称为iris,属性个数为5,实例个数为150,权重和为150,当前关系子面板如下图所示。
Weka根据文件后缀调用不同的转换器来加载数据集。如果Weka无法加载数据,就会尝试以ARFF格式解释数据,如果失败,就会弹出如下图的提示对话框,提示Weka无法自动决定使用哪一个文件加载器,需要用户自己来选择。
加载数据失败图
然后,单击上图中的“确定”按钮后,会弹出如下图所示的通用对象编辑器对话框,让用户选定能打幵数据文件的对应转换器。默认转换器为CSVLoader,该转换器专门用于加载后缀为.csv的文件。如果用户己经确定数据文件格式是CSV格式,那么可以输入曰期格式、字段分割符等信息。如果对窗口里的各项输入不了解,可以单击More按钮査看使用说明。
图通用对象编辑器
如果用户已经知道数据文件格式不是CSV格式,可以单击通用对象编辑器对话框上部的Choose按钮选择其他的转换器,如下图所示。
图选择转换器图
其中,第一个选项是ArffLoader,选择该选项并成功的可能性很小,因为默认使用它来加载数据集,没有成功才会弹出加载数据失败的窗口。
第二个选项是C45Loader,C4.5格式的数据集对应两种文件,一种文件提供字段名,另一种文件提供实际数据。
第三个选项是默认的CSVLoader,这足一种以逗号分隔各属性的文件格式,前面已经介绍了这种数据转换器。
值得一提的是,TextDirectoryLoader加载器的功能是导入一个目录,目录中包含若干以文本挖掘为目的的纯文本文件。导入目录应该有特定的结构——一组子目录,每个子目录包含一个或多个扩展名为.txt的文本文件,每个文本文件都会成为数据集中的一个实例,其中,一个字符串型属性保存该文件的内容,一个标称型的类别属性保存文件所在的子目录名称。该数据集可以通过使用StringToWordVector过滤器进一步加工为词典,为后面的文本挖掘做准备。
2、属性处理
在当前关系子面板的下方,可以看到Attributes(属性)子面板,该子面板上部有四个按钮,中部是一个三列多行的表哥,下部有一个Remove按钮。如下图所示。
表格有三列表头,包括No.(序号)列、复选框列和Name(名字)列。
其中,序号列用于标识指定数据集中的属性序号;
复选框列用于选择厲性,并对其进行操作;
iris.arff里的,以下是选择数值型属性的统计显示结果。
weather.nominal.arff里的,以下是选择标称型属性的统计显示结果。
其中,Name栏显示属性的名称,与属性列表中选中属性的名称相同;
Type栏显示属性的类型,最常见的就是标称型和数值型;
Missing(缺失)栏显示数据集中该属性不存在或未指定的实例的数量及百分比;
Distinct(不同)栏显示该属性取不同值的数量;
Unique(唯一)栏显示没有任何其他实例拥有该属性值的数量及百分比。
已选择属性子面板的下部有一个统计表格,显示该属性值的更多信息,根据属性类型的不同,表格会有所差别。
由上面的iris.arff里的,以下是选择数值型属性的统计显示结果和weather.nominal.arff里的,以下是选择标称型属性的统计显示结果。得出,
如果属性是数值类型,表格显示数据分布的四种统计描述---Minimum(最小值)、Maximum(最大值)、Mean(平均值)和StdDev(StandardDeviation,标准偏差);
如果属性是标称型,列表显示包含属性的全部可能的No.(编号)、Label(标签)表示属性值名称、Count(数量)表示拥有该属性值的实例数量、Weight(权重)表示拥有该属性值的实例权重。
在统计表格之下会显示一个彩色直方图,如图所示,直方图之上有一个下拉列表框,用于选择类别属性。
3、过滤器
预处理面板允许定义并执行以各种方式转换数据的过滤器,过滤器也称为筛选器。在Filter标签之下有一个Choose(选择)按钮,单击该按钮可以选择一个过滤器,如下图所示,按钮的右侧是过滤器输入框,用于设置所选择的过滤器参数。
一旦选定过滤器后,其名称和参数都会显示在过滤器输入框内。在框内单击会弹出一个通用对象编辑器对话框,如下图所示。比如我这里选择Weka下的filters下的unsupervised下的attribute下的Remove
则,得到一个通用对象编辑器对话框用于设置过滤器选项。如果大家用不同的过滤器,则不一样哈!
好的,About框简要说明所选择过滤器的功能;单击右侧的More按钮,弹出一个显示更多信息的窗口,显示该过滤器的简介和不同选项的功能,如下图所示。
单击Capabilities按钮,弹出一个信息窗口,列出所选择对象能够过处理的类别类型和属性类型,如下图所示。
该对话框的中部,attributeIndices文本框用于让用户输入属性的索引(或下标),invertSelection下拉列表框只有ture和false两个选项,提示是否反选。对话框下端有四个按钮,前两个按钮-----Open按钮和Save按钮,用于保存对象选项设置,以备将来使用;Cancel按钮用于取消所做的修改,回退到原来的状态;Ok按钮用于已经正确完成设置后,返回探索者窗口。
用鼠标右击(或用Alt+Shift+单击)过滤器输入框,就会弹出一个菜单,该带单有四个选项:Showproperties(显示属性)、Copyconfigurationtoclipboard(复制设置到剪贴板)、Enterconfiguration(输入设置)和Editconfiguration(编辑设置)。
如果选择Showproperties,就会弹出一个通用对象编辑器对话框,允许用户修改设置,其功能与单击过滤器输入框一样,如下所示
如果选择Copyconfigurationtoclipboard,则将当前的设置字符串复制到剪贴板,以便用于Weka以外的系统中,当用户设置了很长而复杂的选项设置字符串并且想将来复用时,该功能非常方便,如下所示
如果选择Enterconfiguration菜单项,则弹出一个输入dui对话框,让用户直接输入设置字符串,格式为类名称后接类能够支持的选项,如下图所示。
一旦选择并配置好一个过滤器之后,就可以将其应用到数据集。单击位于预处理面板中Filter子面板右端的Apply按钮应用过滤,预处理面板会显示转换后的数据信息。如果对结果不满意,可以单击Undo按钮撤销转换,还可以单击Edit按钮在数据集编辑器里手动修改数据。如果满意修改后的结果,可以单击Preprocess标签页右上角的Save按钮,将当前关系以文件格式进行保存,以供将来使用。使用直方图上部的下拉列表框,可以设置类别属性。根据是否设置类别属性,有些过滤器的行为会有所不同。特别地,有监督过滤器要求设置类别属性;一些无监督属性过滤器会忽略类别属性,即使已经设置了类别属性。请注意,如果不想设置类别属性,可以将类别属性设为None。
4、过滤器算法介绍
在Weka中实现的过滤算法,这些过滤算法都可以用于探索者、知识流和实验者界面。所有的过滤器都是将输入数据集进行某种程度的转换,转换为适合数据挖掘的形式。选杼某个过滤器之后,过滤器的名字及默认参数会出现在Choose按钮旁的输入框内,通过单击该框可以在通用对象编辑器中设置其属性。过滤器以及参数都会以命令行的方式显现在输入框,仔细观察和研宄这些过滤器和参数设设置,是学习如何直接使用Weka命令的好方法。Weka过滤器分为无监督weka过滤器和有监督weka过滤器两种。过滤器经常应用于训练集,然后再应用于测试集。如果过滤器是有监督的,例如,使用带类别值的离散化过滤器是有监督的,如果将训练得到的良好间隔施加到测试集中,可能会使结果出现偏倚。因此,使用有监督的过滤器时,必须非常小心,以确保评估结果的公平性。然而,由于无须经过训练,无监督过滤器就不会出现这个问题。Weka将无监督和有监督两种过滤方法分幵处理,每种类型又细分为属性过滤器和实例过滤器,前者作用于数据集中的属性,后者作用于数据集中的实例。要了解某个过滤器的更多使用信息,请在Weka探索者中选择该过滤器,并查看对应的对象编辑器,以了解该过滤器的功能和选项。
Weka实现的过滤器的更详细介绍请大家在自己机器上逐一去看吧。本博客将按照过滤器的类型和功能顺序进行介绍。
因为,Weka将无监督和有监督两种过滤方法分幵处理,每种类型又细分为属性过滤器和实例过滤器,前者作用于数据集中的属性,后者作用于数据集中的实例!!!
无监督属性过滤器
无监督实例过滤器
有监督属性过滤器
有监督实例过滤器
Weka提供四个有监督的实例过滤器。
Normalize过滤器将数据集中的全部数值属性规范化为[0,1]区间。规范化值可以采用用户提供的常数进一步进行缩放和转换。Center和Standardize过滤器能将数值属性转换为具有零均值,后者还能转换为具有单位方差的数值属性。如果设罝了类别属性,上述三个过滤器都会跳过,不对类别属性进行处理。RandomSubset过滤器随机选择属性的一个子集,并包括在输出中。可以用绝对数值或百分比指定抽取的范围,输出的新数据集总是把类别属性作为最后一个属性。ParUtionedMultiFilter过滤器是一种特殊的过滤器,在输入数据集中一组对应的顺范围内应用一组过滤器。只允许使用能操作属性的过滤器,用户提供和配罝每个过滤器,定义过滤器工作的属性范围。removeUnused选项可以删除不在任何范围内属性。将各个过滤器的输出组装成一个新的数据集。Reorder过滤器改变数据中属性的顺序,通过提供属性索引列表,指定新顺序。另外,通过省略或复制属性索引,可以删除属性或添加多个副本。
2)改变值SwapVaktes过滤器交换同一个标称属性的两个值的位置。值的顺序不影响学习,但如果选择了类别属性,顺序的改变会影响到混淆矩阵的布局。MergeTwoVlues过滤器将一个标称属性的两个值合并为一个单独的类别,新值的名称是原有两个值的字符串连接,每—个原有值的每次出现都更换为新值,新值的索引比原有值的索引小。例如,如果合并天气数据集中outlook属性的前两个值,其中有五个sunny、四个overcast、五个rainy实例,新的outlook屈性就包含sunny_overcast和rainy值,将有九个sunny_overcast实例和原有的五个rainy实例。
处理缺失值的一个方法是在实施学习方案前,全局替换缺失值。ReplaceMissingValues过滤器用均值取代每个数值厲性的缺失值,用出现最多的众数取代标称属性的缺失值。如果设置了类别属性,默认不替换该属性的缺失值,但可以使用ignoreClass选项进行修改。NumericCleaner过滤器用默认值取代数值属性中值太小,或太大,或过于接近某个特定值。也可以为每一种情况指定不同的默认值,供选择情况包括的认定为太大或太小的阈值,以及过于接近定义容差值(tolerancevalue)。如果属性标签缺失,可以使用AddValues过滤器为该属性添加给定标签列表。标签能以升序的方式进行排序。如果没有提供标签,则只能选择排序功能。AddValues过滤器对照用户提供的列表,并在标称属性中添加其中不存在的值,可以选择对标签进行排序。ClassAssigner过滤器用于设置或取消数据集的类别属性。用户提供新的类别属性的索引,索引为0值则取消当前类别属性。
6)随机化—些属性过滤器有意降低数据的质萤。AddNoise过滤器按照指定的一定比例更改标称属性的值。可以保留缺失值,也可以让缺失值和其他值一起变化。Obfuscate过滤器对关系属性、全部属性名称,以及所有标称型和字符串型属性值进行重命名,对数据集进行模糊处理,目的主要是为了交换敏感数据集。RandomProjection过滤器通过使用列为单位长度的随机矩阵,将数据投影到一个低维子空间,以此来降低数据维数。投影不包括类别属性。
2.无监督实例过滤器1)随机化和子采样Randomize过滤器用于将数据集中实例顺序进行随机重排。产生的数据子集的方式有很多种。Resample过滤器产生一个有放回或无放回数据集的随机子样本。RemoveFolds过滤器将数据集分割为给定的交叉验证折数,并指定输出第几折。如果提供一个随机数种子,在提取子集前,先对数据重新排序。ReservoirSample过滤器使用水库抽样算法从数据集中抽取一个随机样本(无放回)。当在知识流界面或命令行界面使用时,可以增量读取数据集,因此可以抽样超出主内存容量的数据集。
RemovePercentage过滤器删除数据集中的给定亩分比的实例。RemoveRange过滤器删除数据集里给定范围的实例。RemoveWithValues过滤器删除符合条件的实例,如标称属性具有一定值的,或者数值属性人于或小于特定阈值的。默认情况下,会删除所有满足条件的实例。也可以反向匹配,保留所有满足条件的实例,删除其余实例。RemoveFrequentValues过滤器用于删除那些满足某个标称型属性值最经常或最不经常使用的对应的实例。用户可以指定频度多大或多小的具体值。SubsetByExpression过滤器选择那些满足用户提供的逻辑表达式的所有实例。表达式可以是数学运算符和函数,如那塑可用于AddExpression和MathExpression过滤器的运算符和函数,以及应用于属性值的逻辑运算符(与或非)。例如以下表达式:(CLASSis'mammal')and(ATT14>2)选择那些CLASS属性值为mammal并且第14个属性的值大于2的实例。通过将分类方法应用到数据集,然后使用RemoveMisdassified过滤器删除错误分类的实例,可以删除离群值。通常上述过程需要重复多遍,直到充分清洗数据,也可以指定最大的迭代次数。除了评估训练数据,还可以使用交叉验证,对数值类别也可以指定的错误阈值。
2)稀疏实例NonSparseToSparse过滤器将全部输入实例转换为稀疏格式。SparseToNonSparsc过滤器将输入的所有稀疏实例转换为非稀疏格式。
3.有监督属性过滤器Discretize过滤器将数据集中一定范围内的数值屈性离散化为标称属性,用户指定属性的范围以及强制属性进行二元离散化。要求类别属性为标称属性,默认的离散化方法楚Fayyad&Irani的MDL(最小描述长度)判据,也可以使用Kononenko方法。NominalToBinary过滤器也有一个有监督版本,将全部标称属性转换成二元的数值属性。在有监督版本中,类别属性是标称型还是数值型,决定如何进行转换。如果是标称型,使用每个值一个属性的方法,将k个值的属性转换成k个二元属性。如果是数值型,考虑类别平均值与每个属性值的关联,创建k-1个新的二元属性。两种情况都不改变类别本身。
ClassOrder过滤器更改类别顺序。用户指定新顺序是否按随机顺序,或按类别频率进行升序或降序排列。该过滤器不能与FilteredClassifier元学习方案联合使用。AttributeSelection过滤器用于自动属性选择,并提供与探索者界面中Selectattributes子面板相同的功能。AddClassification过滤器使用指定分类器为数据集添加分类、分类分布和错误标志。分类器可以通过对数据木身进行训练而得到,也可以通过序列化模型得到。
4.有监督实例过滤器Weka提供三个有监督的实例过滤器。Resample过滤器与同名的无监督实例过滤器类似,但它保持在子样本的类别分布。另外,它可以配罝是否使用均匀的分类偏倚,抽样可以设置为有放回(默认)或无放回模式。SpreadSubsample过滤器也产生一个随机子样本,但时以控制最稀少和最常见的类别之间的频率差异。例如,可以指定至多2:1类别频率差异,也可以通过明确指定某个类别的敁大计数值,限制实例的数量。与无监督的实例过滤器RemoveFolds相似,StratifiedRemoveFolds过滤器为数据集输出指定交叉验证的折,不同之处在于本次的折是分层的。
5、手把手教你用Weka里的过滤器
1.使用数据集编辑器Weka可以查看和编辑整个数据集。首先加载weather.nominal.arff文件,单击预处理而板上端的Edit按钮,弹出一个名称为Viewer(阅读器)的对话框,列出全部天气数据。该窗口以二维表的形式展现数据,用于查看和编辑整个数据集,如下图所示。
图数据集编辑器对话框
数据表顶部显示当前数据集的关系名称。表头列出数据集各属性的序号、名称和数据类型。数据集编辑器的第一列是序号,标识实例的编号。
窗口右下部有三个按钮,Undo按钮撤销所做的修改,不关闭窗口;OK按钮提交所做的修改,关闭窗口;Cancel按钮放弃所做的修改,关闭窗口。
2、删除属性
Weka使用过滤器来系统性地更改数据集,因此过滤器属于预处理工具。
假如要求去除weather.nominal.arff数据集的第二个属性,即temperature属性。删除属性是具体步骤如下。
首先,使用探索者界面加载weather.nominal.arff文件。在预处理面板中单击Choose按钮,打开一个分层菜单,如下图所示。
图过滤器分层菜单图
适合本例要求的过滤器称为Remove,全称是weka.filters.unsupervised.attribme.Remove。从名称上可以看出,过滤器组织成层次结构,根为weka,往下继续分为imsupervised(无监督)和suervised(有监督)两种类型,无监督要求设置类别属性,有监督不要求设置类别属性。继续往下分为attribute(属性)和instance(实例)两种类型,前者主要处理有关属性的过滤,后者处理有关实例的过滤。在分层菜单中按照weka\filters\unsupervised\attribute路径,找到Remove条目,单击选择该过滤器。这时,Choose按钮右边的文本输入框应该显示Remove字符串。单击该文本框,打开通用对象编辑器对话框以设置参数。
在attributelndices文本框内输入“2”,如下图所示。单击OK按钮关闭通用对象编辑器对话框。
这时,Choose按钮右边的文本框应该显示“Remove-R2”,含义是从数据集中去除第二个属性。单击该文本框右边的Applly按钮使过滤器生效据。
应该看到原来的5个属性现在变为4个,temperature属性己经被去除。要特别说明的是,本操作只影响内存中的数据,不会影响数据集文件中的内容。
当然,变更后的数据集也可以通过单击Save按钮并输入文件名另存为ARFF格式或其他格式的新文件。如果要撤消过滤操作,请单击Undo按钮,撤消操作也只会影响内存中的数。
如果仅需要去除属性,还有更简单并且效果一样的方法。只要在Attributes子面板内选择要去除的属性,然后单击属性列表下面的Remove按钮即可。
3、添加属性
启动探索者界面并加载weaather.nominal.arff数据集。假如要求在数据集倒数第二个属性位置添加一个用户定义的字段,具体操作步骤如下:
在预处理面板上单击Choose按钮,选择AddUserFields过滤器。然后单击Choose按钮旁的方框,在通用对象编辑器设置AddUserFields过滤器。
然后单击Choose按钮旁的方框,在通用对象编辑器中设置AddUserFields过滤器的选项。
单击New按钮,然后设置Attributename(属性名称)为mode,设置Attributetype(属性类型)为nominal,不设置Dateformat(日期格式)和Attributevalue(属性值)两个字段,如下图所示。
单击OK按钮结束选项设置,并在预处理面板上单击Apply按钮应用过滤器。这时,应该看到Attributes子面板的属性表格中看到多出来一个mode属性。
如果单击Edit按钮打开viewer窗口,可以看到新增的属性并没有值,因此,下一步是添加标称属性值。
再次,单击Choose按钮,选择AddValues过滤器,按照下图所示设置标称属性的标签。
再次单击Edit按钮打开Viewer对话框,如下图所示。可以看到,这次的最后一个属性已经有了标称属性标签,可以随意设置一些值,然后单击OK按钮关闭对话框。
注意:我们新增属性的位置,不符合要求的倒数第二个属性位置。最后一个属性一般是类别属性,需要把第五个属性与第六个属性对换一下,则,该怎么对换呢?得用到Recorder过滤器,参数为"-R1,2,3,4,6,5”。
我们只需,输入1,2,3,4,6,5即可。然后点击OK
再点击Apply
再点击Edit按钮打开Viewer对话框去看看
4.离散化
如果数据集包含数值属性,但所的学习方案只能处理标称型属性的分类问题,先将数值属性进行离散化是必要的,这样就能使学习方案增加处理数值属性的能力,通常能获得较好的效果。
等宽离散化(或称为等宽分箱)经常造成实例分布不均匀,有的间隔区域内(箱内)包含很多个实例,但有的却很少甚至没有。这样会降低属性辅助构建较好决策结果的能力。通常也允许不同大小的间隔区域存在,从而使每个区间内的训练实例数量相等,这样的效果会好一些,该方法称为等频离散化(或称为等频分箱),其方法是:根据数轴上实例样木的分布将属性区间分隔为预先设定数量的区间。如果观察结果区间的直方图,会发现其形状平直。等频分箱与朴素贝叶斯学习方案一起应用时效果较好。但是,等频分箱也没有注意实例的类别属性,仍有可能导致不好的区间划分。例如,如果一个区域内的全部实例都属于—个类别,而下一个区域内除了第一个实例外都属于前一个类别,其余的实例都属于另一个类别,那么,显然将第一个实例包含到前一个区域更为合理。
无监督离散化
下面以实例说明这两种方法的差异。首先,在data目录中查找到玻璃数据集glass.arf文件,并将它加载至探索者界面,在预处理面板中杳看RI属性直方图,如下图所示。
实施无监督离散化过滤器,分别使用等宽和等频两种离散化方法,即首先保持Discretize的全部选项默认值不变,然后将useEqualFrequency选项的值更改为True。得到离散化后对应的RI属性直方图分别如下图所示。
以下是等频离散化后的RI属性(将useEqualFrequency选项的值更改为True)
以下是等宽离散化后的RI属性(将useEqualFrequency选项的值更改为true,再次开启就可以了)
等宽离散化后的RI属性等频离散化后的RI属性
等宽离散化数值属性从最小值到最大值之间平均分为十份,因此每一份所包含的实例数量就各不相等;而等频离散化按数值属性的大小顺序将全部实例平均分为十份,每份所包含是实例数量为21~22。
大家,也许会形成一个错觉,等频离散化后形成的直方图似乎都会等高。但是,如果等频离散化Ba属性,再检查结果,会发现这些直方图严重地偏向一端,也就是根本不等频。
这是为什么呢?仔细观察第一个直方图的标签,其值为(-inf-0.03】,即区间大于负无穷且小于等于0.03。使用数据集编辑器打开离散化前的原始数据集,单击第八列表头,使数据集按照Ba属性进行排序,可以看到,有176个实例的Ba属性值都等于0.0。由于这些值都完全相同,没有办法将它们分开。这就是为什么,上图严重地偏向一端的根本原因。
总结:一般情况下,等频离散化后直方图大致等高。但如果有很多实例的值都完全相同,则等频离散化也没法做到“等频”。
有监督离散化
有监督的离散化竭力去构建一种间隔,虽然各个间隔之间的分类分布各不相同,但间隔内的分布保持一致。Weka有监督的离散化数值属性的java类的全路径名称为weka.filters.supervised.Discretize。首先,定位到data目录下的鸢尾花数据集,加载iris.arff文件,施加有监督的离散化方案,观察得到的直方图如下图所示。
有监督离散化后的直方图
那么,上图中哪一个经过离散化后的属性最具有预测能力?显然,只有petallength(花瓣长)和petalwidth(花瓣宽)最具竞争力,因为它们的每种分类都已经接近为同一种颜色。
再经仔细对比发现在前者中,有1个virginica实例错分到versicolor中,有6个实例versicolor错分到virginica中,因此共有7个错分的实例;
而后者,只有5个virginica实例错分到versicolor中,有1个versicolor实例错分到virginica中,因此共有6个错分的实例。
从而得出结论:离散化后的petalwidth属性最具有预测能力。
通常将离散化后的属性编码为标称属性,每一个范围给定一个值。然而,因为范围是有序的,离散化后的属性实际上是一个有序标量。除了创建多元属性外,有监督和无监督两种离散化过滤器都能创建二元属性,只要将选项makeBinary设置为True即可。下图就是有监督的离散化方案创建二元属性后得到。
有监督二元离散化后的直方图
分类
分类就是得到一个分类函数或分类模型(即分类器),通过分类器将未知类别的数据对象映射到某一个给定的类别。
数据分类可以分为两步。第一步建立模型,通过分析属性描述的数据集,来建立反映其特性的模型。该步骤也称为有监督的学习,基于训练集而导出模型,训练集是已知类别标签的数据对象。第二步使用模型对数据对象进行分类。首先评估模型的分类准确度或其他指标,如果可以接受,才使用它来对未知类别标签的对象进行分类。
预测的目的是从历史数据记录中自动推导出对给定数据的推广描述,从而能够对事先未知类别的数据进行预测。分类和回归是两类主要的预测问题,分类是预测离散的值,回归的预测连续值。
Weka提供分类面板来构建分类器。如下图所示。
在分类面板的最上部是Classifier(分类器)子面板,子面板内有一个Choose按钮和一个文本框。按钮用于选择Weka提供的分类器;文本框用于显示当前选择的分类器的名称和选项。单击文本框会弹出一个通用对象编辑器对话框,与过滤器的对象编辑器对话框的功能一样,可以用来设置当前分类器的选项。右击(或用Alt+ShifH单击)分类器文本输入框,就会弹出一个菜单,选择菜单项可以让用户修改设置,或将当前设置的字符串复制到剪贴板,或直接输入设置字符串,使用方法与过滤器的相似。
在分类面板的左部有Testoptions(测试选项)子面板。该子面板是为了设置测试模式,将设置的选项应用到当前选择的分类器中。测试模式分为以下四种。
(1)Usetrainingset(使用训练集)。直接将训练集实例用于测试,评估分类器预测类别的性能。(2)Suppliedtestset(提供测试集)。从一个文件中加载一组实例,评估分类器预测类别的性能。单击Set按钮会弹出一个对话框,允许用户选择进行测试的文件。(3)Cross-validation(交叉验证)。通过交叉验证评价分类器,在提示为Folds的文本框中输入交叉验证的折数。(4)Percentagesplit(按比例分割)。在数据集中,取出特定百分比的数据用于训练,其余的数据用于测试,评价分类器预测分类的性能。取出的数据量取决于用户在“%”文本框中输入的值。
图更多测试选项
更多的测试选项解释如下(1)Outputmodel(输出模型)。输出通过完整训练集得到的分类模型,以便能够浏览、可视化等。默认选择此选项。
(2)Outputper-classstats(输出每个类别的统计信息)。输出每个分类的査准率/查全率以及True/False的统计信息。默认选择此选项。(3)Outputentropyevaluationmeasures(输出熵评估度量)。输出中包括熵评估度量。默认不选择此选项。
(4)Outputconfusionmatrix(输出混渚矩阵)。输出中包含分类器预测得到的混淆矩阵。各默认选择此选项。(5)Storepredictionsforvisualization(存储预测以便可视化)。保存分类器的预测结果,以便用于可视化。默认选择此选项。
(6)Outputpredictions(输出预测)。输出预测的评估数据。请注意,在交叉验证的情况下,实例序号不对应于其在数据集中的位置。(7)Outputadditionalattributes(输出额外的属性)。如果伴随预测还需要输出额外的属性(如,跟踪错误分类的1D属性),可以在这里指定该属性的索引。Weka通常支持指定范围,first和last也是有效的索引,例如:“first-3,6,8,12-last”。(8)Cost-sensitiveevaluation(成本敏感评估成本矩阵用于评估错误率。Set按钮允许用户指定所使用的成本矩阵。(9)RandomseedforXVal/%Split(XVal/%分割的随机种子)。为了评估目的而划分数据之前,指定将数据进行随机化处理的随机种子。(10)Preserveorderfor%Split(保持顺序按百分比分割)。将数据划分为训练集和测试集之前禁止随机化,即保持原来的顺序。(11)Outputsourcecode(输出源代码)。如果分类器能够输出所构建模型的Java源代码,可以在这里指定类名D可以在Classifieroutput(分类器输出)区域打印代码。
在Weka中,进行训练后的分类器用于预测某个单一的类别属性,这就是预测的目标。一些分类器只能学习标称型类别的分类(分类问题),一些分类器只能学习数值型类别的分类(回归问题),还有一些分类器能学习两者。默认情况下,数据集的最后一个属性是类别属性。如果想训练分类器来预测其他属性,单击Testoptions子面板下面的下拉列表框,选择其他属性作为类别属性。
2、分类器训练设置好分类器、测试选项和分类属性后,单击Start按钮就启动学习过程。在Weka忙于训练分类器的同时,小鸟会站起来左右走动。用户随时可以单击Stop按钮终止训练过程。训练结束后,右侧的分类器输出区域会显示训练和测试结果的文字描述,如下图所示。同时,在Resultlist(结果列表)中会出现一个新条目,后文再谈结果列表,先仔细分析分类器输出的文字描述。
3、分类器输出
拖动Classifieroutput区域右侧的滚动条,可以浏览全部结果文本。在文本区域中按住Alt键和Shift键的同时单击,会弹出一个对话框,可以以各种不同的格式(目前支持BMP、JPEG、PNG和EPS)保存所显示的输出。当然,也可以调整探索者界面的大小,得到更大的显示面积。
输出分为以下几个部分。(1)Runinformation(运行信息):提供处理过程所涉及的信息列表,如学习方案及选项(Scheme)、关系名(Relation)、实例(Instances)、属性(Attributes)和测试模式(Testmode)。(2)Classifiermodel(fulltrainingset)(分类器模型(完整的训练集)):完整训练数据生成的分类模型的文字表述。本例选择J48决策树构建分类模型,因此以文字方式描述决策树。如果选择其他分类器模型,则显示相应的文字表述。
(3)根据所选择的测试模式,显示不同文字。例如,如果选择十折交叉验证,显示Stratifiedcross-validation;如果选择使用训练集,显示Classifiermodel(fulltrainingset),等等。由于评估内容较多,将结果分解显示如下。
4、分类算法介绍
1.线形回归
线性回归(linearregression)是利用数理统计中的回归分析,来确定多个变量之间相互依赖的定量关系的一种统计分析方法,应用十分广泛。具体来说,它利用称为线性回归方程的最小二乘函数对一个或多个自变量(常表示为x)和一个标量型因变量(常表示为y)之间的关系进行建模,这种函数是一个或多个称为回归系数的模型参数的线性组合。只涉及一个自变量的称为简单线性回归,涉及多个自变量的称为多元线性回归。线性回归的主要目标是用于预测。线性回归使用观测数据集的y值和x值来拟合一个预测模型,构建这样一个模型后,如果给出一个新的x值,但没有给出对应的y值,这时就可以用预测模型来预测y值。
2.决策树
决策树(decisiontree)是一种预测模型,它包括决策节点、分支和叶节点三个部分。其中,决策节点代表一个测试,通常代表待分类样本的某个属性,在该属性上的不同测试结果代表一个分支,分支表示某个决策节点的不同取值。每个叶节点存放某个类别标签,表示一种可能的分类结果,括号内的数字表示到达该叶节点的实例数。使用训练集用决策树算法进行训练,经过训练之后,学习方案只需要保存类似于如下图的树形结构,而不像最近邻学习等消极学习算法那样,不保存模型,只有在需要分类时才去查找与测试样本最为相近的训练样本。决策树对未知样本的分类过程是,自决策树根节点开始,自上向下沿某个分支向下搜索,直到到达叶节点,叶节点的类别标签就是该未知样本的类别。
对于下图所示的决策树,假如有一个新的未知样本,属性值如下:
3.基于规则的分类器
4.基于实例的算法
基于决策树的分类框架包括两个步骤:第一步是归纳步,由训练数据构建分类模型;第二步是演绎步,将模型应用于测试样本。前文所述的决策树和基于规则的分类器都是先对训练数据进行学习,得到分类模型,然后对未知数据进行分类,这类方法通常称为积极学习器(eagerlearner)。与之相反的策略是推迟对训练数据的建模,直到需要对未知样本进行分类时才进行建模,采用这种策略的分类器称为消极学习器(lazylearner)。消极学习器的典型代表是最近邻方法,其途径是找出与测试样本相对接近的所有训练样本,这些训练样本称为最近邻(NearestNeighbor,NN),然后使用最近邻的类别标签来确定测试样本的类别。
5.支持向量机
支持向量机(SupportVectorMachine,SVM)分类器是一种有监督学习的方法,广泛地应用于统计分类以及回归分析。SVM的特点是能够同时最小化经验误差与最大化几何边缘。因此,支持向量机也被称为最大边缘分类器。支持向量机技术具有坚实的统计学理论基础,并在实践上有诸多成功示例。SVM可以很好地用于高维数据,避免维数灾难。它有一个独特的特点,就是使用训练实例的一个子集来表示决策边界,该子集称为支持向量,这就是其名称的来历。
6.集成学习
集成学习(ensemblelearning)就是通过聚集多个分类器的预测结果来提高分类准确率。集成方法由训练数据构建一组基分类器(baseclassifier),然后通过每个基分类器的预测的投票来进行分类。一般来说,集成分类器的性能要好于任意的单个分类器,因为集体决策在全面可靠性和准确度上优于个体决策。
5分类模型评估
1.定性评估标准一般来说,分类模型有如下评估标准。(1)预测的准确率:模型正确地预测新的或先前没见过的样本的类别标签能力。(2)速度:产生和使用模型的计算开销。(3)强壮性:对于有噪声或具有缺失值的样本,模型能正确预测的能力。(4)可伸缩性:给定很大的数据集,能有效地构造模型的能力。(5)可解释性:学习模型提供的理解和解释的层次。
预测的准确率常用于比较和评估分类器的性能,它将每个类别看成同等重要,因此可能不适合用来分析不平衡数据集。在不平衡数据集中,稀有类别比多数类别更有意义。也就是说,需要考虑错误决策、错误分类的代价问题。例如,在银行贷款决策中,贷款给违规者的代价远远比由于拒绝贷款给不违规者而造成生意损失的代价大得多;在诊断问题中,将实际没有问题的机器误诊为有问题而产生的代价比因没有诊断出问题而导致机器损坏而产生的代价小得多。
手把手教你使用Weka的分类器(完整)
1、使用C4.5分类器(名称为J48)
本例使用C4.5分类器对天气数据集进行分类。
首先加载天气数据集,操作步骤为:启动探索者窗口,在预处理面板中单击Openfile按钮,选择并打开data目录中的weather.nominal.arff文件,然后,单击Classify标签页切换到Classify面板。
从上面的学习中,我们可以自动,构建决策树的C4.5算法在Weka中是作为一个分类器来实现,名称为J48。单击Classfiy面板上部的Choose按钮,会出现一个对话框,显示不同类型的分类器。单击tress条目以展开其子条目,然后单击J48选择该分类器。与过滤器一样,分类器也按层次进行组织,J48的全名为weka.classifiers.tress.J48。
在Choose按钮旁边的文本框内,可以看到当前分类器及选项:J48-C0.25-M2。这是此分类器默认的参数设置。对于J48分类器,很少需要为获得良好的性能而更改这些参数。
为了便于说明,使用训练数据进行性能评估,训练数据在预处理面板就已经完成加载。使用训练数据进行评估并不是一个好方法,是因为它导致盲目乐观的性能估计。从分类面板中Testoptions(测试选项)部分,选择Usetrainingset(使用训练集)选项,以确定测试策略。做好上述的准备之后,可以单击Start(开始)按钮,启动分类器的构建和评估,使用当前选择的学习算法----J48,通过训练集构建J48分类器模型。然后,使用构建的模型对训练数据的所有实例进行分类以评估性能,并输出性能统计信息,如下图所示。
训练和测试结果会以文本方式显示在窗口右侧的ClassifierOutput(分类器输出)框中。大家可以拖动右边的滚动条以检查这些文字信息。首先看决策树的描述部分,其信息重新摘录如下图所示。
J48prunedtree------------------outlook=sunny|humidity=high:no(3.0)|humidity=normal:yes(2.0)outlook=overcast:yes(4.0)outlook=rainy|windy=TRUE:no(2.0)|windy=FALSE:yes(3.0)NumberofLeaves:5Sizeofthetree:8上述文字表述构建的J48(就是决策树的)剪枝决策树,包括决策支点、分支和叶节点,决策节点用一个测试表示,分支用“|”加上缩进表示,叶节点后面有一个括号,括号内的数字代表到达该叶节点的实例数量。当然,采用文字对模型进行表述十分笨拙且难以理解,因此Weka也能生成等效的图形表示。
按照上述的方法,如果更改数据集或调整选项,每次单击Start按钮,都会构建和评估一个新的分类器模型,在如下图所示窗口的左下角的ResultList(结果列表)面板上就会相应添加一条新条目。
可以按照如下方法得到图形化表示的决策树。右击刚刚被添加到结果列表中的"tree.J48”条目,并在弹出菜单中选择Visualizetree(可视化树)菜单项,会弹出一个如下图所示的决策树窗口。
该决策树视图可以自动缩放和平移,可以通过选择鼠标右击空白处带出的上下文菜单中的菜单项,实现自动缩放;可以通过拖动鼠标实现视图平移。
大家要知道。如下两幅图表示的信息,是一致的。其中,叶节点中用括号引起的数字表示到达该节点的实例数量。另外,决策树的文字描述图还包含两条额外信息:NumberofLeaves(叶子数量)表示叶子节点的数量,Sizeofthetree(树大小)表示树中全部节点的数量。
决策树的文字描述图构建的决策树
矩阵中的每一个元素是实例的计数值。行表示真实类别,列表示预测类别。大家可以看到,全部9个真实类别为yes的实例都己预测为yes,全部5个真实类别为no的实例都己预测为no。只有主对角线上的数值很大,而非主对角线上的数值都为0时,表明预测完全正确。
以上是使用训练集作为J48算法测试策略得到的训练结果,当然,还可以选择使用其他的测试策略。单击Start按钮启动所选学习算法的运行,使用预处理面板中加戟的数据集和所选择的测试策略。例如,如果使用十折交叉验证,需要运行10次学习算法,以构建和评估10个分类器。要注意的是,打印到分类器输出区域的分类器模型是由完整的训练集构建的,这可能是最后一次运行学习算法得到的结果。
现在加载iris数据集,还是使用J48分类器进行学习。首先选择使用Usetrainingset测试选项,再做一个选择使用Cross-validation10折测试选项,分别训练并评估J48分类器,运行结果如下表所示。
先来使用Usetrainingset测试选项,训练并评估J48分类器
再来,使用Cross-validation10折测试选项,来训练并评估J48分类器
从上表的数据可以看到,使用训练集的正确分类所占的比例较高,达到98%。但由于是直接将训练集用于测试,因此结论并不可靠。相反,十折交叉验证将数据集分为10等份,将其中的1份用于测试,另外9份用于训练,如此依次进行10次训练和评估,显然得到的结论要可靠一些。
最后,检查一下分类错误的可视化表示。右击结果列表中的trees.J48条目,然后从上下文菜单中选择Visualizeclassifiererrors(可视化分类错误)菜单项。会弹出一个散点图窗口,正确分类的实例标记为小十字,不正确的分类实例标记为小空心方块,如下图所示。
注意:这里是接着上面的iris.arff文件来的。
横坐标表示真实的类别,纵坐标表示预测的类别。请注意,不要为表而现象迷惑,一个小十字并不一定只代表一个实例,一个小空心方块有时也并不仅仅代表一个错分的实例。如果想看到底有几个实例错分,可以拉动Jitter滑条,会错开一些相互叠加的实例,便于看清楚到底有多少个错分的实例。另一种办法是单击小空心方块,就会弹出如下图所示的实例信息,显示每个实例的各属性值以及预测类别和真实类别。
2、使用分类器预测未知数据
还是使用J48分类器对天气数据集进行训练,得到如下图所示的决策树。
现在构建一个测试数据集,用任意的文本编辑器,编辑如下内容:
将测试数据集保存为weather.nominal.test.arff文件。
然后,在探索者分类面板的Testoptions子面板下,选择Suppliedtestset作为测试策略,单击后面的Set按钮,打开测试实例对话框,如图2.52所示。单击对话框里的Openfile按钮,打开刚才保存的测试数据集weather.nominal.test.arff文件,单击Close按钮关闭对话框。
然后,单击Testoptions子面板下部的Moreoption按钮,打开如下图所示的分类器评估选项对话框,单击对话框中部的Choose按钮,选择PlainText选项,该选项使分类器的输出中包含预测信息,单击0K按钮关闭对话框。
现在,一切准备就绪了。单击start按钮,启动分类器训练和评估过程,像以前一样。探索者在分类器输出区域输出性能统计信息。仔细查看,会返现多了如下一项测试集的预测结果,表明测试集仅有一个实例,预测值和实际值都为yes,预测没有错误。
3、使用决策规则
本示例使用决策规则训练天气数据集,并评估分类器性能。
首先启动探索者界面,在预处理面板中加载weather.nominal.arff数据文件。切换至分类面板,单击Classifier子面板下的Choose按钮,选择rules条目下的JRip分类器,保持默认参数不变,单击Start按钮启动训练,训练结果如下所示。
经过训练,生成的规则一共有如下三条。
JRIPrules:===========(humidity=high)and(outlook=sunny)=>play=no(3.0/0.0)(outlook=rainy)and(windy=TRUE)=>play=no(2.0/0.0)=>play=yes(9.0/0.0)NumberofRules:3每条规则用“=>”分开规则前件和规则后件,规则后件有用括号引起的两个数字,第一个数字表示规则覆盖的实例数量,第二个数字表示错分的实例数量。注意到第三条规则的规则前件为空,表示这条规则覆盖除去前两条规则覆盖的训练实例外的所有实例。
同样也可以可视化分类错误。右击结果列表中的rules.JRip条目,然后从上下文菜单中选择Visualizeclassifiererrors菜单项。会弹出一个散点图窗口,在窗口中拉动Jitter滑条,会错开一些相互叠加的实例,如下图所示。
可视化JRip分类错误散点图
在分类错误散点图中,左上角和右下角的小方块都是正确分类的实例,左下角的小蓝叉和右上角的小红叉都是错分的实例,可视化能直观看到错分实例的数量。
4、使用线性回归本示例使用线性回归训练CPU数据集,并评估分类器性能。首先启动探索者界面,在预处理面板中加载cpu.arff数据文件。如下图所示,在窗口右下角可以看到第一个属性MYCT的直方图,由于类别属性是连续型数值,因此该直方图不是彩色的。
切换至分类面板,单击Classifier子面板下的Choose按钮,选择functions条目下的LinearRegression分类器,保持默认参数不变,单击Start启动训练,训练结果如下所示
===Runinformation===Scheme:weka.classifiers.functions.LinearRegression-S0-R1.0E-8Relation:cpuInstances:209Attributes:7MYCTMMINMMAXCACHCHMINCHMAXclassTestmode:10-foldcross-validation===Classifiermodel(fulltrainingset)===LinearRegressionModelclass=0.0491*MYCT+0.0152*MMIN+0.0056*MMAX+0.6298*CACH+1.4599*CHMAX+-56.075Timetakentobuildmodel:0.06seconds===Cross-validation======Summary===Correlationcoefficient0.9012Meanabsoluteerror41.0886Rootmeansquarederror69.556Relativeabsoluteerror42.6943%Rootrelativesquarederror43.2421%TotalNumberofInstances209从结果中可以看到,LinearRegression分类器构建了一个回归公式,交叉验证显示其性能不佳。
再次单击Choose按钮,选择另一种分类器——M5P,该分类器在trees条目下。还是保持默认参数不变,单击Start按钮启动训练,训练结果如下图所示。
从上图可以看到,M5P是决策树方案和线性回归方案的结合体。前半部分使用剪枝的决策树,后半部分则使用线性回归。如果要稍微深入了解M5P算法的原理,不妨在结果列表中单击蓝色的条目,在弹出的上下文菜单中选择Visualizetree菜单项,Weka弹出如下图所示的决策树的可视化结果。
剪枝模型树使用数据集中六个属性中的三个进行分叉,树根对CHMIN属性分叉,在左分支上得到一个线性模型——LM1,剩余的结构放到右分支上。继续分叉,得到另外的四个线性模型——LM2LM5。一共有五个叶节点,每个叶节点对应一个线性模型。括号中有两个数字,第一个数字是达到该叶子节点的实例数量,第二个百分数是用该叶节点的线性模型对这些实例进行预测的均方根误差,用百分比表示对全部训练数据计算而得到的类别属性的标准偏差。
为了对两个分类器的性能有一个直观的认识,使用可视化方法来观察两个学习方案的误差。在历史列表子面板中分别右击两个条目,选择Visualizeclassifiererrors菜单项,得到两个学习方案的可视化误差如下两个图所示。
LinearRegression误差
M5p误差
显示的数据点随类别属性值的不同而异,由于类别属性是连续数值,因此数据点的颜色也是连续变化的。这里选择MMAX属性作为X轴,CACH属性作为^轴,这样数据点能够尽量散开。每个数据点用一个小叉表示,其大小表示该实例的误差的绝对值。可以看到,图M5p误差的小叉数量多于图LinearRegression误差的小叉数量,说明M5P的性能优于LinearRegression。
本例使用segment数据集来说明操作方式。根据给定平均intensity(亮度)、hue(色调)、size(大小)、position(位置),以及各种简单的纹理特征的属性,将视觉图像数据分割成各种分类标签,如grass(草)、sky(天空)、foliage(树叶)、brick(砖)和cement(水泥)。训练数据文件随Weka软件配附,名称为segment-challenge.arff。加载该数据文件,选择UserClassifier分类器。
评估使用特殊的测试集,名为segment-test.arff。
这里,大家得要去升级下,自己的Weka版本。很简单,暂时没有提供在线升级,直接去官网,下载最新的weka版本。
我这里,以weka3.7.8到3.9.0
(因为,我本地windows7下,已经安装好了jdk1.7了)
下载,请见
我这里,在我自己电脑里,这两款版本我都保留了。大家也可以这样去做。因为,有些资料网上,还现在很大程度上,停留在3.7,当然慢慢会有3.9的资料增加!
大家也许会有个疑问:那么在环境变量那一步,怎么共存两个不同的weka版本呢?
很简单:WEKA37_HOME=D:\SoftWare\Weka-3-7
WEKA39_HOME=D:\SoftWare\Weka-3-9
然后,再把UserClassifier分类器下载好。
为此,我这里是,以weka3.9.0版本为例。
在Classify面板的Testoptions子面板中选择Suppliedtestset(提供测试集)选项。这里要注意,用户分类器不能使用交叉验证进行评估,因为无法为每个折都手动构建分类器。单击Suppliedtestset选项后面的Set按钮,弹出TestInstances(测试实例)窗口,然后单击Openfile按钮,如下图所示在标准的打开文件窗口中选择data目录下的segment-test.arff文件。单击Close按钮关闭测试实例窗口。
===Runinformation===Scheme:weka.classifiers.trees.UserClassifierRelation:segmentInstances:810Attributes:20region-centroid-colregion-centroid-rowregion-pixel-countshort-line-density-5short-line-density-2vedge-meanvegde-sdhedge-meanhedge-sdintensity-meanrawred-meanrawblue-meanrawgreen-meanexred-meanexblue-meanexgreen-meanvalue-meansaturation-meanhue-meanclassTestmode:usersuppliedtestset:sizeunknown(readingincrementally)
窗口分为TreeVisualizer(树可视化工具)和DataVisualizer(数据可视化工具)两个标签页,可以切换不同的视图。前者显示分类树的当前状态,并且每个节点都给出到达该节点的每个类别的实例数目。构建用户分类器的目标就是得到一棵其叶节点都尽可能纯净的树。最初只有一个根节点,其中包含全部数据。切换到DataVisualizer标签页去创建分割,显示了一个二维散点图,可以参考本博文后面的“可视化面板”的使用方法,选择哪个属性作为X轴,哪个属性作为Y轴。这里的目标是要找到一个X轴和Y轴的属性组合,将不同类别尽可能完全进行分离。尝试多遍以后,读者可能会找到一个好的选择:使用region-centroid-row属性作为X轴,使用intensity-mean属性作为Y轴,这样会将红色的实例几乎完全与其他实例分离,如下图所示。
找到了很好的分离点之后,必须在图中指定一个区域。在Jitter滑块之上的下拉菜单,可以选择四种选择工具:
选择SelectInstance(选择实例)选项标识一个特定实例;
选择Rectangle(矩形)选项在图形上拖出一个矩形:
选择Polygon(多边形)选项画一个自由形状的多边形;
选择Polyline(折线)选项画一种自由形状的折线。
操作方式都是:单击添加了一个顶点,右击完成操作。一旦选择某个区域,该区域会变成灰色。在下图中,用户己经定义好了一个矩形。
(这一步其实是本博文后面所要讲到的可视化界面)。
SelectInstance(选择实例)下拉列表框,以及Reset、Clear、Save按钮,让用户修改数据集。可以选择某些实例并删除其他实例。例如,尝试这样使用Rectangle(矩形)选项:首先从下拉框中选中Rectangle选项,然后单击并拖动鼠标来选择一个区域。这时,Reset按钮会自动变成Submit按钮,单击Submit按钮,矩形以外的所有实例都将被删除(注意看如下的图)。用户可以使用Save按钮将修改过的数据集保存到文件中,当然,Open按钮可以打开保存后的数据集文件。单击Redet按钮,可以恢复到原来的数据集。
如果单击Submit(提交)按钮,则在树中创建两个新的节点,一个节点容纳选定的实例,另一个节点容纳其余的实例。Clear(清除)按钮清除选择,Save(保存)按钮将当前树的节点实例保存为一个ARFF文件。
这时,TreeVisualizer标签页显示如下图所示,左边的节点表示为sky类别,纯粹只有一种类别,但右边的节点还是混合了多个分类,需要进一步进行分割。单击不同节点,可以在DataVisualizer标签页中切换显示哪个数据子集。继续添加节点,直到得到满意的结果,也就是说,直到叶子节点大多是只有一种分类的纯洁点为止。然后,在TreeVisualizer标签页的任意空白处右击,并选择AccepttheTree(接受树)菜单项。Weka使用测试集评估建立的树,并输出性能统计信息。对于本例而言,90%已经是很高的得分了。
这是非常考验细心和耐心的工作,如果能得到93以上成绩真值得骄傲。
现在和Weka的机器学习比试一下。还是使用同样的训练集和测试集,但选择J48分类器来替换用户分类器,单击Start按钮启动训练和评估,本例J48分类器的正确率高达96.1728%,的确是手工交互进行分类难以达到的目标。
6、使用支持向量机
本示例分为两个部分,第一部分展示如何使用SMO分类器,第二部分展示如何使用LibSVM。
启动探索者界面,首先在预处理面板中加载iris数据集,然后切换到分类面板,单击Classifier子面板下的Choose按钮,选择functions条目下的SMO分类器,使用默认的十折交叉验证测试选项,单击Start按钮启动分类模型构建并评估,运行结果如下图所示。
这是因为一个超平面分隔每个可能类别值对。此外,由于SVM是线性的,超平面表示为在原来空间中的属性值的函数,如上的函数表达式。
下图所示的是将多项式核函数的指数设置为2的结果,这使得支持向量机成为非线性的。和前面的一样,也有三个二元的SMO模型,但这次超平面表示为支持向量的函数。支持向量显示在尖括号中,还显示其系数α的值。
7、使用元学习器
元学习器能将简单的分类器变为更强大的学习器,这里以实例进行说明。
首先加载鸢尾花数据集,然后选择DecisionStump分类器,这是一个称为决策树桩的简单分类器,全名为weka.classifiers.trees.DecisionStump。
然后选择十折交叉验证为测试选择项进行训练和评估,得到的分类正确率为66.6667%。
接下来,选择AdaboostM1分类器,这是一个使用提升算法的集成学习器,其全名为weka.classifiers.meta.AdaBoostM1。单击该分类器进行设置,出现如下图所示的对象编辑器。为了和DecisionStump分类器进行比较,设置AdaboostM1的基分类器为DecisionStump分类器。如果需要,还可以继续单击以进一步配置基分类器的选项,但由于DecisionStump刚好没有课编辑的属性。因此,单击OK按钮返回到主分类面板,并且单击Start按钮启动训练。
由于上图中的numIterations参数默认为10,也就是训练会迭代提升DecisionStump分类器10次。
在下图中的运行结果表明,在150个iris数据中,只有7个错分的实例,分类正确率高达95.3333%。
考虑到DecisionStump算法本类就十分原始。并且只听过很少次数的提升迭代,性能提高很大,令人满意。
8、深入研究离散化
这里,研究离散化的效果,加载ionosphere.arff数据文件,构建J48决策树。该数据集包括从电离层传回的雷达信号信息。数据集共有34个属性外加1个类别属性,共有351个实例,没有缺失值。
二元类别标签分别是good和bad,其中,“好”的样本指那些能够显示出电离层中的一些结构类型证据的实例,而“坏”的样本指信号直接穿过电离层的实例。更为详细的信息可以查看ARFF文件中的注释。
首先以无监督离散化开始,采用十折交叉验证,比较不同学习方案的正确率以及决策树的大小。采用J48分类器对原始数据进行分类,正确分类的实例数量为321,正确率为91.453%,叶节点数为18,树的大小为35;然后使用无监督的Discretize过滤器,保持过滤器参数为默认值,先进行过滤,再采用j48分类器对过滤后的数据进行分类,正确分类的实例数最为304,正确率为86.6097%,叶节点数为46,树的大小为51;最后将无监督Discretize过滤器的makeBinary参数设置为True,其余参数仍为缺省值,先进行过滤,再采用J48分类器对过滤后的数据进行分类,正确分类的实例数量为326,正确率为92.8775%,叶节点数为9,树的大小为17。无监督离散化的效果如下表所示。
研究上表的结果,可以得出这样的结论:使用二元化的无监督离散化,可以提高分类器的正确率,并大幅减少决策树的大小。
现在轮到有监督离散化。这里出现一个微妙的问题,如果简单地重复使用有监督离散化方法替换无监督离散化,结果必然过于乐观。因为这里将交叉验证用于评价,测试集里的数据在确定离散间隔时己经使用过,必然造成如同预先偷看到答案再考试的效果。对于新的数据,这就无法给出一个合理的性能评估。要合理地评估有监督离散化,最好使用Weka的元学习器FilteredClassifier。它仅使用训练数据来构建过滤器,然后,使用训练数据计算得到的离散间隔来离散化册数数据,并予以评估。总之,这种方式完全符合在真实实战中处理新数据的过程。
仍然使用ionsphere.arff数据文件,取消在过滤器标签页中选择的过滤器,并在分类器标签页中选择FilteredClassifier分类器,其全名为weka.classifiers.meta.FilterdClassifier。设置该分类器的classifier为J48。filter为有监督的Discretize,保持默认参数不变,如下图所示。
这时,单击Start按钮启动训练及评估,得到输出结果:正确分类的实例数量为320,正确率为91.1681%,叶节点数为21,数的大小为27。然后,修改FilterClassifier分类器的filter参数,将有监督Discretize的makeBinary参数设置为True,其余参数仍为缺省值,输入框中的命令行应该是Doscretize-D-Rfirst-last。再次单击Start按钮,得到输出结果值:正确分类的实例数量为325,正确率为92.5926%,叶子节点数为9,数的大小为17。有监督离散化的效果如下所示。
仍然可以得出这样的结论:使用二元化的有监督离散化,可以提高分类器的正确率,并大幅度减少决策树的大小。
9、初识最近邻分类器本节使用IBk分类器,这是一种k-最近邻分类器,既可以在交叉验证的基础上选择合适的k值,也可以加距离权重。在探索者界面中加载glass.arff数据集,切换至Classify面板,单击Choose按钮选择IBk分类器,其全名为weka.classifiers.lazy.IBk。
使用交叉验证测试该分类器的性能,使用交叉验证,保持折数为默认值10。IBk的选项都保持为默认值,这里要注意的参数是KNN,KNN值默认为1,这是分类时所用的近邻实例的数量。
单击Start按钮运行一次分类算法,记录正确分类的百分比,其值为70%.5607%。
然后,修改KNN值为5,再次运行分类算法,记录正确分类的百分比,其值为67.757%,如下图所示。
可见,将KNN值由1增大至5后,IBK准确度稍微有所下降。从这个实例中,大家可能会凭着直觉得出KNN值越小越好的结论,事实会是这样的吗且看后文。
10、分类噪声与最近邻学习和其他技术一样,最近邻学习对训练数据中的噪声很敏感。在本节中,将大小不等的分类噪声注入数据中,并观察其对分类器性能的影响。本节使用一种称为AddNoise的无监督的属性过滤器来添加噪声,该属性过滤器位于weka.filters.unsupervised.attribute包中,使用该过滤器,可以将数据中一定比例的类别标签翻转为随机选择的其他值。然而,对于本次实验,最重要的是要保证测试数据不受分类噪声的影响,这样才能得到可靠的评估结果。很多实际情况都要求过滤训练数据,但不能过滤测试数据,满足这种要求的元学习器称为niteredClassifier,位于weka.classifiers.meta包中。本例将该元学习器配置为使用IBK作为分类器,使用AddNoise作为过滤器。在运行学习算法之前,FilteredClassifier先对数据应用过滤器过滤,分两批完成:先训练数据,后测试数据。AddNoise过滤器只在遇到的首批数据中添加噪声,也就是说,随后的测试数据在通过时不受任何影响。
还是使用玻璃数据集,在Classify面板中选择FilteredClassifier分类器。
然后打开通用对象编辑器编辑该分类器的参数,选择classifier为IBk,filter参数为AddNoise,如图下图所示。
修改IBk分类器的邻居数量KNN参数,分别设置为k=1,k=3,k=5。同时修改AddNoise过滤器的分类噪声百分比percent参数,从0%、10%—直到100%。每次设置完毕后,单击Start按钮启动训练和评估,将得到的分类正确率填入下表中。
在上图的折线图中,横坐标为噪声,纵坐标为分类准确率。对折线图进行分析,容易得到如下结论:第一,当噪声增大时,分类准确率随之下降;第二,改变k值,对分类正确率的影响较为复杂。当分类噪声百分比较小(低于60%)时,增大k值会增加分类准确率:但分类噪声百分比较大(约高于60%)时,增大k值会降低分类准确率。
11、研究改变训练集大小的影响本节讨论学习曲线,显示训练数据量逐渐増加后的效果。同样使用玻璃数据集,但这—次使用IBk以及在Weka中的实现为J48的C4.5决策树学习器。获取学习曲线,再次使用FilteredClassifier分类器,这一次结合Resample(其全称为weka.filters.unsupervised.instance.Resampie)过滤器,其功能是抽取出给定的一定比例的数据集,返回减少后的数据集。与上一个示例相同,只为第一批训练数据应用过滤器,所以测试数据通过FilteredClassifier分类器到达分类器之前,并不会受任何修改。
具体步骤是,首先加载玻璃数据集,然后选择FilteredClassifier分类器。
打开通用对象编辑器编辑该分类器的参数,分别选择classifier为IBk和J48,filter参数为Resample,如下图所示。
选择classifier为IBK(k=1)或J48。同时修改Resample过滤器的子样本大小百分比sampleSizePercent参数,从10%—直到100%。
..省略
...省略
每次设置完毕后,单击Start按钮启动训练和评估,将得到的分类正确率如下表中。
4、聚类
聚类是对物理对象或抽象对象的集合进行分组的过程,所生成的组