閱讀632 返回首頁    go 阿裏雲 go 技術社區[雲棲]


weka學習入門筆記

目錄 
1. 簡介
2. 數據格式
3. 數據獲取與預處理
3. 關聯規則(購物籃分析)
4. 分類與回歸
5. 聚類分析


1. 簡介 

WEKA的全名是懷卡托智能分析環境(Waikato Environment for Knowledge Analysis),它的源代碼可通過https://www.cs.waikato.ac.nz/ml/weka 得到。同時weka也是新西蘭的一種鳥名,而WEKA的主要開發者來自新西蘭。 

WEKA作為一個公開的數據挖掘工作平台,集合了大量能承擔數據挖掘任務的機器學習算法,包括對數據進行預處理,分類,回歸、聚類、關聯規則以及在新的交互式界麵上的可視化。 
如果想自己實現數據挖掘算法的話,可以看一看weka的接口文檔。在weka中集成自己的算法甚至借鑒它的方法自己實現可視化工具並不是件很困難的事情。 

2005 年8月,在第11屆ACM SIGKDD國際會議上,懷卡托大學的Weka小組榮獲了數據挖掘和知識探索領域的最高服務獎,Weka係統得到了廣泛的認可,被譽為數據挖掘和機器學習 曆史上的裏程碑,是現今最完備的數據挖掘工具之一(已有11年的發展曆史)。Weka的每月下載次數已超過萬次。 

2. 數據格式 

巧婦難為無米之炊。首先我們來看看WEKA所用的數據應是什麼樣的格式。 
跟很多電子表格或數據分析軟件一樣,WEKA所處理的數據集是圖1那樣的一個二維的表格。 
 
圖1 新窗口打開 
這 裏我們要介紹一下WEKA中的術語。表格裏的一個橫行稱作一個實例(Instance),相當於統計學中的一個樣本,或者數據庫中的一條記錄。豎行稱作一 個屬性(Attrbute),相當於統計學中的一個變量,或者數據庫中的一個字段。這樣一個表格,或者叫數據集,在WEKA看來,呈現了屬性之間的一種關 係(Relation)。圖1中一共有14個實例,5個屬性,關係名稱為“weather”。 

WEKA存儲數據的格式是 ARFF(Attribute-Relation File Format)文件,這是一種ASCII文本文件。圖1所示的二維表格存儲在如下的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記事本打開這個文件時,可能會因為回車符定義不一致而導致分行不正常。推薦使用UltraEdit這樣的字符編輯軟件察看ARFF文件的內容。 

下麵我們來對這個文件的內容進行說明。 
識別ARFF文件的重要依據是分行,因此不能在這種文件裏隨意的斷行。空行(或全是空格的行)將被忽略。 
以“%”開始的行是注釋,WEKA將忽略這些行。如果你看到的“weather.arff”文件多了或少了些“%”開始的行,是沒有影響的。 
除 去注釋後,整個ARFF文件可以分為兩個部分。第一部分給出了頭信息(Head information),包括了對關係的聲明和對屬性的聲明。第二部分給出了數據信息(Data information),即數據集中給出的數據。從“@data”標記開始,後麵的就是數據信息了。 

關係聲明 
關係名稱在ARFF文件的第一個有效行來定義,格式為 
@relation <relation-name> 
<relation-name>是一個字符串。如果這個字符串包含空格,它必須加上引號(指英文標點的單引號或雙引號)。 

屬性聲明 
屬性聲明用一列以“@attribute”開頭的語句表示。數據集中的每一個屬性都有它對應的“@attribute”語句,來定義它的屬性名稱和數據類型。 
這 些聲明語句的順序很重要。首先它表明了該項屬性在數據部分的位置。例如,“humidity”是第三個被聲明的屬性,這說明數據部分那些被逗號分開的列 中,第三列數據 85 90 86 96 ... 是相應的“humidity”值。其次,最後一個聲明的屬性被稱作class屬性,在分類或回歸任務中,它是默認的目標變量。 
屬性聲明的格式為 
@attribute <attribute-name> <datatype> 
其中<attribute-name>是必須以字母開頭的字符串。和關係名稱一樣,如果這個字符串包含空格,它必須加上引號。 
WEKA支持的<datatype>有四種,分別是 
numeric-------------------------數值型 
<nominal-specification>-----分類(nominal)型 
string----------------------------字符串型 
date [<date-format>]--------日期和時間型 
其 中<nominal-specification> 和<date-format> 將在下麵說明。還可以使用兩個類型“integer”和“real”,但是WEKA把它們都當作“numeric”看待。注意 “integer”,“real”,“numeric”,“date”,“string”這些關鍵字是區分大小寫的,而 “relation”“attribute ”和“date”則不區分。 

