SVM補做

本文原載於 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。

idfi=log(N/dfi)

其中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 效果更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章