3.數(shù)據(jù)準(zhǔn)備
使用WEKA作數(shù)據(jù)挖掘,面臨的第一個問題往往是我們的數(shù)據(jù)不是ARFF格式的。幸好,WEKA還提供了對CSV文件的支持,而這種格式是被很多其他軟件所支持的。此外,WEKA還提供了通過JDBC訪問數(shù)據(jù)庫的功能。
在這一節(jié)里,我們先以Excel和Matlab為例,說明如何獲得CSV文件。然后我們將知道CSV文件如何轉(zhuǎn)化成ARFF文件,畢竟后者才是WEKA支持得最好的文件格式。面對一個ARFF文件,我們?nèi)杂幸恍╊A(yù)處理要做,才能進(jìn)行挖掘任務(wù)。
.* -> .csv
我們給出一個CSV文件的例子(bank-data.csv)。用UltraEdit打開它可以看到,這種格式也是一種逗號分割數(shù)據(jù)的文本文件,儲存了一個二維表格。
Excel的XLS文件可以讓多個二維表格放到不同的工作表(Sheet)中,我們只能把每個工作表存成不同的CSV文件。打開一個XLS文件并切換到需要轉(zhuǎn)換的工作表,另存為CSV類型,點(diǎn)“確定”、“是”忽略提示即可完成操作。
在Matlab中的二維表格是一個矩陣,我們通過這條命令把一個矩陣存成CSV格式。
csvwrite('filename',matrixname)
需要注意的是,Matllab給出的CSV文件往往沒有屬性名(Excel給出的也有可能沒有)。而WEKA必須從CSV文件的第一行讀取屬性名,否則就會把第一行的各屬性值讀成變量名。因此我們對于Matllab給出的CSV文件需要用UltraEdit打開,手工添加一行屬性名。注意屬性名的個數(shù)要跟數(shù)據(jù)屬性的個數(shù)一致,仍用逗號隔開。
.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ū)懮?br>java weka.core.converters.CSVLoader filename.csv > filename.arff
即可完成轉(zhuǎn)換。
在WEKA 3.5中提供了一個“Arff Viewer”模塊,我們可以用它打開一個CSV文件將進(jìn)行瀏覽,然后另存為ARFF文件。
進(jìn)入“Exploer”模塊,從上方的按鈕中打開CSV文件然后另存為ARFF文件亦可。
“Exploer”界面
我們應(yīng)該注意到,“Exploer”還提供了很多功能,實(shí)際上可以說這是WEKA使用最多的模塊。現(xiàn)在我們先來熟悉它的界面,然后利用它對數(shù)據(jù)進(jìn)行預(yù)處理。
圖2
圖2顯示的是使用3.5版"Exploer"打開"bank-data.csv"的情況。我們根據(jù)不同的功能把這個界面分成8個區(qū)域。
區(qū)域1的幾個選項(xiàng)卡是用來切換不同的挖掘任務(wù)面板。這一節(jié)用到的只有“Preprocess”,其他面板的功能將在以后介紹。
區(qū)域2是一些常用按鈕。包括打開數(shù)據(jù),保存及編輯功能。我們在這里把"bank-data.csv"另存為"bank-data.arff"。
在區(qū)域3中“Choose”某個“Filter”,可以實(shí)現(xiàn)篩選數(shù)據(jù)或者對數(shù)據(jù)進(jìn)行某種變換。數(shù)據(jù)預(yù)處理主要就利用它來實(shí)現(xiàn)。
區(qū)域4展示了數(shù)據(jù)集的一些基本情況。
區(qū)域5中列出了數(shù)據(jù)集的所有屬性。勾選一些屬性并“Remove”就可以刪除它們,刪除后還可以利用區(qū)域2的“Undo”按鈕找回。區(qū)域5上方的一排按鈕是用來實(shí)現(xiàn)快速勾選的。
在區(qū)域5中選中某個屬性,則區(qū)域6中有關(guān)于這個屬性的摘要。注意對于數(shù)值屬性和分類屬性,摘要的方式是不一樣的。圖中顯示的是對數(shù)值屬性“income”的摘要。
區(qū)域7是區(qū)域5中選中屬性的直方圖。若數(shù)據(jù)集的最后一個屬性(我們說過這是分類或回歸任務(wù)的默認(rèn)目標(biāo)變量)是分類變量(這里的“pep”正好是),直方圖中的每個長方形就會按照該變量的比例分成不同顏色的段。要想換個分段的依據(jù),在區(qū)域7上方的下拉框中選個不同的分類屬性就可以了。下拉框里選上“No Class”或者一個數(shù)值屬性會變成黑白的直方圖。
區(qū)域8是狀態(tài)欄,可以查看Log以判斷是否有錯。右邊的weka鳥在動的話說明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)
通常對于數(shù)據(jù)挖掘任務(wù)來說,ID這樣的信息是無用的,我們將之刪除。在區(qū)域5勾選屬性“id”,并點(diǎn)擊“Remove”。將新的數(shù)據(jù)集保存一次,并用UltraEdit打開這個ARFF文件。我們發(fā)現(xiàn),在屬性聲明部分,WEKA已經(jīng)為每個屬性選好了合適的類型。
我們知道,有些算法,只能處理所有的屬性都是分類型的情況。這時候我們就需要對數(shù)值型的屬性進(jìn)行離散化。在這個數(shù)據(jù)集中有3個變量是數(shù)值型的,分別是“age”,“income”和“children”。
其中“children”只有4個取值:0,1,2,3。這時我們在UltraEdit中直接修改ARFF文件,把
@attribute children numeric
改為
@attribute children {0,1,2,3}
就可以了。
在“Explorer”中重新打開“bank-data.arff”,看看選中“children”屬性后,區(qū)域6那里顯示的“Type”是不是變成“Nominal”了?
“age”和“income”的離散化我們需要借助WEKA中名為“Discretize”的Filter來完成。在區(qū)域2中點(diǎn)“Choose”,出現(xiàn)一棵“Filter樹”,逐級找到“weka.filters.unsupervised.attribute.Discretize”,點(diǎn)擊。若無法關(guān)閉這個樹,在樹之外的地方點(diǎn)擊“Explorer”面板即可。
現(xiàn)在“Choose”旁邊的文本框應(yīng)該顯示“Discretize -B 10 -M -0.1 -R first-last”。 點(diǎn)擊這個文本框會彈出新窗口以修改離散化的參數(shù)。
我們不打算對所有的屬性離散化,只是針對對第1個和第4個屬性(見區(qū)域5屬性名左邊的數(shù)字),故把a(bǔ)ttributeIndices右邊改成“1,4”。計劃把這兩個屬性都分成3段,于是把“bins”改成“3”。其它框里不用更改,關(guān)于它們的意思可以點(diǎn)“More”查看。點(diǎn)“OK”回到“Explorer”,可以看到“age”和“income”已經(jīng)被離散化成分類型的屬性。若想放棄離散化可以點(diǎn)區(qū)域2的“Undo”。
如果對“"(-inf-34.333333]"”這樣晦澀的標(biāo)識不滿,我們可以用UltraEdit打開保存后的ARFF文件,把所有的“'\'(-inf-34.333333]\''”替換成“0_34”。其它標(biāo)識做類似地手動替換。
經(jīng)過上述操作得到的數(shù)據(jù)集我們保存為bank-data-final.arff。
----整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/preprocess.html
4. 關(guān)聯(lián)規(guī)則(購物籃分析)
注意:目前,WEKA的關(guān)聯(lián)規(guī)則分析功能僅能用來作示范,不適合用來挖掘大型數(shù)據(jù)集。
我們打算對前面的“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算法,我們就用這個算法,但是點(diǎn)“Choose”右邊的文本框修改默認(rèn)的參數(shù),彈出的窗口中點(diǎn)“More”可以看到各參數(shù)的說明。
背景知識
首先我們來溫習(xí)一下Apriori的有關(guān)知識。對于一條關(guān)聯(lián)規(guī)則L->R,我們常用支持度(Support)和置信度(Confidence)來衡量它的重要性。規(guī)則的支持度是用來估計在一個購物籃中同時觀察到L和R的概率P(L,R),而規(guī)則的置信度是估計購物欄中出現(xiàn)了L時也出會現(xiàn)R的條件概率P(R|L)。關(guān)聯(lián)規(guī)則的目標(biāo)一般是產(chǎn)生支持度和置信度都較高的規(guī)則。
有幾個類似的度量代替置信度來衡量規(guī)則的關(guān)聯(lián)程度,它們分別是
Lift(提升度?): P(L,R)/(P(L)P(R))
Lift=1時表示L和R獨(dú)立。這個數(shù)越大,越表明L和R存在在一個購物籃中不是偶然現(xiàn)象。
Leverage(不知道怎么翻譯):P(L,R)-P(L)P(R)
它和Lift的含義差不多。Leverage=0時L和R獨(dú)立,Leverage越大L和R的關(guān)系越密切。
Conviction(更不知道譯了):P(L)P(!R)/P(L,!R) (!R表示R沒有發(fā)生)
Conviction也是用來衡量L和R的獨(dú)立性。從它和lift的關(guān)系(對R取反,代入Lift公式后求倒數(shù))可以看出,我們也希望這個值越大越好。
值得注意的是,用Lift和Leverage作標(biāo)準(zhǔn)時,L和R是對稱的,Confidence和Conviction則不然。
參數(shù)設(shè)置
現(xiàn)在我們計劃挖掘出支持度在10%到100%之間,并且lift值超過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é)果。
下面是挖掘出來的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)
對于挖掘出的每條規(guī)則,WEKA列出了它們關(guān)聯(lián)程度的四項(xiàng)指標(biāo)。
命令行方式
我們也可以利用命令行來完成挖掘任務(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)是這個文件的樣子。
----整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/associate.html