數值屬性 
數值型屬性可以是整數或者實數,但WEKA把它們都當作實數看待。 

分類屬性 
分 類屬性由<nominal-specification>列出一係列可能的類別名稱並放在花括號中:{<nominal- name1>, <nominal-name2>, <nominal-name3>, ...} 。數據集中該屬性的值隻能是其中一種類別。 
例如如下的屬性聲明說明“outlook”屬性有三種類別:“sunny”,“ overcast”和“rainy”。而數據集中每個實例對應的“outlook”值必是這三者之一。 
@attribute outlook {sunny, overcast, rainy} 
如果類別名稱帶有空格,仍需要將之放入引號中。 

字符串屬性 
字符串屬性中可以包含任意的文本。這種類型的屬性在文本挖掘中非常有用。 
示例: 
@ATTRIBUTE LCC string 

日期和時間屬性 
日期和時間屬性統一用“date”類型表示,它的格式是 
@attribute <name> date [<date-format>] 
其中<name>是這個屬性的名稱,<date-format>是一個字符串,來規定該怎樣解析和顯示日期或時間的格式,默認的字符串是ISO-8601所給的日期時間組合格式“yyyy-MM-dd THH:mm:ss ”。 
數據信息部分表達日期的字符串必須符合聲明中規定的格式要求(下文有例子)。 

數據信息 
數據信息中“@data”標記獨占一行,剩下的是各個實例的數據。 

每個實例占一行。實例的各屬性值用逗號“,”隔開。如果某個屬性的值是缺失值(missing value),用問號“?”表示,且這個問號不能省略。例如: 
@data 
sunny,85,85,FALSE,no 
?,78,90,?,yes 


字符串屬性和分類屬性的值是區分大小寫的。若值中含有空格,必須被引號括起來。例如: 
@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"
 

稀疏數據 
有的時候數據集中含有大量的0值(比如購物籃分析),這個時候用稀疏格式的數據存貯更加省空間。 
稀疏格式是針對數據信息中某個實例的表示而言,不需要修改ARFF文件的其它部分。看如下的數據: 
@data 
  0, X, 0, Y, "class A" 
  0, 0, W, 0, "class B"
 
用稀疏格式表達的話就是 
@data 
  {1 X, 3 Y, 4 "class A"} 
  {2 W, 4 "class B"}
 
每個實例用花括號括起來。實例中每一個非0的屬性值用<index> <空格> <value>表示。<index>是屬性的序號,從0開始計;<value>是屬性值。屬性值之間仍用逗號隔開。 
注意在稀疏格式中沒有注明的屬性值不是缺失值,而是0值。若要表示缺失值必須顯式的用問號表示出來。 

Relational型屬性 

在WEKA 3.5版中增加了一種屬性類型叫做Relational,有了這種類型我們可以像關係型數據庫那樣處理多個維度了。但是這種類型目前還不見廣泛應用,暫不作介紹。 


3.數據準備 

使用WEKA作數據挖掘,麵臨的第一個問題往往是我們的數據不是ARFF格式的。幸好,WEKA還提供了對CSV文件的支持,而這種格式是被很多其他軟件所支持的。此外,WEKA還提供了通過JDBC訪問數據庫的功能。 
在這一節裏,我們先以Excel和Matlab為例,說明如何獲得CSV文件。然後我們將知道CSV文件如何轉化成ARFF文件,畢竟後者才是WEKA支持得最好的文件格式。麵對一個ARFF文件,我們仍有一些預處理要做,才能進行挖掘任務。 

.* -> .csv 
我們給出一個CSV文件的例子(bank-data.csv )。用UltraEdit打開它可以看到,這種格式也是一種逗號分割數據的文本文件,儲存了一個二維表格。 

