Weka使用笔记
from:http://blog.sina.com.cn/s/blog_4766fd440101iyb0.html
前些日子基于weka初步做了一下文本分類,使用的是最頻繁使用的矢量空間模型(Vector Space Model),即假設正負樣本在特征空間的分布迥異,基于某種規則將它們轉化為矢量,然后訓練分類器來區分這些矢量,測試樣本來時送進分類器進行分類就行。在我的實驗里面,特征降維使用的是基于TFIDF的特征選擇,分類器使用的是樸素貝葉斯(na?ve bayes)分類器。
?
前期預處理
編碼不一致:由于我的中文樣本是從網站各個地方收集來的,因此編碼很可能不一致,有的是ANSI,有的是Unicode,需要統一編碼便于后續處理。本實驗里面,所有的文本都被統一成ANSI編碼。下載一個文本編碼轉換器(TxtEdit)即可轉換。
中文分詞:由于樣本是中文文本,因此需要進行中文分詞,包括去掉英文標點符號,停詞處理等,現成的工具有計算所開發的漢語分詞系統(http://ictclas.org/)等。
?
Weka進行分類
Weka功能實在是太強大,剩下的事情可以全部交給weka做了。
先引用weka中文論壇的資料介紹下Weka:
WEKA的全名是懷卡托智能分析環境(Waikato Environment for Knowledge Analysis),它的源代碼可通過http://www.cs.waikato.ac.nz/ml/weka得到。同時weka也是新西蘭的一種鳥名,而WEKA的主要開發者來自新西蘭。
WEKA作為一個公開的數據挖掘工作平臺,集合了大量能承擔數據挖掘任務的機器學習算法,包括對數據進行預處理,分類,回歸、聚類、關聯規則以及在新的交互式界面上的可視化。如果想自己實現數據挖掘算法的話,可以看一看weka的接口文檔。在weka中集成自己的算法甚至借鑒它的方法自己實現可視化工具并不是件很困難的事情。2005年8月,在第11屆ACM SIGKDD國際會議上,懷卡托大學的Weka小組榮獲了數據挖掘和知識探索領域的最高服務獎,Weka系統得到了廣泛的認可,被譽為數據挖掘和機器學習歷史上的里程碑,是現今最完備的數據挖掘工具之一(已有11年的發展歷史)。Weka的每月下載次數已超過萬次。
?
介紹完畢,使用weka之前必須安裝weka,具體參見weka中文論壇http://www.wekacn.org/index.php,注意weka的安裝文件有帶java運行環境和不帶java運行環境的,按照自己的機器情況安裝。
?
安裝完weka以后,由于要處理的是中文文本,需要將安裝文件夾內的RunWeka.ini文件打開,將fileEncoding的值Cp1252換成Cp936。
?
Weka使用的數據格式是arff,因此第一步是將txt轉化為arff文件(命令行在GUI里面的Simple CLI鍵入,下同):
?java weka.core.converters.TextDirectoryLoader -dir my_data_folder > my_arff_save _path/data.arff
其中,my_data_folder是包含樣本txt的文件夾,如果是二值化的分類問題,則該文件夾應該包含兩個子文件夾,每個子文件夾裝每個類的樣本,多類的分類問題就是多個子文件夾,類同。子文件夾的名字就是該類的類標簽,在生成的arff文件可以看到這一點。??my_arff_save _path是想要保存文件的目錄,data.arff是生成的數據文件,也可以是自己想要的任何名字。
?
獲得TFIDF數據,將文本轉化為矢量:
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類說明里面看到如下選項的意義:
-C??對word進行詞頻計數而不是二值化表示
-I??將詞頻轉化為fij*log(文檔數目/包含詞i的文檔數目),fij是詞i出現在文檔j里面的頻率?后面的選項是通用的選項:-i??輸入-o??輸出-c??指明類標簽的位置,last表明標簽為最后一個屬性,first表明標簽為第一個屬性。
注:在這篇文章http://fengshenbang.javaeye.com/blog/695153里面,指出了轉化后產生的第一類的類標簽缺失的情況,其實沒什么問題,對后續的處理沒有任何影響,實在不放心,也可以采用AddString方法修復。
?
轉化后的數據還不能直接用來分類,需要進行離散化:
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的參數設置成了first后類標簽已經成為屬性的第一項
?
將數據分成訓練集和測試集:
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
?
同樣可以參見StratifiedRemoveFolds類說明:
-N 4??指定將數據集分成的折數為4
-F 1??指定第1折被選中
-V????取反,設置-V將導致剩下沒被選中的作為輸出
可以加個-S的選項在分折的時候隨機選擇樣本
?
測試集:
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
?
經過上述操作后,數據被分成了4折,其中3折作為訓練集,還有1折數據作為測試集。
?
訓練模型:
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
?
>為輸出定位符,前后都要有空格
?
在測試集上檢驗效果:
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
?
注:輸出結果的data_vsm_NB_r.txt文件用記事本打開格式是亂的,用ultraedit之類的工具打開看的清楚。
?
在輸出文件的最后可以看到分類結果:
=== 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
?
注:如果數據集過于龐大,可能會報out of memory的錯誤,這時候需要加大java虛擬機從操作系統所獲得內存的大小,在java后加選項-Xmx1024m就能獲得1024m的內存(當然,需要操作系統至少剩余這么大的內存才行),具體參數意義請參考http://sun-xyun.javaeye.com/blog/416054。也可以新建一個bat文件,直接獲取1024m的內存啟動weka:
java -Xmx1024M -jar weka.jar
一勞永逸的解決問題,從該文件啟動weka,免得每一條命令都要帶上-Xmx參數。
總結
- 上一篇: 中文分词器分词效果的评测方法
- 下一篇: 用 WEKA 进行数据挖掘,第 2 部分