本文原载于 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 效果更好。