文字分類——簡化版的LibSVM之LibLinear
阿新 • • 發佈:2018-12-11
1. 什麼情況下使用Liblinear?什麼情況下使用Libsvm?
- Liblinear適用情況
- 訓練資料例項數量大
- 特徵向量維度大
- 特別適合文字分類
- Liblinear優勢
- 大資料時訓練速度快
- 在處理文字分類問題時,Liblinear與Libsvm效果相差不大
- Liblinear特點
- 模型檔案中儲存引數值
2. 可參考的文件和網址
- 文件
- 程式碼
- 官網
3. 約束優化問題轉換為等價的無約束優化問題
4. 資料預處理(文字)
- 輸入資料的格式
- 類標標記 特徵索引1:特徵值1 特徵索引2:特徵值2 …
- 二類標記 1 0 或 -1 +1
- 多類標記 +1 +2 +3
- 特徵索引取值需要從1開始,而不是0
- 尺度變換(svm-scale可執行程式)
- 各特徵的取值範圍應該統一到一個範圍內如[-1, 1]或[0, 1],因此需要尺度變換
- 沒有進行尺度變換,則取值範圍大的特徵會削弱取值範圍小的特徵對分類的貢獻,進而極度影響模型的準確性
- 沒有進行尺度變換,則訓練模型的時間會很長
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中多分類處理方法
- One-Vs-Rest 對於-s 1,2,3,5 處理多分類時,都使用這種方法
- Crammer & Singer 對於-s 4 時,使用這種方法
- Crammer & Singer多分類法
- 公式 2000年 Crammer & Singer提出多分類優化問題的原始形式和對偶形式
- 實現 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"