svm使用的一般步驟


LIBSVM 使用的一般步驟是:
1)准備數據集,轉化為 LIBSVM支持的數據格式 :
[label] [index1]:[value1] [index2]:[value2] ...
即 [l類別標號] [特征1]:[特征值] [特征2]:[特征值] ...
2)對數據進行簡單的縮放操作(scale);(為什么要scale,這里不解釋了)
3)考慮選用核函數(通常選取徑函數,程序默認);
4)采用交叉驗證(一般采用5折交叉驗證),選擇最佳參數C與g ;
5)用得到的最佳參數C與g 對整個訓練集進行訓練得到SVM模型;
6)用得到的SVM模型進行測試

 

 

Libsvm 是一個簡單的,易用的,高效的SVM分類和回歸軟件。它解決了 C-SVM 分類,nu-SVM 分類,
one-class-SVM,epsilon-SVM 回歸,nu-SVM 回歸(的問題)。它也提供了一個自動的 C-SVM 分類的模型選擇工具。本文檔解釋了 Libsvm 的用法。


Libsvm 的獲取:http://www.csie.ntu.edu.tw/~cjlin/libsvm
請在使用 Libsvm 之前閱讀 COPYRIGHT 文檔。

目錄:
=======================

- 快速開始
- 安裝與數據格式
- 使用 ‘svm-train’
- 使用 ‘svm-predict’
- 使用 ‘svm-scale’
- 實際應用的小貼士
- 例子
- 自定義核函數
- 庫的使用
- Java 版本
- 編譯 Windows 二進制文件
- 附加工具:Sub-sampling, Parameter Selection, Format checking, 等
- MATLAB/OCTAVE 接口
- Python 接口
- 補充

快速開始
=======================

如果你剛接觸 SVM 並且數據不大,安裝完畢之后請用 ‘tools' 文件夾下的 easy.py。它自動做好所有的事情——從數據縮放到參數選擇。

使用方法:easy.py training_file [testing_file]

有關參數選擇的更多信息請參閱 ‘tools/README’。

安裝和數據格式
=======================

在 Unix 系統中,鍵入 ‘make’  編譯 ‘svm-train’ 和 ‘smv-predict’ 程序。運行程序時不設參數可以顯示它們的用法。

在另一些系統中,查閱 ‘Makefile’ 來編譯它們( 例如,參閱本文檔中的 ‘編譯 Windows 二進制文件’ )或者使用已編譯的二進制文件( Windows 二進制文件在 ‘windows’ 目錄下 )。

訓練數據和測試數據的文件格式如下:

<label> <index1>:<value1> <index2>:<value2> ...
   .
   .

每一行包括一個實例(樣本)並以 ‘\n’ 字符結束。對於分類,<label> 是一個整型數據,表示一個分類標簽(支持多類分類)。對於回歸,<label> 是一個可以為任意實數的目標值。對於 one-class SVM,它不被使用,所以可取任意值。一對 <index>:<value> 提供一個特征(屬性)值:<index> 是從 1 開始的整型數據,<value> 是一個實數。唯一的例外是自定義核函數,<index> 從 0 開始;參見自 ‘定義核函數’ 部分。Indices 必須是單調增的順序。測試文件中的 Labels 僅僅用於計算精度或誤差。如果它們是未知量,只需在第一列任意填一個數。

本程序包中的一個已分類的數據的樣本是 ‘heart_scale’。使用‘tools/checkdata.py(細節參閱 ‘tools/README’ )’ 來檢查你的數據是否為正確的格式。

鍵入 ‘svm-train heart_scale’,此程序會讀入訓練數據並且輸出(建立好的)模型文件 ‘heart_scale.model’。如果你有一個命名為 ‘heart_scale.t’ 的測試集,鍵入 ‘svm-predict heart_scale.t heart_scale.model output’ 來觀察預測精度。‘output’ 文件包含預測后的類別標簽。
 
對於分類(問題),如果訓練數據都是同一類(即,所有標簽都一樣),那么 'svm-train' 會出示一個警告信息:‘Warning: training data in only one class. See README for details’,意味着訓練數據是非常不平衡的。訓練數據的 label 在測試的時候直接返回。
 
