第3章数据分析入门 Weka是一款免费的、基于Java环境下的开源的机器学习(Machine Learning)以及数据挖掘 (Data Mining)软件。Weka是怀卡托智能分析环境(Waikato environment for knowledge analysis)的英文字首缩写。有趣的是,该缩写Weka也是新西兰独有的一种鸟名,而Weka的主要开发者恰好来自新西兰的怀卡托大学(the University of Waikato)。 3.1Weka简介与数据预处理 3.1.1软件下载 Weka软件的官方网址是https://www.cs.waikato.ac.nz/ml/weka/,网站首页如图3.1 所示。 图3.1Weka网站首页 Weka是集数据预处理、学习算法和评估方法等为一体的综合性数据挖掘工具,学习算法包括分类、回归、聚类、关联分析等。Weka经历了二十多年的发展,功能已经十分强大和成熟,代表了当今数据挖掘和机器学习领域的最高水平。 单击网站首页上的Download and install按钮,进入https://waikato.github.io/wekawiki/downloading_weka/页面,如图3.2 所示。选择Stable version(稳定版本)的Windows安装文件下载。如果用户使用的是其他操作系统,例如苹果的Mac OS或者开源的Linux,则应选择对应的Weka版本。 图3.2Windows操作系统的Stable版本下载 本书以Windows系统下安装Weka为例。建议安装本书编写时使用的 “稳定版本(Stable version)3.8.4 ”。如果使用的Windows系统未安装过Java,则须下载自带Java VM的Weka版本,即安装文件名中带有jre字样的版本。安装结束后,启动Weka,出现程序主界面,则表示安装成功,如图3.3 所示。 0 0 图3.3Weka主界面 3.1.2文件与数据格式 Weka用ARFF(AttributeRelation File Format)文件格式存储数据,这是一种ASCII文本文件。下载的Weka安装文件自带了多个示例用数据文件,其默认安装路径在“C:\Program Files\Weka384\data”目录中,如图3.4 所示。 图3.4Weka自带数据文件 下面以Weka自带的weather.numeric.arff数据文件为例,简单说明ARFF文件的格式和结构。如果直接双击该文件,Windows会自动调用已经安装好的Weka软件的Explorer工具打开数据文件,如图3.5 所示。 图3.5Explorer自动打开ARFF数据文件 单击图3.5 右上方的Edit按钮,则会看到数据的具体结构和值,如图3.6 所示。 图3.6浏览numeric数据 表格里的每个横行称作实例(instance),相当于统计学中的一个样本,或者数据库中的一条记录。每个竖行称作属性 (attribute),相当于统计学中的一个变量,或者数据库中的一个字段。在Weka看来,这样的一个表格或者数据集,呈现了属性之间的一种关系(relation)。图3.6 中一共有14个实例,5个属性,关系名称为weather。 如果直接使用文本编辑软件(例如,Windows自带的“记事本”程序)打开ARFF数据文件,可以看到其内容如图3.7 所示。 图3.7ARFF文件以纯文本方式打开 ARFF文件用分行来表示不同的数据域,因此不能在这种文件里随意断行。以“%”开始的行是注释,Weka将忽略这些行。除去注释后,整个ARFF文件可以分为两个部分。第1部分给出了头信息(head information),包括了对关系的声明和对属性的声明。 (1) 关系声明。关系声明在ARFF文件的第1个有效行, 关系声明的格式为@relation 是一个字符串。如果这个字符串包含空格,则必须加上引号(指英文标点的单引号或双引号)。 (2) 属性声明。属性声明用一列以@attribute开头的语句表示。属性声明的格式为@attribute 。其中,是必须以字母开头的字符串。和关系名称一样,如果这个字符串包含空格,必须加上引号。数据集中的每一个属性都有它对应的@attribute语句,来定义它的属性名称和数据类型。这些声明语句的顺序很重要。首先,它表明了该项属性在数据部分的位置。例如,humidity是第3个被声明的属性,这说明数据部分那些被逗号分开的列中,第3列数据 85 90 86 96 ... 是相应的humidity值。其次,最后一个声明的属性被称作class属性,在分类或回归任务中,它是默认的目标变量。 第2部分给出了数据信息(data information),即数据集中给出的数据。从@data标记开始,后面的就是数据信息了。Weka支持的有以下4种:  numeric数值型,包括整数(integer)或者实数(real);  nominalspecification标称型,只能取预定义值列表中的一个,常用于分类标识;  string字符串型;  date日期和时间型。 当然,对于大多数普通用户来说,直接使用图3.6 的Weka自带数据浏览编辑工具就可以满足需求了。 在图3.6 所示的数据集中,第2个属性temperature(温度)和第3个属性 humidity(湿度)是数值型。第1个属性outlook(天气状况)是标称型,可选的值是sunny (晴天)、overcast(阴天)、rainy(下雨)。第4个属性windy(刮风)是标称型,可选的值是TRUE、FALSE。第5个属性play (运动)是标称型,可选的值是yes、no。 图3.8weather.nominal.arff文件数据 Weka自带了另外一个weather.nominal.arff数据文件,打开以后如图3.8 所示。与图3.6 相比,主要区别在于后者都是标称型数据,前者包含标称型和数值型两种数据。 在Excel和Weka之间交换数据,可以借助csv格式的文件,步骤如下。 (1) 将Excel文件另存为csv文件。使用Excel打开xls或者xlsx文件,将其另存为csv格式,如图3.9所示。 (2) 将csv文件在ArffViewer中另存为arff文件: 打开Weka 主界面,单击“工具”菜单,打开ArffViewer工具,打开刚刚生成的csv文件,文件类型选择csv,另存为同名文件,文件类型选择Arff data files格式,如图3.10 所示。 图3.9将Excel文件另存为csv文件 图3.10借助ARFFViewer将csv文件导出为arff文件 3.1.3Weka程序界面 本小节介绍Weka程序界面。Weka主界面菜单包含以下 4 部分。 (1) Program(程序)菜单,如图3.11 所示。 图3.11Weka Program(程序)菜单 Program(程序)菜单包含以下子菜单命令。  LogWindow(日志窗口)。打开一个日志窗口,捕获所有的stdout或者stderr输出。  Memory usage(内存使用)。显示 Weka 内存使用情况,同时执行Java垃圾回收。  Settings(设置)。设置图形界面的风格和网络超时时间。  Exit(退出)。退出 GUI 选择器。 (2) Visualization(可视化)菜单,如图3.12 所示。 图3.12Weka Visualization(可视化)菜单 Visualization(可视化)菜单包含以下子菜单命令。  Plot(散点图)。绘制数据集的 2D 散点图。  ROC(受试者工作特征曲线)。显示ROC 曲线。  TreeVisualizer(树结构可视化)。显示有向图,例如决策树等。  GraphVisualizer(图结构可视化)。显示 XML、BIF 或 DOT 格式的图,如贝叶斯网络。  BoundaryVisualizer(边界可视化)。显示二维空间中分类器决策边界的可视化。 (3) Tools(工具)菜单,如图3.13 所示。 图3.13Weka Tools(工具)菜单 Tools(工具)菜单包含以下子菜单命令。  Package manager(包管理器)。Weka 包管理系统的图形接口。  ArffViewer(ARFF文件查看器)。以电子表格形式查看 ARFF 文件的 MDI 应用。  SqlViewer(SQL查看器)。一个 SQL 工作表单,通过JDBC查询数据库。  Bayes net editor(贝叶斯网络编辑器)。一个用于编辑、可视化和学习贝叶斯网络的应用。 (4) Help(帮助)菜单,如图3.14所示。 图3.14Weka Help(帮助)菜单 Help(帮助)菜单包含以下子菜单命令。  Weka Homepage(Weka主页)。在浏览器中打开 Weka 主页。  HOWTOs,code snippets,etc.(WekaWiki)。包含许多关于 Weka 开发和使用的示例和指南。  Weka on Sourceforge(Sourceforge.net上的Weka项目)。Weka项目在Sourceforge.net上的主页。  SystemInfo(系统信息)。显示关于 Java/Weka 环境的内部信息,例如,CLASSPATH。 Weka程序主页面窗口右侧共有5个按钮,如图3.15(a)所示。 图3.15Explorer(探索者)界面  Explorer是用来进行数据实验、挖掘的环境,它提供了分类、聚类、关联规则、特征选择以及数据可视化的功能。  Experimenter是用来进行实验、对不同学习方案进行数据测试的环境。  KnowledgeFlow功能和Explorer差不多,不过提供的接口不同,用户可以使用拖曳的方式去建立实验方案。另外,它支持增量学习。  Workbench工作台界面包含了其他界面的组合。  Simple CLI是简单的命令行界面。 Explorer(探索者)界面是Weka主要图形用户界面(GUI),其全部功能都可以通过菜单选择或表单填写进行访问。后续操作以Expl orer界面为主。单击Explorer按钮后,弹出如图3.15 (b)所示界面。 3.1.4数据预处理 大数据处理一直遵循着一个理念,即高质量的数据才能产生高质量的数据挖掘结果。也就是高质量的输入才会得到高质量的输出。为了使输入的数据有比较好的质量,就必须预先对输入数据进行一些处理。数据挖掘前检测并纠正一些数据质量问题,称为数据预处理。下面以Weka自带的“C:\Program Files\Weka384\data\weather.numeric.arff”文件为例,介绍对数据集进行属性删除、添加、赋值、离散化等操作的步骤。操作前请做好该文件的备份,以免原始数据被修改,影响后续操作。 1. 属性删除 属性删除可以直接在Preprocess标签页中进行。例如要将湿度(humidity)和刮风(windy)两个属性删除,则直接在左下方的Attributes区域选中humidity和windy两项前面的复选框,再单击Remove删除按钮即可。 [注意]删除之后一定要选择Save→Save as命令将其另存为其他文件,否则会覆盖原来文件,如图3.16 所示。 图3.16删除属性 2. 属性添加 假设要添加一个新属性“心情(mood)”,可选的值为“好(good)”或者“不好(bad)”。这时候需要使用AddUserFields过滤器来完成操作。Weka中数据预处理工具称作Filters过滤器。顾名思义,过滤器是对输入数据集进行某种程度的过滤(转换)操作。Weka过滤器分为无监督过滤器和有监督过滤器两种类型,每种类型又细分为属性过滤器和实例过滤器。有监督过滤器需要预先经过训练; 无监督过滤器则无须预先训练。新属性“心情(mood)” 添加步骤如下。 (1) 在Explorer对话框的Preprocess标签页中,可以找到Filter的下拉菜单,如图3.17 所示。 (2) 单击Choose按钮, 选择filters→unsupervised→attribute→AddUserFields过滤器,如图3.18 所示。 (3) 单击Filter下方文本框中出现的AddUserFields字符串,会出现一个新的weka.filters.unsupervised.attribute.AddUserFields对话框。单击New按钮,在Attribute name中输入“mood”, Attribute type下拉列表中选择nominal标称类型,如图3.19 所示。 (4) 选好后,单击OK按钮。返回到Preprocess标签页中,单击Apply按钮,完成属性添加。添加了属性的数据如图3.20 所示。 3. 属性赋值 “mood”属性是nominal标称型数据,还需设置允许的取值: “好(good)”或者“不好(bad)”,步骤如下。 (1) 保持图3.20 中“mood”属性的选中状态,单击Choose按钮,找到AddValues过滤器,如图3.21 所示。 图3.17Filter下拉菜单 图3.18选择AddUserFields过滤器 图3.19添加“mood”属性 图3.20添加好的“mood”属性 图3.21选择AddValues过滤器 (2) 单击Filter下方的文本框,会出现一个新的weka.filters.unsupervised.attribute.AddValues对话框。在labels标签框中输入“good,bad”,单击OK按钮,如图3.22 所示。 图3.22添加“mood”属性可能的取值 (3) 返回到Preprocess标签页中,单击Apply按钮。这样,该属性取值添加完成,如图3.23 中部右侧的Selected attribute所示。 图3.23“mood”属性取值范围 (4) “mood”属性已经添加了,下面给每个实例的该属性设置具体的属性值。在图3.23 所示的Preprocess标签页中,单击Edit编辑按钮。在Viewer界面,设置第1个实例的“心情(mood)”属性值为“好(good)”,设置第2个实例的“心情(mood)”属性值为“不好(bad)”,其他实例执行类似的操作,如图3.24 所示。 4. 属性离散化 所谓属性离散化是将数值型属性转换为标称型属性。为什么需要离散化呢?主要是因为某些数据挖掘算法只能处理标称型属性,如关联分析等。离散化分为无监督离散化和有监督离散化。无监督离散化提供等宽和等频两种方法。等宽是指让间隔区间相等,等频是使一个区间内实例的数量相等。继续以weather.numeric.arff文 图3.24逐个设置“mood”属性值 件为例演示一个无监督、等宽离散化的操作。该文件中的 temperature温度属性是数值型数据,现在需要将它们离散(转换)成低温(cool)、中温(mild)、高温(hot)3个等级,步骤如下。 (1) 单击Choose按钮,选择filters→unsupervised→attribute→Discretize (离散化)过滤器,如图3.25 所示。 图3.25选择Discretize过滤器 (2) 单击Filter下方的文本框,会出现weka.filters.unsupervised.attribute.Discretize对话框,在这个对话框中,有两个关键参数: 一个是 attributeIndices(属性编号),指明需要进行离散化的属性是哪一列,因为temperature属性在第2列,则在属性编号attributeIndices文本框中输入编号2。另一个关键参数是 bins(箱数),指离散为多少个等级,由于需要离散成低温(cool)、中温(mild)、高温(hot)3个等级,因此在箱数文本框输入3。其他保持不变,单击OK按钮,如图3.26 所示。 图3.26离散化参数设置 (3) 返回到Preprocess标签页中,单击Apply按钮。在Attributes中,选中temperature(温度)属性,观察右侧Selected attribute区域,可以发现,原来的temperature被分为3个范围,如图3.27 右侧中部所示。 图3.27离散化后的temperature属性 (4) 如果觉得离散后的值可读性比较差,可以先将修改后的数据文件另存为其他文件,再使用Word打开该文件,用“替换”功能将图3.27 中部右侧“Label”列下的3个值分别替换成低温(cool)、中温(mild)、高温(hot)。再用Viewer查看最后离散后的结果,此时已改为低温(cool)、中温(mild)、高温(hot)3个等级了。 借助Weka的数据预处理功能,可以完成属性删除、添加、赋值、离散化等操作,数据预处理将为后续的数据挖掘算法实施奠定基础。 3.2数据分类 分类(classify)是通过分类函数或分类模型(分类器),将未知类别实例划分到某个给定的类别,在第1章中,形象地称之为“贴标签”。即有一个由多个属性字段描绘的实例(也就是某个数据对象),分类算法通过预先制定好的规则,或者是通过前期的算法训练得到的一个数学模型,给这个实例贴上一个分类标签。分类在现实生活中有着广泛的应用。例如,通过前期的数据搜集,医院开发一套心血管疾病风险的预测系统。预测系统可以根据就诊者的身体指标、生活习惯、家族病史等一系列属性,对其罹患心血管疾病的可能性做分类预测,评估其为高风险、中风险或者低风险。再例如,在金融机构的风险控制领域,需要对客户是高风险、中风险、低风险进行分类,以便对不同类别的客户采用不同的策略。 从分类的定义可以看出,分类是预测离散的值,主要预测未知类别实例所属类别。和分类类似的还有回归(regression) 分析。回归分析也是通过已有的数据发现规律,从而预测未知属性的数值。分类和回归都是预测技术,但分类预测离散的值,回归预测连续的值。更直观的区别是,分类得到的结果是具体的类别,而回归得到的结果是具体的数值。 分类以及后续讲到的聚集等数据挖掘的方法,都是属于机器学习的范畴。为更好理解这些技术,在介绍具体的算法操作之前,先对机器学习的类型做一个分类: 有监督学习(supervised learning)、无监督学习(unsupervised learning)、半监督学习(semisupervised learning)。 (1) 有监督学习通过对已有样本分析建立模型。所谓已有样本,是指已知数据和输出。通俗地讲,就是算法“学习”的时候,有一个“监督者”事先提供了分好类的好样本和坏样本。算法目的在于找出这些样本的属性数据与“好或坏”标签之间的关系。 (2) 无监督学习直接对实例建立模型。这种“学习”方式,不存在一个可以提供分类结果的“监督者”,需要算法自己判断实例之间的关系。 (3) 半监督学习是介于有监督学习与无监督学习之间的一种类型。 显然,分类属于有监督学习的范畴,而3.3节介绍的聚类,则属于无监督学习。分类是利用已知的观测数据构建一个分类模型,常常称为分类器,用来预测未知类别实例所属类型。使用Weka进行分类分如下两个步骤。 (1) 通过分析已知类别数据集选择合适的分类器进行训练。 (2) 使用分类器对未知类别实例进行分类。 有可能需要根据分类的情况,返回到步骤(1),重新选择另外的分类器。Weka把分类和回归都放在 Weka Explorer的Classify标签页中。下面介绍三个典型的分类器: J48决策树、LinearRegression、M5P。 3.2.1J48决策树分类器 决策树是描述对实例进行分类的树形结构,由决策节点、叶节点和分支组成。决策节点表示一个属性,叶节点表示一个类别,分支表示某个决策节点的不同取值。现实生活中其实存在很多可以使用树形结构来做决策的例子,例如女孩找对象。 图3.28“见面”决策树 首先在女孩的心目中预先构建了一颗决策树,树中有年龄、长相、收入和公务员4个决策节点,代表男孩的4个属性。还有两个类别“见面”和“不见面”,这是叶子节点的取值范围。女孩依据男孩的具体情况,将男孩划分到“见面”还是“不见面”的类别。比方说母亲口中的男孩26岁、长相挺帅的、收入中等、公务员职业,依据女孩心中的决策树,这个男孩划分到“见面”的类别,如图3.28所示。 下面以天气数据集为例来介绍J48决策树分类器的使用。首先在Preprocess标签页中,单击Open file按钮打开“C:\Program Files\Weka384\data\ weather.nominal.arff”文件。切换到Classify标签页,单击Choose按钮,打开分类器分层列表。单击trees目录以展开子目录,然后找到J48目录并选择该分类器,如图3.29所示。 图3.29选择J48决策树分类器 回到Classify标签页,在左侧的Test options(测试选项组)中,选中Use training set(使用训练集),即使用训练数据集作为测试数据集。单击Start按钮,训练和测试结果会以文本方式显示在右侧的Classifier Output分类器输出区域中,如图3.30所示。 图3.30J48分类器分类结果文本显示 这是生成的用文本描述的决策树,可读性比较差。再来看可视化的决策树。在Result list(结果列表)中,右击对应的trees.J48条目,并在弹出的快捷菜单中选择Visualize tree(可视化树)菜单项,如图3.31 所示。 图3.31设置决策树可视化 图3.32是生成的可视化决策树,这个决策树就非常直观了。以该决策树最左侧的一支为例,决策路径是: 先考察outlook属性的取值,如果该值是sunny,则考察humidity属性的值,如果是high,那么决策结果是no; 如果是normal,那么决策结果是yes。该决策树视图可以自动缩放和平移。 图3.32J48分类器可视化决策树 在图3.30 右侧的Classifier output中,算法运行总结Summary的Correctly Classified Instance的结果是100%,表示这个分类器对所有的结果都判断正确了。在真实世界里,当然不会存在一个能100%正确的预测算法。这里之所以出现这种情况,是因为用来训练分类器的数据和后来用分类器来预测的数据是相同的,所以出现了完全一致的情况。 现实中的业务一般会事先准备好一批带有分类标签的训练数据,将其分拆为两部分: 一部分是保留分类结果的训练集数据,输入算法进行训练,得到训练好的算法模型; 另一部分是去除了分类结果的测试集数据,用训练好的模型对测试集数据进行分类预测。然后比较测试集算法预测结果和原分类结果的误差,以此作为算法的评价标准。通过了评价的算法,就可以用于真实业务数据的分类了,如图3.33 所示。 图3.33分类业务的一般流程 用于算法评估的方法有很多,混淆矩阵是其中比较简单直观的一个。图3.34 是图3.30 右下侧显示本例的混淆矩阵。大多数资料中的标准混淆矩阵见表3.1 。其中行表示真实分类结果,列表示预测分类,数字表示个数。本例中,全部9个真实类别为yes的实例都预测为yes,全部5个真实类别为no的实例都预测为no。主对角线(左上到右下)上的数值很大,非主对角线上的数值为0,表示预测完全正确。 图3.34Weka输出的混淆矩阵 表3.1常见标准混淆矩阵 真 实 分 类 预 测 分 类 YesNo Yes90 No05 可以使用得到的决策树来进行预测。假设已知某天的天气状况是下雨(outlook=rainy),温度是低温(temperature=cool),湿度是高(humidity =high),不刮风(windy=FALSE)。根据上面这个决策树,这天能出去运动吗?按照图3.32 决策树的决策路径,分类结果是yes,那么这天是可以出去运动的。 这个实例也可以让Weka来自动进行分类。首先用记事本将已知天气指标构建一个.arff文件。头信息跟天气数据集完全一样; 数据信息就是已知各个属性的值,play值未知,设定为yes。保存到素材文件夹,文件名为test.arff,如图3.35所示。 图3.35生成test.arff文件 准备好这个文件后,可以用Weka中已经生成的决策树来分类了。选择Supplied test set (提供测试集)命令,选择test.arff文件,如图3.36 所示。 单击More option(更多选项)按钮,在弹出的对话框中,单击Output Prediction右侧的Choose按钮,选择Plain Text,这样可以更好地观察预测结果。准备好后,单击Start按钮,右边的框显示分类结果,输出 的测试结果如图3.37所示。重点来看Predictions on test set这一部分: 第1列inst#为实例编号; 第2列actual为真实类别,是 在test.arff文件中填写的类别yes; 第3列为J48分类器利用之前训练出来的模型预测出来的类别,为yes,跟刚才手工按照决策树路径进行判断的结果一致; 第4列为预测结果置信度,为1,如图3.37 所示。 使用训练数据集作为测试数据集来判断分类器的性能不太可信,因为这个分类器本身就是由训练数据集的数据产生的。一般会 认为把这个分类器用在新数据(非训练数据)上的效果更有说服力。这里介绍另外一种测试方法: 十折交叉验证 (10fold crossvalidation)。十折交叉验证用来测试算法的准确性。它的基本过程是: 将数据集随机分成10份,轮流将其中9 图3.36载入test.arff文件 图3.37测试结果 份合成一个训练数据,1份作为测试数据进行试验。这将进行10次试验。10次试验得出10个正确率(或差错率)。那么,就将10次正确率的平均值作为对算法精度的估计。十折交叉验证使得训练数据集与测试数据集不同。 下面以2.1节中介绍过的鸢尾花(iris)数据集为例说明十折交叉验证的操作。鸢尾花数据集包含150个实例,每个类别有50个实例。定义了五个属性,分别是花萼长(sepal.length),花萼宽(sepal.width),花瓣长(petal.length),花瓣宽(petal.width),最后一个属性的字符串表示类别。进入Explorer界面,打开鸢尾花(iris)数据集,选择使用J48分类器。勾选十折交叉验证(10fold crossvalidation)。正确分类的测试实例数是144个,占比96%。在右下侧的混淆矩阵中可以看到,有1个a被错误地分类到b,有3个b被错误地分类到了c,有2个c被错误地分类到了b,如图3.38 所示。 图3.38十折交叉验证 3.2.2LinearRegression分类器 本小节以CPU数据集为例介绍使用LinearRegression分类器构建线性回归公式。CPU数据集呈现了CPU几个相关属性与其处理能力的关联,属性与类别都为数值型。CPU数据集包含209个实例。定义了七个属性,分别是周期时间(MYCT),内存最小值(MMIN),内存最大值(MMAX),高速缓存(CACH),最小通道数(CHMIN),最大通道数(CHMAX),class属性体现CPU性能的类别属性。 进入Weka Explorer界面,打开CPU数据集。切换到Classify标签页,单击Choose按钮,选择functions条目下的LinearRegression分类器,如图3.39 所示。选择Crossvalidation Folds,保持默认值10,单击Start按钮。 图3.40 中,右边输出结果的中间部分Linear Regression Model是线性回归函数,其结果为class=0.0491×MYCT+0.0152×MMIN+ 0.0056×MMAX+0.6298×CACH+ 图3.39选择LinearRegression分类器 图3.40LinearRegression线性回归结果 1.4599×CHMAX+(-56.075)。这说明class分类结果可以用这样一个线性方程表示,这也是Linear Regression名字的来源。 在Result list结果列表中,右击functions LinearRegression,在弹出菜单中选择Visualize classifier errors (可视化分类误差)命令,弹出一张误差可视化图,直观显示误差状况,如图3.41和图3.42所示。 图3.41设置可视化分类误差 图3.42LinearRegression可视化分类误差 这个线性回归函数中,分类class是线性函数的因变量,其他属性是自变量。平均绝对误差MAE 41.0886以及其他的性能指标值都表明,这个分类器在这个数据集上的性能无法满足需求。在数据挖掘的应用中,经常会碰到这种选用某种算法效果不好的情况,有可能需要更换算法,或者调整参数。例如,如果选择下面介绍的M5P分类器,就会明显改善分类效果。 3.2.3M5P分类器 M5P是决策树方案和线性回归方案的结合体。先构建决策树,后使用线性回归。 进入Weka Explorer界面,打开CPU数据集。切换到Classify标签页,单击Choose按钮,选择trees条目下的M5P分类器,如图3.43所示。选择Crossvalidation Folds,单击Start按钮。 图3.43选择M5P分类器 在图3.44 右侧的结果输出中,包括5个线性回归方程,LM1~LM5。M5P的平均绝对误差(MAE)是29.8309。 在Result list结果列表中,右击trees.M5P条目,在弹出的菜单中选择Visualize tree(可视化树)命令菜单项,弹出决策树的可视化结果,如图3.45 所示。 通过决策树,可以看到数据集中6个属性中有4个进行了分叉,一共产生5个叶节点,分支的每个叶节点对应一个线性回归方程。这意味着利用M5P分类器产生的线性模型不同的情况对应着不同的线性回归方程。叶节点括号中第1个数字代表到达该叶节点的实例个数,第2个数字代表使用对应线性模型的预测均方根误差。M5P算法的可视化误差如图3.46所示。 简单比较LinearRegression和M5P两种分类器的性能。LinearRegression和M5P的平均绝对误差(MAE)分别为41.0886和29.8309, M5P性能优于LinearRegression。图3.42 图3.44M5P分类器分类结果 图3.45M5P分类器可视化分类结果 图3.46M5P可视化分类误差 和图3.46 分别是LinearRegression和M5P的可视化误差(visualize classify errors )结果。可视化误差图中,一个叉号代表存在一个误差,叉号大小代表误差的绝对值。LinearRegression的叉号多于M5P,因此,M5P性能优于LinearRegression。所以,在对CPU数据集进行分类预测的业务中,应该选择M5P分类器,而不使用LinearRegression分类器。 3.3数据聚类 本节介绍数据聚类,主要内容分为两部分。第1部分概述数据聚类,简单介绍聚类的定义、聚类与分类的区别; 第2部分介绍主要的聚类器及其操作,主要包括3个聚类器: SimpleKMeans、EM、DBSCAN。 什么是聚类呢?聚类是将数据集中相似的实例聚集在一起,而将不相似的实例划分到不同类别。在第1章中,形象地称之为“找朋友”。有一个由多个属性字段描绘的实例(也就是某个数据对象),聚类算法通过前期的算法训练得到的一个数学模型,将这些实例簇集成若干组,就像是俗话说的: “物以类聚,人以群分”一样。聚类对数据集进行分组,所生产的组称为簇(cluster)。簇内任意两个实例之间应该具有较高的相似度,而隶属于不同簇的两个实例之间应该具有较高的相异度。 聚类与分类是有区别的,其区别主要有以下两点。 (1) 分类是将数据集中的实例归结到某个已知的类别中,而聚类是将数据集中的实例聚集到某个预先不知的类别中。在聚类中,用户其实不太关心具体的类别是什么,而更关心的是哪些实例具有比较高的相似性,也就是属于一类。 (2) 分类是有监督学习,而聚类是无监督学习。 那么实例和实例之间如何度量相似度?最简单的方式是通过距离的远近来度量。假设将具有n个属性的实例当成是n维空间中的一个点的坐标,两个实例在这样一个n维空间中的距离就是它们的相似性强弱的度量值。 使用Weka进行聚类分两步。第1步是通过分析已知类别数据集,选择合适的聚类器进行训练; 第2步是使用聚类器对新实例进行聚类。有可能需要根据聚类的效果,返回到第1步,重新选择另外的聚类器。现实中聚类有广泛应用,例如在商务上,聚类能帮助市场分析人员从客户信息库中发现不同的客户群体,从而针对不同的客户群体,制定不同的销售方案。 Weka使用聚类器这个概念,它的任务是把所有的实例分配到若干簇,使得同一个簇的实例聚集在一个簇中心的周围,它们之间的距离比较近; 而不同簇实例之间的距离比较远。本节介绍3个经典的聚类器,包括SimpleKMeans、EM和DBSCAN。 3.3.1SimpleKMeans聚类器 SimpleKMeans聚类器使用k均值算法或k中位数算法。SimpleKMeans聚类器思想有直观的几何意义: 将样本点聚集(归属)到距离它最近的那个聚类中心。算法的目标簇的数量由参数k指定,这k个聚类中心的坐标由与它相邻的若干个实例的坐标的距离平均值确定。这也是SimpleKMeans聚类器名字中间K和Means这两个元素的来源。 当选择k均值算法时,SimpleKMeans聚类器使用欧氏距离度量相似度; 当选择k中位数算法时,SimpleKMeans聚类器使用曼哈顿距离度量相似度。 欧氏距离指在n维空间中两个点之间的真实距离。在二维和三维空间中的欧氏距离就是两点之间的实际距离,例如,两个点在二维空间中的欧氏距离 d=(x2-x1)2+(y2-y1)2 ,推广到更高维的空间中以后,其距离计算的方法仍然一样。而曼哈顿距离是两个点在标准坐标系上的绝对轴距总和。例如,两个点在二维空间中的曼哈顿距离d=|x2-x1|+|y2-y1|,其计算方法同样可以推广到更高维的空间中。 SimpleKMeans聚类器适用于处理标称型属性。本节继续以天气数据集为例介绍SimpleKMeans聚类器的使用。进入 Weka Explorer界面,打开素材文件夹中数值型天气数据集“C:\Program Files\Weka384\data\weather.numeric.arff”,注意是数值型天气数据集。切换到Cluster标签页,单击Choose按钮,选择SimpleKMeans聚类器,如图3.47 所示。 图3.47选择SimpleKMeans聚类器 在标签页单击Choose按钮右侧的文本框,弹出参数设置窗口,保持默认设置,即选择欧氏距离, numClusters簇数目为2,意味着要划分为两个类别; 设置seed种子为10,单击OK按钮,如图3.48 所示。 图3.48SimpleKMeans参数设置 回到Cluster标签页,选中Use training set(使用训练集),勾选Store clusters for visualization (存储聚类可视化)。单击Ignore attributes(忽略属性)按钮,在弹出窗口中选择play属性,单击Select按钮,忽略类别属性,如图3.49 所示。 图3.49聚类模式设置 单击Start按钮,运行结果如图3.50所示。 图3.50SimpleKMeans聚类结果 在图3.50所示的Clusterer output(聚类器输出框)中,Within cluster sum of squared errors缩写为SSE,它是误差的平方数, 用来度量聚类质量。SSE值越小,表明聚类质量越高。本例SSE值是11.23。Initial starting points (random)表示随机设定两个实例作为聚类的簇中心。Final cluster centroids是算法反复调整簇中心,使得各实例点距离簇中心点的距离和最小。这就是算法找到的最终聚类中心。簇中心的每个值是如何计算出来的呢?标称型属性的簇中心是簇内数量最多的属性值; 数值型属性的簇中心是簇内值的平均。Clustered Instances是聚类后每个簇的实例数目以及百分比。第0个簇有9个实例,占比64%; 第1个簇有5个实例,占比36%。 在Result list(结果列表)中,右击SimpleKMeans条目,在弹出菜单中选择Visualize cluster assignments(可视化簇分配)命令,如图3.51所示。 在弹出的对话框中,单击Save按钮,将簇分配的结果保存在桌面,文件名为KM_Result的.arff文件,如图3.52 所示。 在Weka Explorer中打开这个文件,单击Edit按钮,最后一列就是簇分类结果。可以非常清晰地看到每个实例是属于第0簇还是第1簇,如图3.53所示。 图3.51可视化簇分配 图3.52输出到文件 图3.53SimpleKMeans聚类结果 本例中,已知play属性值,也就是每个属性的类别。可以借此来检验聚类器的性能。方法是: 不选中Use training set,而是选中Classes to clusters evaluation(类别作为簇的评估准则),比较聚类器所得到的簇与预先指定类别的匹配程度,如图3.54 所示。 图3.54设置评估聚类结果 单击Start按钮,得到聚类结果,如图3.55 所示。 图3.55聚类结果评估 图3.55右下方Incorrectly clustered instance值为3,表示有3个实例的聚类结果与原始结果不一致。另外,在图3.48 的参数设置页面中,如果seed设置一个随机种子,产生一个随机数,对聚类的质量有比较大的影响。调整这个参数的值,可能会得到更好的聚类结果,但是也有可能会得到更差的聚类结果。 3.3.2EM聚类器 下面介绍另外一个重要的聚类器EM(Expectation Maximization,期望最大化)。EM聚类器使用EM算法,EM算法是解决数据缺失时聚类问题的一种出色算法,它在概率模型中寻求最大似然估计或者最大后验估计,可以根据实例与簇之间隶属关系发生的概率来分配实例。 图3.56选择EM聚类器 进入Weka Explorer界面,继续使用3.3.1小节使用的天气数据集。切换到Cluster标签页,单击Choose按钮,选择EM聚类器,如图3.56 所示。 单击Choose按钮右侧文本框,弹出参数设置窗口,将numClusters簇数目设置为2,意味着要划分为两个类别。其他参数保持不变。选中Classes to clusters evaluation类别作为簇的评估准则,单击Ignore attributes按钮,在弹出窗口中选择play属性,单击Select按钮,忽略play属性。以上步骤,可以参见图3.48 和图3.49 。单击Start按钮,得到聚类结果如图3.57 所示。 图3.57EM聚类结果 图3.57右侧Clustered Instance是各个簇中实例的数目及百分比。第0个簇有4个实例,占比29%; 第1个簇有10个实例,占比71%。Incorrectly clustered instance输出了聚类器所得到的簇与预先指定类别的不匹配实例数目,一共有5个,占比35.7%。查看或保存聚类的具体结果与图3.50~图3.52记录的步骤类似,请参考执行。 3.3.3DBSCAN聚类器 DBSCAN使用欧氏距离度量,以确定哪些实例属于同一个簇。但是,不同于k均值算法,DBSCAN可以自动确定簇的数量。DBSCAN聚类器属于包optics_dbScan,最新版本为1.0.5。 切换到Cluster标签页,如果找不到DBSCAN聚类器,需要另外安装optics_dbScan包。回到Weka主界面,依次选择Tools→Package manager→optics_dbScan→Install命令,如图3.58 和图3.59 所示。 图3.58包管理器 图3.59安装optics_dbScan包 DBSCAN聚类器有两个重要参数,一个是参数(epsilon),它设定簇内点对之间的最小距离,的值越小,产生的簇越密集,这是因为实例必须靠得更紧密,彼此才能同属于一个簇; 另外一个参数是minPoints,指簇内实例数的最小值。参数和minPoints的设定,对聚类的结果有很大的影响。根据设定的值和簇的最小值,有可能存在某些不属于任何簇的实例,这些实例称为离群值。下面以鸢尾花(iris)数据集为例,介绍DBSCAN聚类器的使用。 进入Weka Explorer界面,打开素材文件夹中鸢尾花数据集。切换到Cluster标签页,单击Choose按钮,选择DBSCAN聚类器,如图3.60所示。 图3.60选择DBSCAN聚类器 单击Choose按钮右侧文本框,弹出参数设置窗口,将设置为0.2,minPoints设置为5,其他参数保持不变,如图3.61 所示。 图3.61DBSCAN参数设置 选中Classes to clusters evaluation(类别作为簇的评估准则),勾选Store clusters for visualization(存储聚类可视化),忽略class属性,如图3.62 所示。 图3.62聚类模式设置 单击Start按钮,得到聚类结果,如图3.63 所示。 图3.63DBSCAN聚类结果 图3.63 右侧在Clusterer output (聚类器输出)中可以看到,DBSCAN只发现了两个簇,一个簇有49个实例,另一个簇有98个实例,还有3个实例未能聚类。未正确聚类的实例有48个,占比32%。查看或保存聚类具体结果的方法与前述例子类似,读者可以自己尝试。 还可以将聚类的结果进行可视化输出。右击Result list中DBSCAN算法得到的结果,在弹出的菜单中选择Visualize cluster assignments,如图3.64所示。 图3.64设置可视化聚类结果 可视化结果如图3.65 所示。 图3.65可视化聚类结果 因为Weka使用颜色来区分聚类结果,因此图3.65 的灰度图像中难以查看两个不同的聚类结果信息,建议读者在Weka中自行验证。图3.65 中单个圈注的M符号表示有3个实例未能聚类。 3.4数据关联 随着数据库技术的飞速发展,快速增长的海量数据被收集并存放在一定的数据库中。从这些海量数据中分析并发现有用知识的数据挖掘技术目前已经发展得较为成熟。数据挖掘的任务是从大量的数据中发现模式。根据数据挖掘的任务分类,必然可以获知数据挖掘的方法也分很多种。 关联分析是当前数据挖掘研究的主要方法之一,关联规则描述了一组数据项之间的密切度或关系,它反映一个事物与其他事物之间的相互依存性和关联性。如果两个或者多个事物之间存在一定的关联关系,那么其中一个事物就能够通过其他事物预测到。 一个典型的使用关联规则发现问题的案例是超市中购物篮数据分析。通过发现顾客放入购物篮中的不同商品之间的关系来分析顾客的购买习惯。数据挖掘领域最经典的案例就是“啤酒与尿布”的故事。该故事中体现的就是关联规则的妙用和功力。美国的沃尔玛超市管理人员通过对超市一年多的销售数据进行详细的分析,发现了一个令人难于想象的现象,与尿布一起被购买最多的商品竟然是啤酒。借助于数据仓库和关联规则,商家发现了这个隐藏在背后的事实: 每逢周五,美国的妇女们经常会嘱咐她们的丈夫下班以后去超市为孩子买尿布,而30%~40%的丈夫在购买尿布的同时,会顺便购买自己爱喝的啤酒,因此啤酒和尿布就经常出现在一个购物车里了。根据发现的该事实,沃尔玛超市及时调整了货架的摆放位置,把啤酒和尿布摆在相邻的货架,最后经过一段时间的实施,发现二者的销售量都大大提高了。生活中其实还有很多类似的现象,例如70%购买了牛奶的顾客将倾向于同时购买面包,买了一台PC之后人们习惯于继续购买音响、耳机、摄像头等,这些都是事物之间的关联现象。 3.4.1关联规则相关概念 1. 支持度和置信度 关联规则挖掘的目的是在数据项目中找出所有的并发关系。关联规则可以采用与分类规则相同的方式产生。 因为做数据挖掘时得到的关联规则数量可能很大,所以通常需要依据两个指标来对规则进行修剪,即支持度和置信度。 1) 支持度 支持度又称覆盖率,通俗地说,即为几个相互关联的数据在数据集中出现的次数占总数据集的比重。给出一个形式化定义为,在M条交易集中,对于关联规则R: AB,其中AI,BI,并且A∩B=。规则R的支持度是交易集中同时包含A和B元素的交易数与所有交易数之比,其计算公式为 Support(A,B)=P(A,B)= number(AB)number(AllSamples) 其中,P为概率。支持度是一种重要度量,低支持度的规则一般只是偶然出现,所以可以用支持度来删除无意义的规则。 2) 置信度 置信度也称为准确率,指的是一个数据出现后,另一个数据出现的概率,或者说数据的条件概率。即,在M条交易集中,对于关联规则R: AB,其中AI,BI,I是所有项集的集合,并且A∩B=。规则R的置信度是指包含A和B的交易数与包含A的交易数之比。计算公式为 Confidence(AB)= P(A|B)= P(AB)P(A) 置信度一般用于度量规则,可用于推理的可靠性,因此置信度越高,推理越可靠。一般来说,只有支持度和置信度均较高的关联规则才是用户感兴趣的、有用的规则。 2. 项集、频繁项集及强关联规则 数据挖掘中最基本的模式是项集,它是指若干个项的集合。频繁模式是指数据集中频繁出现的项集、序列或子结构。频繁项集是指支持度大于或等于最小支持度的集合。频繁项集的经典应用就是前面提到的购物篮模型。一般来说,如果事件A中包含k个元素,那么称这个事件A为k项集; 事件A满足最小支持度阈值的事件称为频繁k项集。关联规则表示的是在某个频繁项集的条件下推出另一个频繁项集的概率。如果该关联规则同时满足置信度大于或等于最小置信度阈值,则该规则被称为强关联规则。所以,在数据挖掘中一般找的是频繁项集和强关联规则。 3.4.2Apriori算法介绍 关联规则挖掘的目的就是发现隐藏在大型数据集中的数据之间的有价值的联系,这些联系可以采用关联规则的形式表示,所发现的联系,可用于医疗诊断、购物推荐和科学数据分析等领域。 最常用的一种关联规则挖掘算法是Apriori算法。Apriori算法基于演绎原理,使用基于支持度的修剪技术来高效地产生所有频繁项集,控制项集的指数增长。算法基于逐级搜索的思想,采用多轮搜索的迭代方法,每一轮搜索扫描一遍整个数据集,最终生成所有的频繁项集。算法的基本思想如下所示。 (1) 找出频繁“1项集”的集合。该集合记作L1。L1用于找频繁“2项集”的集合L2,而L2用于找L3,“k-1项集”用于 找“k项集”。 (2) 如此下去,直到不能找到“k项集”。找每个Lk需要一次数据集扫描。 (3) 最后利用频繁项集构造出满足用户最小置信度的规则。 Apriori算法的原理是: 如果某个项集是频繁项集,那么它所有的子集也是频繁的。即如果{0,1}是频繁的,那么{0},{1}也一定是频繁的。所以,挖掘或识别出所有频繁项集是该算法的核心,占整个计算量的大部分。频繁项集的发现过程,一般经过如下步骤。 首先会生成所有单个物品的项集列表; 然后,扫描交易记录并通过计数的方式来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉,从而产生频繁项集; 接着对剩下的集合进行组合,即通过连接、剪枝操作生成包含两个元素的项集; 接下来重新扫描交易记录,去掉不满足最小支持度的项集,生成相应的频繁项集; 最后重复进行以上几个操作直到不能发现更大频繁项集。 举例看一下Apriori算法的执行过程。现有A、B、C、D、E 5种商品的交易记录表(见表3.2),试找出3种商品关联销售情况(k=3),最小支持度=50%。 表3.2商品交易记录表 交易号商 品 代 码交易号商 品 代 码 100A、C、D300A、B、C、E 200B、C、E400B、E 求解过程如下所示。 (1) 首先利用求解支持度的公式求出各1项集,即{A}、{B}、{C}、{D}、{E}的支持度,结果如表3.3所示。 表3.31项集的支持度 1项集支持度/% {A}50 {B}75 {C}75 {D}25 {E}75 (2) 由表3.3可知1项集{D}的支持度为25%,小于最小支持度阈值50%,所以这时候去掉D商品,得出频繁1项集的列表, 结果见表3.4。 表3.4频繁1项集的支持度 频繁1项集支持度/% {A}50 {B}75 {C}75 {E}75 (3) 在剩余商品组合{A,B,C,E}中两两结合产生2项集{A,B}、{A,C}、{A,E}、{B,C}、{B,E}、{C,E},同理继续利用公式计算支持度,结果见表3.5。 表3.52项集的支持度 2项集支持度/% {A,B}25 {A,C}50 {A,E}25 {B,C}50 {B,E}75 {C,E}50 (4) 由表3.5可知2项集{A,B}、{A,E}的支持度为25%,小于最小支持度阈值50%,所以这时候去掉这两个组合,得出频繁2项集的列表,结果见表3.6。 表3.6频繁2项集的支持度 频繁2项集支持度/% {A,C}50 {B,C}50 {B,E}75 {C,E}50 (5) 由剩余4个商品组合两两结合,生成3项集{A,B,C}、{A,C,E}、 {B,C,E},并继续利用公式计算支持度,结果见表3.7。 表3.73项集的支持度 3项集支持度/% {A,B,C}25 {A,C,E}25 {B,C,E}50 (6) 由表3.7可知3项集{A,B,C}、{A,C,E}的支持度为25%,小于最小支持度阈值50%,所以这时候去掉这两个组合,得到频繁3项集{B,C,E},支持度为50%,等于题目要求的最小支持度阈值50%,所以最后得出题目的结果即为B、C、E 3种商品可以一起关联销售。 Weka软件提供了Apriori算法的实现类,所以不需要写代码,只需要选择相应的算法,通过减少最小支持度进行迭代,直到找到所需数量的并且满足给定最小置信度的规则。 3.4.3Weka中Apriori关联规则挖掘 1. Associate标签页 Weka中通过Associate(关联)标签页来实现数据关联问题,如图3.66所示。 图3.66Associate标签页 Associate标签页中包含了学习关联规则的方案。从图中可以看到,在Associator 栏中设置关联规则学习器,可以通过单击Choose按钮进行选择,采用与前面章节中的聚类器、分类器等相同的方式来进行选择和配置。只不过这里点开后一般自动选择了Apriori算法。单击文本框,会弹出Weka的通用对象编辑器GenericObjectEditor,可以对Apriori算法的各个参数进行相应的设置和修改,后面的案例分析中将对这些参数做出具体的解释和说明。 Weka关联规则挖掘的一般步骤是,首先选择合适的关联规则学习器,并为关联规则学习器设置好合适的参数,然后单击Start按钮就可以启动学习器,学习完成后可右击Result list结果列表中的条目,从而查看或保存结果。 2. Apriori关联规则挖掘 为了更好地理解并应用Apriori算法,在Weka软件中通过加载案例数据运行该算法并挖掘规则。这里要注意一个问题,Apriori算法一般要求的是完全标称型数据,如果案例中有数值型属性,必须先进行离散化操作。 在Preprocess标签页加载weather.nominal.arff文件,切换至Associate标签页,并在Associator栏中选择Apriori算法,其他各参数先按照默认设置,接下来单击Start按钮,启动Apriori运行,结果如图3.66所示。 在图3.66中,可以看到,Result list下面的列表中显示的是每次运行算法的时间点记录。右侧的Associator output区域中列出的是本次算法运行的结果。默认情况下,一次算法的运行会输出最优的10条规则,并按照每条规则后面尖括号中的置信度值进行排序。拿出其中的第1条规则解释,其规则如下: 1. outlook=overcast 4 ==> play=yes 4 lift:(1.56) lev:(0.1) [1] conv:(1.43)。所有规则采用“前件 数字==>结论 数字”的形式表示,前件后面的数字表示有多少个实例满足前件,结论后面的数字表示有多少个实例满足整个规则,这就是规则的支持度。因为在结果给出的10条规则中,这两个数字相等,所以可以得出每个规则的置信度都为1。在这10条规则的上面结果区,还给出了算法运行后达到的几个参数值,分别为如下。  Minimum support(最小支持度): 0.15  Minimum metric(最小置信度): 0.9  Number of cycles performed(为产生规则算法实际运行的次数): 17  Generated sets of large itemsets: Size of set of large itemsets L(1):12 Size of set of large itemsets L(2):47 Size of set of large itemsets L(3):39 Size of set of large itemsets L(4):6 这表示达到最小支持度0.15后,产生的各个频繁项集分别为: 12个大小为1的项集、47个大小为2的项集、39个大小为3的项集、6个大小为4的项集。 前面提到,在实践中,需要通过最小支持度和置信度两个指标的衡量得出满意的结果。在Weka中,这一切是通过多次运行Apriori算法来得到的。当然,在执行算法之前需要用户指定最小置信度等参数的值。下面通过打开Weka软件的通用对象编辑器GenericObjectEditor,如图3.67所示,研究一下Apriori算法中的各个参数的意义及如何设置。 图3.67Apriori算法的通用对象编辑器 针对跟实际应用相关性比较大的几个参数,解释如下。  car和classindex参数,跟类关联规则挖掘和类属性相关,这里不展开。  delta,支持度变化的单位。以此数值为迭代递减单位,不断减小支持度直至达到最小支持度或产生了满足数量要求的规则。  lowerBoundMinSupport,最小支持度下界。  metricType,度量类型。设置对规则进行排序的度量依据。可以是置信度(confidence)、提升度(lift)、杠杆率(leverage)、确信度(conviction)。在Weka中可以通过metricType下拉列表框来设置这几个类似置信度的度量,从而衡量规则的关联程度。除置信度之外的其他几个标准在这里不做解释。  minMtric,所选中的度量类型的最小值。  numRules,结果中想要发现的规则数。  outputItemSets,如果设置为TRUE,会在结果中输出各项集的具体内容。  upperBoundMinSupport,最小支持度上界。从这个值开始,以delta为单位,迭代减小最小支持度。 现在,更改通用对象资源管理器里的几个参数,比如设置outputItemSets为True,numRules为5,minMetric为0.95,再次运行Apriori算法,观察一下结果有何不同,如图3.68所示。 图3.68设置不同参数后的运行结果 Apriori算法还有其他一些参数,更多信息可以通过在通用对象编辑器中单击More按钮获得。 3. 挖掘其他数据集 本案例挖掘乳腺癌的相关数据集,该数据集是从斯洛妮亚卢布尔雅那大学医疗中心乳腺癌肿瘤研究所获得的。数据集中一共有286个实例,9个属性加1个类别属性。本来该数据集更多地用于分类问题,目的是可以根据病人的各项身体指标预测其癌症是否会复发。这里应用关联规则挖掘,看看能不能发现一些有趣的关联性,从而为病人的检查或医生的诊断提供有价值的建议。本数据集中所有的属性都被处理为标称型属性,并且有些属性具有一定的数据缺失。 首先在Preprocess标签页中加载breastcancer.arff数据集,切换至Associate标签页,选择Apriori算法,保持默认选项不变,单击Start按钮,运行结果如图3.69所示。 图3.69breastcancer数据集运行Apriori算法的结果 从图3.69的运行结果可以看到,输出的最小支持度达到0.5,有143个实例最小置信度为0.9,执行了10次迭代。达到最小支持度0.5时,产生的各个频繁项集分别为6个大小为1的项集、6个大小为2的项集、4个大小为3的项集、1个大小为4的项集。 挖掘产生的10条规则如下。  第1条规则: 受侵淋巴结数=0~2,未放疗,无复发==>无结节帽。  第2条规则: 受侵淋巴结数=0~2,未放疗==>无结节帽。  第3条规则: 无结节帽,未放疗,无复发==>受侵淋巴结数=0~2。  第4条规则: 受侵淋巴结数=0~2,无复发==>无结节帽。  第5条规则: 受侵淋巴结数=0~2 ==>无结节帽。  第6条规则: 无结节帽,未放疗==>受侵淋巴结数=0~2。  第7条规则: 无结节帽,无复发==>受侵淋巴结数=0~2。  第8条规则: 未放疗,无复发==>无结节帽。  第9条规则: 受侵淋巴结数=0~2,无结节帽,无复发==>未放疗。  第10条规则: 无结节帽==>受侵淋巴结数=0~2。 在这10条关联规则中,有3个指标是多次同时出现,而且实例数非常多。这给出了一条比较符合实际的结论: 如果一个病人的受侵淋巴结小于两个,并且无结节帽,未做过放疗,那这个病人复发的可能性就比较低。也就是说这四者之间的关联性非常大。 对于医生来说,这就是一条重要的参考信息,可以根据挖掘到的规则来给病人做出合理的判断,或者当病人来到医院检查时,也可以关注这几项指标,让整个看病过程更快捷。 最后建议读者试着借助于通用对象编辑器,修改Apriori算法的不同参数,针对以上数据集进行挖掘,看看挖掘效果,尝试能否从中分析出一些意外而又在情理之中的结论。 3.5选择属性 事物的属性从多个角度描述了事物,然而有的属性对于目标是不重要的,或者起了反作用,这就需要从众多属性中,把 不重要的识别出来,保留重要的属性。数据挖掘中,在考虑挖掘模型拟合效果、系统运行时间等前提下,对某些数据集来说,构建的包含所有或大多数属性的模型并不一定是最优模型。原因在于数据集中存在的跟挖掘任务不相关的属性或冗余的属性,可能会导致无效的挖掘过程或降低挖掘的效率。很多研究表明,一些常见的算法可能会因为不相关或冗余的数据而产生低质量的结果,甚至于冗余的属性也可能直接影响某些分类算法的表现。 因此我们需要对所有的属性进行甄别,在数据挖掘操作之前选择合适有效的属性。大量的实证研究表明,属性选择 对于提高挖掘的效率以及挖掘结果的准确性是非常有效的,所以要重视属性的选择问题。 3.5.1属性选择概述 1. 属性选择的定义 属性选择一般属于数据挖掘过程中的数据预处理阶段的工作。面对大量的高维数据,从理论上来说,当然是属性数目越多越有利于目标的分类,但实际情况却并非如此。一般在选取的样本数目有限的情况下,用很多属性去对数据做分类,设计分类器,从计算的复杂性或分类器的性能角度来说都是不适宜的。而样本的属性中既包括有效属性,又包括噪声属性,还包括问题无关属性以及冗余属性。很明显我们希望保留有效属性,尽可能地去掉噪声属性,对于无关属性或冗余属性也希望尽量减少到最少。 属性选择的目的就是从属性集中删除不具有预测能力或预测能力极其微弱的属性,从而建立高效的挖掘模型。属性选择也是对高维数据进行降维的一种有效方法。当然,在不同的应用问题中,属性选择的目标或标准也不一样。在本小节内容中,只研究数据挖掘中的属性选择问题。下面给出一个最典型的定义。 属性选择是指在属性个数为n的属性集合中,选择m个属性成为一个属性子集,其中m