Classification with SVM model

发布于 2021-06-05  0 次阅读


《机器学习》课程实验报告

实验名称:  Classification with SVM model                            

一、实验目的和内容

目的:

1.熟悉支持向量机SVM(Support Vector Machine)模型分类算法的使用。
2.学习使用libSVM(台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库。
3.使用svm-train中提供的代码框架(填入SVM分类器代码)用train.data训练数据提供的矩阵来训练参数得到训练模型model,利用libsvm进行模型的训练,分类预测等。
4.利用model和svm-train的代码来分类测试数据集test.data,并报告其分类正确率。
5.LIBSVM软件包是台湾大学林智仁(Chih-Jen Lin)博士等用C++实现的SVM库,并且拥有matlab,perl等工具箱或者代码,移植和使用都比较方便.它可以解决分类问题(包括C-SVC、n-SVC)、回归问题(包括e-SVR、n-SVR)以及分布估计(one-class-SVM )等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等。

内容:

支持向量机SVM将向量映射到一个更高维的空间中,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面。分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。
1、数据预处理(将原始数据格式做一定的处理,转换成libsvm能够使用的数据)。
2、使用训练集进行训,得到训练模型。
3、将测试集运行在模型上,观测并且分析实验结果。

二、实验过程

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

(1)原始数据格式:(包含十个feature和一个类别)

20210711095442647

(2)数据格式转换
使用python读取原数据对其进行处理,Python源代码:

import numpy as np
data = np.loadtxt("train.txt")
fh = open('train1.txt', 'w', encoding='utf-8')
for i in range(len(data)):
    ans = str(data[i][10])
    for j in range(len(data[i]) - 1):
        ans = ans + ' ' + str(j + 1) + ":" + str(data[i][j])
    ans = ans + '\n'
    fh.write(ans)
fh.close()

处理完后的数据格式为:

20210711095824414

2对数据进行简单的缩放操作

采用svmscale来对原始样本进行缩放,范围选定为[-1,1]。
缩放的目的主要是
1)防止某个特征过大或过小,从而在训练中起的作用不平衡;
2)为了计算速度。因为在核计算中,会用到内积运算或exp运算,不平衡的数据可能造成计算困难。
cmd命令:svm-scale -l -1 -u -1 -s train.range train.txt>train_scale.txt

结果:
生成规则文件train.range和数据缩放后的文件train_scale.txt

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

使用命令: svm-train [options] training_set_file [model_file]

其中,
#iter为迭代次数,
nu是你选择的核函数类型的参数,
obj为SVM文件转换为的二次规划求解得到的最小值,
rho为判诀函数的偏置项b, .
nSV为标准支持向量个数(0<a[]<c),
nBSV为边界上的支持向量个数(a[i]=c),
Total nSV为支持向量总个数(对于两类来说,因为只有一个分类模型Total nSV = nSV ,但是对于多类,这个是各个分类模型的nSV之和)。

训练后的模型保存为文件train_scale.txt.model,打开文件其内容为:

20210711100217193

svm_type c_svc %训练所采用的svm类型,此处为c_svc
kerne1_type rbf %训练采用的核函数类型,此处为RBF核
gamma 0.10000000000000001 %设置核函数中的g,默认值为1/k
nr_class 2 %分类时的类别数,此处为两分类问题
tota1_sv 989 %总共的支持向量个数
rho 0.94408941851144201 %诀策函数中的常数项b
labe 1 -1 %类别标签
nr_sv 466 523 %各类别标签对应的支持拘量个数
SV %以下为支持向量

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

cmd命令:

20210711100325403

此时正确率为:94.3533%


平平无奇的在校大学生