下面是本程序包中的其他的一些有用的程序:

svm-scale:
   這是一個縮放輸入數據文件的工具(其實就是把屬性值歸一化)。
svm-toy:
   這是一個簡單的圖形接口,它用一個平面展示 SVM 怎樣將數據分開。你可以在窗口內點擊來畫出一些數據點,使用 ‘change’ 按鈕來選擇類別 1,2,3(即,最多支持三個類別),‘load’ 按鈕用來載入文件中的數據,‘save’ 按鈕用來保存數據到一個文件,‘run’ 按鈕用來得到一個 SVM 模型,‘clear’ 按鈕來清空窗口。

你可以在窗口底端內輸入選項,選項語法與 ‘svm-train’ 相同。

注意,‘load’ 和 ‘save’ 會考慮分類和回歸情況中的密集數據格式。對於分類,每一個數據點有一個必須為1,2,3的 label(顏色)和兩個在 [0,1)上的屬性(x坐標和y坐標)。對於回歸,每一個數據點有一個在 [0,1)上的目標值(y坐標)和一個在 [0,1)上屬性(x坐標)。

分別在其各自的文件夾中鍵入‘make’來編譯它們。

你需要 Qt 庫來編譯 Qt 版本。從 http://www.trolltech.com 獲取。
你需要 GTK+ 庫來編譯 GTK 版本。從 http://www.gtk.org 獲取。

預編譯的 Windows 二進制文件在 ‘windows’ 文件夾下。我們使用的是32位的機器上的 Visual C++,所以最大緩存
大小是2GB。

使用‘svm-train’
=======================

用法:svm-train [options] training_set_file [model_file]
options:
-s svm_type:設定SVM類型(默認為0)
        0 -- C-SVC   (多類分類)
        1 -- nu-SVC   (多類分類)
        2 -- one-class SVM
        3 -- epsilon-SVR   (回歸)
        4 -- nu-SVR   (回歸)
-t kernel_type:設定核函數類型(默認為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) sigmoid核函數
        4 -- precomputed kernel (kernel values in training_set_file) 自定義核函數
-d degree:設定核函數的 degree 值(默認為 3)
-g gamma:設定核函數的 gamma 值(默認為 1/k)
-r coef0:設定核函數的 coef0 值(默認為 0)
-c cost:設定 C-SVC,epsilon-SVR,nu-SVR 的參數懲罰因子C值(默認為 1)
-n nu:設定 nu-SVC,one-class SVM,nu-SVR 的參數nu值(默認為 0.5)
-p epsilon:設定 epsilon-SVR 的損失函數中的 epsilon 值(默認為 0.1)
-m cachesize:設定緩存大小,以 MB 為單位(默認為 100)
-e epsilon:設定終止條件的允差(默認為 0.001)
-h shrinking:是否使用 shrinking heuristics(PS:這玩意太不好翻譯),0 或 1(默認為 1)
-b probability_estimates:是否訓練一個 SVC 或 SVR 模型做概率估計,0或1(默認為 0)
-wi weight : 對於 C-SVC,設定 i 類的參數 C 為 weight*C(默認為1)
-v n:n-折交叉驗證模式
-q :退出模式(無輸出)

-g 選項中的的 k 為輸入數據的屬性數量。
-v 選項隨機截取數據為 n 個部分,計算它們的交叉驗證的精度或者均方誤差。
關於輸出的意義,參閱libsvm FAQ。

使用‘svm-predict’
=======================

用法:svm-predict [options] test_file model_file output_file
options:
-b probability_estimates:是否預測概率估計,0或1(默認為 0);對於one-class SVM,僅支持 0。
model_file 是由 ‘svm-train’ 產生的模型文件。
test_file 是你欲預測的測試數據。
output_file 是 ‘svm-predict’ 產生的輸出文件。

使用‘svm-scale’
=======================

