文本分类——简化版的LibSVM之LibLinear

1. 什么情况下使用Liblinear?什么情况下使用Libsvm?

  • Liblinear适用情况
  1. 训练数据实例数量大
  2. 特征向量维度大
  3. 特别适合文本分类
  • Liblinear优势
  1. 大数据时训练速度快
  2. 在处理文本分类问题时,Liblinear与Libsvm效果相差不大
  • Liblinear特点
  1. 模型文件中存储参数值

2. 可参考的文档和网址

  • 文档
  1. README 在github代码根目录下
    liblinear的安装、训练程序用法、预测程序用法、开发者Library用法
  2. guide
    附录B中介绍了尺度变换程序svm-scale的用法
  3. liblinear LIBLINEAR: A library for large linear classification Journal of Machine Learning Research
    主要介绍Liblinear理论基础以及实现细节
  4. FAQ
  • 代码
  1. libsvm github
  2. liblinear github
  • 官网
  1. libsvm
  2. liblinear

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" 

预测输出…
Accuracy = 99.7291% (23931/23996)
predicting time elapse 5 s

2. THUCTC语料上的分类

THUTC参考1
THUTC参考2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值