1. 程式人生 > >文字分類——簡化版的LibSVM之LibLinear

文字分類——簡化版的LibSVM之LibLinear

1. 什麼情況下使用Liblinear?什麼情況下使用Libsvm?

  • Liblinear適用情況
  1. 訓練資料例項數量大
  2. 特徵向量維度大
  3. 特別適合文字分類
  • Liblinear優勢
  1. 大資料時訓練速度快
  2. 在處理文字分類問題時,Liblinear與Libsvm效果相差不大
  • Liblinear特點
  1. 模型檔案中儲存引數值

2. 可參考的文件和網址

  • 文件
  • 程式碼
  • 官網

3. 約束優化問題轉換為等價的無約束優化問題

在這裡插入圖片描述

在這裡插入圖片描述

4. 資料預處理(文字)

  • 輸入資料的格式
  1. 類標標記 特徵索引1:特徵值1 特徵索引2:特徵值2 …
  2. 二類標記 1 0 或 -1 +1
  3. 多類標記 +1 +2 +3
  4. 特徵索引取值需要從1開始,而不是0
  • 尺度變換(svm-scale可執行程式)
  1. 各特徵的取值範圍應該統一到一個範圍內如[-1, 1]或[0, 1],因此需要尺度變換
  2. 沒有進行尺度變換,則取值範圍大的特徵會削弱取值範圍小的特徵對分類的貢獻,進而極度影響模型的準確性
  3. 沒有進行尺度變換,則訓練模型的時間會很長

5. 優化問題求解器的選擇(一般使用預設值-s 1)

  • 對偶形式求解器和原始形式求解器在相同資料條件下,兩者準確性相差不大
  • L1正則化與L2正則化相比,訓練模型耗時多,但兩者準確性相差不大
  • 總的來說,三種求解器的準確性相差都不打,區別主要在模型訓練時間的長短
  • 推薦選擇方案 方案1:首先選擇L2-正則化,對偶形式求解器 方案2:方案1訓練時間長,則使用L2-正則化,原始形式求解器 方案3:L1正則化只有原始形式求解器,因此一般不會使用

6. 懲罰引數C選擇(一般使用預設值 –c 1)

  • 首先,引數c對準確率的影響並不大
  • 其次,引數c與交叉驗證準確率在1-2之間呈正向關係,但隨著C取值逐漸增大,準確率不再上升
  • 最後,引數c越大,訓練模型所需的時間越長 引數c預設情況下取值1,可以使用-c n 指定懲罰引數
  • Liblinear自動確定最佳引數C 只有-s 0 –s 2 兩種引數情況下,使用-C,則Liblinear自動確定最佳引數C的取值

7. 多分類實現

  • Liblinear提供了2中多分類處理方法
    1. One-Vs-Rest 對於-s 1,2,3,5 處理多分類時,都使用這種方法
    2. Crammer & Singer 對於-s 4 時,使用這種方法
  • Crammer & Singer多分類法
    1. 公式 2000年 Crammer & Singer提出多分類優化問題的原始形式和對偶形式
    2. 實現 2008年 Keerthi 實現對偶演算法 (1)Liblinear改進了實現中的停止條件 (2)Liblinear改進了壓縮策略

8. svm-scale用法

  • 將訓練檔案中各列元素的取值範圍尺度變換到[0,1]之間
$ ./svm-scale -l 0 -s range_news news20.binary.tr >news20.binary.tr.scale
  • 將測試檔案中各列元素的取值範圍尺度變換到[0,1]之間
$ ./svm-scale -r range_news news20.binary.t >news20.binary.t.scale

9. train用法

train [options] training_set_file [model_file]

$ ./train news20.binary.tr.scale

-s type 設定solver型別(預設1) -c cost 設定懲罰係數(預設1) -e epsilon 確定終止條件 -s 2 時 (預設0.01) -s 1 3 時 (預設0.1) -B bias 如果bias>=0,則例項x變為[x; bias],w變為[w, w_{n+1}]如果bias<0,例項不新增bias項,w也不新增bias項(預設 -1) -wi weight 不同類別下係數C的調節權重 -v n n-fold交叉驗證模式 隨機將資料拆成n部分並且計算交叉驗證準確率 -C 尋找最佳係數C(只適用於-s 0和-s 2) 在不同的C值下進行交叉驗證,找到最佳的C。 如果-s沒有指定,則預設使用-s 2 -q 靜默模式(沒有輸出) primal-dual 關係表示-s 1和- s 2給出相同模型;-s 0 –s 7給出相同模型;-s 11和-s 12給出相同模型

10. predict用法

predict [options] test_file model_file output_file

$ ./predict news20.binary.t.scale news20.binary.tr.scale.model prediction

-q 靜默模式(沒有輸出)

11. 使用舉例

1. NEW20新聞分類

#! /bin/sh
### 請把該指令碼檔案放到liblinear根目錄下
# 獲得當前正在執行的指令碼的存放路徑
basepath=$(cd `dirname $0`; pwd)
# 進入當前指令碼正在執行的指令碼的存放目錄
cd "$basepath"
# 語料不存在則下載並解壓
echo "下載並解壓news20..."
if ! [ -e news20.binary.bz2 ]; then
    wget -P ./ https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/news20.binary.bz2
    bzip2 -dkv news20.binary.bz2
fi
# 生成news20為訓練集和測試集
echo "生成訓練集和測試集..."
sed '1,4000p' news20.binary >news20.binary.t
sed '4001,$p' news20.binary >news20.binary.tr
# 訓練集的尺度變換
echo "訓練集尺度變換..."
./svm-scale -l 0 -s news20.binary.range news20.binary.tr >news20.binary.tr.scale
# 測試集的尺度變換
echo "測試集尺度變換..."
./svm-scale -r news20.binary.range news20.binary.t >news20.binary.t.scale
# 訓練模型
echo "訓練模型..."
start=$(date +%s)
./train news20.binary.tr.scale
end=$(date +%s)
time=$(( $end - $start ))
echo "training time elapse $time s" 
# 預測
echo "預測輸出..."
start=$(date +%s)
./predict news20.binary.t.scale news20.binary.tr.scale.model news20.binary.prediction
end=$(date +%s)
time=$(( $end - $start ))
echo "predicting time elapse $time s" 

2. THUCTC語料上的分類