用法:svm-scale [options] data_filename
options:
-l lower:x 縮放下限(默認為-1)
-u upper:x 縮放上限(默認為+1)
-y y_lower y_upper:y 縮放上下限(默認為不縮放)
-s save_filename:儲存縮放參數到save_filename文件中
-r restore_filename:載入 restore_filename 中的縮放參數
 
例子請參閱本文件中的‘Examples’。

實際應用的小貼士
=======================
 
* 縮放數據。例如,縮放每個屬性為 [0,1] 或 [-1,+1]。
* 對於 C-SVC,可以考慮用 ‘tools’ 文件夾下的模型選擇工具。
* nu-SVC/one-class-SVM/nu-SVR 中的 nu 參數近似為訓練誤差和支持向量的比率。
* 如果要分類的數據是不平衡的(如,大正集和小負集),用 -wi 嘗試不同的懲罰因子(參見下述例子)。
* 對於復雜問題,指定更大的緩存(即,larger -m)。

例子
=======================

> svm-scale -l -1 -u 1 -s range train > train.scale
> svm-scale -r range test > test.scale
縮放訓練數據的每個特征值在 [-1,1] 內(訓練數據文件為 train,縮放后的數據為 train.scale),縮放因子(就是一些參數)被存儲在 range 文件中然后被用於縮放測試數據(測試數據文件為test,縮放后的數據為test.scale)。

> svm-train -s 0 -c 5 -t 2 -g 0.5 -e 0.1 data_file
用 RBF核函數 exp(-0.5|u-v|^2) 訓練(data_file文件)得到一個分類器,C=10,終止允差為0.1。

> svm-train -s 3 -p 0.1 -t 0 data_file
用 線性核函數 u'v 解決 SVM 回歸(問題),損失函數中 epsilon=0.1。

> svm-train -c 10 -w1 1 -w2 5 -w4 2 data_file
訓練一個分類器,對於 ‘1’ 類 懲罰因子為 10= 1 * 10,對於 ‘2’ 類 懲罰因子為 50 = 5 * 10,對於 ‘4’ 類 懲罰因子為 20 = 2 * 10。

> svm-train -s 0 -c 100 -g 0.1 -v 5 data_file
對分類器用參數 C=100,gamma=0.1 做五折交叉驗證。

> svm-train -s 0 -b 1 data_file
> svm-predict -b 1 test_file data_file.model output_file
用概率信息得到一個模型。用概率估計來預測測試數據。

自定義核函數
=======================

用戶可以自定義核函數的值並輸入它們作為訓練和測試文件。之后 libsvm 不需要原始的訓練和測試集。
假定有 L 個訓練實體 x1, ..., xL。以 K(x, y) 做核函數中兩個實體 x,y 的值,輸入格式如下:
 
新訓練實例 xi:
<label> 0:i 1:K(xi,x1) ... L:K(xi,xL)
新測試實例 任意 x:
<label> 0:? 1:K(x,x1) ... L:K(x,xL)
 
即,在訓練文件中,第一列必須是 xi 的‘ID’。在測試中,用 ? 作為任意值。
 
所有核函數值包括 ZEROs 必須是明確提供的。訓練和測試文件中任何隨機的或排列的子集也有效(見下例)。
 
注意:格式與以前在 libsvmtools(文件夾)中發布的預定義核函數略有不同。

例子:
        假定最初的訓練數據有三個 4-feature 的實例,測試數據有一個實例:
 
        15  1:1 2:1 3:1 4:1
        45        2:3       4:3
        25              3:1
 
        15  1:1       3:1
 
        如果用線性核函數,我們將得到如下新的訓練和測試子集:
 
        15  0:1 1:4 2:6   3:1
        45  0:2 1:6 2:18 3:0
        25  0:3 1:1 2:0   3:1
 
        15  0:? 1:2 2:0  3:1
 
        ? 可為任何值。
 
        上面的訓練文件的任何子集也是有效的。如,
 
        25  0:3 1:1 2:0  3:1
        45  0:2 1:6 2:18 3:0
 
        意味着核矩陣為:
 
                [K(2,2) K(2,3)] = [18 0]
                [K(3,2) K(3,3)] = [ 0  1]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM