標籤:nlp python libsvm ubuntu
preface: 最近在做一個多分類的問題,資料格式要求跟libsvm接受的格式很像,為圖方便,試著用下libsvm, 習慣用python, 那就用python版本的吧。
工欲擅其事,必先利其器。Libsvm下載:http://www.csie.ntu.edu.tw/~cjlin/libsvm/,Download LIBSVM那一欄,下載libsvm包。也可以從網盤下載:http://pan.baidu.com/s/1bnk5Hr5,本人用的是ubuntu 15.04版本的,python用了內建的,另外安裝了anaconda。
解壓後,看README即可。有個python檔案夾,這裡介紹python部分的,看python檔案夾下README即可。裡面有詳細的介紹。
在該檔案夾下開啟終端,make,編譯下,然後輸入ipython或python,進入python互動式介面,按照README檔案的說明,運行一個已經處理好的LIBSVM資料格式的心臟資料heart_scale,進行分類。
<span style="font-size:18px;">>>> from svmutil import *# Read data in LIBSVM format>>> y, x = svm_read_problem('../heart_scale')>>> m = svm_train(y[:200], x[:200], '-c 4')>>> p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)</span>以上只是一個小demo.關鍵還在於各個函數以及參數用法。
首先,svm_read_problem()函數,顧名思義可以看出,用來讀取資料的函數,資料格式需要是libsvm能夠接受的格式,並且此函數返回兩個值,y為第一列label, 即哪個類別。x為後面的特徵列。資料格式,有博友說的很清楚:
#=====================================
1)LIBSVM使用的資料格式
該軟體使用的訓練資料和檢驗資料檔案格式如下:
[label] [index1]:[value1] [index2]:[value2] ...
[label] [index1]:[value1] [index2]:[value2] ...
一行一條記錄資料,如下(可參看libsvm-3.1/heart_scale):
+1 1:0.708 2:1 3:14:-0.3205:-0.1056:-1
注意:由於程式設計的原因,每行資料的最後一個value後面,
還必須加一個空格 ‘ ‘ 或Tab ‘\t‘ 才能斷行符號換到下一行繼續輸入下一條資料。
最後一行資料也是必須在最後一個value後面加一個空格 ‘ ‘ 或Tab ‘\t‘ 的!!!
這裡(x,y) -> ((0.708,1,1, -0.320, -0.105, -1), +1) ( ps: 這話什麼意思? 沒弄明白!! )
label 或說是class, 就是你要分類的種類,通常是一些整數。
index 是有順序的索引,通常是連續的整數。
value 就是用來 train 的資料,通常是一堆實數。
#=======================================================
其次,svm_train()函數。最好的文檔莫過於help(svm_train):
Help on function svm_train in module svmutil:svm_train(arg1, arg2=None, arg3=None) svm_train(y, x [, options]) -> model | ACC | MSE svm_train(prob [, options]) -> model | ACC | MSE svm_train(prob, param) -> model | ACC| MSE Train an SVM model from data (y, x) or an svm_problem prob using 'options' or an svm_parameter param. If '-v' is specified in 'options' (i.e., cross validation) either accuracy (ACC) or mean-squared error (MSE) is returned. options: -s svm_type : set type of SVM (default 0) 0 -- C-SVC (multi-class classification) 1 -- nu-SVC (multi-class classification) 2 -- one-class SVM 3 -- epsilon-SVR (regression) 4 -- nu-SVR (regression) -t kernel_type : set type of kernel function (default 2) 0 -- linear: u'*v 1 -- polynomial: (gamma*u'*v + coef0)^degree 2 -- radial basis function: exp(-gamma*|u-v|^2) 3 -- sigmoid: tanh(gamma*u'*v + coef0) 4 -- precomputed kernel (kernel values in training_set_file) -d degree : set degree in kernel function (default 3) -g gamma : set gamma in kernel function (default 1/num_features) -r coef0 : set coef0 in kernel function (default 0) -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1) -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5) -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1) -m cachesize : set cache memory size in MB (default 100) -e epsilon : set tolerance of termination criterion (default 0.001) -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1) -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0) -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1) -v n: n-fold cross validation mode -q : quiet mode (no outputs)
以上是英文文檔。中文文檔有博友也寫得很清楚,直接轉載過來:
#=================================
其中options涵義如下:
-s svm類型:設定SVM 類型,預設值為0,可選類型有:
0 -- C- SVC
1 -- nu - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- nu-SVR
-t 核函數類型:設定核函數類型,預設值為2,可選類型有:
0 -- 線性核:u‘*v
1 -- 多項式核:(g*u‘*v+ coef0)degree
2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)
3 -- sigmoid 核:tanh(g*u‘*v+ coef 0)
-d degree:核函數中的degree設定,預設值為3;
-g r(gama):核函數中的函數設定(預設1/ k);
-r coef 0:設定核函數中的coef0,預設值為0;
-c cost:設定C- SVC、e - SVR、n - SVR中從懲罰係數C,預設值為1;
-n nu :設定nu - SVC、one-class-SVM 與nu - SVR 中參數nu ,預設值0.5;
-p e :核寬,設定e - SVR的損失函數中的e ,預設值為0.1;
-m cachesize:設定cache記憶體大小,以MB為單位(預設40):
-e e :設定終止準則中的可容忍偏差,預設值為0.001;
-h shrinking:是否使用啟發學習法,可選值為0 或1,預設值為1;
-b 機率估計:是否計算SVC或SVR的機率估計,可選值0 或1,預設0;
-wi weight:對各類樣本的懲罰係數C加權,預設值為1;
-v n:n折交叉驗證模式。
其中-g選項中的k是指輸入資料中的屬性數。巨集指令引數 -v 隨機地將資料剖分為n 部分並計算交叉檢驗準確度和均方根誤差。以上這些參數設定可以按照SVM 的類型和核函數所支援的參數進行任意組合,如果設定的參數在函數或SVM 類型中沒有也不會產生影響,程式不會接受該參數;如果應有的參數設定不正確,參數將採用預設值。training_set_file是要進行訓練的資料集;model_file是訓練結束後產生的模型檔案,該參數如果不設定將採用預設的檔案名稱,也可以設定成自己慣用的檔案名稱。
#==================================
再次,關鍵的特徵問題,本人做NLP的戰五渣研究僧一枚,資料格式及文本有如下所例:
<span style="font-size:18px;">同為校花 楊冪 鄭爽 楊冪趙薇唐嫣章子怡鄭爽誰是當之無愧最美校花昔日情敵 周慧敏 張茆 周慧敏情敵張茆嫁外籍男朋友 玲花 曾毅 曾毅和玲花介於友情與愛情之間</span>
同仁的盆友應該能看出鹵主要幹什麼了,是的,沒錯,你猜對了:對新聞標題抽取出明星名字並對名人1和名人2之間的關係進行分類。去停用詞,找出該類的特徵詞,用卡方特徵量等等什麼的。暫時還在做,有空再貼出來。~,~///。
最後,待續。。。
#==============================
參考:
1.http://www.csie.ntu.edu.tw/~cjlin/libsvm/
2.http://blog.csdn.net/meredith_leaf/article/details/6714144
3.http://shiyanjun.cn/archives/548.html
使用libsvm進行分類之python版本