使用libsvm分類和預測詳細說明(python)
Libsvm使用詳細介紹
optimization finished, #iter= 162 //iter為迭代次數,
nu = 0.431029 //nu是你選擇的核函式型別的引數
obj = -100.877288, rho =0.424462 // rho為判決函式的偏置項b
// obj為SVM檔案轉換為的二次規劃求解得到的最小值
nSV = 132, nBSV = 107 // nSV為標準支援向量個數(0<a[i]<c)
//nBSV為邊界上的支援向量個數(a[i]=c)
Total nSV = 132
//TotalnSV為支援向量總個數(對於兩類來說,因為只有一個分類模型TotalnSV = nSV
用法:
svmscale[-l lower] [-u upper] //將資料進行歸一化處理
[-y y_lower y_upper]
[-s save_filename]
[-r restore_filename]filename
其中,[]中都是可選項:
-l:設定資料下限;lower:設定的資料下限值,預設為-1
-u:設定資料上限;upper:設定的資料上限值,預設為 1
-y:是否對目標值同時進行縮放;y_lower為下限值,y_upper為上限值;
-ssave_filename:表示將縮放的規則儲存為檔案save_filename
-rrestore_filename:表示將按照已經存在的規則檔案restore_filename進行縮放;
filename:待縮放的資料檔案,檔案格式按照libsvm格式。
首先開啟cmd,進入libsvm>windows資料夾
預設情況下,只需要輸入要縮放的檔名就可以了:比如(已經存在的檔案為test.txt)
svm-scaletest.txt
這時,test.txt中的資料已經變成[-1,1]之間的資料了。但是,這樣原來的資料就被覆蓋了,為了讓規劃好的資料另存為其他的檔案,我們用一個dos的重定向符 > 來另存為(
svm-scale test.txt > out.txt
執行後,我們就可以看到目錄下多了一個out.txt檔案,那就是規範後的資料。假如,我們想設定資料範圍[0,1],並把規則儲存為test.range檔案:
svm-scale –l 0 –u 1 –s test.range test.txt > out.txt
這時,目錄下又多了一個test.range檔案,可以用記事本開啟,下次就可以用
-r test.range來載入了。
grid.py //暴力試參
首先進入libsvm>tools資料夾,找到grid.py,開啟原始碼修改gnuplot_exe(需要另下載)的路徑
開啟cmd,進入libsvm>tools資料夾
輸入python grid.py test.txt
可選引數[-log2cbegin,end,step] [-log2g begin,end,step] [-v fold]
//使用者自定義的引數 c和g 的範圍 begin~end 以及步長 step,幾折交叉驗證
得到引數c和g的值以及交叉驗證準確率
注意:text.txt裡面的資料,每一行的的鍵必須從小到大依次排列,否則報錯,libsvm其他方法處理的時候,則不需要
使用時調入模組
(1)svm_read_problem() : read the data from a LIBSVM-format file
(2)svm_problem():
(3)svm_parameter():引數為字串
其中的c和g引數根據之前除錯的引數進行修改
svm_train的引數:
-s SVM的型別(svm_type)
0 -- C-SVC(預設)使用懲罰因子(Cost)的處理噪聲的多分類器
1 -- nu-SVC(多分類器)按照錯誤樣本比例處理噪聲的多分類器
2 -- one-class SVM一類支援向量機,可參見"SVDD"的相關內容
3 -- epsilon-SVR(迴歸)epsilon支援向量迴歸
4 -- nu-SVR(迴歸)
-t核函式型別(kernel_type)
0 -- linear(線性核):u'*v
1 -- polynomial(多項式核):(gamma*u'*v +coef0)^degree
2 -- radial basisfunction(RBF,徑向基核/高斯核):exp(-gamma*|u-v|^2)
3 -- sigmoid(S型核):tanh(gamma*u'*v + coef0)
4 -- precomputed kernel(預計算核):
核矩陣儲存在training_set_file中
下面是調整SVM或核函式中引數的選項:
-d調整核函式的degree引數,預設為3
-g調整核函式的gamma引數,預設為1/num_features
-r調整核函式的coef0引數,預設為0
-c調整C-SVC, epsilon-SVR 和 nu-SVR中的Cost引數,預設為1
-n調整nu-SVC, one-class SVM 和 nu-SVR中的錯誤率nu引數,預設為0.5
-p調整epsilon-SVR的loss function中的epsilon引數,預設0.1
-m調整內緩衝區大小,以MB為單位,預設100
-e調整終止判據,預設0.001
-wi調整C-SVC中第i個特徵的Cost引數
調整演算法功能的選項:
•-b是否估算正確概率,取值0 - 1,預設為0
•-h是否使用收縮啟發式演算法(shrinkingheuristics),取值0- 1,預設為0
•-v交叉校驗
• -q靜默模式
(4)svm_train()
svm_train有3個過載:
l model = svm_train(y, x [,'training_options'])
l model = svm_train(prob [,'training_options'])
l model = svm_train(prob, param)
(5)svm_save_model() : save model to a file.
將訓練好的svm_model儲存到檔案中:
svm_save_model('model_file',model)
model_file的內容:
svm_typec_svckernel_typelinearnr_class 2 total_sv 2 rho 0 label 1 -1probA 0.693147 probB 2.3919e-16 nr_sv 1 1 SV 0.25 1:1 2:1-0.25 1:-1 2:-1
(6)svm_load_model() : load a LIBSVM model.
讀取儲存在檔案中的svm_model:
model =svm_load_model('model_file')
(7)svm_predict()
呼叫語法:
p_labs, p_acc, p_vals =svm_predict(y, x, model [,'predicting_options'])
引數:
y測試資料的標籤x測試資料的輸入向量model為訓練好的SVM模型。
返回值:
p_labs是儲存預測標籤的列表。
p_acc儲存了預測的精確度,均值和迴歸的平方相關係數。
p_vals在指定引數'-b 1'時將返回判定係數(判定的可靠程度)。
這個函式不僅是測試用的介面,也是應用狀態下進行分類的介面。比較奇葩的是需要輸入測試標籤y才能進行預測,因為y不影響預測結果可以用0向量代替。