Excel的XLS文件可以讓多個二維表格放到不同的工作表(Sheet)中,我們隻能把每個工作表存成不同的CSV文件。打開一個XLS文件並切換到需要轉換的工作表,另存為CSV類型,點“確定”、“是”忽略提示即可完成操作。 

在Matlab中的二維表格是一個矩陣,我們通過這條命令把一個矩陣存成CSV格式。 
csvwrite('filename',matrixname) 
需 要注意的是,Matllab給出的CSV文件往往沒有屬性名(Excel給出的也有可能沒有)。而WEKA必須從CSV文件的第一行讀取屬性名,否則就會 把第一行的各屬性值讀成變量名。因此我們對於Matllab給出的CSV文件需要用UltraEdit打開,手工添加一行屬性名。注意屬性名的個數要跟數 據屬性的個數一致,仍用逗號隔開。 

.csv -> .arff 
將CSV轉換為ARFF最迅捷的辦法是使用WEKA所帶的命令行工具。 
運行WEKA的主程序,出現GUI後可以點擊下方按鈕進入相應的模塊。我們點擊進入“Simple CLI”模塊提供的命令行功能。在新窗口的最下方(上方是不能寫字的)輸入框寫上 
java weka.core.converters.CSVLoader filename.csv > filename.arff 
即可完成轉換。 
在WEKA 3.5中提供了一個“Arff Viewer”模塊,我們可以用它打開一個CSV文件將進行瀏覽,然後另存為ARFF文件。 
進入“Exploer”模塊,從上方的按鈕中打開CSV文件然後另存為ARFF文件亦可。 

“Exploer”界麵 
我們應該注意到,“Exploer”還提供了很多功能,實際上可以說這是WEKA使用最多的模塊。現在我們先來熟悉它的界麵,然後利用它對數據進行預處理。 
 
圖2 新窗口打開 
圖2顯示的是使用3.5版"Exploer"打開"bank-data.csv"的情況。我們根據不同的功能把這個界麵分成8個區域。 
區域1的幾個選項卡是用來切換不同的挖掘任務麵板。這一節用到的隻有“Preprocess”,其他麵板的功能將在以後介紹。 
區域2是一些常用按鈕。包括打開數據,保存及編輯功能。我們在這裏把"bank-data.csv"另存為"bank-data.arff"。 
在區域3中“Choose”某個“Filter”,可以實現篩選數據或者對數據進行某種變換。數據預處理主要就利用它來實現。 
區域4展示了數據集的一些基本情況。 
區域5中列出了數據集的所有屬性。勾選一些屬性並“Remove”就可以刪除它們,刪除後還可以利用區域2的“Undo”按鈕找回。區域5上方的一排按鈕是用來實現快速勾選的。 
在區域5中選中某個屬性,則區域6中有關於這個屬性的摘要。注意對於數值屬性和分類屬性,摘要的方式是不一樣的。圖中顯示的是對數值屬性“income”的摘要。 
區 域7是區域5中選中屬性的直方圖。若數據集的最後一個屬性(我們說過這是分類或回歸任務的默認目標變量)是分類變量(這裏的“pep”正好是),直方圖中 的每個長方形就會按照該變量的比例分成不同顏色的段。要想換個分段的依據,在區域7上方的下拉框中選個不同的分類屬性就可以了。下拉框裏選上“No Class”或者一個數值屬性會變成黑白的直方圖。 
區域8是狀態欄,可以查看Log以判斷是否有錯。右邊的weka鳥在動的話說明WEKA正在執行挖掘任務。右鍵點擊狀態欄還可以執行JAVA內存的垃圾回收。 

預處理 
bank-data數據各屬性的含義如下: 
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) 

通常對於數據挖掘任務來說,ID這樣的信息是無用的,我們將之刪除。在區域5勾選屬性“id”,並點擊“Remove”。將新的數據集保存一次,並用UltraEdit打開這個ARFF文件。我們發現,在屬性聲明部分,WEKA已經為每個屬性選好了合適的類型。 

我們知道,有些算法,隻能處理所有的屬性都是分類型的情況。這時候我們就需要對數值型的屬性進行離散化。在這個數據集中有3個變量是數值型的,分別是“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”屬性後,區域6那裏顯示的“Type”是不是變成“Nominal”了? 

