数据挖掘与机器学习-WEKA应用技术与实践(第二版)
上QQ阅读APP看书,第一时间看更新

1.3 Weka系统安装

本节介绍Weka系统的安装。由于Weka采用Java编写,因此,具有Java“一次编译,到处运行”的特性,Weka支持的操作系统有Windows x86、Windows x64、Mac OS X、Linux等。

1.3.1 系统要求

表1.1列举了运行Weka的特定版本对Java版本的要求。

表1.1 Weka各版本对Java版本的要求来源:http://www.cs.waikato.ac.nz/~ml/weka/requirements.html。

表1.1中的X表示所在列的Java版本支持所在行的Weka版本。表中有两处还注明了因版本变更对Java版本要求的变化,采用前缀r加数字表示Subversion修订版本,并列出变更时间。

在Linux/GNOME系统中,使用Java 1.5及以上版本会遇到界面的缺省外观显示问题。Mac OS X用户使用Weka 3.6.5/3.7.4版本时,需要安装Java for Mac OS X 10.6 Update 3及以上版本。

1.3.2 安装过程

下面介绍Weka 3.7.13在Windows 8.1中文版上的下载及安装过程。

1.下载

SourceForge.net网站提供Weka各类版本的下载,本书推荐从Weka官网链接到下载地址,另外,Weka官网还提供很多相关资源。在浏览器地址栏中输入网址“http://www.cs.waikato.ac.nz/~ml/weka/”,并按Enter键,在主页的导航栏中单击Download超链接,根据自己的计算机所安装的操作系统选择下载文件。

要注意的是,Weka主要版本有三种,第一种称为Snapshots(快照版本),是开发过程中构建的版本,并不是正式版,这是为想要最新的错误修正版的用户设置的;第二种称为Stable book 3rd ed. version(第3版书的稳定版本),是Ian H. Witten的第3版著作对应的Weka实现的稳定版本,版本为3.6.x;第三种称为Developer version(开发者版本),目前版本为3.7.x,这是Weka的主干版本,是稳定3.6版本代码的延续,进行了错误修复并新增了一些功能,因此,它是学习和研究Weka的理想版本,本书的写作就基于这个版本。

由于作者使用的操作系统为Windows 8.1中文版,并且已经安装过JDK 8(要求JRE 7以上版本),因此,选择下载weka-3-7-13-x64.exe,如图1.3所示。如果没有安装过Java,最好选择下载自带Java VM的Weka版本。

图1.3 选择下载的文件

2.安装

下载完成后双击.exe文件进行安装。

首先出现的是欢迎窗口,如图1.4所示,单击Next按钮进入下一步。

图1.4 欢迎窗口

随后出现的是GNU GPL协议,必须同意才能进行安装。单击I Agree按钮,如图1.5所示。

图1.5 同意GNU GPL协议

下一步是选择安装组件。选项有Full、Minimal、Custom三项,默认为Full。由于完全安装也不占多大空间,建议选择默认的Full选项。因此保持默认选项,单击Next按钮进入下一步,如图1.6所示。

图1.6 选择安装组件

下一步是选择安装路径。根据自己计算机的硬盘空间进行选择,建议安装在C盘的Weka-3-7目录下,选择完成后,单击Next按钮进入下一步,如图1.7所示。

图1.7 选择安装路径

接下来是选择开始菜单文件夹名称,这里是Weka 3.7.13,没有特殊要求则不必更改,单击Install按钮开始安装,如图1.8所示。

图1.8 选择开始菜单文件夹名称

安装完成后,最好花上一点时间看看已安装的文件。如图1.9所示,Weka-3-7目录下有三个子目录,changelogs子目录用于存放Weka版本的变更情况,除非想参与到Weka项目的开发,或者想知道Weka的某版本在上一个版本的基础上究竟变更了哪些内容,才需要进行研究;data子目录存放自带的23个ARFF文件作为测试用途的示例数据集,详见后文;doc子目录存放Weka文档,进行二次开发的技术人员需要仔细阅读。

图1.9 安装在硬盘上的文件

安装目录下还有几个文件值得关注。WekaManual.pdf是Weka用户手册,不论新手还是老资格用户,该手册都很有用;weka-src.jar是打包源程序,可以解压出来供深层次的用户使用;RunWeka.ini是运行Weka的配置文件。

1.3.3 Weka使用初步

由于从Windows 8开始取消了开始菜单,很多人觉得使用不方便。本书建议安装360软件小助手,以保持原来的使用习惯。

图1.10 Weka菜单

Weka安装完成后,在Windows左下角的360软件小助手菜单中,可以找到Weka 3.7.13子菜单,下面有四个菜单项,如图1.10所示。

单击第一个菜单项Documentation(参考资料),可以浏览Weka提供的非常有用的参考资料,包括Weka手册、Java包API文档,还有一些在线资源,如Weka主页、WekaWiki、Pentaho的Weka社区文档,以及SourceForge.net网站下的Weka,如图1.11所示。

图1.11 Weka参考资料

第二个菜单项用于卸载Weka。

第三和第四个菜单项均可以启动Weka界面,不同的是前者带有一个控制台输出,而后者没有。不管使用哪种方式启动Weka,主界面均显示为Weka GUI选择器窗口,如前文的图1.2所示。这里主要介绍Weka的菜单。

Weka使用的MDI(多文档界面)外观让所有打开的窗口更加简洁明了。Weka菜单分为以下四个部分。

1.Program(编排)菜单

● LogWindow(日志窗口)菜单项:打开一个记录输出到stdout或stderr内容的日志窗口。在Windows环境下,如果以不带控制台输出的方式启动Weka,日志窗口比较有用。

● Memory usage(内存使用情况)菜单项:打开一个显示内存使用情况的窗口,如果用户发现内存占用过大,可单击窗口右边的GC按钮,启动垃圾回收器,如图1.12所示。

图1.12 内存使用情况

● Exit(退出)菜单项:关闭Weka。

2.Visualization(可视化)菜单

● Plot(散点图)菜单项:画出数据集的二维散点图。

● ROC(接收者操作特征)菜单项:打开预先保存的文件以显示ROC曲线。

● TreeVisualizer(树可视化工具)菜单项:打开预先保存的文件以显示一个有向图,例如,决策树。

● GraphVisualizer(图可视化工具)菜单项:显示XML、BIF或DOT格式的图片,例如,贝叶斯网络。

● BoundaryVisualizer(边界可视化工具)菜单项:允许在二维空间中对分类器的决策边界进行可视化。

3.Tools(工具)菜单

● Package manager(包管理器)菜单项:允许用户选择安装感兴趣或需要的算法软件包。

● ArffViewer(ARFF查看器)菜单项:一个MDI应用程序,使用电子表格的形式来查看ARFF文件。

● SqlViewer(SQL查看器)菜单项:通过JDBC(Java数据库连接)查询数据库的简单窗口,支持连接数据库,执行SQL语句,并显示结果。

● Bayes net editor(贝叶斯网络编辑器)菜单项:一个编辑、可视化和学习贝叶斯网络的应用程序。

4.Help(帮助)菜单

● Weka homepage(Weka主页)菜单项:打开一个浏览器窗口,显示Weka主页。

● HOWTOs,code snippets,etc(基本知识、代码段等)菜单项:打开常用的WekaWiki,其中含有大量的示例,以及开发和使用Weka的基本知识(HOWTO)。

● Weka on Sourceforge(Sourceforge网站的Weka)菜单项:打开Weka项目在Sourceforge.net网站上的主页。

● SystemInfo(系统信息)菜单项:列出一些关于Java和Weka的环境信息,如WEKA_HOME、file.encoding等。

1.3.4 系统运行注意事项

1.使用Weka包管理器

