RWeka (http://cran.r-project.org/web/packages/RWeka/index.html) :
1) 數據輸入和輸出
WOW():查看Weka函數的參數。
Weka_control():設置Weka函數的參數。
read.arff():讀Weka Attribute-Relation File Format (ARFF)格式的數據。
write.arff:將數據寫入Weka Attribute-Relation File Format (ARFF)格式的文件。
2) 數據預處理
Normalize():無監督的標准化連續性數據。
Discretize():用MDL(Minimum Description Length)方法,有監督的離散化連續性數值數據。
3) 分類和回歸
IBk():k最近鄰分類
LBR():naive Bayes法分類
J48():C4.5決策樹算法(決策樹在分析各個屬性時,是完全獨立的)。
LMT():組合樹結構和Logistic回歸模型,每個葉子節點是一個Logistic回歸模型,准確性比單獨的決策樹和Logistic回歸方法要好。
M5P():M5 模型數算法,組合了樹結構和線性回歸模型,每個葉子節點是一個線性回歸模型,因而可用於連續數據的回歸。
DecisionStump():單層決策樹算法,常被作為boosting的基本學習器。
SMO():支持向量機分類
AdaBoostM1():Adaboost M1方法。-W參數指定弱學習器的算法。
Bagging():通過從原始數據取樣(用替換方法),創建多個模型。
LogitBoost():弱學習器采用了對數回歸方法,學習到的是實數值
MultiBoostAB():AdaBoost 方法的改進,可看作AdaBoost 和 “wagging”的組合。
Stacking():用於不同的基本分類器集成的算法。
LinearRegression():建立合適的線性回歸模型。
Logistic():建立logistic回歸模型。
JRip():一種規則學習方法。
M5Rules():用M5方法產生回歸問題的決策規則。
OneR():簡單的1-R分類法。
PART():產生PART決策規則。
4) 聚類
Cobweb():這是種基於模型方法,它假設每個聚類的模型並發現適合相應模型的數據。不適合對大數據庫進行聚類處理。
FarthestFirst():快速的近似的k均值聚類算法
SimpleKMeans():k均值聚類算法
XMeans():改進的k均值法,能自動決定類別數
DBScan():基於密度的聚類方法,它根據對象周圍的密度不斷增長聚類。它能從含有噪聲的空間數據庫中發現任意形狀的聚類。此方法將一個聚類定義為一組“密度連接”的點集。
5)關聯規則
Apriori():Apriori是關聯規則領域里最具影響力的基礎算法,是一種廣度優先算法,通過多次掃描數據庫來獲取支持度大於最小支持度的頻繁項集。它的理論基礎是頻繁項集的兩個單調性原則:頻繁項集的任一子集一定是頻繁的;非頻繁項集的任一超集一定是非頻繁的。在海量數據的情況下,Apriori 算法的時間和空間成本非常高。
Tertius():Tertius算法。
6)預測和評估:
predict():根據分類或聚類結果預測新數據的類別
table():比較兩個因子對象
evaluate_Weka_classifier():評估模型的執行,如:TP Rate,FP Rate,Precision,Recall,F-Measure。
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”,可以把這個樹看清楚些。看完后截圖或者關掉
這 里我們解釋一下“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”。
---- 整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/classify.html
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”屬性表示聚類算法給出的該實例所在的簇。