一、实验目的和内容

(一)实验目的

    1、熟悉支持向量机SVM(Support Vector Machine)模型分类算法的使用。

    2、用svm-train中提供的代码框架(填入SVM分类器代码)用train.data训练数据提供的矩阵来训练参数得到训练模型model,利用libsvm进行模型的训练,分类预测等。

    3、利用model和svm-train的代码来分类测试数据集test.data,并报告其分类正确率。

(二)实验内容

    支持向量机将向量映射到一个更高维的空间裡,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面。分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。

   1、数据预处理(将原始数据格式做一定的处理,转换成libsvm能够使用的而数据)

   2、训练数据集的训练,产生训练模型。

   3、测试数据集的分类预测,观察分析实验结果。

二、实验过程

实验步骤和详细实验内容

(一)实验步骤

1、对原始数据集进行预处理,将文本数据集转换成为libsvm能够使用的数据。

(1)原始数据格式:

条件属性a 

条件属性b 

条件属性c 

条件属性d 

条件属性e 

条件属性f 

条件属性g 

条件属性h 

条件属性i 

条件属性j 

决策属性

0.006129

-0.029258

-1.000000

-1.000000

-1.000000

-1.000000

-1.000000

-1.000000

-1.000000

-1.000000

1

(2)数据格式转换需要:

当数据较少时,可以用formatdatalibsvm轻松地将文本数据转换成为svm工具使用的数据。使用方法为:

打开train.data然后将数据粘贴到sheet1的单元格中。

‚再"工具"-->"宏"-->执行下面有一个选项(FormatDatatoLibsvm)-->执行,要选中这个然后运行就可以了 ,这时数据转换的问题就解决了(如果没有宏选项,点击“开始--excel选项---在功能区显示“开发工具”选项卡”)

ƒ可以copy到一个记事本中即可。但是注意在用libsvm的时候要在命令行输入.txt后缀。

决策属性

条件属性a 

条件属性b 

条件属性c 

条件属性d 

条件属性e 

条件属性f 

条件属性g 

条件属性h 

条件属性i 

条件属性j 

1

1:.006129

2:-.029258

3:-1

4:-1

5:-1

6:-1

7:-1

8:-1

9:-1

10:-1

2、将处理好的数据集train.txt通过libsvm包中的svm-train进行训练,生成训练模型train.model。

3、利用训练好的模型对测试数据集test.txt进行分类预测,观其分类结果和识别正确率。

4、分析得到的实验结果,思考有什么问题以及改进办法等。

(二)详细实验内容

   1、对实验中给出的数据集train.data进行数据格式转换,能够更有效地将文本数据转换成为svm工具使用的数据。

    2、利用1转换好的数据,通过实验指导书中给出的通用SVM 软件包Libsvm建立分类模型,生成训练模型train.model。

    3、利用2所训练好的模型对测试数据集test.txt进行分类预测,观察分类结果以及分类正确率。

三、实验结果

实验结果数据(如果有评测要求应包括评测结果,例如分类的准确率)

分析:在原始训练数据集中可以发现,这实际上是一个非均衡数据集,正样本的数据和负样本的数据数量偏差十分大,决策属性1很少,而决策属性-1较多。

分析:自动选择最优参数,自动进行归一化。利用我们生成的模型对测试数据集进行预测,得到的预测准确率为94.3533%。

四、实验总结

完成试验后对实验中的问题进行总结(可包括实验结果讨论及下一步工作)

    本次实验是通过LIBSVM进行模型的构建与预测,使用libsvm进行分类,只需要有属性矩阵和标签,然后就可以建立分类模型(model),然后利用得到的这个model进行分类预测了。对数据进行预处理之后,调用相关的软件包能够将训练数据集转换出训练模型,并且对测试数据集进行简单的分类,得到了最后的分类结果。

在实验过程中也发现了一些问题,就是训练数据样板不平衡。这本身是一个二元分类问题,分类器是由训练数据训练出来的模型,所以训练数据肯定会对其造成直接的影响,这里所说的不平衡性就是各个类别的训练 sample 数目不平衡。比如,在二元分类的情况下在原始训练数据集中可以发现,这实际上是一个非均衡数据集,正样本的数据和负样本的数据数量偏差十分大。因此导致测试的结果分类正确率accuracy只有94.3533%,最后的分类输出也只有-1了。

通过调研和分析,我收集到一些方法可以解决样本为非均衡数据集的方法:

1、在两类正负样本比例非常不均衡的情况下,就不能再用「分类正确率」(accuracy)来衡量模型性能,而要用少数类的「准确率」(precision)和「召回率」(recall),或者二者的综合(F1, equal error rate, area under curve 等等)。

2、增加数量较少决策属性的样本特征,把少数类的数据复制几份,并适当加噪声。这可以增强模型的鲁棒性,调整两类训练样本的权重,使得两类的总权重相等。

3、采样,选择每个正样本的k近邻,然后在该样本和近邻样本的连线上随机采样。

4、数据预处理。基本的目标就是把数据变平衡,常见的方法有over-sample,under-sample,smote等。

总结:

1、支持向量机的关键技术:支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法.目前比较成熟的核函数及其参数的选择都是人为的,根据经验来选取的,带有一定的随意性.在不同的问题领域,核函数应当具有不同的形式和参数,所以在选取时候应该将领域知识引入进来.

2、在使用libsvm进行分类训练时,也要注意正负样本的均衡问题,我们可以采用上面提到的一些方法进行解决。

3、在接下来需要尝试将不同的训练样本训练出模型,调整正负样本的比例,寻找最优参数的设置,提高模型的分类预测正确率。

参考文献:

[1]姬水旺,姬旺田,支持向量机训练算法综述[J],微机发展,14(1),2004。

[2]刘江华,程君实,陈佳品,支持向量机训练算法综述[J],信息与控制,31(1),2002。

[3]Libsvm学习笔记(http://mirrorlake.bokee.com/5133582.html)

[4]LIBSVM使用方法及参数设置(http://blog.sina.com.cn/s/blog_60f842960101j5rw.html)

以大多数人努力程度之低,根本轮不到去拼天赋~