目錄
1. 簡(jiǎn)介 頂樓
2. 數(shù)據(jù)格式 頂樓
3.數(shù)據(jù)準(zhǔn)備 1樓
4. 關(guān)聯(lián)規(guī)則(購(gòu)物籃分析) 1樓
5. 分類與回歸 2樓
6. 聚類分析 2樓
1. 簡(jiǎn)介
WEKA的全名是懷卡托智能分析環(huán)境(Waikato Environment for Knowledge Analysis),它的源代碼可通過(guò)
http://www.cs.waikato.ac.nz/ml/weka得到。同時(shí)weka也是新西蘭的一種鳥名,而WEKA的主要開發(fā)者來(lái)自新西蘭。
WEKA作為一個(gè)公開的數(shù)據(jù)挖掘工作平臺(tái),集合了大量能承擔(dān)數(shù)據(jù)挖掘任務(wù)的機(jī)器學(xué)習(xí)算法,包括對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,分類,回歸、聚類、關(guān)聯(lián)規(guī)則以及在新的交互式界面上的可視化。
如果想自己實(shí)現(xiàn)數(shù)據(jù)挖掘算法的話,可以看一看weka的接口文檔。在weka中集成自己的算法甚至借鑒它的方法自己實(shí)現(xiàn)可視化工具并不是件很困難的事情。
2005年8月,在第11屆ACM SIGKDD國(guó)際會(huì)議上,懷卡托大學(xué)的Weka小組榮獲了數(shù)據(jù)挖掘和知識(shí)探索領(lǐng)域的最高服務(wù)獎(jiǎng),Weka系統(tǒng)得到了廣泛的認(rèn)可,被譽(yù)為數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)歷史上的里程碑,是現(xiàn)今最完備的數(shù)據(jù)挖掘工具之一(已有11年的發(fā)展歷史)。Weka的每月下載次數(shù)已超過(guò)萬(wàn)次。
--整理自
http://www.china-pub.com/computers/common/info.asp?id=29304
2. 數(shù)據(jù)格式
巧婦難為無(wú)米之炊。首先我們來(lái)看看WEKA所用的數(shù)據(jù)應(yīng)是什么樣的格式。
跟很多電子表格或數(shù)據(jù)分析軟件一樣,WEKA所處理的數(shù)據(jù)集是圖1那樣的一個(gè)二維的表格。
圖1
新窗口打開
這里我們要介紹一下WEKA中的術(shù)語(yǔ)。表格里的一個(gè)橫行稱作一個(gè)實(shí)例(Instance),相當(dāng)于統(tǒng)計(jì)學(xué)中的一個(gè)樣本,或者數(shù)據(jù)庫(kù)中的一條記錄。豎行稱作一個(gè)屬性(Attrbute),相當(dāng)于統(tǒng)計(jì)學(xué)中的一個(gè)變量,或者數(shù)據(jù)庫(kù)中的一個(gè)字段。這樣一個(gè)表格,或者叫數(shù)據(jù)集,在WEKA看來(lái),呈現(xiàn)了屬性之間的一種關(guān)系(Relation)。圖1中一共有14個(gè)實(shí)例,5個(gè)屬性,關(guān)系名稱為“weather”。
WEKA存儲(chǔ)數(shù)據(jù)的格式是ARFF(Attribute-Relation File Format)文件,這是一種ASCII文本文件。圖1所示的二維表格存儲(chǔ)在如下的ARFF文件中。這也就是WEKA自帶的“weather.arff”文件,在WEKA安裝目錄的“data”子目錄下可以找到。
代碼:
% 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
需要注意的是,在Windows記事本打開這個(gè)文件時(shí),可能會(huì)因?yàn)榛剀嚪x不一致而導(dǎo)致分行不正常。推薦使用UltraEdit這樣的字符編輯軟件察看ARFF文件的內(nèi)容。
下面我們來(lái)對(duì)這個(gè)文件的內(nèi)容進(jìn)行說(shuō)明。
識(shí)別ARFF文件的重要依據(jù)是分行,因此不能在這種文件里隨意的斷行。空行(或全是空格的行)將被忽略。
以“%”開始的行是注釋,WEKA將忽略這些行。如果你看到的“weather.arff”文件多了或少了些“%”開始的行,是沒(méi)有影響的。
除去注釋后,整個(gè)ARFF文件可以分為兩個(gè)部分。第一部分給出了頭信息(Head information),包括了對(duì)關(guān)系的聲明和對(duì)屬性的聲明。第二部分給出了數(shù)據(jù)信息(Data information),即數(shù)據(jù)集中給出的數(shù)據(jù)。從“@data”標(biāo)記開始,后面的就是數(shù)據(jù)信息了。
關(guān)系聲明
關(guān)系名稱在ARFF文件的第一個(gè)有效行來(lái)定義,格式為
@relation <relation-name>
<relation-name>是一個(gè)字符串。如果這個(gè)字符串包含空格,它必須加上引號(hào)(指英文標(biāo)點(diǎn)的單引號(hào)或雙引號(hào))。
屬性聲明
屬性聲明用一列以“@attribute”開頭的語(yǔ)句表示。數(shù)據(jù)集中的每一個(gè)屬性都有它對(duì)應(yīng)的“@attribute”語(yǔ)句,來(lái)定義它的屬性名稱和數(shù)據(jù)類型。
這些聲明語(yǔ)句的順序很重要。首先它表明了該項(xiàng)屬性在數(shù)據(jù)部分的位置。例如,“humidity”是第三個(gè)被聲明的屬性,這說(shuō)明數(shù)據(jù)部分那些被逗號(hào)分開的列中,第三列數(shù)據(jù) 85 90 86 96 ... 是相應(yīng)的“humidity”值。其次,最后一個(gè)聲明的屬性被稱作class屬性,在分類或回歸任務(wù)中,它是默認(rèn)的目標(biāo)變量。
屬性聲明的格式為
@attribute <attribute-name> <datatype>
其中<attribute-name>是必須以字母開頭的字符串。和關(guān)系名稱一樣,如果這個(gè)字符串包含空格,它必須加上引號(hào)。
WEKA支持的<datatype>有四種,分別是
numeric-------------------------數(shù)值型
<nominal-specification>-----分類(nominal)型
string----------------------------字符串型
date [<date-format>]--------日期和時(shí)間型
其中<nominal-specification> 和<date-format> 將在下面說(shuō)明。還可以使用兩個(gè)類型“integer”和“real”,但是WEKA把它們都當(dāng)作“numeric”看待。注意“integer”,“real”,“numeric”,“date”,“string”這些關(guān)鍵字是區(qū)分大小寫的,而“relation”“attribute ”和“date”則不區(qū)分。
數(shù)值屬性
數(shù)值型屬性可以是整數(shù)或者實(shí)數(shù),但WEKA把它們都當(dāng)作實(shí)數(shù)看待。
分類屬性
分類屬性由<nominal-specification>列出一系列可能的類別名稱并放在花括號(hào)中:{<nominal-name1>, <nominal-name2>, <nominal-name3>, ...} 。數(shù)據(jù)集中該屬性的值只能是其中一種類別。
例如如下的屬性聲明說(shuō)明“outlook”屬性有三種類別:“sunny”,“ overcast”和“rainy”。而數(shù)據(jù)集中每個(gè)實(shí)例對(duì)應(yīng)的“outlook”值必是這三者之一。
@attribute outlook {sunny, overcast, rainy}
如果類別名稱帶有空格,仍需要將之放入引號(hào)中。
字符串屬性
字符串屬性中可以包含任意的文本。這種類型的屬性在文本挖掘中非常有用。
示例:
@ATTRIBUTE LCC string
日期和時(shí)間屬性
日期和時(shí)間屬性統(tǒng)一用“date”類型表示,它的格式是
@attribute <name> date [<date-format>]
其中<name>是這個(gè)屬性的名稱,<date-format>是一個(gè)字符串,來(lái)規(guī)定該怎樣解析和顯示日期或時(shí)間的格式,默認(rèn)的字符串是ISO-8601所給的日期時(shí)間組合格式“
yyyy-MM-ddT
HH:mm:ss”。
數(shù)據(jù)信息部分表達(dá)日期的字符串必須符合聲明中規(guī)定的格式要求(下文有例子)。
數(shù)據(jù)信息
數(shù)據(jù)信息中“@data”標(biāo)記獨(dú)占一行,剩下的是各個(gè)實(shí)例的數(shù)據(jù)。
每個(gè)實(shí)例占一行。實(shí)例的各屬性值用逗號(hào)“,”隔開。如果某個(gè)屬性的值是缺失值(missing value),用問(wèn)號(hào)“?”表示,且這個(gè)問(wèn)號(hào)不能省略。例如:
@data
sunny,85,85,FALSE,no
?,78,90,?,yes
字符串屬性和分類屬性的值是區(qū)分大小寫的。若值中含有空格,必須被引號(hào)括起來(lái)。例如:
@relation LCCvsLCSH
@attribute LCC string
@attribute LCSH string
@data
AG5, 'Encyclopedias and dictionaries.;Twentieth century.'
AS262, 'Science -- Soviet Union -- History.'
日期屬性的值必須與屬性聲明中給定的相一致。例如:
@RELATION Timestamps
@ATTRIBUTE timestamp DATE "yyyy-MM-dd HH:mm:ss"
@DATA
"2001-04-03 12:12:12"
"2001-05-03 12:59:55"
稀疏數(shù)據(jù)
有的時(shí)候數(shù)據(jù)集中含有大量的0值(比如購(gòu)物籃分析),這個(gè)時(shí)候用稀疏格式的數(shù)據(jù)存貯更加省空間。
稀疏格式是針對(duì)數(shù)據(jù)信息中某個(gè)實(shí)例的表示而言,不需要修改ARFF文件的其它部分。看如下的數(shù)據(jù):
@data
0, X, 0, Y, "class A"
0, 0, W, 0, "class B"
用稀疏格式表達(dá)的話就是
@data
{1 X, 3 Y, 4 "class A"}
{2 W, 4 "class B"}
每個(gè)實(shí)例用花括號(hào)括起來(lái)。實(shí)例中每一個(gè)非0的屬性值用<index> <空格> <value>表示。<index>是屬性的序號(hào),從0開始計(jì);<value>是屬性值。屬性值之間仍用逗號(hào)隔開。這里每個(gè)實(shí)例的數(shù)值必須按屬性的順序來(lái)寫,如
{1 X, 3 Y, 4 "class A"},不能寫成
{3 Y, 1 X, 4 "class A"}。
注意在稀疏格式中沒(méi)有注明的屬性值不是缺失值,而是0值。若要表示缺失值必須顯式的用問(wèn)號(hào)表示出來(lái)。
Relational型屬性
在WEKA 3.5版中增加了一種屬性類型叫做Relational,有了這種類型我們可以像關(guān)系型數(shù)據(jù)庫(kù)那樣處理多個(gè)維度了。但是這種類型目前還不見廣泛應(yīng)用,暫不作介紹。
--整理自
http://www.cs.waikato.ac.nz/~ml/weka/arff.html 和
http://weka.sourceforge.net/wekadoc/index.php/en:ARFF_%283.5.3%29
3.數(shù)據(jù)準(zhǔn)備
使用WEKA作數(shù)據(jù)挖掘,面臨的第一個(gè)問(wèn)題往往是我們的數(shù)據(jù)不是ARFF格式的。幸好,WEKA還提供了對(duì)CSV文件的支持,而這種格式是被很多其他軟件所支持的。此外,WEKA還提供了通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的功能。
在這一節(jié)里,我們先以Excel和Matlab為例,說(shuō)明如何獲得CSV文件。然后我們將知道CSV文件如何轉(zhuǎn)化成ARFF文件,畢竟后者才是WEKA支持得最好的文件格式。面對(duì)一個(gè)ARFF文件,我們?nèi)杂幸恍╊A(yù)處理要做,才能進(jìn)行挖掘任務(wù)。
.* -> .csv
我們給出一個(gè)CSV文件的例子(
bank-data.csv)。用UltraEdit打開它可以看到,這種格式也是一種逗號(hào)分割數(shù)據(jù)的文本文件,儲(chǔ)存了一個(gè)二維表格。
Excel的XLS文件可以讓多個(gè)二維表格放到不同的工作表(Sheet)中,我們只能把每個(gè)工作表存成不同的CSV文件。打開一個(gè)XLS文件并切換到需要轉(zhuǎn)換的工作表,另存為CSV類型,點(diǎn)“確定”、“是”忽略提示即可完成操作。
在Matlab中的二維表格是一個(gè)矩陣,我們通過(guò)這條命令把一個(gè)矩陣存成CSV格式。
csvwrite('filename',matrixname)
需要注意的是,Matllab給出的CSV文件往往沒(méi)有屬性名(Excel給出的也有可能沒(méi)有)。而WEKA必須從CSV文件的第一行讀取屬性名,否則就會(huì)把第一行的各屬性值讀成變量名。因此我們對(duì)于Matllab給出的CSV文件需要用UltraEdit打開,手工添加一行屬性名。注意屬性名的個(gè)數(shù)要跟數(shù)據(jù)屬性的個(gè)數(shù)一致,仍用逗號(hào)隔開。
.csv -> .arff
將CSV轉(zhuǎn)換為ARFF最迅捷的辦法是使用WEKA所帶的命令行工具。
運(yùn)行WEKA的主程序,出現(xiàn)GUI后可以點(diǎn)擊下方按鈕進(jìn)入相應(yīng)的模塊。我們點(diǎn)擊進(jìn)入“Simple CLI”模塊提供的命令行功能。在新窗口的最下方(上方是不能寫字的)輸入框?qū)懮?
java weka.core.converters.CSVLoader filename.csv > filename.arff
即可完成轉(zhuǎn)換。
在WEKA 3.5中提供了一個(gè)“Arff Viewer”模塊,我們可以用它打開一個(gè)CSV文件將進(jìn)行瀏覽,然后另存為ARFF文件。
進(jìn)入“Exploer”模塊,從上方的按鈕中打開CSV文件然后另存為ARFF文件亦可。
“Exploer”界面
我們應(yīng)該注意到,“Exploer”還提供了很多功能,實(shí)際上可以說(shuō)這是WEKA使用最多的模塊。現(xiàn)在我們先來(lái)熟悉它的界面,然后利用它對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。
圖2
新窗口打開
圖2顯示的是使用3.5版"Exploer"打開"bank-data.csv"的情況。我們根據(jù)不同的功能把這個(gè)界面分成8個(gè)區(qū)域。
區(qū)域1的幾個(gè)選項(xiàng)卡是用來(lái)切換不同的挖掘任務(wù)面板。這一節(jié)用到的只有“Preprocess”,其他面板的功能將在以后介紹。
區(qū)域2是一些常用按鈕。包括打開數(shù)據(jù),保存及編輯功能。我們?cè)谶@里把"bank-data.csv"另存為"bank-data.arff"。
在區(qū)域3中“Choose”某個(gè)“Filter”,可以實(shí)現(xiàn)篩選數(shù)據(jù)或者對(duì)數(shù)據(jù)進(jìn)行某種變換。數(shù)據(jù)預(yù)處理主要就利用它來(lái)實(shí)現(xiàn)。
區(qū)域4展示了數(shù)據(jù)集的一些基本情況。
區(qū)域5中列出了數(shù)據(jù)集的所有屬性。勾選一些屬性并“Remove”就可以刪除它們,刪除后還可以利用區(qū)域2的“Undo”按鈕找回。區(qū)域5上方的一排按鈕是用來(lái)實(shí)現(xiàn)快速勾選的。
在區(qū)域5中選中某個(gè)屬性,則區(qū)域6中有關(guān)于這個(gè)屬性的摘要。注意對(duì)于數(shù)值屬性和分類屬性,摘要的方式是不一樣的。圖中顯示的是對(duì)數(shù)值屬性“income”的摘要。
區(qū)域7是區(qū)域5中選中屬性的直方圖。若數(shù)據(jù)集的最后一個(gè)屬性(我們說(shuō)過(guò)這是分類或回歸任務(wù)的默認(rèn)目標(biāo)變量)是分類變量(這里的“pep”正好是),直方圖中的每個(gè)長(zhǎng)方形就會(huì)按照該變量的比例分成不同顏色的段。要想換個(gè)分段的依據(jù),在區(qū)域7上方的下拉框中選個(gè)不同的分類屬性就可以了。下拉框里選上“No Class”或者一個(gè)數(shù)值屬性會(huì)變成黑白的直方圖。
區(qū)域8是狀態(tài)欄,可以查看Log以判斷是否有錯(cuò)。右邊的weka鳥在動(dòng)的話說(shuō)明WEKA正在執(zhí)行挖掘任務(wù)。右鍵點(diǎn)擊狀態(tài)欄還可以執(zhí)行JAVA內(nèi)存的垃圾回收。
預(yù)處理
bank-data數(shù)據(jù)各屬性的含義如下:
id a unique identification number
age age of customer in years (numeric)
sex MALE / FEMALE
region inner_city/rural/suburban/town
income income of customer (numeric)
married is the customer married (YES/NO)
children number of children (numeric)
car does the customer own a car (YES/NO)
save_acct does the customer have a saving account (YES/NO)
current_acct does the customer have a current account (YES/NO)
mortgage does the customer have a mortgage (YES/NO)
pep did the customer buy a PEP (Personal Equity Plan) after the last mailing (YES/NO)
通常對(duì)于數(shù)據(jù)挖掘任務(wù)來(lái)說(shuō),ID這樣的信息是無(wú)用的,我們將之刪除。在區(qū)域5勾選屬性“id”,并點(diǎn)擊“Remove”。將新的數(shù)據(jù)集保存一次,并用UltraEdit打開這個(gè)ARFF文件。我們發(fā)現(xiàn),在屬性聲明部分,WEKA已經(jīng)為每個(gè)屬性選好了合適的類型。
我們知道,有些算法,只能處理所有的屬性都是分類型的情況。這時(shí)候我們就需要對(duì)數(shù)值型的屬性進(jìn)行離散化。在這個(gè)數(shù)據(jù)集中有3個(gè)變量是數(shù)值型的,分別是“age”,“income”和“children”。
其中“children”只有4個(gè)取值:0,1,2,3。這時(shí)我們?cè)赨ltraEdit中直接修改ARFF文件,把
@attribute children numeric
改為
@attribute children {0,1,2,3}
就可以了。
在“Explorer”中重新打開“bank-data.arff”,看看選中“children”屬性后,區(qū)域6那里顯示的“Type”是不是變成“Nominal”了?
“age”和“income”的離散化我們需要借助WEKA中名為“Discretize”的Filter來(lái)完成。在區(qū)域2中點(diǎn)“Choose”,出現(xiàn)一棵“Filter樹”,逐級(jí)找到“weka.filters.unsupervised.attribute.Discretize”,點(diǎn)擊。若無(wú)法關(guān)閉這個(gè)樹,在樹之外的地方點(diǎn)擊“Explorer”面板即可。
現(xiàn)在“Choose”旁邊的文本框應(yīng)該顯示“Discretize -B 10 -M -0.1 -R first-last”。 點(diǎn)擊這個(gè)文本框會(huì)彈出新窗口以修改離散化的參數(shù)。
我們不打算對(duì)所有的屬性離散化,只是針對(duì)對(duì)第1個(gè)和第4個(gè)屬性(見區(qū)域5屬性名左邊的數(shù)字),故把a(bǔ)ttributeIndices右邊改成“1,4”。計(jì)劃把這兩個(gè)屬性都分成3段,于是把“bins”改成“3”。其它框里不用更改,關(guān)于它們的意思可以點(diǎn)“More”查看。點(diǎn)“OK”回到“Explorer”,可以看到“age”和“income”已經(jīng)被離散化成分類型的屬性。若想放棄離散化可以點(diǎn)區(qū)域2的“Undo”。
如果對(duì)“"(-inf-34.333333]"”這樣晦澀的標(biāo)識(shí)不滿,我們可以用UltraEdit打開保存后的ARFF文件,把所有的“'\'(-inf-34.333333]\''”替換成“0_34”。其它標(biāo)識(shí)做類似地手動(dòng)替換。
經(jīng)過(guò)上述操作得到的數(shù)據(jù)集我們保存為
bank-data-final.arff。
----整理自
http://maya.cs.depaul.edu/~classes/ect584/WEKA/preprocess.html
4. 關(guān)聯(lián)規(guī)則(購(gòu)物籃分析)
注意:目前,WEKA的關(guān)聯(lián)規(guī)則分析功能僅能用來(lái)作示范,不適合用來(lái)挖掘大型數(shù)據(jù)集。
我們打算對(duì)前面的“bank-data”數(shù)據(jù)作關(guān)聯(lián)規(guī)則的分析。用“Explorer”打開“bank-data-final.arff”后,切換到“Associate”選項(xiàng)卡。默認(rèn)關(guān)聯(lián)規(guī)則分析是用Apriori算法,我們就用這個(gè)算法,但是點(diǎn)“Choose”右邊的文本框修改默認(rèn)的參數(shù),彈出的窗口中點(diǎn)“More”可以看到各參數(shù)的說(shuō)明。
背景知識(shí)
首先我們來(lái)溫習(xí)一下Apriori的有關(guān)知識(shí)。對(duì)于一條關(guān)聯(lián)規(guī)則L->R,我們常用支持度(Support)和置信度(Confidence)來(lái)衡量它的重要性。規(guī)則的支持度是用來(lái)估計(jì)在一個(gè)購(gòu)物籃中同時(shí)觀察到L和R的概率
P(L,R),而規(guī)則的置信度是估計(jì)購(gòu)物欄中出現(xiàn)了L時(shí)也出會(huì)現(xiàn)R的條件概率
P(R|L)。關(guān)聯(lián)規(guī)則的目標(biāo)一般是產(chǎn)生支持度和置信度都較高的規(guī)則。
有幾個(gè)類似的度量代替置信度來(lái)衡量規(guī)則的關(guān)聯(lián)程度,它們分別是
Lift(提升度?):
P(L,R)/(P(L)P(R))
Lift=1時(shí)表示L和R獨(dú)立。這個(gè)數(shù)越大,越表明L和R存在在一個(gè)購(gòu)物籃中不是偶然現(xiàn)象。
Leverage(不知道怎么翻譯):
P(L,R)-P(L)P(R)
它和Lift的含義差不多。Leverage=0時(shí)L和R獨(dú)立,Leverage越大L和R的關(guān)系越密切。
Conviction(更不知道譯了):
P(L)P(!R)/P(L,!R) (!R表示R沒(méi)有發(fā)生)
Conviction也是用來(lái)衡量L和R的獨(dú)立性。從它和lift的關(guān)系(對(duì)R取反,代入Lift公式后求倒數(shù))可以看出,我們也希望這個(gè)值越大越好。
值得注意的是,用Lift和Leverage作標(biāo)準(zhǔn)時(shí),L和R是對(duì)稱的,Confidence和Conviction則不然。
參數(shù)設(shè)置
現(xiàn)在我們計(jì)劃挖掘出支持度在10%到100%之間,并且lift值超過(guò)1.5且lift值排在前100位的那些關(guān)聯(lián)規(guī)則。我們把“lowerBoundMinSupport”和“upperBoundMinSupport”分別設(shè)為0.1和1,“metricType”設(shè)為lift,“minMetric”設(shè)為1.5,“numRules”設(shè)為100。其他選項(xiàng)保持默認(rèn)即可。“OK” 之后在“Explorer”中點(diǎn)擊“Start”開始運(yùn)行算法,在右邊窗口顯示數(shù)據(jù)集摘要和挖掘結(jié)果。
下面是挖掘出來(lái)的lift排前5的規(guī)則。
Best rules found:
1. age=52_max save_act=YES current_act=YES 113 ==> income=43759_max 61 conf:(0.54) < lift:(4.05)> lev:(0.08) [45] conv:(1.85)
2. income=43759_max 80 ==> age=52_max save_act=YES current_act=YES 61 conf:(0.76) < lift:(4.05)> lev:(0.08) [45] conv:(3.25)
3. income=43759_max current_act=YES 63 ==> age=52_max save_act=YES 61 conf:(0.97) < lift:(3.85)> lev:(0.08) [45] conv:(15.72)
4. age=52_max save_act=YES 151 ==> income=43759_max current_act=YES 61 conf:(0.4) < lift:(3.85)> lev:(0.08) [45] conv:(1.49)
5. age=52_max save_act=YES 151 ==> income=43759_max 76 conf:(0.5) < lift:(3.77)> lev:(0.09) [55] conv:(1.72)
對(duì)于挖掘出的每條規(guī)則,WEKA列出了它們關(guān)聯(lián)程度的四項(xiàng)指標(biāo)。
命令行方式
我們也可以利用命令行來(lái)完成挖掘任務(wù),在“Simlpe CLI”模塊中輸入如下格式的命令:
java weka.associations.Apriori options -t directory-path\bank-data-final.arff
即可完成Apriori算法。注意,“-t”參數(shù)后的文件路徑中不能含有空格。
在前面我們使用的option為
-N 100 -T 1 -C 1.5 -D 0.05 -U 1.0 -M 0.1 -S -1.0 命令行中使用這些參數(shù)得到的結(jié)果和前面利用GUI得到的一樣。
我們還可以加上“- I”參數(shù),得到不同項(xiàng)數(shù)的頻繁項(xiàng)集。我用的命令如下:
java weka.associations.Apriori -N 100 -T 1 -C 1.5 -D 0.05 -U 1.0 -M 0.1 -S -1.0 -I -t d:\weka\bank-data-final.arff
挖掘結(jié)果在上方顯示,應(yīng)是
這個(gè)文件的樣子。
----整理自
http://maya.cs.depaul.edu/~classes/ect584/WEKA/associate.html
5. 分類與回歸
背景知識(shí)
WEKA把分類(Classification)和回歸(Regression)都放在“Classify”選項(xiàng)卡中,這是有原因的。
在這兩個(gè)任務(wù)中,都有一個(gè)目標(biāo)屬性(輸出變量)。我們希望根據(jù)一個(gè)樣本(WEKA中稱作實(shí)例)的一組特征(輸入變量),對(duì)目標(biāo)進(jìn)行預(yù)測(cè)。為了實(shí)現(xiàn)這一目的,我們需要有一個(gè)訓(xùn)練數(shù)據(jù)集,這個(gè)數(shù)據(jù)集中每個(gè)實(shí)例的輸入和輸出都是已知的。觀察訓(xùn)練集中的實(shí)例,可以建立起預(yù)測(cè)的模型。有了這個(gè)模型,我們就可以新的輸出未知的實(shí)例進(jìn)行預(yù)測(cè)了。衡量模型的好壞就在于預(yù)測(cè)的準(zhǔn)確程度。
在WEKA中,待預(yù)測(cè)的目標(biāo)(輸出)被稱作Class屬性,這應(yīng)該是來(lái)自分類任務(wù)的“類”。一般的,若Class屬性是分類型時(shí)我們的任務(wù)才叫分類,Class屬性是數(shù)值型時(shí)我們的任務(wù)叫回歸。
選擇算法
這一節(jié)中,我們使用C4.5決策樹算法對(duì)bank-data建立起分類模型。
我們來(lái)看原來(lái)的“
bank-data.csv”文件。“ID”屬性肯定是不需要的。由于C4.5算法可以處理數(shù)值型的屬性,我們不用像前面用關(guān)聯(lián)規(guī)則那樣把每個(gè)變量都離散化成分類型。盡管如此,我們還是把“Children”屬性轉(zhuǎn)換成分類型的兩個(gè)值“YES”和“NO”。另外,我們的訓(xùn)練集僅取原來(lái)數(shù)據(jù)集實(shí)例的一半;而從另外一半中抽出若干條作為待預(yù)測(cè)的實(shí)例,它們的“pep”屬性都設(shè)為缺失值。經(jīng)過(guò)了這些處理的訓(xùn)練集數(shù)據(jù)在
這里下載;待預(yù)測(cè)集數(shù)據(jù)在
這里下載。
我們用“Explorer”打開訓(xùn)練集“bank.arff”,觀察一下它是不是按照前面的要求處理好了。切換到“Classify”選項(xiàng)卡,點(diǎn)擊“Choose”按鈕后可以看到很多分類或者回歸的算法分門別類的列在一個(gè)樹型框里。3.5版的WEKA中,樹型框下方有一個(gè)“Filter...”按鈕,點(diǎn)擊可以根據(jù)數(shù)據(jù)集的特性過(guò)濾掉不合適的算法。我們數(shù)據(jù)集的輸入屬性中有“Binary”型(即只有兩個(gè)類的分類型)和數(shù)值型的屬性,而Class變量是“Binary”的;于是我們勾選“Binary attributes”“Numeric attributes”和“Binary class”。點(diǎn)“OK”后回到樹形圖,可以發(fā)現(xiàn)一些算法名稱變紅了,說(shuō)明它們不能用。選擇“trees”下的“J48”,這就是我們需要的C4.5算法,還好它沒(méi)有變紅。
點(diǎn)擊“Choose”右邊的文本框,彈出新窗口為該算法設(shè)置各種參數(shù)。點(diǎn)“More”查看參數(shù)說(shuō)明,點(diǎn)“Capabilities”是查看算法適用范圍。這里我們把參數(shù)保持默認(rèn)。
現(xiàn)在來(lái)看左中的“Test Option”。我們沒(méi)有專門設(shè)置檢驗(yàn)數(shù)據(jù)集,為了保證生成的模型的準(zhǔn)確性而不至于出現(xiàn)過(guò)擬合(overfitting)的現(xiàn)象,我們有必要采用10折交叉驗(yàn)證(10-fold cross validation)來(lái)選擇和評(píng)估模型。若不明白交叉驗(yàn)證的含義可以
Google一下。
建模結(jié)果
OK,選上“Cross-validation”并在“Folds”框填上“10”。點(diǎn)“Start”按鈕開始讓算法生成決策樹模型。很快,用文本表示的一棵決策樹,以及對(duì)這個(gè)決策樹的誤差分析等等結(jié)果出現(xiàn)在右邊的“Classifier output”中。同時(shí)左下的“Results list”出現(xiàn)了一個(gè)項(xiàng)目顯示剛才的時(shí)間和算法名稱。如果換一個(gè)模型或者換個(gè)參數(shù),重新“Start”一次,則“Results list”又會(huì)多出一項(xiàng)。
我們看到“J48”算法交叉驗(yàn)證的結(jié)果之一為
Correctly Classified Instances 206 68.6667 %
也就是說(shuō)這個(gè)模型的準(zhǔn)確度只有69%左右。也許我們需要對(duì)原屬性進(jìn)行處理,或者修改算法的參數(shù)來(lái)提高準(zhǔn)確度。但這里我們不管它,繼續(xù)用這個(gè)模型。
右鍵點(diǎn)擊“Results list”剛才出現(xiàn)的那一項(xiàng),彈出菜單中選擇“Visualize tree”,新窗口里可以看到圖形模式的決策樹。建議把這個(gè)新窗口最大化,然后點(diǎn)右鍵,選“Fit to screen”,可以把這個(gè)樹看清楚些。看完后截圖或者關(guān)掉:P
這里我們解釋一下“Confusion Matrix”的含義。
=== Confusion Matrix ===
a b <-- classified as
74 64 | a = YES
30 132 | b = NO
這個(gè)矩陣是說(shuō),原本“pep”是“YES”的實(shí)例,有74個(gè)被正確的預(yù)測(cè)為“YES”,有64個(gè)錯(cuò)誤的預(yù)測(cè)成了“NO”;原本“pep”是“NO”的實(shí)例,有30個(gè)被錯(cuò)誤的預(yù)測(cè)為“YES”,有132個(gè)正確的預(yù)測(cè)成了“NO”。74+64+30+132 = 300是實(shí)例總數(shù),而(74+132)/300 = 0.68667正好是正確分類的實(shí)例所占比例。這個(gè)矩陣對(duì)角線上的數(shù)字越大,說(shuō)明預(yù)測(cè)得越好。
模型應(yīng)用
現(xiàn)在我們要用生成的模型對(duì)那些待預(yù)測(cè)的數(shù)據(jù)集進(jìn)行預(yù)測(cè)了。注意待預(yù)測(cè)數(shù)據(jù)集和訓(xùn)練用數(shù)據(jù)集各個(gè)屬性的設(shè)置必須是一致的。即使你沒(méi)有待預(yù)測(cè)數(shù)據(jù)集的Class屬性的值,你也要添加這個(gè)屬性,可以將該屬性在各實(shí)例上的值均設(shè)成缺失值。
在“Test Opion”中選擇“Supplied test set”,并且“Set”成你要應(yīng)用模型的數(shù)據(jù)集,這里是“bank-new.arff”文件。
現(xiàn)在,右鍵點(diǎn)擊“Result list”中剛產(chǎn)生的那一項(xiàng),選擇“Re-evaluate model on current test set”。右邊顯示結(jié)果的區(qū)域中會(huì)增加一些內(nèi)容,告訴你該模型應(yīng)用在這個(gè)數(shù)據(jù)集上表現(xiàn)將如何。如果你的Class屬性都是些缺失值,那這些內(nèi)容是無(wú)意義的,我們關(guān)注的是模型在新數(shù)據(jù)集上的預(yù)測(cè)值。
現(xiàn)在點(diǎn)擊右鍵菜單中的“Visualize classifier errors”,將彈出一個(gè)新窗口顯示一些有關(guān)預(yù)測(cè)誤差的散點(diǎn)圖。點(diǎn)擊這個(gè)新窗口中的“Save”按鈕,保存一個(gè)Arff文件。打開這個(gè)文件可以看到在倒數(shù)第二個(gè)位置多了一個(gè)屬性(predictedpep),這個(gè)屬性上的值就是模型對(duì)每個(gè)實(shí)例的預(yù)測(cè)值。
使用命令行(推薦)
雖然使用圖形界面查看結(jié)果和設(shè)置參數(shù)很方便,但是最直接最靈活的建模及應(yīng)用的辦法仍是使用命令行。
打開“Simple CLI”模塊,像上面那樣使用“J48”算法的命令格式為:
java weka.classifiers.trees.J48 -C 0.25 -M 2 -t directory-path\bank.arff -d directory-path \bank.model
其中參數(shù)“ -C 0.25”和“-M 2”是和圖形界面中所設(shè)的一樣的。“-t ”后面跟著的是訓(xùn)練數(shù)據(jù)集的完整路徑(包括目錄和文件名),“-d ”后面跟著的是保存模型的完整路徑。注意!這里我們可以把模型保存下來(lái)。
輸入上述命令后,所得到樹模型和誤差分析會(huì)在“Simple CLI”上方顯示,可以復(fù)制下來(lái)保存在文本文件里。誤差是把模型應(yīng)用到訓(xùn)練集上給出的。
把這個(gè)模型應(yīng)用到“bank-new.arff”所用命令的格式為:
java weka.classifiers.trees.J48 -p 9 -l directory-path\bank.model -T directory-path \bank-new.arff
其中“-p 9”說(shuō)的是模型中的待預(yù)測(cè)屬性的真實(shí)值存在第9個(gè)(也就是“pep”)屬性中,這里它們?nèi)课粗虼巳坑萌笔е荡妗?#8220;-l”后面是模型的完整路徑。“-T”后面是待預(yù)測(cè)數(shù)據(jù)集的完整路徑。
輸入上述命令后,在“Simple CLI”上方會(huì)有這樣一些結(jié)果:
0 YES 0.75 ?
1 NO 0.7272727272727273 ?
2 YES 0.95 ?
3 YES 0.8813559322033898 ?
4 NO 0.8421052631578947 ?
...
這里的第一列就是我們提到過(guò)的“Instance_number”,第二列就是剛才的“predictedpep”,第四列則是“bank-new.arff”中原來(lái)的“pep”值(這里都是“?”缺失值)。第三列對(duì)預(yù)測(cè)結(jié)果的置信度(confidence )。比如說(shuō)對(duì)于實(shí)例0,我們有75%的把握說(shuō)它的“pep”的值會(huì)是“YES”,對(duì)實(shí)例4我們有84.2%的把握說(shuō)它的“pep”值會(huì)是“NO”。
我們看到,使用命令行至少有兩個(gè)好處。一個(gè)是可以把模型保存下來(lái),這樣有新的待預(yù)測(cè)數(shù)據(jù)出現(xiàn)時(shí),不用每次重新建模,直接應(yīng)用保存好的模型即可。另一個(gè)是對(duì)預(yù)測(cè)結(jié)果給出了置信度,我們可以有選擇的采納預(yù)測(cè)結(jié)果,例如,只考慮那些置信度在85%以上的結(jié)果。
----整理自
http://maya.cs.depaul.edu/~classes/ect584/WEKA/classify.html
6. 聚類分析
原理與實(shí)現(xiàn)
聚類分析中的“類”(cluster)和前面分類的“類”(class)是不同的,對(duì)cluster更加準(zhǔn)確的翻譯應(yīng)該是“簇”。聚類的任務(wù)是把所有的實(shí)例分配到若干的簇,使得同一個(gè)簇的實(shí)例聚集在一個(gè)簇中心的周圍,它們之間距離的比較近;而不同簇實(shí)例之間的距離比較遠(yuǎn)。對(duì)于由數(shù)值型屬性刻畫的實(shí)例來(lái)說(shuō),這個(gè)距離通常指歐氏距離。
現(xiàn)在我們對(duì)前面的“bank data”作聚類分析,使用最常見的K均值(K-means)算法。下面我們簡(jiǎn)單描述一下K均值聚類的步驟。
K均值算法首先隨機(jī)的指定K個(gè)簇中心。然后:1)將每個(gè)實(shí)例分配到距它最近的簇中心,得到K個(gè)簇;2)計(jì)分別計(jì)算各簇中所有實(shí)例的均值,把它們作為各簇新的簇中心。重復(fù)1)和2),直到K個(gè)簇中心的位置都固定,簇的分配也固定。
上述K均值算法只能處理數(shù)值型的屬性,遇到分類型的屬性時(shí)要把它變?yōu)槿舾蓚€(gè)取值0和1的屬性。WEKA將自動(dòng)實(shí)施這個(gè)分類型到數(shù)值型的變換,而且WEKA會(huì)自動(dòng)對(duì)數(shù)值型的數(shù)據(jù)作標(biāo)準(zhǔn)化。因此,對(duì)于原始數(shù)據(jù)“bank-data.csv”,我們所做的預(yù)處理只是刪去屬性“id”,保存為ARFF格式后,修改屬性“children”為分類型。這樣得到的數(shù)據(jù)文件為“
bank.arff”,含600條實(shí)例。
用“Explorer”打開剛才得到的“bank.arff”,并切換到“Cluster”。點(diǎn)“Choose”按鈕選擇“SimpleKMeans”,這是WEKA中實(shí)現(xiàn)K均值的算法。點(diǎn)擊旁邊的文本框,修改“numClusters”為6,說(shuō)明我們希望把這600條實(shí)例聚成6類,即K=6。下面的“seed”參數(shù)是要設(shè)置一個(gè)隨機(jī)種子,依此產(chǎn)生一個(gè)隨機(jī)數(shù),用來(lái)得到K均值算法中第一次給出的K個(gè)簇中心的位置。我們不妨?xí)簳r(shí)讓它就為10。
選中“Cluster Mode”的“Use training set”,點(diǎn)擊“Start”按鈕,觀察右邊“Clusterer output”給出的聚類結(jié)果。也可以在左下角“Result list”中這次產(chǎn)生的結(jié)果上點(diǎn)右鍵,“View in separate window”在新窗口中瀏覽結(jié)果。
結(jié)果解釋
首先我們注意到結(jié)果中有這么一行:
Within cluster sum of squared errors: 1604.7416693522332
這是評(píng)價(jià)聚類好壞的標(biāo)準(zhǔn),數(shù)值越小說(shuō)明同一簇實(shí)例之間的距離越小。也許你得到的數(shù)值會(huì)不一樣;實(shí)際上如果把“seed”參數(shù)改一下,得到的這個(gè)數(shù)值就可能會(huì)不一樣。我們應(yīng)該多嘗試幾個(gè)seed,并采納這個(gè)數(shù)值最小的那個(gè)結(jié)果。例如我讓“seed”取100,就得到
Within cluster sum of squared errors: 1555.6241507629218
我該取后面這個(gè)。當(dāng)然再嘗試幾個(gè)seed,這個(gè)數(shù)值可能會(huì)更小。
接下來(lái)“Cluster centroids:”之后列出了各個(gè)簇中心的位置。對(duì)于數(shù)值型的屬性,簇中心就是它的均值(Mean);分類型的就是它的眾數(shù)(Mode), 也就是說(shuō)這個(gè)屬性上取值為眾數(shù)值的實(shí)例最多。對(duì)于數(shù)值型的屬性,還給出了它在各個(gè)簇里的標(biāo)準(zhǔn)差(Std Devs)。
最后的“Clustered Instances”是各個(gè)簇中實(shí)例的數(shù)目及百分比。
為了觀察可視化的聚類結(jié)果,我們?cè)谧笙路?#8220;Result list”列出的結(jié)果上右擊,點(diǎn)“Visualize cluster assignments”。彈出的窗口給出了各實(shí)例的散點(diǎn)圖。最上方的兩個(gè)框是選擇橫坐標(biāo)和縱坐標(biāo),第二行的“color”是散點(diǎn)圖著色的依據(jù),默認(rèn)是根據(jù)不同的簇“Cluster”給實(shí)例標(biāo)上不同的顏色。
可以在這里點(diǎn)“Save”把聚類結(jié)果保存成ARFF文件。在這個(gè)新的ARFF文件中,“instance_number”屬性表示某實(shí)例的編號(hào),“Cluster”屬性表示聚類算法給出的該實(shí)例所在的簇。
----整理自
http://maya.cs.depaul.edu/~classes/ect584/WEKA/k-means.html