通常术语“包”(package)指的是Java通过包来组织Java类。自Weka 3.7.2开始,Weka引入包的概念,它将额外功能从weka.jar文件中分离,以软件包的形式单独提供。Weka包由各种jar文件、文档、元数据,以及可能的源代码组成。从版本3.7.2开始,早期版本Weka中的许多学习算法和工具就分离出来成为单独的包。这样做的最大好处就是简化了Weka的核心系统,允许用户选择安装自己需要或者感兴趣的软件包。它还提供了一种简单机制,用户能够及时使用到Weka爱好者提供的新功能。Weka可以使用很多包,这些包以某种方式添加学习方案,或扩展核心系统的功能,很多包都由Weka团队和第三方提供。

Weka自带有软件包的管理机制,能在运行时动态加载包。软件包管理器分为命令行和图形用户界面(GUI)两种,下面分别予以说明。

假定weka.jar文件在classpath路径中,使用如下命令即可访问包管理器:

    java weka.core.WekaPackageManager

运行结果如图1.13所示。详细的命令行包管理器的使用将在第5章讲述。

图1.13 命令行包管理器

可以看到,除非是专业程序员,使用命令行包管理器非常麻烦,要求输入若干命令行选项。因此,普通人员还是使用GUI进行包管理较为直观方便。

首先启动Weka GUI选择器窗口,在Tools菜单下,选择Package manager菜单项,或者按Ctrl+U快捷键,会弹出如图1.14所示的Package Manager(包管理器)窗口。命令行包管理器中包含的全部功能都可以在GUI版本中使用,GUI版本还能够一键安装和卸载多个包。

图1.14 Package Manager窗口

Package Manager窗口可分为上、下两部分:顶部是一个软件包的列表;底部是一个小型的浏览器,用于显示当前选择的包信息。

包列表中显示了包的名称(Package)、类别(Category)、如已安装则显示目前安装的版本(Installed version)、存储库中可用的最新版本(Repository version),以及包是否已经加载(Loaded)。可以通过单击此列表相应的列标题,按照包名称或类别进行排序。第二次单击相同列标题会反转排列顺序。在窗口左上角,有三个单选按钮可以用来过滤列表中显示的内容,默认选中All(所有软件包)单选按钮,Available单选按钮用于显示所有可用的尚未安装软件包,Installed单选按钮用于显示已安装的软件包。

如果某一种软件包有多个版本可用,可以选择对应的Repository version列来选取版本。具体方法是:单击该列,在出现的下拉列表框中选择希望安装的版本。

窗口顶部有四个按钮,分别为Refresh repository cache(刷新库缓存)、Install(安装)、Uninstall(卸载)和Toggle load(切换加载)。第一个按钮用于刷新包信息库中的元数据的缓存副本。第一次使用程序包管理器时,不论是GUI版本还是命令行版本,都会出现短暂的延迟,这是因为第一次要建立初始缓存。Install和Uninstall按钮分别用于安装和卸载包,可以一次安装或卸载多个包,可以在按住Shift键的同时选择一定范围内连续的包,也可以在按住Ctrl键的同时将不连续的包依次添加到选择集合中。Toggle load按钮用于切换已安装包的加载状态,在Loaded列的Yes与No之间进行切换,切换时会弹出一个信息对话框,指示修改的加载状态必须在重启Weka之后才会生效。在Install和Uninstall按钮的下面,有一个Ignore dependencies/conflicts(忽略依赖关系和冲突)复选框,选中该复选框可以忽略所选择软件包的依赖关系和可能发生的任何冲突。如果在安装软件包时选中该复选框,将无法安装存在依赖关系的软件包。

下面以LibSVM(SVM模式与回归软件包)的安装和卸载为实例进行说明。

首先安装。选中All单选按钮,显示全部包,选中LibSVM包,如图1.15所示。

图1.15 选中要安装的包

然后,单击Install按钮进行安装。这时,Weka会弹出一个窗口请用户确认,单击“是(Y)”按钮确认自己的操作。包管理器窗口右上角显示安装进度,经过一小段时间后,所选中的LibSVM包对应的Loaded列也会显示Yes字样,说明安装完成。

