针对iris数据集 SVM 不同核函数的比较

思路为:利用不同的核函数来训练不同的分类器,再通过分类器的预测准确率和运行时间来比较分类器的优劣。
需要用到的库为:numpy,pandas,matplotlib,time,sklearn.svm
实现代码用的:jupyter
需要记住的函数为:
1.pd.Categorical().codes将文本数据转化为易分析的数字。
2.train_test_split(random_state,train_size)
#random_state设置随机次数,train_size设置train集和test集的分割点
3.accuracy_score来比较预测值和实际值的差距,并且返回一个准确率
下面是关于matplotlib包的一些函数讲解
plt.figure(figsize=,)自定义画布,相当于画图前的第一步,也是最初始的一步。
plt.subplot(number)将画布分为几个区域,如果是121意味着将画布分为1*2列
并且这一部分占据第一部分
plt.plot(x,y,color=,lw=,label=u’’)label是图像所带的标签,可以通过plt.legend(loc=’’)来指定相应的位置来显示标签。
a.settitle(u’’)可以通过对图设置标题
plt.suptitle(u’’)可以设置画布的标题,但是任何字符串都需要在引号前面加上u.
plt.xlim()可以来设置x轴的坐标范围,plt,ylim()同样可以来设置y轴的坐标范围

import time 
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
#SVC向量机
from sklearn.svm import SVC
#训练测试数据分割
from sklearn.model_selection import train_test_split
#准确率
from sklearn.metrics import accuracy_score
#乱码设置
## 设置属性防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
path="./iris.data"
data=pd.read_csv(path,header=None)
x,y=data[list(range(4))],data[4]
#将y转化为数字标签
y=pd.Categorical(y).codes
#数据分割,有两个参数,random_state,train_size
#random_state随机抽样,train_size设置分割规模
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=88,train_size=0.7)
#构建分类器/
#kernel是不同的方法
svm1 = SVC(C=1, kernel='linear')
svm2 = SVC(C=1, kernel='rbf')
svm3 = SVC(C=1, kernel='poly')
svm4 = SVC(C=1, kernel='sigmoid')
#分类器的训练
t0=time.time()
svm1.fit(x_train,y_train)
t1=time.time()
svm2.fit(x_train,y_train)
t2=time.time()
svm3.fit(x_train,y_train)
t3=time.time()
svm4.fit(x_train,y_train)
t4=time.time()
#训练完后做什么呢?当然是画图测试准确率
svm1_train_score=accuracy_score(y_train,svm1.predict(x_train))
svm1_test_score=accuracy_score(y_test,svm1.predict(x_test))
svm2_train_score=accuracy_score(y_train,svm2.predict(x_train))
svm2_test_score=accuracy_score(y_test,svm2.predict(x_test))
svm3_train_score=accuracy_score(y_train,svm3.predict(x_train))
svm3_test_score=accuracy_score(y_test,svm3.predict(x_test))
svm4_train_score=accuracy_score(y_train,svm4.predict(x_train))
svm4_test_score=accuracy_score(y_test,svm4.predict(x_test))
#画图
#设置X轴,y轴
x_tmp=[0,1,2,3]
y_train_tmp=[svm1_train_score,svm2_train_score,svm3_train_score,svm4_train_score]
y_test_tmp=[svm1_test_score,svm2_test_score,svm3_test_score,svm4_test_score]
y_score=[t1-t0,t2-t1,t3-t2,t4-t3]
#设置尺寸和颜色
plt.figure(facecolor='w',figsize=(12,6))
#subplot是用来分割画布,分割成一行两列,用第一列的来画图
a=plt.subplot(121)
#绘图
plt.plot(x_tmp,y_train_tmp,'r-',lw=2,label=u'训练集准确率')
plt.plot(x_tmp,y_test_tmp,'g-',lw=2,label=u'测试集准确率')
#设置两个图形的解释
plt.legend(loc='lower left')
#plt.title(u'模型预测准确率', fontsize=13)
plt.xticks(x_tmp, [u'linear-SVM', u'rbf-SVM', u'poly-SVM', u'sigmoid-SVM'], rotation=0)
#开启网格线
plt.grid(b=True)

#第二个图,分割成一行两列,第二列来画图
b=plt.subplot(122)

plt.plot(x_tmp, y_score, 'b-', lw=2, label=u'模型训练时间')
#plt.title(u'模型训练耗时', fontsize=13)
#给x赋予标签
plt.xticks(x_tmp, [u'linear-SVM', u'rbf-SVM', u'poly-SVM', u'sigmoid-SVM'], rotation=0)
plt.legend(loc='lower left')
plt.grid(b=True)
#大标题suptitle
plt.suptitle(u'鸢尾花数据SVM分类器不同内核函数模型比较', fontsize=16)
a.set_title(u'预测准确率')
b.set_title(u'模型运行时间')
plt.show()

在这里插入图片描述

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值