“age” 和“income”的離散化我們需要借助WEKA中名為“Discretize”的Filter來完成。在區域2中點“Choose”,出現一棵 “Filter樹”,逐級找到“weka.filters.unsupervised.attribute.Discretize”,點擊。若無法關閉這 個樹,在樹之外的地方點擊“Explorer”麵板即可。 
現在“Choose”旁邊的文本框應該顯示“Discretize -B 10 -M -0.1 -R first-last”。 點擊這個文本框會彈出新窗口以修改離散化的參數。 
我 們不打算對所有的屬性離散化,隻是針對對第1個和第4個屬性(見區域5屬性名左邊的數字),故把attributeIndices右邊改成“1,4”。計 劃把這兩個屬性都分成3段,於是把“bins”改成“3”。其它框裏不用更改,關於它們的意思可以點“More”查看。點“OK”回到 “Explorer”,可以看到“age”和“income”已經被離散化成分類型的屬性。若想放棄離散化可以點區域2的“Undo”。 
如果對“"(-inf-34.333333]"”這樣晦澀的標識不滿,我們可以用UltraEdit打開保存後的ARFF文件,把所有的“'/'(-inf-34.333333]/''”替換成“0_34”。其它標識做類似地手動替換。 

經過上述操作得到的數據集我們保存為bank-data-final.arff 。 

----整理自https://maya.cs.depaul.edu/~classes/ect584/WEKA/preprocess.html 


4. 關聯規則(購物籃分析) 
注意 :目前,WEKA的關聯規則分析功能僅能用來作示範,不適合用來挖掘大型數據集。 

我 們打算對前麵的“bank-data”數據作關聯規則的分析。用“Explorer”打開“bank-data-final.arff”後,切換到 “Associate”選項卡。默認關聯規則分析是用Apriori算法,我們就用這個算法,但是點“Choose”右邊的文本框修改默認的參數,彈出的 窗口中點“More”可以看到各參數的說明。 

背景知識 
首先我們來溫習一下Apriori的有關知識。對於一條關聯規則L->R,我們常用支持度(Support)和置信度(Confidence)來衡量它的重要性。規則的支持度是用來估計在一個購物籃中同時觀察到L和R的概率P(L,R) ,而規則的置信度是估計購物欄中出現了L時也出會現R的條件概率P(R|L) 。關聯規則的目標一般是產生支持度和置信度都較高的規則。 
有幾個類似的度量代替置信度來衡量規則的關聯程度,它們分別是 
Lift(提升度?): P(L,R)/(P(L)P(R)) 
Lift=1時表示L和R獨立。這個數越大,越表明L和R存在在一個購物籃中不是偶然現象。 
Leverage(不知道怎麼翻譯):P(L,R)-P(L)P(R) 
它和Lift的含義差不多。Leverage=0時L和R獨立,Leverage越大L和R的關係越密切。 
Conviction(更不知道譯了):P(L)P(!R)/P(L,!R) (!R表示R沒有發生) 
Conviction也是用來衡量L和R的獨立性。從它和lift的關係(對R取反,代入Lift公式後求倒數)可以看出,我們也希望這個值越大越好。 
值得注意的是,用Lift和Leverage作標準時,L和R是對稱的,Confidence和Conviction則不然。 

參數設置 
現 在我們計劃挖掘出支持度在10%到100%之間,並且lift值超過1.5且lift值排在前100位的那些關聯規則。我們把 “lowerBoundMinSupport”和“upperBoundMinSupport”分別設為0.1和1,“metricType”設為 lift,“minMetric”設為1.5,“numRules”設為100。其他選項保持默認即可。“OK” 之後在“Explorer”中點擊“Start”開始運行算法,在右邊窗口顯示數據集摘要和挖掘結果。 

