LIBSVM 使用的一般步骤是:
1)准备数据集,转化为 LIBSVM支持的数据格式 :
[label] [index1]:[value1] [index2]:[value2] ...
即 [l类别标号] [特征1]:[特征值] [特征2]:[特征值] ...
2)对数据进行简单的缩放操作(scale);(为什么要scale,这里不解释了)
3)考虑选用核函数(通常选取径函数,程序默认);
4)采用交叉验证(一般采用5折交叉验证),选择最佳参数C与g ;
5)用得到的最佳参数C与g 对整个训练集进行训练得到SVM模型;
6)用得到的SVM模型进行测试
Libsvm 是一个简单的,易用的,高效的SVM分类和回归软件。它解决了 C-SVM 分类,nu-SVM 分类,
one-class-SVM,epsilon-SVM 回归,nu-SVM 回归(的问题)。它也提供了一个自动的 C-SVM 分类的模型选择工具。本文档解释了 Libsvm 的用法。
Libsvm 的获取:http://www.csie.ntu.edu.tw/~cjlin/libsvm
请在使用 Libsvm 之前阅读 COPYRIGHT 文档。
目录:
=======================
目录:
=======================
- 快速开始
- 安装与数据格式
- 使用 ‘svm-train’
- 使用 ‘svm-predict’
- 使用 ‘svm-scale’
- 实际应用的小贴士
- 例子
- 自定义核函数
- 库的使用
- Java 版本
- 编译 Windows 二进制文件
- 附加工具:Sub-sampling, Parameter Selection, Format checking, 等
- MATLAB/OCTAVE 接口
- Python 接口
- 补充
快速开始
=======================
如果你刚接触 SVM 并且数据不大,安装完毕之后请用 ‘tools' 文件夹下的 easy.py。它自动做好所有的事情——从数据缩放到参数选择。
使用方法:easy.py training_file [testing_file]
有关参数选择的更多信息请参阅 ‘tools/README’。
安装和数据格式
=======================
在 Unix 系统中,键入 ‘make’ 编译 ‘svm-train’ 和 ‘smv-predict’ 程序。运行程序时不设参数可以显示它们的用法。
在另一些系统中,查阅 ‘Makefile’ 来编译它们( 例如,参阅本文档中的 ‘编译 Windows 二进制文件’ )或者使用已编译的二进制文件( Windows 二进制文件在 ‘windows’ 目录下 )。
训练数据和测试数据的文件格式如下:
<label> <index1>:<value1> <index2>:<value2> ...
.
.
每一行包括一个实例(样本)并以 ‘ ’ 字符结束。对于分类,<label> 是一个整型数据,表示一个分类标签(支持多类分类)。对于回归,<label> 是一个可以为任意实数的目标值。对于 one-class SVM,它不被使用,所以可取任意值。一对 <index>:<value> 提供一个特征(属性)值:<index> 是从 1 开始的整型数据,<value> 是一个实数。唯一的例外是自定义核函数,<index> 从 0 开始;参见自 ‘定义核函数’ 部分。Indices 必须是单调增的顺序。测试文件中的 Labels 仅仅用于计算精度或误差。如果它们是未知量,只需在第一列任意填一个数。
本程序包中的一个已分类的数据的样本是 ‘heart_scale’。使用‘tools/checkdata.py(细节参阅 ‘tools/README’ )’ 来检查你的数据是否为正确的格式。
键入 ‘svm-train heart_scale’,此程序会读入训练数据并且输出(建立好的)模型文件 ‘heart_scale.model’。如果你有一个命名为 ‘heart_scale.t’ 的测试集,键入 ‘svm-predict heart_scale.t heart_scale.model output’ 来观察预测精度。‘output’ 文件包含预测后的类别标签。
对于分类(问题),如果训练数据都是同一类(即,所有标签都一样),那么 'svm-train' 会出示一个警告信息:‘Warning: training data in only one class. See README for details’,意味着训练数据是非常不平衡的。训练数据的 label 在测试的时候直接返回。
下面是本程序包中的其他的一些有用的程序:
svm-scale:
这是一个缩放输入数据文件的工具(其实就是把属性值归一化)。
svm-toy:
这是一个简单的图形接口,它用一个平面展示 SVM 怎样将数据分开。你可以在窗口内点击来画出一些数据点,使用 ‘change’ 按钮来选择类别 1,2,3(即,最多支持三个类别),‘load’ 按钮用来载入文件中的数据,‘save’ 按钮用来保存数据到一个文件,‘run’ 按钮用来得到一个 SVM 模型,‘clear’ 按钮来清空窗口。
你可以在窗口底端内输入选项,选项语法与 ‘svm-train’ 相同。
注意,‘load’ 和 ‘save’ 会考虑分类和回归情况中的密集数据格式。对于分类,每一个数据点有一个必须为1,2,3的 label(颜色)和两个在 [0,1)上的属性(x坐标和y坐标)。对于回归,每一个数据点有一个在 [0,1)上的目标值(y坐标)和一个在 [0,1)上属性(x坐标)。
分别在其各自的文件夹中键入‘make’来编译它们。
你需要 Qt 库来编译 Qt 版本。从 http://www.trolltech.com 获取。
你需要 GTK+ 库来编译 GTK 版本。从 http://www.gtk.org 获取。
预编译的 Windows 二进制文件在 ‘windows’ 文件夹下。我们使用的是32位的机器上的 Visual C++,所以最大缓存
大小是2GB。
使用‘svm-train’=======================
用法:svm-train [options] training_set_file [model_file]
options:
-s svm_type:设定SVM类型(默认为0)
0 -- C-SVC (多类分类)
1 -- nu-SVC (多类分类)
2 -- one-class SVM
3 -- epsilon-SVR (回归)
4 -- nu-SVR (回归)
-t kernel_type:设定核函数类型(默认为2)
用法:svm-predict [options] test_file model_file output_file
-t kernel_type:设定核函数类型(默认为2)
0 -- linear: u'*v 线性核函数
1 -- polynomial: (gamma*u'*v + coef0)^degree 多项式核函数
2 -- radial basis function: exp(-gamma*|u-v|^2) 径向基函数
3 -- sigmoid: tanh(gamma*u'*v + coef0) sigmoid核函数
4 -- precomputed kernel (kernel values in training_set_file) 自定义核函数
-d degree:设定核函数的 degree 值(默认为 3)
-g gamma:设定核函数的 gamma 值(默认为 1/k)
-r coef0:设定核函数的 coef0 值(默认为 0)
-c cost:设定 C-SVC,epsilon-SVR,nu-SVR 的参数惩罚因子C值(默认为 1)
-d degree:设定核函数的 degree 值(默认为 3)
-g gamma:设定核函数的 gamma 值(默认为 1/k)
-r coef0:设定核函数的 coef0 值(默认为 0)
-c cost:设定 C-SVC,epsilon-SVR,nu-SVR 的参数惩罚因子C值(默认为 1)
-n nu:设定 nu-SVC,one-class SVM,nu-SVR 的参数nu值(默认为 0.5)
-p epsilon:设定 epsilon-SVR 的损失函数中的 epsilon 值(默认为 0.1)
-m cachesize:设定缓存大小,以 MB 为单位(默认为 100)
-e epsilon:设定终止条件的允差(默认为 0.001)
-h shrinking:是否使用 shrinking heuristics(PS:这玩意太不好翻译),0 或 1(默认为 1)
-b probability_estimates:是否训练一个 SVC 或 SVR 模型做概率估计,0或1(默认为 0)
-wi weight : 对于 C-SVC,设定 i 类的参数 C 为 weight*C(默认为1)
-v n:n-折交叉验证模式
-q :退出模式(无输出)
-g 选项中的的 k 为输入数据的属性数量。
-v 选项随机截取数据为 n 个部分,计算它们的交叉验证的精度或者均方误差。
关于输出的意义,参阅libsvm FAQ。
使用‘svm-predict’
-g 选项中的的 k 为输入数据的属性数量。
-v 选项随机截取数据为 n 个部分,计算它们的交叉验证的精度或者均方误差。
关于输出的意义,参阅libsvm FAQ。
使用‘svm-predict’
=======================
用法:svm-predict [options] test_file model_file output_file
options:
-b probability_estimates:是否预测概率估计,0或1(默认为 0);对于one-class SVM,仅支持 0。
model_file 是由 ‘svm-train’ 产生的模型文件。
test_file 是你欲预测的测试数据。
output_file 是 ‘svm-predict’ 产生的输出文件。
使用‘svm-scale’
=======================
使用‘svm-scale’
=======================
用法:svm-scale [options] data_filename
options:
-l lower:x 缩放下限(默认为-1)
-u upper:x 缩放上限(默认为+1)
-y y_lower y_upper:y 缩放上下限(默认为不缩放)
-s save_filename:储存缩放参数到save_filename文件中
-r restore_filename:载入 restore_filename 中的缩放参数
例子请参阅本文件中的‘Examples’。
实际应用的小贴士
=======================
* 缩放数据。例如,缩放每个属性为 [0,1] 或 [-1,+1]。
* 对于 C-SVC,可以考虑用 ‘tools’ 文件夹下的模型选择工具。
* nu-SVC/one-class-SVM/nu-SVR 中的 nu 参数近似为训练误差和支持向量的比率。
* 如果要分类的数据是不平衡的(如,大正集和小负集),用 -wi 尝试不同的惩罚因子(参见下述例子)。
* 对于复杂问题,指定更大的缓存(即,larger -m)。
> svm-scale -l -1 -u 1 -s range train > train.scale
> svm-train -s 3 -p 0.1 -t 0 data_file
用 线性核函数 u'v 解决 SVM 回归(问题),损失函数中 epsilon=0.1。
> svm-train -c 10 -w1 1 -w2 5 -w4 2 data_file
> svm-train -s 0 -c 100 -g 0.1 -v 5 data_file
例子:
例子
=======================
=======================
> svm-scale -l -1 -u 1 -s range train > train.scale
> svm-scale -r range test > test.scale
缩放训练数据的每个特征值在 [-1,1] 内(训练数据文件为 train,缩放后的数据为 train.scale),缩放因子(就是一些参数)被存储在 range 文件中然后被用于缩放测试数据(测试数据文件为test,缩放后的数据为test.scale)。
> svm-train -s 0 -c 5 -t 2 -g 0.5 -e 0.1 data_file
用 RBF核函数 exp(-0.5|u-v|^2) 训练(data_file文件)得到一个分类器,C=10,终止允差为0.1。
缩放训练数据的每个特征值在 [-1,1] 内(训练数据文件为 train,缩放后的数据为 train.scale),缩放因子(就是一些参数)被存储在 range 文件中然后被用于缩放测试数据(测试数据文件为test,缩放后的数据为test.scale)。
> svm-train -s 0 -c 5 -t 2 -g 0.5 -e 0.1 data_file
用 RBF核函数 exp(-0.5|u-v|^2) 训练(data_file文件)得到一个分类器,C=10,终止允差为0.1。
> svm-train -s 3 -p 0.1 -t 0 data_file
用 线性核函数 u'v 解决 SVM 回归(问题),损失函数中 epsilon=0.1。
> svm-train -c 10 -w1 1 -w2 5 -w4 2 data_file
训练一个分类器,对于 ‘1’ 类 惩罚因子为 10= 1 * 10,对于 ‘2’ 类 惩罚因子为 50 = 5 * 10,对于 ‘4’ 类 惩罚因子为 20 = 2 * 10。
> svm-train -s 0 -c 100 -g 0.1 -v 5 data_file
对分类器用参数 C=100,gamma=0.1 做五折交叉验证。
> svm-train -s 0 -b 1 data_file
> svm-predict -b 1 test_file data_file.model output_file
用概率信息得到一个模型。用概率估计来预测测试数据。
自定义核函数
=======================
自定义核函数
=======================
用户可以自定义核函数的值并输入它们作为训练和测试文件。之后 libsvm 不需要原始的训练和测试集。
假定有 L 个训练实体 x1, ..., xL。以 K(x, y) 做核函数中两个实体 x,y 的值,输入格式如下:
新训练实例 xi:
<label> 0:i 1:K(xi,x1) ... L:K(xi,xL)
新测试实例 任意 x:
<label> 0:? 1:K(x,x1) ... L:K(x,xL)
即,在训练文件中,第一列必须是 xi 的‘ID’。在测试中,用 ? 作为任意值。
所有核函数值包括 ZEROs 必须是明确提供的。训练和测试文件中任何随机的或排列的子集也有效(见下例)。
注意:格式与以前在 libsvmtools(文件夹)中发布的预定义核函数略有不同。
例子:
假定最初的训练数据有三个 4-feature 的实例,测试数据有一个实例:
15 1:1 2:1 3:1 4:1
45 2:3 4:3
25 3:1
15 1:1 3:1
如果用线性核函数,我们将得到如下新的训练和测试子集:
15 0:1 1:4 2:6 3:1
45 0:2 1:6 2:18 3:0
25 0:3 1:1 2:0 3:1
15 0:? 1:2 2:0 3:1
? 可为任何值。
上面的训练文件的任何子集也是有效的。如,
25 0:3 1:1 2:0 3:1
45 0:2 1:6 2:18 3:0
意味着核矩阵为:
[K(2,2) K(2,3)] = [18 0]
[K(3,2) K(3,3)] = [ 0 1]