最近学习libsvm库,将一些个人认为可以mark的东西做了记录,虽然README文档很清晰,但是在这篇文章中列出了dual problemd和核函数的公式,这样在选择参数时更加清楚。刚开始学习LIBSVM库时直接一脸懵,现在也还是在不断摸索中,如若有理解错误,请指出哦,谢谢!
Libsvm 使用步骤:
1. 按照libsvm要求的数据格式,将要训练和预测的数据准备好;http://blog.csdn.net/u014772862/article/details/51828981
2. 使用svm-scale实现数据缩放,可有可没有,需要按照特征的相关性进行操作;
3. 考虑svm-train时是否使用核函数以及核函数的选择,建议首先考虑RBF核函数;
4. 采用grid.py选择最优参数c和g;http://blog.csdn.net/u014772862/article/details/51829727
5. 设置svm-train参数,对整个数据集训练获取svm模型;
6. 利用svm-predict加载训练好的模型进行测试与预测。
对数据集缩放的目的在于:
1)避免原始数据中部分特征范围过大而另一部分特征范围过小;
2)避免在训练时选择核函数计算内积时引起数值计算的困难;
3)加快训练速度,提高准确率。
因此,将数据缩放到[-1,1]或者[0,1]之间。
用法:svm-scale [options] data_filename”
其中,options选择如下:
-l lower,数据下限标记,设置lower值表示缩放后数据下限,默认为-1;
-u upper,数据上限标记,设置upper值表示缩放后数据上限,默认为1;
-y y_lower y_upper,是否对目标值同时进行缩放,y_lower 表示下限值, y_upper表示上限值;
-s save_filename,将缩放的规则保存为文件save_filename;
-r restore_filename,表示将缩放规则文件restore_filename载入后按此缩放;
filename,待缩放的数据文件。
缩放规则文件可以使用notepad++或者其他文本操作软件打开,格式为:
lower upper
index1 lval1 uval1
index 2 lval2 uval2
……………….
其中,lower和upper是数据的上下限,与参数设置中的lower和upper含义相同,index表示测试数据集的特征维数,lval 为该index维特征对应转换后下限lower 的特征值,uval 为该index维特征对应转换后上限upper 的特征值。输入命令./svm-scale -s heart_scale.range heart_scale>heart_scale.scale测试svm-scale,下面是缩放heart_scale数据输出的缩放规则文件heart_scale.range.
x
-1 1
1 -1 1
2 -1 1
3 -1 1
使用示例:
1) svmscale –s train.range train>train.scale
表示采用缺省值(将特征缩放到[-1,1]之间,对y目标值不进行缩放)对数据集train进行缩放,其结果保存在文件train.scale中,缩放规则保存在文件train.range中。
2) svmscale –r train.range test>test.scale
表示载入缩放规则文件train.range,按照文件中的上下限对应的特征值和上下限值线性的对数据test进行缩放操作,并将其结果保存在文件train.scale中。
用法: svm-train [options] training_set_file [model_file]
其中,
-s svm训练,默认0, 其中前三种用来做分类问题,后两种用来实现回归问题。
0 c-SVC,
1 nu-SVC,
2 one-class SVM,
3 epsilon-SVR,
4. v-SVR,
-t 核函数类型
0 线性核函数,
1 多项式核函数,
2 RBF核函数,
3 sigmoid核函数,
4 自定义核函数
-v n, n-fold交叉验证。
-d degree,设置多项式核函数的参数d,默认为3。
-g gamma,设置多项式、RBF 、sigmoid核函数的参数,在多项式和sigmoid中gamma表示为a,在RBF中表示为r,默认为1/num_features。
-r 设置多项式和sigmoid核函数中的常数项c,默认为0。
-c cost,设置c-svc,epsilon-SVR,nu-SVR类型的惩罚系数C,默认为1。
-n nu,设置nu-SVC,one-class SVM,nu-SVR类型的参数v,默认为0.5。
-p epsilon,设置epsilon-SVR的loss function参数,默认为0.1。
-m cachesize ,设置cache大小,默认为100MB。
-e epsilon,设置终止条件,默认为0.001。
-h shrinking,是否运用shrinking启发式,默认为1。
-b probability_estimates,是否使用概率估计模型,默认0。
-wi weight,将i类的参数C设置为weight*C,默认为1。
-v n, n-fold交叉验证。
使用示例:
svmtrain train3.scale train3.model
训练 train3.scale, 将模型保存于文件 train3.model, 并在 dos 窗口中输出如下结果:
optimization finished, #iter = 1756
nu = 0.464223
obj = -551.002342, rho = -0.337784
nSV = 604, nBSV = 557
Total nSV = 604
其中,#iter 为迭代次数,nu 与前面的操作参数-n ν 相同,obj 为 SVM 文件转换为的二次规划求解得到的最小值,rho 为判决函数的常数项 b ,nSV 为支持向量个数,nBSV 为边界上的支持向量个数,Total nSV 为支持向量总个数。
模型文件介绍:
svm_type c_svc % 训练所采用的svm类型,此处为C SVC −
kernel_type rbf % 训练采用的核函数类型,此处为RBF核
gamma 0.047619 % 与操作参数设置中的 γ 含义相同
nr_class 2 % 分类时的类别数,此处为两分类问题
total_sv 604 % 总共的支持向量个数
rho -0.337784 % 决策函数中的常数项 b
label 0 1 % 类别标签
nr_sv 314 290 % 各类别标签对应的支持向量个数
SV % 以下为支持向量
1 1:-0.963808 2:0.906788 ... 19:-0.197706 20:-0.928853 21:-1
1 1:-0.885128 2:0.768219 ... 19:-0.452573 20:-0.980591 21:-1
... ... ...
1 1:-0.847359 2:0.485921 ... 19:-0.541457 20:-0.989077 21:-1
用法:svm-predict [options] test_file model_file output_file
其中
-b probability_estimates,是否需要进行概率估计预测,可选值为 0 或者 1,默认值为 0。
est_file 是要进行预测的数据文件;
model_file 是由 svmtrain 产生的模型文件;
output_file 是 svmpredict 的输出文件,表示预测的结果值。
svmpredict 没有其它的选项。