前言
Liblinear机器学习库主要实现SVM算法,在处理大规模数据时速度快,但也有缺点,就是太吃内存,博客 https://blog.csdn.net/roguesir/article/details/79793569 中介绍了在Mac Python3环境下安装,这篇博客介绍使用教程。以下材料自己整理,有错误请指出。
数据集要求
liblinear与libsvm类似,都要求使用libsvm格式数据,下面用库自带的heart_scale数据集进行介绍,数据集如下:
$ head heart_scale
+1 1:0.708333 2:1 3:1 4:-0.320755 5:-0.105023 6:-1 7:1 8:-0.419847 9:-1 10:-0.225806 12:1 13:-1
-1 1:0.583333 2:-1 3:0.333333 4:-0.603774 5:1 6:-1 7:1 8:0.358779 9:-1 10:-0.483871 12:-1 13:1
+1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1
-1 1:0.458333 2:1 3:1 4:-0.358491 5:-0.374429 6:-1 7:-1 8:-0.480916 9:1 10:-0.935484 12:-0.333333 13:1
-1 1:0.875 2:-1 3:-0.333333 4:-0.509434 5:-0.347032 6:-1 7:1 8:-0.236641 9:1 10:-0.935484 11:-1 12:-0.333333 13:-1
-1 1:0.5 2:1 3:1 4:-0.509434 5:-0.767123 6:-1 7:-1 8:0.0534351 9:-1 10:-0.870968 11:-1 12:-1 13:1
+1 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5
+1 1:0.25 2:1 3:1 4:-0.698113 5:-0.484018 6:-1 7:1 8:0.0839695 9:1 10:-0.612903 12:-0.333333 13:1
+1 1:0.291667 2:1 3:1 4:-0.132075 5:-0.237443 6:-1 7:1 8:0.51145 9:-1 10:-0.612903 12:0.333333 13:1
+1 1:0.416667 2:-1 3:1 4:0.0566038 5:0.283105 6:-1 7:1 8:0.267176 9:-1 10:0.290323 12:1 13:1
数据形式为:label+(index:value)
第一列表示样本标签,随后是libsvm格式数据集,这种数据集为了避免稀疏情况,默认未显示的索引值为0,如第一行所示,1:0.708333表示索引为1的属性值为0.708333,而未出现的索引为11的属性值为0。
以上这种数据格式并不是必须的,也可以使用one-hot编码的列表,如:
# Dense data
y, x = [1,-1], [[1,0,1], [-1,0,-1]]
# Sparse data
y, x = [1,-1], [{1:1, 3:1}, {1:-1,3:-1}]
算法实现
支持向量机原理在这里不做赘述,之前有一篇博文写得比较详细:https://blog.csdn.net/roguesir/article/details/78659645 ,这节介绍算法实现。
>>> from liblinearutil import *
>>> y, x = svm_read_problem('../heart_scale', return_scipy = True) # 生成训练集
>>> m1 = train(y[:200], x[:200, :], '-v 5 -c 4') # 训练模型,这里使用了交叉验证
........................*....*
optimization finished, #iter = 288
Objective value = -273.047815
nSV = 116
.........................*.***.**
optimization finished, #iter = 274
Objective value = -305.012970
nSV = 124
.........................*...*.*.*
optimization finished, #iter = 301
Objective value = -271.645969
nSV = 109
.........................*.*.*
optimization finished, #iter = 275
Objective value = -253.467882
nSV = 108
........................*.***
optimization finished, #iter = 259
Objective value = -284.334805
nSV = 119
Cross Validation Accuracy = 83%
>>> m2 = train(y[:200], x[:200, :], '-c 4') # 训练模型,未使用交叉验证
.........................*......**
optimization finished, #iter = 319
Objective value = -357.115226
nSV = 145
>>> p_label, p_acc, p_val = predict(y[200:], x[200:, :], m2) # 测试
Accuracy = 81.4286% (57/70) (classification)
>>> save_model('model_file', m2) # 保存模型
>>> model_ = load_model('model_file') # 加载训练好的模型
Liblinear库使用非常简单,简单几步就可以实现SVM算法,而且速度超快~
参数详解
在训练和测试时,需要设置很多参数来提升模型性能,比如上面代码中的-v、-c等,下面进行详细介绍。
参数名 | 作用 | 描述 |
---|---|---|
-w | 正则化 | 可选-w1和-w2,分别为 和 正则罚项 |
-c | 正则化项参数 | 控制正则化的效果,大多的损失函数都会加上正则化项防止过拟合,即 的形式,参数C控制了二者之间的比重,C越大,正则效果越弱,w的波动越大,先验方差越大;减小C则可以防止过拟合,常用参数 |
-s | 限制w的大小 | 与C存在正向关系 |
-v | 交叉验证 | cross validation,需选择k-fold,一般大于4,常用参数 |
-b | 决策值/概率估计列表 | - |
-q | quiet | 不输出信息 |