目录
前言
本文是有关SVM(支持向量机)的数据分类算法,使用python实现,基于sklearn库。
一、思路
支持向量机是一种二分类模型,它使用一个超平面分割数据,适用于高维数据的处理。
老师给的数据是690维的带标签的高维数据,标签为0和1,分别代表正负标签。首先需要处理一下数据集,将训练集、测试集的数据和标签分别存在列表中。然后导入sklearn库,调用其中svm函数,定义模型,训练、测试,计算一些反映结果的指标(recall、precision)。定义模型时有很多不同的参数,可以调整参数使其达到最佳效果。
二、实现代码
1.安装sklearn库
pip install -U scikit-learn
2.引入库
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
3.具体代码
def train():#训练数据集
dataMat=[];labelMat=[]
fr1=open("SVM实验数据/train_sample.txt")
fr2=open("SVM实验数据/train_sample_label.txt")
for line in fr1.readlines():
currLineListFloat = []
line = line.split(" ")
line=line[0:-1]
for i in line: # 逐行将字符串数据转化为浮点数
currLineListFloat.append(float(i))
dataMat.append(currLineListFloat)#数组矩阵
for line in fr2.readlines():
line=line.strip("\n")
for i in line: # 逐行将字符串数据转化为浮点数
labelMat.append(float(i))
return dataMat,labelMat
def test():#测试数据集
dataMat=[];labelMat=[]
fr1=open("SVM实验数据/test_sample.txt")
fr2=open("SVM实验数据/test_sample_label.txt")
for line in fr1.readlines():
currLineListFloat = []
line = line.split(" ")
line=line[0:-1]
for i in line: # 逐行将字符串数据转化为浮点数
currLineListFloat.append(float(i))
dataMat.append(currLineListFloat)#数组矩阵
for line in fr2.readlines():
line=line.strip("\n")
for i in line: # 逐行将字符串数据转化为浮点数
labelMat.append(float(i))
return dataMat,labelMat
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)
'''gamma:内核系数
c:错误项的惩罚参数
kernel:核函数
degree:多项式poly函数的阶数
'''
# 训练
x_train,y_train=train()
predictor.fit(x_train, y_train)
# 预测
x_test,y_test=test()
result = predictor.predict(x_test)
# 评估
tp=0
fp=0
p=0
for i in range(0,len(y_test)):
if y_test[i]==1:
p=p+1
if result[i]==1:
tp=tp+1
elif result[i]==1:
fp=fp+1
print("recall:",100*tp/p,"%")
print("precision:",100*tp/(tp+fp),"%")
三、实验结果
本实验最终输出的结果只有recall和precision的值,下图为调整不同的参数,本次实验主要调整了c的值、核函数kernel、gamma的值、degree的值,就不一一展示。
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='linear')
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)
输出(例):
结果分析:
c是错误项的惩罚系数。c的值越大,查全率越大。根据查找的资料,c的值越大,在训练集中的准确率越高,泛化能力降低,也就是对测试数据的分类准确率降低。
Kernel是算法中采用的核函数类型。实验中,核函数分别采用了‘rbf’:径像核函数/高斯核、‘linear’:线性核函数、‘poly’:多项式核函数,得到了不同的查全率。其中,使用‘poly’的查全率最高。
当gamma的值为‘auto’时,tp和fp的值都为0,即所有的预测结果都是0(负样本)。
degree是指多项式核函数的阶数n,只对多项式核函数有用,默认值为3。阶数变大时,查全率也变大。
总结
本实验中,代码并不难,调用svm函数后,实验就变得比较简单。对于本实验中的代码,可以多思考搭建模型时的参数设置,分析各个参数的含义,也可调整参数值探究其对分类结果的影响等等。