下麵是挖掘出來的lift排前5的規則。 
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.0Cool [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.0Cool [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.0Cool [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.0Cool [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)
 
對於挖掘出的每條規則,WEKA列出了它們關聯程度的四項指標。 

命令行方式 
我們也可以利用命令行來完成挖掘任務,在“Simlpe CLI”模塊中輸入如下格式的命令: 
java weka.associations.Apriori options -t directory-path/bank-data-final.arff 
即可完成Apriori算法。注意,“-t”參數後的文件路徑中不能含有空格。 
在前麵我們使用的option為 
-N 100 -T 1 -C 1.5 -D 0.05 -U 1.0 -M 0.1 -S -1.0 命令行中使用這些參數得到的結果和前麵利用GUI得到的一樣。 
我們還可以加上“- I”參數,得到不同項數的頻繁項集。我用的命令如下: 
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 
挖掘結果在上方顯示,應是這個文件 的樣子。 


3. 分類與回歸 
背景知識 
WEKA把分類(Classification)和回歸(Regression)都放在“Classify”選項卡中,這是有原因的。 
在 這兩個任務中,都有一個目標屬性(輸出變量)。我們希望根據一個樣本(WEKA中稱作實例)的一組特征(輸入變量),對目標進行預測。為了實現這一目的, 我們需要有一個訓練數據集,這個數據集中每個實例的輸入和輸出都是已知的。觀察訓練集中的實例,可以建立起預測的模型。有了這個模型,我們就可以新的輸出 未知的實例進行預測了。衡量模型的好壞就在於預測的準確程度。 
在WEKA中,待預測的目標(輸出)被稱作Class屬性,這應該是來自分類任務的“類”。一般的,若Class屬性是分類型時我們的任務才叫分類,Class屬性是數值型時我們的任務叫回歸。 

選擇算法 
這一節中,我們使用C4.5決策樹算法對bank-data建立起分類模型。 
我們來看原來的“bank-data.csv ” 文件。“ID”屬性肯定是不需要的。由於C4.5算法可以處理數值型的屬性,我們不用像前麵用關聯規則那樣把每個變量都離散化成分類型。盡管如此,我們還 是把“Children”屬性轉換成分類型的兩個值“YES”和“NO”。另外,我們的訓練集僅取原來數據集實例的一半;而從另外一半中抽出若幹條作為待 預測的實例,它們的“pep”屬性都設為缺失值。經過了這些處理的訓練集數據在這裏 下載;待預測集數據在這裏 下載。 

我 們用“Explorer”打開訓練集“bank.arff”,觀察一下它是不是按照前麵的要求處理好了。切換到“Classify”選項卡,點擊 “Choose”按鈕後可以看到很多分類或者回歸的算法分門別類的列在一個樹型框裏。3.5版的WEKA中,樹型框下方有一個“Filter...”按 鈕,點擊可以根據數據集的特性過濾掉不合適的算法。我們數據集的輸入屬性中有“Binary”型(即隻有兩個類的分類型)和數值型的屬性,而Class變 量是“Binary”的;於是我們勾選“Binary attributes”“Numeric attributes”和“Binary class”。點“OK”後回到樹形圖,可以發現一些算法名稱變紅了,說明它們不能用。選擇“trees”下的“J48”,這就是我們需要的C4.5算 法,還好它沒有變紅。 
點擊“Choose”右邊的文本框,彈出新窗口為該算法設置各種參數。點“More”查看參數說明,點“Capabilities”是查看算法適用範圍。這裏我們把參數保持默認。 
現 在來看左中的“Test Option”。我們沒有專門設置檢驗數據集,為了保證生成的模型的準確性而不至於出現過擬合(overfitting)的現象,我們有必要采用10折交 叉驗證(10-fold cross validation)來選擇和評估模型。若不明白交叉驗證的含義可以Google 一下。 

建模結果 
OK, 選上“Cross-validation”並在“Folds”框填上“10”。點“Start”按鈕開始讓算法生成決策樹模型。很快,用文本表示的一棵決 策樹,以及對這個決策樹的誤差分析等等結果出現在右邊的“Classifier output”中。同時左下的“Results list”出現了一個項目顯示剛才的時間和算法名稱。如果換一個模型或者換個參數,重新“Start”一次,則“Results list”又會多出一項。 

我們看到“J48”算法交叉驗證的結果之一為 
Correctly Classified Instances 206 68.6667 % 
也就是說這個模型的準確度隻有69%左右。也許我們需要對原屬性進行處理,或者修改算法的參數來提高準確度。但這裏我們不管它,繼續用這個模型。 

右鍵點擊“Results list”剛才出現的那一項,彈出菜單中選擇“Visualize tree”,新窗口裏可以看到圖形模式的決策樹。建議把這個新窗口最大化,然後點右鍵,選“Fit to screen”,可以把這個樹看清楚些。看完後截圖或者關掉Razz 

這裏我們解釋一下“Confusion Matrix”的含義。 
=== Confusion Matrix === 
  a b <-- classified as 
  74 64 | a = YES 
  30 132 | b = NO
 
這 個矩陣是說,原本“pep”是“YES”的實例,有74個被正確的預測為“YES”,有64個錯誤的預測成了“NO”;原本“pep”是“NO”的實例, 有30個被錯誤的預測為“YES”,有132個正確的預測成了“NO”。74+64+30+132 = 300是實例總數,而(74+132)/300 = 0.68667正好是正確分類的實例所占比例。這個矩陣對角線上的數字越大,說明預測得越好。 

模型應用 
現在我們要用生成的模型對那些待預測的數據集進行預測了,注意待預測數據集和訓練用數據集各個屬性的設置必須是一致的。WEKA中並沒有直接提供把模型應用到帶預測數據集上的方法,我們要采取間接的辦法。 
在“Test Opion”中選擇“Supplied test set”,並且“Set”成“bank-new.arff”文件。重新“Start”一次。注意這次生成的模型沒有 通過交叉驗證來選擇,“Classifier output”給出的誤差分析也沒有多少意義。這也是間接作預測帶來的缺陷吧。 
現 在,右鍵點擊“Result list”中剛產生的那一項,選擇“Visualize classifier errors”。我們不去管新窗口中的圖有什麼含義,點“Save”按鈕,把結果保存成“bank-predicted.arff”。這個ARFF文件中 就有我們需要的預測結果。在“Explorer”的“Preprocess”選項卡中打開這個新文件,可以看到多了兩個屬性 “Instance_number”和“predictedpep”。“Instance_number”是指一個實例在原“bank- new.arff”文件中的位置,“predictedpep”就是模型預測的結果。點“Edit”按鈕或者在“ArffViewer”模塊中打開可以查 看這個數據集的內容。比如,我們對實例0的pep預測值為“YES”,對實例4的預測值為“NO”。 

使用命令行(推薦) 
雖然使用圖形界麵查看結果和設置參數很方便,但是最直接最靈活的建模及應用的辦法仍是使用命令行。 
打開“Simple CLI”模塊,像上麵那樣使用“J48”算法的命令格式為: 
java weka.classifiers.trees.J48 -C 0.25 -M 2 -t directory-path/bank.arff -d directory-path /bank.model 
其中參數“ -C 0.25”和“-M 2”是和圖形界麵中所設的一樣的。“-t ”後麵跟著的是訓練數據集的完整路徑(包括目錄和文件名),“-d ”後麵跟著的是保存模型的完整路徑。注意!這裏我們可以把模型保存下來。 
輸入上述命令後,所得到樹模型和誤差分析會在“Simple CLI”上方顯示,可以複製下來保存在文本文件裏。誤差是把模型應用到訓練集上給出的。 
把這個模型應用到“bank-new.arff”所用命令的格式為: 
java weka.classifiers.trees.J48 -p 9 -l directory-path/bank.model -T directory-path /bank-new.arff 
其中“-p 9”說的是模型中的Class屬性是第9個(也就是“pep”),“-l”後麵是模型的完整路徑,“-T”後麵是待預測數據集的完整路徑。 
輸入上述命令後,在“Simple CLI”上方會有這樣一些結果: 
0 YES 0.75 ? 
1 NO 0.7272727272727273 ? 
2 YES 0.95 ? 
3 YES 0.8813559322033898 ? 
4 NO 0.8421052631578947 ? 
...
 
這 裏的第一列就是我們提到過的“Instance_number”,第二列就是剛才的“predictedpep”,第四列則是“bank- new.arff”中原來的“pep”值(這裏都是“?”缺失值)。第三列對預測結果的置信度(confidence )。比如說對於實例0,我們有75%的把握說它的“pep”的值會是“YES”,對實例4我們有84.2%的把握說它的“pep”值會是“NO”。
我們看到,使用命令行至少有兩個好處。一個是可以把模型保存下來,這樣有新的待預測數據出現時,不用每次重新建模,直接應用保存好的模型即可。另一個是對預測結果給出了置信度,我們可以有選擇的采納預測結果,例如,隻考慮那些置信度在85%以上的結果。 
可惜,命令行仍不能保存交叉驗證等方式選擇過的模型,也不能將它們應用到待預測數據上。要實現這一目的,須用到“KnowledgeFlow”模塊的“ PredictionAppender”。 

4. 聚類分析 

原理與實現 
聚 類分析中的“類”(cluster)和前麵分類的“類”(class)是不同的,對cluster更加準確的翻譯應該是“簇”。聚類的任務是把所有的實例 分配到若幹的簇,使得同一個簇的實例聚集在一個簇中心的周圍,它們之間距離的比較近;而不同簇實例之間的距離比較遠。對於由數值型屬性刻畫的實例來說,這 個距離通常指歐氏距離。 
現在我們對前麵的“bank data”作聚類分析,使用最常見的K均值(K-means)算法。下麵我們簡單描述一下K均值聚類的步驟。 
K均值算法首先隨機的指定K個簇中心。然後:1)將每個實例分配到距它最近的簇中心,得到K個簇;2)計分別計算各簇中所有實例的均值,把它們作為各簇新的簇中心。重複1)和2),直到K個簇中心的位置都固定,簇的分配也固定。 

