本文原載於 cyz14.farbox.com [2016-06-23的博客]。代碼 svm.py 已丟失,印象中比較簡單,僅僅使用了 libsvm 進行了測試。
—–以下爲原文—–
SVM作業
SVM的文本分類實驗採用libsvm工具,對文本處理後得到的數據進行訓練和測試。
代碼爲 svm.py 文件,主要功能是處理4類文本獲得詞彙表和每個文件的詞彙 tf-idf 向量,按格式輸出到 libsvm 的訓練數據文件中。
libsvm 的數據格式爲:
每行一個樣例,這裏爲一個文件的數據
<label> <index1>:<value1> <index2>:<value2> ...
其中
[
"c1_atheism", # (無神論)
"c2_sci.crypt", # (洞穴)
"c3_talk.politics.guns", # (政治)
"c4_comp.sys.mac.hardware"] # (計算機)
之後每個 : 對爲一個分量的值,這裏是每個單詞的權重,採用的是 tf-idf。單詞順序是預處理所有文本得到的詞彙表的順序,保證了所有文件裏順序的相同。
TF-IDF 的計算
預處理得到了總的詞彙表,同時還記錄了出現了每個單詞的文檔個數 df , 這樣方便後面計算 idf。
其中N爲文檔總數,這裏取了400.
tf 則是採用了單詞在文檔中所佔的頻率,而不是直接採用了出現次數。
交叉驗證
驗證方式採用了最直接的交叉驗證,這也可以不用分出訓練集和測試集。
./svm-scale textsvm.txt > textsvm.scale
./svm-train -s 0 -c 5 -t 2 -v 5 textsvm.scale
svm-type: C-SVC
cost: C of C-SVC = 5
kernel type: 2 – radial basis function: exp(-gamma*|u-v|^2)
S 折交叉驗證:5
測試一次的結果正確率爲 81.25%
嘗試其他不同參數的結果如下:
svm-type: nu-SVC
cost: C of C-SVC = 5
kernel-type: 2 – radial basis function: exp(-gamma*|u-v|^2)
S 折交叉驗證: 5
svm-type: nu-SVC
cost: C of C-SVC = 5
kernel-type: 1 – polynomial: (gamma*u’*v + coef0)^degree
S 折交叉驗證: 5
可見在該文本庫中,SVM-type 選擇 nu-SVC 要比 C-SVC 效果更好。