天天看點

Weka簡單介紹

之前從來沒寫過文章,這是第一篇,希望自己能把這個習慣堅持下去,算是給自己定期做個總結,也希望能在這裡跟大家交流一下心得。

    以前一直在做system & network方面的工作,沒有怎麼接觸過datamining,不過馬上要去的公司在這方面很有建樹,估計去了以後也免不了接觸這些知識,更何況bigdata現在是最熱門的話題,是以在學校的最後一個學期選了datamining這門課,先入個門,以後有機會的話再深入研究。

    目前用weka做了一些簡單的資料分析的工作,發現這個工具還是很強大的,是以寫這篇文章簡單介紹一下weka。

    Weka(Waikato Environment for Knowledge Analysis) 由紐西蘭的Universityof Waikato研發,是一款基于java的machinelearning的軟體套件。使用者可以使用weka提供的可視化界面,也可以使用weka提供的api開發滿足特定需求的模型和算法。同時weka也支援加載開發者自己開發的extensionpackages,是以在weka下幾乎能找到了所有現在比較流行的datamining模型和算法的實作。

Weka現在有windows,linux以及mac os版本,可視化界面基本上是一樣的。下面用幾個例子簡單介紹一下如何用weka進行簡單的datamining的工作。

訓練classifier:

首先在Preprocess标簽下,點選Openfile選擇一個你要打開的dataset,這個dataset需要符合一定的檔案格式才能被weka解析,最常用的是arff格式的檔案,是以最好先将你的dataset轉換成這個格式的檔案。打開檔案後,weka會自動解析資料,并且顯示關于這個dataset的統計資訊在圖形界面上。比如這個dataset含有多少instances,每個instances有多少attributes,attributes的分布情況,而且提供可視化圖像使得資料更加直覺。

    如果要做一個簡單的classifier的訓練,首先我們打開一個weka自帶的dataset :breast-cancer.arff,這是一個關于患者乳腺癌是否複發的dataset,資料比較簡單,每一個instance代表一個病人,有9個attributes,包括age,tumor-size等等,所有attributes都是nominal屬性的,每一個instance帶有一個class屬性,no-recur或者recur。

現在我們選擇一個classifier來進行訓練。切換到Classify标簽下,點選Choose選擇一個classifier,在weka-classifier-trees下選擇DecisionStump,此時點選Choose旁邊的文本欄可以設定DecisionStump的具體參數,調整完畢之後選擇如何進行測試,這裡我們選擇使用cv進行測試,folds選擇10,點選Start,好了,weka就會開始使用我們的dataset并且按照我們調整的參數來和訓練方法來訓練classifier了。訓練完畢後classifier的結構以及測試結果都會輸出在output欄,你可以很直覺地看到目前模型的訓練成果。拿我們這個例子來說,因為DecisionStump模型是在太過簡單,僅僅根據deg-malig屬性是否等于3來進行分類,正确率僅有68%左右。讓我們換一個classifier再試試,這次我們選擇J48,這是一個C4.5的實作。如果隻是選擇預設參數并且不prune的話,我們會發現訓練出來的tree結構非常複雜,并且分類效果依然很差,僅有69%左右,很明顯,訓練出的模型出現了overfitting。此時我們設定一下J48的屬性,将unpruned的參數調增為False,即允許prune,再次進行訓練,可以看到,這次訓練出來的tree結構得到了極大的簡化,并且正确率也提升到了75%。當然,要想得到好的結果還需要進行參數調整,我們這裡隻是使用了預設設定。再換一個knnclassifier試試,選擇weka-classifiers-lazy下面的IBK,并且設定它的KNN參數為5,即使用離輸入點最近的5個樣本點作為分類參考,訓練完成後分類準确率在73%左右。

Unbalance資料預處理:

有時候我們的dataset會有嚴重的unbalance問題,會導緻classifier模組化過程受到極大影響。比如我曾經使用過一個dataset,資料總量為9688,但是其中8704個instances為class 0,而剩下的984個instances為class 1。使用J48訓練過後,class0的分類效果較為理想,準确率可達96%,但是class1因為訓練樣本量過小,準确率僅有32%。在選擇dataset時,我們應盡量保證其中的資料在各個class之中是平衡的,并且如實反映真實世界中的資料分布。如果手頭資料偏差過大,那麼我們就需要在将資料送入classifier進行訓練之前對資料進行一些預處理。這裡我們讨論兩個比較典型的做法。

    第一個是undersampling,即從class占比例較大instances中sample出一部分資料,進而和class占比例較小的instances組成更為均衡的dataset。在Preprocess标簽下,在Filter下點選Choose,在weka-supervised-instance下選擇SpreadSubsample,然後設定參數,其中distributionSpread選擇1.0,代表uniformdistribution,使得從majorclass 中sample出的instances數量和minorclass保持一緻,然後點選Apply,這時候我們得到的dataset   其中class 0和class 1的instances都是984個,這樣就可以進行後續的資料處理了。

第二個是oversampling,我們讨論一個比較常用的算法:SMOTE,這個算法的特點是可以根據原有資料的特點生成原本不存在dataset裡的instances,進而擴充minor的dataset。同樣在weka-supervised-instance下選擇SMOTE,然後設定參數,classValue采用預設值,這樣SMOTE會自動識别哪一個class的數量是少數,并進行擴充,在percentege中選擇你想要将minorclass的instances擴充到多少比例,比如我的資料中class0的資料有8704,而class1的資料有984,那麼可以設定percentage為800,那麼擴充後的class1就可以和class0保持平衡。結果顯示class0的資料數量不變,而class1的資料量變成了8856.

資料降維:

使用weka還可以很友善的進行資料降維。當一個dataset中attributes太多的時候,會出現curseof dimensionality,這是因為資料次元空間過于複雜而造成資料難以處理。此時進行适當的降維就在所難免。我們這裡也讨論兩個weka中比較常用的降維方法。

    第一個是使用weka的InfoGainAttributeEval進行attributes選擇。基本原理是通過計算每一個attribute對于降低entropy的貢獻來進行排序,然後選擇排序較高的留下來,去掉排序較低的attributes,進而達到降維的目的。切換到Selectattributes标簽下,選擇weka-attributeSelection下的InfoGainAttributeEval,然後再選擇一個SearchMethod,比如我們選擇Ranker,然後設定Ranker的threshold為0.2,意思是去掉所有InfoGain低于0.2的attributes,那麼剩下的attributes就是對分類作用比較大的。以我手頭的一個dataset為例,降維後attributes數量從524降到了128。我們可以儲存這個dataset到新的arff檔案中。

第二個方法是PCA。基本思想是不删除任何一個attribute,但是将原有的attributes進行線性組合,進而生成一組新的attributes,但是數量遠小于原有attributes,進而達到降維的目的。同樣在weka-attributeSelection下選擇PrincipalComponents,即可進行PCA降維,降維後的dataset同樣可以儲存并進行後續處理。

我使用的weka版本是3.7.13-snapshot,這個版本雖然不是穩定版,但是這個版本有一個可視化的Packagemanager,可以十分友善的添加你所需要的package,比如我在使用的過程中需要的SMOTE,LibSVM以及GridSearch這些算法和模型的實作,都可以很友善地在這裡找到,省去了手動配置的麻煩。