一、实验目的和内容
(一)实验目的
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)
以大多数人努力程度之低,根本轮不到去拼天赋~