如何找出最优的【SVC】核函数和参数值—以乳腺癌数据集为例

        在实际的工作中,有的时候我们不知道数据特征,也不知道我们的数据是线性还是非线性。因此我们需要对数据一步步进行摸索,来找到最优的核函数和参数值。接下来我们以sklearn乳腺癌数据集为例。

       先来导入相应的模块:

from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
from time import time
import datetime

导入数据集,并将特征矩阵和标签赋值给X和Y:

data = load_breast_cancer()
X = data.data
y = data.target

可以看到数据集有569个样本,30个特征,2种标签。我们先来选取前两列特征,画出散点图看看效果:

plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

我们用PCA降维,保留数据的两个特征:

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
data_pca = pca.fit_transform(x)
data_pca.shape

画图查看效果:

plt.scatter(data_pca[:,0],data_pca[:,1],c=y)
plt.show()

此时我们使用SVC看看图像:

def plot_svc_decision_function(model,ax=None):if ax is None:ax = plt.gca()xlim = ax.get_xlim()ylim = ax.get_ylim()x = np.linspace(xlim[0],xlim[1],30)y = np.linspace(ylim[0],ylim[1],30)Y,X = np.meshgrid(y,x) xy = np.vstack([X.ravel(), Y.ravel()]).TP = model.decision_function(xy).reshape(X.shape)ax.contour(X, Y, P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"]) ax.set_xlim(xlim)ax.set_ylim(ylim)
plt.scatter(data_pca[:,0],data_pca[:,1],c=y,s=50,cmap="rainbow") # 画散点图
clf = SVC(kernel = "linear").fit(data_pca,y) 
plot_svc_decision_function(clf)

接下来我们将数据集分隔为训练集和测试集,并看看另外三个核函数的准确率,并使用时间戳函数计算每个函数的运行时长:

x_train,x_test,y_train,y_test = train_test_split(data_pca,y,test_size=0.3,random_state=420)
kernel = ['linear','poly','rbf','sigmoid']
for i in kernel:time0 = time()clf = SVC(kernel=i,gamma="auto",degree=1,cache_size=5000 #缓存大小,以MB为单位,默认为200).fit(x_train,y_train)print("The accuracy under kernel %s is %f" % (i,clf.score(x_test,y_test)))print(datetime.datetime.fromtimestamp(time()-time0).strftime("%M:%S:%f"))

输出结果如下:

       从输出结果来看,rbf核函数显然不能用。运行时间中,线性核函数运行时间最长。在这里我们要重新强调一个概念,在机器学习和数据分析中,量纲的概念非常重要。因为不同的特征可能有不同的量纲,如果直接使用这些特征进行计算,可能会导致一些问题。例如,一个特征的范围是1到10,另一个特征的范围是1到10000,那么在计算距离或者相似度时,范围大的特征可能会主导结果,而忽略了范围小的特征。为了解决这个问题,我们通常会进行特征缩放,使得所有的特征都在同一量纲上,或者说有相同的尺度。常见的特征缩放方法有标准化等。

现在我们把X放在我们的dataframe里面,用describe()函数看看描述性统计的结果:

import pandas as pd
data = pd.DataFrame(X)
data.describe([0.01,0.05,0.1,0.25,0.5,0.75,0.9,0.99]).T#描述性统计

通过观察数据我们可以发现,平均值有的仅有0.04,有的高达654,说明存在严重的量纲不统一问题。我们再来看看数据的分布,我们通过从1%的数据和最小值相对比,90%的数据和最大值相对比,查看是否是正态分布或偏态分布,如果差的太多就是偏态分布,谁大方向就偏向谁。可以发现数据大的特征存在偏态问题,这个时候就需要对数据进行标准化。

from sklearn.preprocessing import StandardScaler
X = StandardScaler().fit_transform(X)#将数据转化为0,1正态分布
data = pd.DataFrame(X)
data.describe([0.01,0.05,0.1,0.25,0.5,0.75,0.9,0.99]).T#均值很接近,方差为1了

我们将标准化后的数据去训练模型,再去计算模型的准确率和运行时间:

Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)Kernel = ["linear","poly","rbf","sigmoid"]for kernel in Kernel:time0 = time()clf= SVC(kernel = kernel, gamma="auto", degree = 1, cache_size=5000).fit(Xtrain,Ytrain)print("The accuracy under kernel %s is %f" % (kernel,clf.score(Xtest,Ytest)))print(time()-time0)

可以发现四个模型的分数都有大幅度的提高!而且运行时间也可以大幅缩短!这说明标准化可以有效的提升分类器的效果。因此,SVM执行之前,非常推荐先进行数据的无量纲化!到 了这一步,我们是否已经完成建模了呢?虽然线性核函数的效果是最好的,但它是没有核函数相关参数可以调整的,rbf和多项式却还有着可以调整的相关参数,接下来我们就来看看这些参数。

        从核函数的公式来看,我们其实很难去界定具体每个参数如何影响了SVM的表现。当gamma的符号变化,或者 degree的大小变化时,核函数本身甚至都不是永远单调的。所以如果我们想要彻底地理解这三个参数,我们要先推 导出它们如何影响核函数地变化,再找出核函数的变化如何影响了我们的预测函数(可能改变我们的核变化所在的 维度),再判断出决策边界随着预测函数的改变发生了怎样的变化。无论是从数学的角度来说还是从实践的角度来 说,这个过程太复杂也太低效。所以,我们往往避免去真正探究这些参数如何影响了我们的核函数,而直接使用学 习曲线或者网格搜索来帮助我们查找最佳的参数组合。

接下来我们先来画gamma的学习曲线:

score = []
gamma_range = np.logspace(-10, 1, 50) #返回在对数刻度上均匀间隔的数字
for i in gamma_range:clf = SVC(kernel="rbf",gamma = i,cache_size=5000).fit(Xtrain,Ytrain)score.append(clf.score(Xtest,Ytest))print(max(score), gamma_range[score.index(max(score))])
plt.plot(gamma_range,score)
plt.show()

输出结果为:0.9766081871345029 0.012067926406393264

说明把gamma设置成0.012时,准确率最高可达0.9766。

接下来我们来调整poly核函数的参数:gamma和coef。在这里我们用交叉验证和网格搜索,先导入相应的模块:

from sklearn.model_selection import StratifiedShuffleSplit#用来实例化交叉验证
from sklearn.model_selection import GridSearchCV#带交叉验证的网格搜索

再来确定我们的参数范围:

gamma_range = np.logspace(-10,1,20)
coef0_range = np.linspace(0,5,10)

把参数放在字典里面:

param_grid = dict(gamma = gamma_range,coef0 = coef0_range)

实例化一个交叉验证对象:

cv = StratifiedShuffleSplit(n_splits=5, test_size=0.3, random_state=420)#将数据分为5份,5份数据中测试集占30%

实例化一个网格搜索对象:

grid = GridSearchCV(SVC(kernel = "poly",degree=1,cache_size=5000,param_grid=param_grid,cv=cv))

训练数据:

grid.fit(X, y)

输出最佳的参数组合,准确率和时间戳:

print("The best parameters are %s with a score of %0.5f" % (grid.best_params_, 
grid.best_score_))
print(time()-time0)

输出结果为:

由结果可知,最好的参数组合是coef = 0, gamma = 0.1832,准确率可达96%以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【I/O流之旅】File类-零基础入门指南

🎊专栏【Java】 🌺每日一句:看不清楚未来时,就比别人坚持久一点 ⭐欢迎并且感谢大家指出我的问题 目录 1.File概述 2.File构造方法 (1).根据文件路径创建文件对象 (2).根据父路径名字符串和子路径名字符串创建对象 (3).根据父路径对应文件对象和子路…

第20章_Myisam与InnoDB

文章目录 区别如何选择innodb额外补充知识innodb为什么推荐使用自增ID作为主键innodb引擎4大特性 区别 InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条…

设计模式——解释器模式(Interpreter Pattern)+ Spring相关源码

文章目录 一、解释器模式定义二、例子2.1 菜鸟教程例子2.1.1 定义一个表达式接口2.1.2 实现Expression接口2.1.3 定义解析规则2.1.4 使用 2.2 JDK源码——Pattern2.3 Spring源码——ExpressionParser 三、其他设计模式 一、解释器模式定义 类型: 行为型模式 目的&a…

顶板事故防治vr实景交互体验提高操作人员安全防护技能水平

建筑业在我国各行业中属危险性较大且事故多发的行业,在建筑业“八大伤害”(高处坠落、坍塌、物体打击、触电、起重伤害、机械伤害、火灾爆炸及其他伤害)事故中,高处坠落事故的发生率最高、危险性极大。工地现场培训vr坠落体验利用虚拟现实技术还原各种情…

Day23力扣打卡

打卡记录 将 x 减到 0 的最小操作数(逆向思维 滑动窗口) 链接 将 x 减到 0 的最小操作数,可以逆向思考,求一个数组中的最大长度的滑动窗口,来使得这个窗口里的数等于 全数组之和 - x 的值。 class Solution { publ…

前后端交互—Express

Express 代码下载 Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。本质就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法。Express 的中文官网: https://www.expressjs.com.cn/ 最常见的两种服务器,分别是…

elasticsearch 基本使用,ES8.10

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html ES版本:8.10 By default, Elasticsearch indexes all data in every field and each indexed field has a dedicated, optimized data structure…

LLM之幻觉(一):大语言模型幻觉解决方案综述

论文题目:《Cognitive Mirage: A Review of Hallucinations in Large Language Models》 ​论文链接:https://arxiv.org/abs/2309.06794v1 论文代码:https://github.com/hongbinye/cognitive-mirage-hallucinations-in-llms 一、幻觉介绍 …

原语:串并转换器

串并转换器OSERDESE2 可被Select IO IP核调用。 OSERDESE2允许DDR功能 参考: FPGA原语学习与整理第二弹,OSERDESE2串并转换器 - 知乎 (zhihu.com) 正点原子。 ISERDESE2原语和OSERDESE2原语是串并转换器,他的的功能都是实现串行数据和并行…

0基础学习VR全景平台篇第118篇:利用动作录制器功能避免重复操作 - PS教程

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 嗨,大家好。欢迎收看蛙色VR系列教程之PS利用动作记录器节约补地时间。 大家拍摄在补地的时候,利用插件选择输入输出选项的时候,每次重复操作…

基于springboot垃圾分类管理系统

基于springboot垃圾分类管理系统 摘要 垃圾分类管理系统是一个基于现代技术和数据管理方法的解决方案,旨在协助城市和社区更有效地管理垃圾分类。在这个系统中,Spring Boot框架充当了后端应用程序的构建工具,为其提供了高度灵活的特性。该系统…

【设计模式】工厂模式总结

工厂模式 定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生产。 工厂模式大致可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式。 简单工厂模式 简单工厂模式提供一个工厂类,根据传入的参…

MATLAB算法实战应用案例精讲-【图像处理】Transformer

目录 前言 算法原理 什么是transformer呢? self-attention 输入和位置编码 编码器 Softmax

我在Vscode学OpenCV 图像运算(权重、逻辑运算、掩码、位分解、数字水印)

文章目录 权重 _ 要求两幅图像是相同大小的。[ 1 ] 以数据说话( 1) 最终:( 2 )gamma _输出图像的标量值 [ 2 ] 图像的展现力gamma并不等同于增加曝光度( 1 )gamma100( 2 &#xff09…

经典OJ题:链表中的倒数第K个节点

题目: 输入一个链表,输出该链表中倒数第k个结点。 题源:链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com) 方法一:暴力求解法 可以线统计链表的节点个数,然后用链表节点的个数减去K,得出倒数第K个节点…

Jmeter全流程性能测试实战

项目背景: 我们的平台为全国某行业监控平台,经过3轮功能测试、接口测试后,98%的问题已经关闭,决定对省平台向全国平台上传数据的接口进行性能测试。 01、测试步骤 1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c…

异构融合计算技术白皮书(2023年)研读2

读到工业和信息化部电子第五研究所所做的《异构融合计算技术白皮书(2023年)》,我关注的重点是FPGA与异构计算。续前篇,前篇为第1和第2点。 3 异构计算技术困境 性能瓶颈,性能/灵活性矛盾,编程框架不统一 …

支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新

支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具,也是一个数字生活平台,通过…

Ipswitch WS_FTP 12 安裝

Ipswitch WS.FTP.Professional.12.6.rar_免费高速下载|百度网盘-分享无限制 This works but quite difficult to figure out. It didnt allow me to replace the wsftpext.dll at 1st and had to test lots of ways how to replace it. This is how I did: 1. Follow the instr…

JS逆向爬虫---请求参数加密③【比特币交易爬虫】

查询参数确定 t无加密 请求头参数加密 X-Apikey参数加密确定 X-Apikey逆向 const API_KEY "a2c903cc-b31e-4547-9299-b6d07b7631ab" function encryptApiKey(){ var t API_KEY, e t.split(""), n e.splice(0, 8);return t e.concat(n).join("&…