现在卸载LibSVM包。选中Installed单选按钮,显示已安装的包,选中LibSVM包,这时,Uninstall按钮从不可用变为可用,如图1.16所示。

图1.16 选中要卸载的包

单击Uninstall按钮,会出现一个警告窗口,单击“是(Y)”按钮确认自己的操作。经过一小段时间后,Weka提示需要重新启动以便使更改生效,单击“确定”按钮重启Weka。

有时,读者会遇到因网络问题无法连接包管理器网站下载Weka的附加算法包的问题,下面提供一个简单的解决方案。

通过浏览器连接网址http://sourceforge.net/projects/weka/files/weka-packages/,如图1.17所示。如果无法连接,可设置代理服务器。

图1.17 Weka算法包下载页

选择并下载需要的算法后,解压,然后在类路径中加入解压后的jar文件全路径名。

下面以安装LibSVM1.0.6.zip的实例进行说明。

首先停止运行Weka,下载LibSVM1.0.6.zip文件,并解压到某个目录中,如D:\LibSVM目录,如图1.18所示。

图1.18 LibSVM解压的目录

然后设置环境变量,如图1.19所示。变量名为CLASSPATH,变量值为“D:\LibSVM\LibSVM.jar;D:\LibSVM\lib\libsvm.jar;”。

图1.19 LibSVM环境变量设置

注意: 第一,LibSVM需要设定两个jar文件,其他算法可能只需要设定一个即可;第二,冒号和分号一定要是英文半角字符;第三,如果CLASSPATH原来就有值,请不要删除原值,添加新值即可。

最后,重新启动Weka,打开数据集,切换至Classify(分类)标签页。可以看到,已经可以使用LibSVM算法包,如图1.20所示。

图1.20 成功加载LibSVM算法包

如果所在单位使用HTTP代理服务器访问Internet,可以尝试使用代理。具体方法是,从命令行启动Weka时提供代理服务器主机名及端口号,如:

    java -Dhttp.proxyHost=proxyHostOrIP -Dhttp.proxyPort=port weka.gui.GUIChooser

请自行将proxyHostOrIP替换为自己的代理服务器名或IP,port替换为端口号。

如果代理服务器需要认证,请使用-Dhttp.proxyUser和-Dhttp.proxyPassword属性分别提供用户名和密码。

另外,还可以将上述代理服务器的各种属性加到RunWeka.ini配置文件中。使用任意文本编辑器打开RunWeka.ini文件,在约第17行,找到以下配置:

    cmd_default=javaw -Dfile.encoding=#fileEncoding# ...

将其改为

    cmd_default=javaw -Dfile.encoding=#fileEncoding# -
    Dhttp.proxyHost=proxyHostOrIP -Dhttp.proxyPort=port -
    Dfile.encoding=#fileEncoding# ...

重新启动Weka,包管理器应该能访问Weka附加算法包。

2.设置CLASSPATH

CLASSPATH环境变量告知Java应该在什么地方去查找Java类。因为Java总是按照一定顺序去查找CLASSPATH环境变量里的类路径,因此,用户应该认真考虑将何种路径放到CLASSPATH的什么位置。

下面以在Windows操作系统中添加MySQL驱动程序mysql-connector-java-5.1.6.jar为例进行说明。只有将该jar文件添加到CLASSPATH环境变量中,Weka才能通过JDBC访问MySQL数据库。

在Windows桌面上,右击“这台电脑”图标,在弹出的快捷菜单中选择“属性”菜单项,在新窗口左部选择“高级系统设置”选项,打开“系统属性”对话框,在“高级”标签页下单击“环境变量”按钮,打开“环境变量”对话框。根据计算机是仅供一人使用还是多人使用,可以选择将环境变量设置为用户变量还是系统变量。如果不知道该设置为哪一种变量,建议设置为用户变量。如果已经存在CLASSPATH环境变量,则进行编辑,否则,单击“新建”按钮进行新建,按照图1.21所示输入变量名和变量值。

