LibLinear使用總結(L1,L2正則)

liblinear實踐初步

在相關推薦項目的改版中,對liblinear/fm/xgboost等主流成熟算法模型的訓練效果進行了嘗試和對比,並在一期改造中選擇了liblinear實際上線使用。本文主要從工程應用的角度對liblinear涉及的各模式進行初步介紹,並給出liblinear/fm/xgboost的實際評測結果供參考。 (參考自http://blog.csdn.net/ytbigdata/article/details/52909685)

1.      Liblinear說明

考慮到訓練效率,本次選用的爲多線程並行版liblinear,實際爲liblinear-multicore-2.1-4,首先直接給出其train命令所支持的各模式說明,各模式選擇不僅與我們使用liblinear工具直接相關,也對我們理解liblinear很有幫助,下面即主要圍繞這些模式展開。

ParallelLIBLINEAR is only available for -s0, 1, 2, 3, 11 now

Usage:train [options] training_set_file[model_file]

options:

-s type : set typeof solver (default 1)

  formulti-class classification  (dual對偶的, primal 原始的)

        0 -- L2-regularized logisticregression (primal)  ---邏輯迴歸

        1 -- L2-regularized L2-losssupport vector classification (dual) ---線性svm

        2 -- L2-regularized L2-loss supportvector classification (primal)--與1對應

        3-- L2-regularized L1-loss support vector classification (dual)

        4-- support vector classification by Crammer and Singer

        5-- L1-regularized L2-loss support vector classification

        6-- L1-regularized logisticregression

        7-- L2-regularized logistic regression (dual)

  forregression

       11-- L2-regularized L2-loss support vector regression (primal)

       12-- L2-regularized L2-loss support vector regression (dual)

       13-- L2-regularized L1-loss support vector regression (dual)

1.1  liblinear還是libsvm

既然是liblinear相關,不可免俗地會涉及到這個問題,當然其實這是個很大的命題,在此我們截取重點簡單介紹。

首先,liblinear和libsvm都是國立臺灣大學林智仁(Chih-Jen Lin)老師團隊開發的,libsvm早在2000年就已經發布,liblinear則在2007年才發佈首個版本。

在原理和實現上存在差別,libsvm是一套完整的svm實現,既包含基礎的線性svm,也包含核函數方式的非線性svm;liblinear則是針對線性場景而專門實現和優化的工具包,同時支持線性svm和線性Logistic Regression模型由於libsvm支持核函數方式實現非線性分類器,理論上,libsvm具有更強的分類能力,應該能夠處理更復雜的問題。

但是,libsvm的訓練速度是個很大的瓶頸,按一般經驗,在樣本量過萬後,libsvm就比較慢了,樣本量再大一個數量級,通常的機器就無法處理了;而liblinear設計初衷就是爲了解決大數據量的問題,正因爲只需要支持線性分類,liblinear可以採用與libsvm完全不一樣的優化算法,在保持線性svm分類時類似效果的同時,大大降低了訓練計算複雜度和時間消耗。

同時,在大數據背景下,線性分類和非線性分類效果差別不大,尤其是在特徵維度很高而樣本有限的情況下,核函數方式有可能會錯誤地劃分類別空間,導致效果反而變差。林智仁老師也給出過很多實際例子證明,人工構造特徵+線性模型的方式可以達到甚至超過kernel SVM的表現,同時大大降低訓練的時間和消耗的資源。

關於實際時間對比,liblinear作者官方給出了以下數據:對於LIBSVM數據集中某實例"20242個樣本/47236個特徵",在保持交叉驗證的精度接近的情況下,liblinear僅耗時約3秒,遠遠小於libsvm的346秒。

% timelibsvm-2.85/svm-train -c 4 -t 0 -e 0.1 -m 800 -v 5rcv1_train.binary

CrossValidation Accuracy = 96.8136%

345.569s

% timeliblinear-1.21/train -c 4 -e 0.1 -v 5rcv1_train.binary

CrossValidation Accuracy = 97.0161%

2.944s

1.2  具體solver的選擇?線性svm還是logisticregression/L1正則化項還是L2正則化項

liblinear支持多種solver模式,以下直接列舉liblinear支持的幾種典型solver模式對應的結構風險函數(結構風險函數由損失函數和正則化項/罰項組合而成,實際即爲求解結構風險函數最小值的最優化問題),以方便說明和理解。

L2-regularizedL1-loss Support VectorClassification


L2-regularizedL2-loss Support Vector Classification


L1-regularizedL2-loss Support Vector Classification


L2-regularized Logistic Regression


L1-regularized Logistic Regression


Liblinear中同時支持線性svm和logisticregression,兩者最大區別即在於損失函數(loss function)不同,損失函數是用來描述預測值f(X)與實際值Y之間差別的非負實值函數,記作L(Y, f(X)),即上述公式中的項。

另一個重要選擇是正則化項。正則化項是爲了降低模型複雜度,提高泛化能力,避免過擬合而引入的項。當數據維度很高/樣本不多的情況下,模型參數很多,模型容易變得很複雜,表面上看雖然極好地通過了所有樣本點,但實際卻出現了很多過擬合,此時則通過引入L1/L2正則化項來解決。

一般情況下,L1即爲1範數,爲絕對值之和;L2即爲2範數,就是通常意義上的模。L1會趨向於產生少量的特徵,而其他的特徵都是0,即實現所謂的稀疏,而L2會選擇更多的特徵,這些特徵都會接近於0。

對於solver的選擇,作者的建議是:一般情況下推薦使用線性svm,其訓練速度快且效果與lr接近;一般情況下推薦使用L2正則化項,L1精度相對低且訓練速度也會慢一些,除非想得到一個稀疏的模型(個人注:當特徵數量非常大,稀疏模型對於減少在線預測計算量比較有幫助)。

1.3  primal還是dual

primal和dual分別對應於原問題和對偶問題的求解,對結果是沒有影響的,但是對偶問題可能比較慢。作者有如下建議:對於L2正則-SVM,可以先嚐試用dual求解,如果非常慢,則換用primal求解。

網上另一個可參考的建議是:對於樣本量不大,但是維度特別高的場景,如文本分類,更適合對偶問題求解;相反,當樣本數非常多,而特徵維度不高時,如果採用求解對偶問題,則由於Kernel Matrix過大,求解並不方便。反倒是求解原問題更加容易。

1.4  訓練數據是否要歸一化

對於這點,作者是這樣建議的:在他們文檔分類的應用中,歸一化不但能大大減少訓練時間,也能使得訓練效果更好,因此我們選擇對訓練數據進行歸一化。同時在實踐中,歸一化使得我們能直接對比各特徵的公式權重,直觀地看出哪些特徵比較重要。

2.      liblinear及fm/xgboost實際效果對比記錄

本輪改造中,主要實際嘗試了liblinear各模式的效果,也同時對業界常用的fm/xgboost進行了對比測試,以下一併列出供參考。

注:由於liblinear尚爲單機訓練,受內存限制,不能加載全量數據訓練,因此後續針對訓練數據量多少(1/120->1/4->1/2)也有專門實驗;

 5, xgboost效果總結

xgboost的全稱是eXtreme Gradient Boosting,它是GradientBoosting Machine的一個c++實現,作者爲華盛頓大學研機器學習的大牛陳天奇。傳統GBDT以CART作爲基分類器,xgboost還支持線性分類器,它能夠自動利用CPU的多線程進行並行,同時在算法上加以改進提高了精度,在Kaggle等數據競賽平臺社區知名度很高。

在測試中,xgboost確實表現出了實力,僅用默認參數配置和1/120小數據量(約200萬樣本),就達到了0.8406的超出所有liblinear效果的AUC;受時間限制,當前並未直接採用xgboost,後續有同事進一步跟進。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章