使用LibSVM進行分類的注意事項

採用LibSVM進行分類中介紹了

  1. 數據預處理
    1. categorical feature的numerical
    2. scale 將attribute都映射到[-1,1]
  2. 模型選擇
    1. 常見kernel function
    2. cross-validation和grid-search用來查找參數 (C,gamma)
  3. LibSVM的用法
  4. 採用scale+cross-validation進行分類

本文介紹一些注意事項??


1. Scaling Training and Testing Data

在採用LibSVM進行分類我們介紹了需要將訓練數據和測試數據進行scale,這是為了

  1. 避免有的數據特別大而有的數據特別小導致dominate
  2. 為了避免計算難度,因為kernel值往往依賴於兩個特徵向量的內積

但是如果訓練數據和測試數據分別scaled to [0, 1],那麼這意味著縮放尺度可能是不一樣的,需要用相同的縮放尺度,正確方法如下


??首先對訓練集進行scale,並且將scale的結果存入到svmguide1.scale, scale參數存入到range1文件中

/svm-scale -l -1 -u 1 -s range1 svmguide1.txt > svmguide1.scale

scale的結果如下所示

1 1:-0.630352 2:-0.198921 3:0.177151 4:0.164773 1 1:-0.836265 2:-0.74039 3:-0.444672 4:0.319044 1 1:-0.83292 2:-0.694281 3:0.358023 4:0.534116 1 1:-0.694967 2:-0.0898725 3:-0.290532 4:0.712971 1 1:-0.565608 2:-0.340882 3:0.12296 4:0.456853 1 1:-0.415903 2:0.0703588 3:-0.105526 4:0.569952 1 1:-0.65183 2:-0.0256065 3:-0.228021 4:0.681195 0 1:-0.879798 2:-0.933452 3:0.256268 4:-0.355646 0 1:-0.886787 2:-0.89496 3:0.226495 4:-0.520531 0 1:-0.879161 2:-0.866991 3:0.850791 4:0.692447 0 1:-0.889332 2:-0.983733 3:0.572379 4:-0.681611

??然後採用相同的scaling parameter對測試集數據進行scale

./svm-scale -r range1 svmguide1.t >svmguide1.t.scale

scale的結果如下所示

0 1:-0.912194 2:-0.924597 3:0.531213 4:0.035627 0 1:-0.930858 2:-0.944502 3:0.41847 4:0.280396 0 1:-0.869272 2:-0.89418 3:0.425484 4:0.783106 0 1:-0.863384 2:-0.811593 3:-0.388981 4:0.293535 0 1:-0.88641 2:-0.925034 3:0.395975 4:0.160618 0 1:-0.900741 2:-0.877244 3:0.828971 4:0.688611 0 1:-0.886672 2:-0.890022 3:0.591167 4:-0.559946 0 1:-0.888692 2:-0.815783 3:-0.304775 4:-0.669528 1 1:-0.475186 2:-0.323007 3:0.239772 4:0.328027 1 1:-0.66172 2:0.081458 3:-0.202763 4:0.999777 1 1:-0.765757 2:-0.556267 3:0.221668 4:0.141725 1 1:-0.711618 2:-0.242799 3:-0.169259 4:0.524334


如果採用分別scaled的方法,那麼結果精度會有很大誤差,例如我們採用svmguide4的數據進行實驗。

??首先測試分別scaled to [0, 1]的方法

../svm-scale -l 0 svmguide4 > svmguide4.scale../svm-scale -l 0 svmguide4.t > svmguide4.t.scalepython easy.py svmguide4.scale svmguide4.t.scaleAccuracy = 69.2308% (216/312) (classification)

可以看出得到的精度為69%,比較低

??然後測試採用相同scaling factor的方法,先把訓練集scaled to [0,1],然後用產生的scaling factor來scale測試集

../svm-scale -l 0 -s range4 svmguide4 > svmguide4.scale../svm-scale -r range4 svmguide4.t > svmguide4.t.scalepython easy.py svmguide4.scale svmguide4.t.scaleAccuracy = 89.4231% (279/312) (classification)


2. Linear Kernel VS RBF Kernel

推薦閱讀:

為什麼支持向量機要用拉格朗日對偶演算法來解最大化間隔問題?
SVM—線性支持向量機—二類分類模型
Tensorflow實現二分類線性SVM
如何理解SVM | 支持向量機之我見
支持向量機嶺回歸和分類凸損失

TAG:機器學習 | SVM | libsvm |