liblinear使用
1. 什么情况下使用Liblinear?什么情况下使用Libsvm?
- Liblinear适用情况
- 训练数据实例数量大
- 特征向量维度大
- 特别适合文本分类
- Liblinear优势
- 大数据时训练速度快
- 在处理文本分类问题时,Liblinear与Libsvm效果相差不大
- Liblinear特点
- 模型文件中存储参数值
2. 可参考的文档和网址
- 文档
- README 在github代码根目录下
liblinear的安装、训练程序用法、预测程序用法、开发者Library用法 - guide
附录B中介绍了尺度变换程序svm-scale的用法 - liblinear LIBLINEAR: A library for large linear classification Journal of Machine Learning Research
主要介绍Liblinear理论基础以及实现细节 - FAQ
- 代码
- 官网
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"
预测输出…
Accuracy = 99.7291% (23931/23996)
predicting time elapse 5 s