上 述K均值算法隻能處理數值型的屬性,遇到分類型的屬性時要把它變為若幹個取值0和1的屬性。WEKA將自動實施這個分類型到數值型的變換,而且WEKA會 自動對數值型的數據作標準化。因此,對於原始數據“bank-data.csv”,我們所做的預處理隻是刪去屬性“id”,保存為ARFF格式後,修改屬 性“children”為分類型。這樣得到的數據文件為“bank.arff ”,含600條實例。 

用 “Explorer”打開剛才得到的“bank.arff”,並切換到“Cluster”。點“Choose”按鈕選擇“SimpleKMeans”,這 是WEKA中實現K均值的算法。點擊旁邊的文本框,修改“numClusters”為6,說明我們希望把這600條實例聚成6類,即K=6。下麵的 “seed”參數是要設置一個隨機種子,依此產生一個隨機數,用來得到K均值算法中第一次給出的K個簇中心的位置。我們不妨暫時讓它就為10。 
選 中“Cluster Mode”的“Use training set”,點擊“Start”按鈕,觀察右邊“Clusterer output”給出的聚類結果。也可以在左下角“Result list”中這次產生的結果上點右鍵,“View in separate window”在新窗口中瀏覽結果。 

結果解釋 
首先我們注意到結果中有這麼一行: 
Within cluster sum of squared errors: 1604.7416693522332 
這是評價聚類好壞的標準,數值越小說明同一簇實例之間的距離越小。也許你得到的數值會不一樣;實際上如果把“seed”參數改一下,得到的這個數值就可能會不一樣。我們應該多嚐試幾個seed,並采納這個數值最小的那個結果。例如我讓“seed”取100,就得到 
Within cluster sum of squared errors: 1555.6241507629218 
我該取後麵這個。當然再嚐試幾個seed,這個數值可能會更小。 

接 下來“Cluster centroids:”之後列出了各個簇中心的位置。對於數值型的屬性,簇中心就是它的均值(Mean);分類型的就是它的眾數(Mode), 也就是說這個屬性上取值為眾數值的實例最多。對於數值型的屬性,還給出了它在各個簇裏的標準差(Std Devs)。 

最後的“Clustered Instances”是各個簇中實例的數目及百分比。 

為 了觀察可視化的聚類結果,我們在左下方“Result list”列出的結果上右擊,點“Visualize cluster assignments”。彈出的窗口給出了各實例的散點圖。最上方的兩個框是選擇橫坐標和縱坐標,第二行的“color”是散點圖著色的依據,默認是根 據不同的簇“Cluster”給實例標上不同的顏色。 
可以在這裏點“Save”把聚類結果保存成ARFF文件。在這個新的ARFF文件中,“instance_number”屬性表示某實例的編號,“Cluster”屬性表示聚類算法給出的該實例所在的簇。 



最後更新:2017-04-03 12:54:29

  上一篇:go C++編程規範之42:不要公開內部數據
  下一篇:go Windows Server 2008通過計劃任務定時執行bat文件