Liblinear機器學習庫教程詳解(基於Python API)
阿新 • • 發佈:2019-02-10
前言
Liblinear機器學習庫主要實現SVM演算法,在處理大規模資料時速度快,但也有缺點,就是太吃記憶體,部落格 https://blog.csdn.net/roguesir/article/details/79793569 中介紹了在Mac Python3環境下安裝,這篇部落格介紹使用教程。以下材料自己整理,有錯誤請指出。
資料集要求
liblinear與libsvm類似,都要求使用libsvm格式資料,下面用庫自帶的heart_scale資料集進行介紹,資料集如下:
$ head heart_scale
+1 1:0.708333 2:1 3:1 4:-0.320755 5:-0.105023 6:-1 7:1 8:-0.419847 9:-1 10:-0.225806 12:1 13:-1
-1 1:0.583333 2:-1 3:0.333333 4:-0.603774 5:1 6:-1 7:1 8:0.358779 9:-1 10:-0.483871 12:-1 13:1
+1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1
-1 1:0.458333 2:1 3:1 4:-0.358491 5:-0.374429 6:-1 7:-1 8:-0.480916 9:1 10:-0 .935484 12:-0.333333 13:1
-1 1:0.875 2:-1 3:-0.333333 4:-0.509434 5:-0.347032 6:-1 7:1 8:-0.236641 9:1 10:-0.935484 11:-1 12:-0.333333 13:-1
-1 1:0.5 2:1 3:1 4:-0.509434 5:-0.767123 6:-1 7:-1 8:0.0534351 9:-1 10:-0.870968 11:-1 12:-1 13:1
+1 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5
+1 1:0.25 2:1 3:1 4:-0.698113 5:-0.484018 6:-1 7:1 8:0.0839695 9:1 10:-0.612903 12:-0.333333 13:1
+1 1:0.291667 2:1 3:1 4:-0.132075 5:-0.237443 6:-1 7:1 8:0.51145 9:-1 10:-0.612903 12:0.333333 13:1
+1 1:0.416667 2:-1 3:1 4:0.0566038 5:0.283105 6:-1 7:1 8:0.267176 9:-1 10:0.290323 12:1 13:1
資料形式為:label+(index:value)
第一列表示樣本標籤,隨後是libsvm格式資料集,這種資料集為了避免稀疏情況,預設未顯示的索引值為0,如第一行所示,1:0.708333表示索引為1的屬性值為0.708333,而未出現的索引為11的屬性值為0。
以上這種資料格式並不是必須的,也可以使用one-hot編碼的列表,如:
# Dense data
y, x = [1,-1], [[1,0,1], [-1,0,-1]]
# Sparse data
y, x = [1,-1], [{1:1, 3:1}, {1:-1,3:-1}]
演算法實現
>>> from liblinearutil import *
>>> y, x = svm_read_problem('../heart_scale', return_scipy = True) # 生成訓練集
>>> m1 = train(y[:200], x[:200, :], '-v 5 -c 4') # 訓練模型,這裡使用了交叉驗證
........................*....*
optimization finished, #iter = 288
Objective value = -273.047815
nSV = 116
.........................*.***.**
optimization finished, #iter = 274
Objective value = -305.012970
nSV = 124
.........................*...*.*.*
optimization finished, #iter = 301
Objective value = -271.645969
nSV = 109
.........................*.*.*
optimization finished, #iter = 275
Objective value = -253.467882
nSV = 108
........................*.***
optimization finished, #iter = 259
Objective value = -284.334805
nSV = 119
Cross Validation Accuracy = 83%
>>> m2 = train(y[:200], x[:200, :], '-c 4') # 訓練模型,未使用交叉驗證
.........................*......**
optimization finished, #iter = 319
Objective value = -357.115226
nSV = 145
>>> p_label, p_acc, p_val = predict(y[200:], x[200:, :], m2) # 測試
Accuracy = 81.4286% (57/70) (classification)
>>> save_model('model_file', m2) # 儲存模型
>>> model_ = load_model('model_file') # 載入訓練好的模型
Liblinear庫使用非常簡單,簡單幾步就可以實現SVM演算法,而且速度超快~
引數詳解
在訓練和測試時,需要設定很多引數來提升模型效能,比如上面程式碼中的-v、-c等,下面進行詳細介紹。
引數名 | 作用 | 描述 |
---|---|---|
-w | 正則化 | 可選-w1和-w2,分別為 和 正則罰項 |
-c | 正則化項引數 | 控制正則化的效果,大多的損失函式都會加上正則化項防止過擬合,即 的形式,引數C控制了二者之間的比重,C越大,正則效果越弱,w的波動越大,先驗方差越大;減小C則可以防止過擬合,常用引數 |
-s | 限制w的大小 | 與C存在正向關係 |
-v | 交叉驗證 | cross validation,需選擇k-fold,一般大於4,常用引數 |
-b | 決策值/概率估計列表 | - |
-q | quiet | 不輸出資訊 |