1. 程式人生 > >Liblinear機器學習庫教程詳解(基於Python API)

Liblinear機器學習庫教程詳解(基於Python API)

前言

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,分別為 L1L2 正則罰項
-c 正則化項引數 控制正則化的效果,大多的損失函式都會加上正則化項防止過擬合,即 Loss=loss+regularizer 的形式,引數C控制了二者之間的比重,C越大,正則效果越弱,w的波動越大,先驗方差越大;減小C則可以防止過擬合,常用引數
-s 限制w的大小 與C存在正向關係
-v 交叉驗證 cross validation,需選擇k-fold,一般大於4,常用引數
-b 決策值/概率估計列表 -
-q quiet 不輸出資訊