图1.21 设置环境变量

如果用户的jar文件名称或路径与本书不同,请做相应修改。如果用户还想加入更多的jar文件,请使用分号进行分割。

3.使用UTF-8数据集或文件

Java本来就支持UTF-8字符集,因此Weka应该能够处理UTF-8字符集的数据集或文件,只要选择合适的字符集即可。在Windows平台下,Weka默认使用另一种字符集Cp1252,可以通过以下方式将文件编码(file encoding)改为“utf-8”,重新启动就能支持汉字。

如果直接在命令行下运行Weka,只要在命令行中添加如下参数:

    -Dfile.encoding=utf-8

如果在“开始”菜单下启动Weka,那么就需要修改RunWeka.ini文件,步骤如下。

步骤1 在Weka安装目录下,找到RunWeka.ini文件,用任意文本编辑器打开该文件。

步骤2 在第32行附近,找到“fileEncoding=Cp1252”行,将“Cp1252”改为“utf-8”,注意不要有引号;如果没有找到这一行,那么,找到所有的java/javaw命令,在这些命令行中添加“-Dfile.encoding=utf-8”参数。

4.常见运行错误

1)OutOfMemoryException(内存不足例外)

大多数Java虚拟机只分配一定数额的最大内存来运行Java程序,通常远低于计算机中的内存大小。但是,可以通过设置适当的选项来扩展虚拟内存。例如,可以用命令

    java -Xmx512m ...

设置最大Java堆的大小为512MB。还可以使用Xmx2g将其设置为2GB,这样就足够使用。当然,这还要看计算机的具体配置,设置过大的内存会影响运行性能。

2)StackOverflowError(栈溢出错误)

这是由于设置的堆栈过小造成的错误。尝试增加虚拟机的堆栈,可以使用下面的命令来增加堆栈空间:

    java -Xss512k ...

该命令设置Java的最大堆栈大小为512KB。如果还是不够,请慢慢增加。

3)training and test set are not compatible(训练集和测试集不兼容)

Weka假定训练集和测试集的结构应该完全一致,这意味着训练集和测试集的属性不但在数量上相同,而且在类型上也应该完全一样。对于标称型属性,必须确保标签的数量和顺序完全一致。

使用已经训练好的分类器进行预测,不需要包括任何分类属性的信息。出于速度的原因,Weka不执行任何有关数据集结构的检查,既没有将属性名称从训练空间映射到测试空间,也没有映射标签。在内部,数据集的单行表示为一个double型数组。对于数值型属性,这并不构成问题;但对于其他类型的属性,如标称型属性,double值表示可用标签列表的索引,标签的不同顺序会导致不同的标签却采用相同的索引表示,这样,预测就不可靠。

解决办法是使用批量过滤(batch filtering)。如果需要将第二个数据集(通常为测试集)处理为与第一个数据集(通常为训练集)具有相同的统计数据,那么就使用批量过滤。

例如,使用Standardize过滤器分别对两个数据集执行标准化操作,肯定会创建两个不同的标准化输出文件,因为如果数据集不同,输入数据就不同,导致均值和标准偏差也就不同。StringToWordVector也同样会产生这个问题,因为在训练集和测试集中单词出现的次数不同,导致单词词典也相应改变,从而输出两个互不兼容的文件。

为了创建兼容的训练集和测试集,有必要使用批量过滤。启用批量过滤,必须提供额外的命令行参数-b。此外,第一个输入/输出对(-i/-o)初始化过滤器的统计数据,第二个输入/输出对(-r/-s)根据这些统计数据进行处理。

例如,如下的Java调用启用批量过滤:

    java weka.filters.unsupervised.attribute.Standardize \
      -b \
      -i train.arff \
      -o train_std.arff \
      -r test.arff \
      -s test_std.arff

注意: 上述命令是适用于Linux/UNIX的bash,反斜杠表示续行。如果采用Windows或Simple CLI,需要去掉反斜杠符号,并在一行内写全命令。更详细的命令解释请参见本书第5章。