Weka使用笔记
from:http://blog.sina.com.cn/s/blog_4766fd440101iyb0.html
前些日子基于weka初步做了一下文本分類,使用的是最頻繁使用的矢量空間模型(Vector Space Model),即假設(shè)正負(fù)樣本在特征空間的分布迥異,基于某種規(guī)則將它們轉(zhuǎn)化為矢量,然后訓(xùn)練分類器來(lái)區(qū)分這些矢量,測(cè)試樣本來(lái)時(shí)送進(jìn)分類器進(jìn)行分類就行。在我的實(shí)驗(yàn)里面,特征降維使用的是基于TFIDF的特征選擇,分類器使用的是樸素貝葉斯(na?ve bayes)分類器。
?
前期預(yù)處理
編碼不一致:由于我的中文樣本是從網(wǎng)站各個(gè)地方收集來(lái)的,因此編碼很可能不一致,有的是ANSI,有的是Unicode,需要統(tǒng)一編碼便于后續(xù)處理。本實(shí)驗(yàn)里面,所有的文本都被統(tǒng)一成ANSI編碼。下載一個(gè)文本編碼轉(zhuǎn)換器(TxtEdit)即可轉(zhuǎn)換。
中文分詞:由于樣本是中文文本,因此需要進(jìn)行中文分詞,包括去掉英文標(biāo)點(diǎn)符號(hào),停詞處理等,現(xiàn)成的工具有計(jì)算所開(kāi)發(fā)的漢語(yǔ)分詞系統(tǒng)(http://ictclas.org/)等。
?
Weka進(jìn)行分類
Weka功能實(shí)在是太強(qiáng)大,剩下的事情可以全部交給weka做了。
先引用weka中文論壇的資料介紹下Weka:
WEKA的全名是懷卡托智能分析環(huán)境(Waikato Environment for Knowledge Analysis),它的源代碼可通過(guò)http://www.cs.waikato.ac.nz/ml/weka得到。同時(shí)weka也是新西蘭的一種鳥(niǎo)名,而WEKA的主要開(kāi)發(fā)者來(lái)自新西蘭。
WEKA作為一個(gè)公開(kāi)的數(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)次。
?
介紹完畢,使用weka之前必須安裝weka,具體參見(jiàn)weka中文論壇http://www.wekacn.org/index.php,注意weka的安裝文件有帶java運(yùn)行環(huán)境和不帶java運(yùn)行環(huán)境的,按照自己的機(jī)器情況安裝。
?
安裝完weka以后,由于要處理的是中文文本,需要將安裝文件夾內(nèi)的RunWeka.ini文件打開(kāi),將fileEncoding的值Cp1252換成Cp936。
?
Weka使用的數(shù)據(jù)格式是arff,因此第一步是將txt轉(zhuǎn)化為arff文件(命令行在GUI里面的Simple CLI鍵入,下同):
?java weka.core.converters.TextDirectoryLoader -dir my_data_folder > my_arff_save _path/data.arff
其中,my_data_folder是包含樣本txt的文件夾,如果是二值化的分類問(wèn)題,則該文件夾應(yīng)該包含兩個(gè)子文件夾,每個(gè)子文件夾裝每個(gè)類的樣本,多類的分類問(wèn)題就是多個(gè)子文件夾,類同。子文件夾的名字就是該類的類標(biāo)簽,在生成的arff文件可以看到這一點(diǎn)。??my_arff_save _path是想要保存文件的目錄,data.arff是生成的數(shù)據(jù)文件,也可以是自己想要的任何名字。
?
獲得TFIDF數(shù)據(jù),將文本轉(zhuǎn)化為矢量:
java weka.filters.unsupervised.attribute.StringToWordVector -I -C -i my_arff_save _path/data.arff -o my_arff_save_path/data_vsm.arff -c last??
?
可以在weka的StringToWordVector類說(shuō)明里面看到如下選項(xiàng)的意義:
-C??對(duì)word進(jìn)行詞頻計(jì)數(shù)而不是二值化表示
-I??將詞頻轉(zhuǎn)化為fij*log(文檔數(shù)目/包含詞i的文檔數(shù)目),fij是詞i出現(xiàn)在文檔j里面的頻率?后面的選項(xiàng)是通用的選項(xiàng):-i??輸入-o??輸出-c??指明類標(biāo)簽的位置,last表明標(biāo)簽為最后一個(gè)屬性,first表明標(biāo)簽為第一個(gè)屬性。
注:在這篇文章http://fengshenbang.javaeye.com/blog/695153里面,指出了轉(zhuǎn)化后產(chǎn)生的第一類的類標(biāo)簽缺失的情況,其實(shí)沒(méi)什么問(wèn)題,對(duì)后續(xù)的處理沒(méi)有任何影響,實(shí)在不放心,也可以采用AddString方法修復(fù)。
?
轉(zhuǎn)化后的數(shù)據(jù)還不能直接用來(lái)分類,需要進(jìn)行離散化:
java weka.filters.supervised.attribute.Discretize -i my_arff_save_path/data_vsm.arff -o my_arff_save_path/data_D_vsm.arff -c first
?
注:-c的參數(shù)設(shè)置成了first后類標(biāo)簽已經(jīng)成為屬性的第一項(xiàng)
?
將數(shù)據(jù)分成訓(xùn)練集和測(cè)試集:
java weka.filters.supervised.instance.StratifiedRemoveFolds -i my_arff_save_path/data_D_vsm.arff -o my_arff_save_path/data_vsm_train.arff -c first -N 4 -F 1 –V
?
同樣可以參見(jiàn)StratifiedRemoveFolds類說(shuō)明:
-N 4??指定將數(shù)據(jù)集分成的折數(shù)為4
-F 1??指定第1折被選中
-V????取反,設(shè)置-V將導(dǎo)致剩下沒(méi)被選中的作為輸出
可以加個(gè)-S的選項(xiàng)在分折的時(shí)候隨機(jī)選擇樣本
?
測(cè)試集:
java weka.filters.supervised.instance.StratifiedRemoveFolds -i my_arff_save_path/data_D_vsm.arff -o my_arff_save_path/data_vsm_test.arff -c first -N 4 -F 1
?
經(jīng)過(guò)上述操作后,數(shù)據(jù)被分成了4折,其中3折作為訓(xùn)練集,還有1折數(shù)據(jù)作為測(cè)試集。
?
訓(xùn)練模型:
java weka.classifiers.bayes.NaiveBayes -t my_arff_save_path/data_D_vsm.arff -i -k -d my_arff_save_path/data_vsm_nb.model -c first > my_arff_save_path/data_vsm_nb.model
?
>為輸出定位符,前后都要有空格
?
在測(cè)試集上檢驗(yàn)效果:
java weka.classifiers.bayes.NaiveBayes -l my_arff_save_path/data_vsm_nb.model -T my_arff_save_path/data_vsm_test.arff –c first > my_arff_save_path/data_vsm_NB_r.txt
?
注:輸出結(jié)果的data_vsm_NB_r.txt文件用記事本打開(kāi)格式是亂的,用ultraedit之類的工具打開(kāi)看的清楚。
?
在輸出文件的最后可以看到分類結(jié)果:
=== Error on test data ===
?
Correctly Classified Instances?????????627???????????????85.0746 %
Incorrectly Classified Instances???????110???????????????14.9254 %
Kappa statistic??????????????????????????0.5842
Mean absolute error??????????????????????0.1487
Root mean squared error??????????????????0.3852
Total Number of Instances??????????????737?????
?
?
=== Confusion Matrix ===
?
???a???b???<-- classified as
?115??22 |???a = horror
??88 512 |???b = normal
?
注:如果數(shù)據(jù)集過(guò)于龐大,可能會(huì)報(bào)out of memory的錯(cuò)誤,這時(shí)候需要加大java虛擬機(jī)從操作系統(tǒng)所獲得內(nèi)存的大小,在java后加選項(xiàng)-Xmx1024m就能獲得1024m的內(nèi)存(當(dāng)然,需要操作系統(tǒng)至少剩余這么大的內(nèi)存才行),具體參數(shù)意義請(qǐng)參考http://sun-xyun.javaeye.com/blog/416054。也可以新建一個(gè)bat文件,直接獲取1024m的內(nèi)存啟動(dòng)weka:
java -Xmx1024M -jar weka.jar
一勞永逸的解決問(wèn)題,從該文件啟動(dòng)weka,免得每一條命令都要帶上-Xmx參數(shù)。
總結(jié)
- 上一篇: 中文分词器分词效果的评测方法
- 下一篇: 用 WEKA 进行数据挖掘,第 2 部分