• svm使用的一般步骤


    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)
            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)
    -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’
    =======================

    用法: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 [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-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。

    > 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]
  • 相关阅读:
    C++ Primer 读书笔记 第六章
    C++ Primer 读书笔记 第十章
    面试题笔记
    C++ Primer 读书笔记 第八章
    ZedGraph源码学习(三)
    一个简单的代码生成器XML与XLST的应用测试。
    信息导到Execl上.
    SQL相关功能实现.
    ZedGraph源码学习(二)
    EXECL导入(检查服务器版本.包括NPOI方式导入.可以通过配置文件信息导入EXECL)代码记录下.
  • 原文地址:https://www.cnblogs.com/jiahuiyu/p/5415939.html
Copyright © 2020-2023  润新知