声明:
1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究。
2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析,第三是关联挖掘。
3)本文由于过长,且实验报告内的评估观点有时不一定正确,希望抛砖引玉。
(一)WEKA在Ubuntu下的配置
下载解压
-
下载和解压weka
。下载:
创建目录:sudo mkdir /usr/weka。
解压weka到该目录:unzip weka-3-6-10.zip -d /usr/weka。
配置Ubuntu的环境变量
-
配置环境变量。还是使用vim 在/etc/environment 中配置。(新增WEKAROOT,修改CLASSPATH)
export WEKAROOT=/usr/weka/weka-3-6-10
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$WEKAROOT/weka.jar
最后别忘了 source /etc/environment,加载新的配置文件。
当然了WEKAROOT换成别的名字也可以的,如WEKA_PATH等,切记如果想换名字的话,首先用echo命令查看环境变量参数,指令如下:
echo $WEKAROOT
然后使用unset命令删除掉,指令为unset WEKAROOT
最后新建一个WEKA_PATH环境,新建方法仍然是往environment文件里写入并更新。
运行WEKA
-
运行WEKA,运行命令:cd $WEKAROOT(或者cd $WEKA_PATH)
运行命令:java -Xmx1000M -jar weka.jar(或者java -jar weka.jar)
Java虚拟机进程能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时候,没有添加-Xmx参数,那么就是64兆,这是java虚拟机默认情况下能从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如本指令下最大内存就是1000兆。
快速启动WEKA
-
更加快捷的运行weka,输入以下命令:
sudo touch /usr/bin/weka
sudo chmod 775 /usr/bin/weka
sudo vi /usr/bin/weka
输入以下代码:
#!/bin/bash
cd $WEKAROOT 或 cd $WEKA_PATH
java -Xmx1000M -jar weka.jar
保存退出vim
以后要运行weka,只要在命令行里直接键入命令 weka 就可以了。这里附上vim编辑的一些经验:
1)vi 的进入
在 shell 模式下,键入vi 及需要编辑的文件名,即可进入vi。
例如:
vi example.txt
即可编辑 example.txt 文件。如果该文件存在,则编辑界面中会显示该文件的内容,并将光标定位在文件的第一行;如果文件不存在,则编辑界面中无任何内容。如果需要在进入vi 编辑界面后,将光标置于文件的第n 行,则在vi命令后面加上+n 参数即可。例如需要从example.txt 文件的第5 行开始显示,则使用如下命令:
vi +5 example.txt
2)退出 vi
退出 vi 时,需要在末行模式中输入退出命令q。
如果在文本输入模式下,首先按ESC 键进入命令模式,然后输入": "进入末行模式。在末行模式下,可使用如下退出命令:
:q 直接退出如果在文本输入模式下修改了文档内容则不能退出
:wq 保存后退出
:x 同 wq
:q! 不保存内容强制退出
(二)WEKA在Windows下的配置
安装WEKA的EXE程序包
-
下载weka在Windows下的可执行包
官方网站提供两类Windows下的可执行包,一类是OS直接运行的,另一类是在JVM里运行的,我下载的是基于JVM运行的类型的可执行包。
安装过程没有什么可说的,Windows下的安装过程非常简单易懂。
运行WEKA
-
运行Weka
运行Weka有两类方式,一类是通过OS的操作方式运行,如双击运行或调用exe等等。还有一类是通过Java命令运行。
OS操作下运行Weka感觉上是没有什么问题,注意是"感觉上"没有问题!事实上通过OS运行,由于什么错误也没有,可能发觉不到Weka的一些Warning。直到你需要某项Weka读取数据库的功能操作时,才发现怎么也运行不通,而却不知道为什么。
在调用Java命令运行的过程中就发现,几个关于数据库读取的Warning!处理需要一定时间。相关Warning如下:
>java –Xmx1024M –jar weka.jar Trying to add database driver (JDBC): RmiJdbc.RJDriver - Error, not in CLASSPATH? Trying to add database driver (JDBC): jdbc.idbDriver - Error, not in CLASSPATH? Trying to add database driver (JDBC): org.gjt.mm.mysql.Driver - Error, not in CLASSPATH? Trying to add database driver (JDBC): com.mckoi.JDBCDriver - Error, not in CLASSPATH? Trying to add database driver (JDBC): org.hsqldb.jdbcDriver - Error, not in CLASSPATH? |
WEKA启动的驱动报错
-
弥补数据库连接的问题方法(Ubuntu和Windows皆出现)
查询网络论坛,说linux和windows均会出现此类问题,我在Ubunntu和Win8都配置过了,确实都会出现这些Warning。
查询网络论坛的一些大神的实验记录与心得,两大OS的解决办法基本相同,先说说Ubuntu
1)Ubuntu解决方法
第一步、下载相关数据驱动包,大约有5个jar包,注意Weka3-6对应的这5个jar包版本各自不同,一定要找对版本的这5个jar包。例如:对于Weka(version 3.5.5) 对于RmiJdbc,一定选择版本3.05或2.5。
名字分别为:hsqldb.jar,idb.jar,mkjdbc.jar,mysql-connector-java-5.1.6-bin.jar,RmiJdbc.jar。
我的Weka版本为3-6-11,使用3-6-8版本的此5个jar包,没有问题。
第二步、解压后把这5个jar包拷贝到/usr/lib/jvm/jdk1.7.0_25 /jre/lib/ext目录下,你的路径可能和我的不一样,记着是你的jdk安装路径就行了。(吐个槽,在这一点上,Ubuntu比Windows好使多了,复制一下这几个jar包就行了,就不会报错了。可是Windows你懂的,修改环境变量起来好累。)
第三步、修改weka数据类型和数据库数据类型的映射。
(对于这步骤操作,Weka官方wiki提供相关文档操作方法http://weka.wikispaces.com/Properties+file)
在weka.jar里面有一个文件/weka/experiment/DatabaseUtils.props,记录了数据库操作的相关参数。还有很多文件DatabaseUtils.props.msaccess,DatabaseUtils.props.mssqlserver等,分别对应了各个数据库的操作参数,
如果你使用msaccess,可以把DatabaseUtils.props.msaccess的内容覆盖DatabaseUtils.props。
如果不对DatabaseUtils.props修改,可能在连接数据库时一切顺利,但在将数据装入准备预处理时,却出现找不到数据类型(can not read from database,unknown data type)之类错误。
没关系,在DatabaseUtils.props加入类型映射就OK了。文件中一般有下面的内容(这里是我用mysql对应的文件覆盖了):
# JDBC driver (comma-separated list) jdbcDriver=com.mysql.jdbc.Driver # database URL jdbcURL=jdbc:mysql://server_name:3306/database_name # specific data types string, getString() = 0; --> nominal boolean, getBoolean() = 1; --> nominal double, getDouble() = 2; --> numeric byte, getByte() = 3; --> numeric short, getByte()= 4; --> numeric int, getInteger() = 5; --> numeric long, getLong() = 6; --> numeric float, getFloat() = 7; --> numeric date, getDate() = 8; --> date text, getString() = 9; --> string time, getTime() = 10; --> date BigDecimal,getBigDecimal()=11; -->nominal #mysql-conversion CHAR=0 TEXT=0 |
#mysql-conversion下提供的类型一般是不够的,比如int unsigned就找不到,
所以要加入int是如何映射到weka类型的。
在# specific data types下找到Int对应的java类型,这里是
int, getInteger() = 5; --> numeric
所以在#mysql-conversion下新增INT=5
再加上UNSIGNED类型,INT_UNSIGNED=6(因为unsigned比signed多一倍的数,为防止截断,要取大的类型)
其他类型的映射依次类推。
注意INT和UNSIGNED之间的下划线,缺了的话错误解决不了,我就在这里搞了好久。(Note: in case database types have blanks, one needs to replace those blanks with an underscore, e.g., DOUBLE PRECISION must be listed like this:DOUBLE_PRECISION=2. Notes from http://weka.wikispaces.com/weka_experiment_DatabaseUtils.props#toc4)
第四步,最后最重要的是,把DatabaseUtils.props放到home目录下,重启Weka后生效。并请注意:不同的数据库,书写方法与格式不同,上面是MySql类型,还有SQL Server2000或Oracle等等,格式是不同的,可百度参考相关格式或论坛博客。
2)Windows解决方法
对于找不到jdbc驱动的问题,主要是修改RunWeka.ini,因为屡次修改classpath都不成功。干脆将jar文件的地址加到weka指定的运行时classpath中。RunWeka.ini的位置在Weka总目录下,与Weka.jar是平行目录。打开后内容底部有如下内容:
# The classpath placeholder. Add any environment variables or jars to it that # you need for your Weka environment. # Example with an enviroment variable (e.g., THIRD_PARTY_LIBS): # cp=%CLASSPATH%;%THIRD_PARTY_LIBS% # Example with an extra jar (located at D:\libraries\libsvm.jar): # cp=%CLASSPATH%;D:\\\\libraries\\\\libsvm.jar # Or in order to avoid quadrupled backslashes, you can also use slashes "/": # cp=%CLASSPATH%;D:/libraries/libsvm.jar cp=%CLASSPATH% |
根据提示,将jdbc驱动jar文件地址附加到cp变量。
比如mysql jdbc驱动(mysql-connector.jar)在E:/jars/下,则加入下面这句:
cp=%CLASSPATH%;E:/jars/mysql-connector.jar
同时把cp=%CLASSPATH%注释掉,
结果像
cp=%CLASSPATH%;E:/jars/mysql-connector.jar
#cp=%CLASSPATH%
也就是说如果有5个jar包,需要在一行里一个一个写进,而不能用写一个5个jar包所在的总目录来省事。(网上有人说把那5个Jar包解压到weka路径下,然后修改CLASSPATH也能解决,我试过很多次,都不可行。)
至于数据类型映射,参见上面Linux环境下的配置。
最后将DatabaseUtils.props文件放在跟Weka.jar同一目录下即可。
3)Windows下若上述方法失败,仍然报JDBC错误。
解决方法有以下几种:
一、设置系统里环境变量,因为你在RunWeka.ini内设置了classpath,结果仍然不识别,我想应该为系统里的classpath添加路径。
二、使用java命令行,利用临时权限添加classpath的方法
上面两方法,第一种我试了很多遍没有成功,第二种java命令会有问题,但最终成功。
第二种方法方法细节:
一、使用如下命令格式,但是中途出现一些问题
java -classpath E:/Weka-3-6/jars/RmiJdbc.jar -jar weka.jar
依然报5个错误,如下图。
查询相关知识,java的此classpath命令会被-jar屏蔽掉,意思就是说如果java命令里有-jar参数,则会自动屏蔽-classpath添加参数
二、我们尝试修改指令
java -Xbootclasspath/a:/E:/Weka-3-6/jars/Rmijdbc.jar: -jar Weka.jar
运行后发现少了一个错误,我们添加的是Rmijdbc驱动包,减少的错误恰好是RJDriverError,说明我们的目前指令成功,如果需要添加多个jar包,则在路径后面使用分号,逐步添加五个jar包。不要企图使用目录,使用目录仍然不识别。所以添加五个jar包的java指令确实很长。唯一欣慰的是,指令最后成功了,没有错误。不过请注意一点:由上述的分析我们知道它只是不报驱动错误了,以后我们使用数据库,它无法读取识别数据库的类型又是另外一码事。(下面有两张图,第一个图第一个指令是展示企图使用目录添加classpath是不正确的,第一个图第二个指令表明添加具体某一个jar包,成功减少了错误。第二个图第二个指令,一口气写了五个jar包,最后是成功的零错误,正确通过!。)
(三)WEKA使用的准备工作
WEKA数据格式中的数据属性
-
数据格式中的数据属性
1)二元属性(定性的)
二元属性的英文为"binary attribute",比较好理解。可以认为它是一种特殊的标称属性,只有两个类别或状态:0或1,其中0通常表示该属性不出现,而1表示出现。二元属性又称布尔属性,如果两种状态对应于true和false的话。
2)标称属性(定性的)
标称属性的英文为"nominal attribute",有时候感到不好理解。标称属性值既不是具有有意义的顺序,也不是定量的。每个值代表某种类别、编码或状态,因此标称属性又被看做是分类的(categorical),所以有时候看到顾客的ID或者鞋码尺寸SIZE等,总会误认为是序号属性。所以标称属性要抓住核心概念:标称只是一种分类,即标称数值的数学运算毫无意义。顾客ID有时候会是数值属性,但注意应用的时候,如果顾客ID之间的数值加减乘除没有任何意义,则我们不认为它是数值属性,认为其为标称属性更为恰当。以年龄为例,年龄之间常常涉及到加减,所以年龄总认为是数值属性,鞋码大小不太涉及到加减意义,故认为标称的。
3)数值属性(定量的)
数值属性的英文为"numericattribute",它是定量的,它是可度量的量。抓住这个概念,也就是说它的数值是有意义的,可以参与加减乘除运算的,其值进行数学运算的结果常常是有意义的。
4)序数属性(定性的)
序数属性的英文单词为"ordinal attribute",也是不太好理解的一个属性。但是切记序数属性可以通过数值属性离散化得到,并且序数属性往往携带一种重要意义,就是具有有意义的先后次序。以快餐店售卖可乐大小杯为例,0表示小杯,1表示中杯,2表示大杯。它们既可以认为是序数属性,也可以认为是间接的标称属性。或以顾客满意度调查为例,0是很不满意,1是不太满意,2是一般,3是满意,4是非常满意。
WEKA数据集格式属性
-
数据集格式问题
WEKA可识别ARFF格式,也可识别CSV电子数据表格式。虽然我们知道WEKA-Explorer对于两者格式都能够读取,但对于CSV格式与ARFF格式比较感兴趣。
1)CSV和ARFF格式
这里写出CSV的格式,以weather.csv为例,其内容如下表所示。至于其arff格式的规范,我们通过看后续部分,就发现两者实际上通过手动改写。ARFF格式实际上就是统计了CSV格式的属性分类,并加强规范。
outlook,temperature,humidity,windy,play sunny,85,85,FALSE,no sunny,80,90,TRUE,no overcast,83,86,FALSE,yes rainy,70,96,FALSE,yes rainy,68,80,FALSE,yes rainy,65,70,TRUE,no overcast,64,65,TRUE,yes sunny,72,95,FALSE,no sunny,69,70,FALSE,yes rainy,75,80,FALSE,yes sunny,75,70,TRUE,yes overcast,72,90,TRUE,yes overcast,81,75,FALSE,yes rainy,71,91,TRUE,no |
2)两者转化
一、我们知道WEKA读取时会自动转化
二、如果需要人为干预,需要处理两个格式的内容,那么这就是比较有意思的事情了
ARFF文件是Weka默认的储存数据集文件。每个ARFF文件对应一个二维表格。表格的各行是数据集的各实例,各列是数据集的各个属性。
下面是Weka自带的"weather.arff"文件,在Weka安装目录的"data"子目录下可以找到。 需要注意的是,在Windows记事本打开这个文件时,可能会因为回车符定义不一致而导致分行不正常。推荐使用UltraEdit这样的字符编辑软件察看ARFF文件的内容。
%ARFF file for the weather data with some numric features % @relation weather @attribute outlook {sunny, overcast, rainy} @attribute temperature real @attribute humidity real @attribute windy {TRUE, FALSE} @attribute play {yes, no} @data % % 14 instances % sunny,85,85,FALSE,no sunny,80,90,TRUE,no overcast,83,86,FALSE,yes rainy,70,96,FALSE,yes rainy,68,80,FALSE,yes rainy,65,70,TRUE,no overcast,64,65,TRUE,yes sunny,72,95,FALSE,no sunny,69,70,FALSE,yes rainy,75,80,FALSE,yes sunny,75,70,TRUE,yes overcast,72,90,TRUE,yes overcast,81,75,FALSE,yes rainy,71,91,TRUE,no |
识别ARFF文件的重要依据是分行,因此不能在这种文件里随意的断行。空行(或全是空格的行)将被忽略。
以"%"开始的行是注释,WEKA将忽略这些行。如果你看到的"weather.arff"文件多了或少了些"%"开始的行,是没有影响的。
除去注释后,整个ARFF文件可以分为两个部分。第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。第二部分给出了数据信息(Data information),即数据集中给出的数据。虽然Weka也支持其他一些格式的文件,但是ARFF格式是支持的最好的。因此有必要在数据处理之前把CSV数据集的格式转换成ARFF。
将CSV转换为ARFF最迅捷的办法是使用WEKA所带的命令行工具。运行WEKA的主程序,在菜单中找到"Simple CLI"模块,它可提供命令行功能。在新窗口的最下方(上方是不能写字的)的输入框写上
java weka.core.converters.CSVLoader filename.csv > filename.arff
即可完成转换。
在WEKA 3.6中提供了一个"Arff Viewer"模块(在Tools里),我们可以用它打开一个CSV文件将进行浏览,然后另存为ARFF文件。 进入"Exploer"模块,从上方的按钮中打开CSV文件然后另存为ARFF文件亦可。
Excel的XLS文件可以让多个二维表格放到不同的工作表(Sheet)中,我们只能把每个工作表存成不同的CSV文件。打开一个XLS文件并切换到需要转换的工作表,另存为CSV类型,点"确定"、"是"忽略提示即可完成操作。接下来把得到的CSV文件按照前述步骤转换为ARFF即可。
WEKA分类挖掘的评估标准
-
分类挖掘算法的评估性能标准
Confusion Matrix是混淆矩阵,提供的评估标准,如下表所示。
Predicted |
C1 |
¬ C1 |
ALL |
|
Actual |
C1 |
True Positives (TP) |
False Negatives (FN) |
P |
¬ C1 |
False Positives (FP) |
True Negatives (TN) |
N |
1)TP/FN/FP/TN
对于C1事件来说,可将其看成事件中的正面事件,或称为真事件,或称为阳事件。由于预测结果为C1事件,既然结果为阳事件,正事件。说明实际过程可能由正到正,由负到正,都可成为真正,假正,说明预测都是正的。故TP可称为判正得正或真阳率或真正率,FP则为判负为正或假阳率或假正率。同理FN可推理成为判正得负或真阴率或真反率,TN顺理为判负得负或真阴率或假反率。
2)各评估率
准确率(识别率)
召回率(灵敏度)
精度
3)ROC曲线
反映的是分类器的真正例率(TPR,灵敏度)和假正例率(FPR)之间的权衡,简而言之就说观察"真判正"占据"判真"的比率。如下图所示。
WEKA软件Explorer之Classifier
-
Classifier菜单面板区域模块介绍
1)Classifier
点击choose按钮,可以选择weka提供的分类器。常用的分类器有: