传统机器学习(七)支持向量机(2)sklearn中的svm

news2024/12/25 9:04:05

传统机器学习(七)支持向量机(2)sklearn中的svm

2 sklearn中的svm

2.1 LinearSVC及SVC参数详解

2.1.1 SVC参数

class sklearn.svm.SVC(*,
                      C=1.0, 
                      kernel='rbf', 
                      degree=3, 
                      gamma='scale', 
                      coef0=0.0, 
                      shrinking=True, 
                      probability=False, 
                      tol=0.001, 
                      cache_size=200, 
                      class_weight=None, 
                      verbose=False, 
                      max_iter=-1, 
                      decision_function_shape='ovr', 
                      break_ties=False, 
                      random_state=None
                     )

用于分类,用libsvm实现,参数如下:

  • C : 惩罚项,默认为1.0,C越大容错空间越小;C越小,容错空间越大
  • kernel : 核函数的类型,可选参数为:
    • “linear” : 线性核函数
    • “poly” : 多项式核函数
    • “rbf” : 高斯核函数(默认)
    • “sigmod” : sigmod核函数
    • “precomputed” : 核矩阵,表示自己提前计算好核函数矩阵
  • degree : 多项式核函数的阶,默认为3,只对多项式核函数生效
  • gamma : 核函数系数,可选,float类型,默认为auto。只对’rbf’ ,’poly’ ,’sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features
  • coef0 :核函数中的独立项,float类型,可选,默认为0.0。只有对’poly’ 和,’sigmod’核函数有用,是指其中的参数c
  • probability : 是否启用概率估计,bool类型,可选参数,默认为False,这必须在调用fit()之前启用,并且会fit()方法速度变慢
  • tol :svm停止训练的误差精度,float类型,可选参数,默认为1e^-3
  • cache_size :内存大小,float,可选,默认200。指定训练所需要的内存,单位MB
  • class_weight:类别权重,dict类型或str类型,可选,默认None。给每个类别分别设置不同的惩罚参数C,如果没有,则会给所有类别都给C=1,即前面指出的C。如果给定参数’balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重
  • max_iter:最大迭代次数,int类型,默认为-1,不限制
  • decision_function_shape :决策函数类型,可选参数’ovo’和’ovr’,默认为’ovr’。’ovo’表示one vs one,’ovr’表示one vs rest。(多分类)
  • random_state :数据洗牌时的种子值,int类型,可选,默认为None

2.1.2 LinearSVC参数

class sklearn.svm.LinearSVC(
    penalty='l2', 
    loss='squared_hinge', 
    *, 
    dual=True, 
    tol=0.0001, 
    C=1.0, 
    multi_class='ovr', 
    fit_intercept=True, 
    intercept_scaling=1, 
    class_weight=None, 
    verbose=0, 
    random_state=None, 
    max_iter=1000
)

LinearSVC(Linear Support Vector Classification)线性支持向量机,核函数是 linear,不是基于libsvm实现的
参数:

  • C:目标函数的惩罚系数C,默认C = 1.0;
  • loss:指定损失函数. squared_hinge(默认), squared_hinge
  • penalty : 惩罚方式,str类型,l1, l2
  • dual :选择算法来解决对偶或原始优化问题。当nsamples>nfeaturesdual=false
  • tol :svm结束标准的精度, 默认是 1e - 3
  • multi_class:如果y输出类别包含多类,用来确定多类策略, ovr表示一对多,“crammer_singer”优化所有类别的一个共同的目标 。如果选择“crammer_singer”,损失、惩罚和优化将会被被忽略。
  • max_iter : 要运行的最大迭代次数。int,默认1000

2.2 LinearSVC及SVC使用案例

2.2.1 鸢尾花数据集在线性SVM上的应用

线性SVM有两种方式实现:

  • LinearSVC(C=1)
  • SVC(C=1, kernel="linear")
import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')


from sklearn.svm import SVC
from sklearn.datasets import load_iris

# 选择鸢尾花数据集的两列,方便画图
iris = load_iris()
X = iris['data'][:, (2,3)]
y = iris['target']
# 只选择两个种类的鸢尾花数据
setosa_versi = (y == 0) | (y == 1)
X = X[setosa_versi]
y = y[setosa_versi]


# 训练,常数C越大,容错空间越小,上下支持面之间的距离越小;常数C越小,容错空间越大,上下支持面之间的距离越大
svm_clf = SVC(kernel='linear',C=100000000)
svm_clf.fit(X,y)
# 绘制决策边界
def plot_svc_decision_boundary(svm_clf,xmin,xmax,sv=True):
    # linearsvc.coef_是所有特征的权重
    w = svm_clf.coef_[0]
    # linearsvc.intercept_是截距
    b = svm_clf.intercept_[0]
    
    x0 = np.linspace(xmin, xmax, 200)
    # 决策边界方程为:w[0]x0 + w[1]x1 = 0
    # 这里计算x1的值
    decision_boundary = - w[0]/w[1] * x0 - b/w[1]
    # 支持面距离判别面之间的距离margin
    margin = 1 / w[1]
    # 上支持面,在这里是x1 + margin
    gutter_up = decision_boundary + margin
    # 下支持面,在这里是x1 - margin
    gutter_dw = decision_boundary - margin
    
    # 是否画出支持向量
    if sv:
        svs = svm_clf.support_vectors_  # 支持向量
        plt.scatter(svs[:,0],svs[:,1],s=180)
    plt.plot(x0,decision_boundary,'k-',linewidth=2)
    plt.plot(x0,gutter_up,'k--',linewidth=2)
    plt.plot(x0,gutter_dw,'k--',linewidth=2)

plt.figure(figsize=(12,8))
plot_svc_decision_boundary(svm_clf,0,5.5)
plt.plot(X[:,0][y==1],X[:,1][y==1],'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0],'yo')
plt.axis([0,5.5,0,2])
plt.show()

在这里插入图片描述

# 在这里把C值调小一些,我们可以看到容错空间越大,上下支持面之间的距离越大
# 此时的支撑向量:指的是落在支持面上的样本,及支持面没支持住的样本
svm_clf_2 = SVC(kernel='linear',C=0.01)
svm_clf_2.fit(X,y)


plt.figure(figsize=(12,8))
plot_svc_decision_boundary(svm_clf_2,0,5.5)
plt.plot(X[:,0][y==1],X[:,1][y==1],'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0],'yo')
plt.axis([0,5.5,0,2])
plt.show()

在这里插入图片描述

2.2.2 多项式核函数

这里可以手动使用 PolynomialFeature将数据升维,再用LinearSVC进行分类。也可以直接使用SVC指定多项式核函数,即:

1、用LinearSVC,需要用PolynomialFeatures升维

from sklearn.datasets import make_moons

# 使用sklearn自带的moon数据
X, y = make_moons(n_samples=100,noise=0.15,random_state=42)

def plot_dataset(X,y,axis):
    plt.plot(X[:,0][y == 0],X[:,1][y == 0],'bs')
    plt.plot(X[:,0][y == 1],X[:,1][y == 1],'go')
    plt.axis(axis)
    plt.grid(True,which='both')


plot_dataset(X,y,[-1.5,2.5,-1,1.5])
plt.show()

在这里插入图片描述

from sklearn.preprocessing import PolynomialFeatures

# 使用LinearSVC分类,使用pipeline封装一下
poly_pipeline = Pipeline(steps=[
    ("ploy_features",PolynomialFeatures(degree=3)),
    ("scaler",StandardScaler()),
    ("svm_clf",LinearSVC(C=10,loss='hinge'))
])

poly_pipeline.fit(X,y)
# 画出决策边界
def plot_pred(clf,axes):
    x0s = np.linspace(axes[0],axes[1],100)
    x1s = np.linspace(axes[2],axes[3],100)
    x0,x1 = np.meshgrid(x0s,x1s)
    # x0 和 x1 被拉成一列,然后拼接成10000行2列的矩阵,表示所有点
    X = np.c_[x0.ravel(),x1.ravel()]
    # 二维点集才可以用来预测
    y_pred = clf.predict(X).reshape(x0.shape)
    # 等高线
    plt.contourf(x0,x1,y_pred,alpha=0.2)

plot_pred(poly_pipeline,[-1.5,2.5,-1,1.5])
plot_dataset(X,y,[-1.5,2.5,-1,1.5])
plt.show()

在这里插入图片描述

2、用SVC() 指定kernel=poly

ploy_kernel_svm_clf1 = Pipeline(
    steps=[
        ("scaler",StandardScaler()),
        ("svm_clf",SVC(kernel='poly',degree=3,coef0=1,C=5))
    ]
)

ploy_kernel_svm_clf1.fit(X,y)


# 可以看到degree越大,分类效果越好,但是也容易造成模型过拟合、模型复杂度提高
ploy_kernel_svm_clf2 = Pipeline(
    steps=[
        ("scaler",StandardScaler()),
        ("svm_clf",SVC(kernel='poly',degree=10,coef0=100,C=5))
    ]
)

ploy_kernel_svm_clf2.fit(X,y)
plt.figure(figsize=(12,5))
plt.subplot(121)
plot_pred(ploy_kernel_svm_clf1,[-1.5,2.5,-1,1.5])
plot_dataset(X,y,[-1.5,2.5,-1,1.5])

plt.subplot(122)
plot_pred(ploy_kernel_svm_clf2,[-1.5,2.5,-1,1.5])
plot_dataset(X,y,[-1.5,2.5,-1,1.5])
plt.show()

在这里插入图片描述

2.2.3 高斯核函数

在这里插入图片描述

在这里插入图片描述

gamma1,gamma2 = 0.1,5
C1,C2 = 0.001,1000

params = (gamma1,C1),(gamma1,C2),(gamma2,C1),(gamma2,C2)

svm_clfs = []

for gamma,C in params:
    rbf_pipeline = Pipeline(
        steps=[
             ("scaler",StandardScaler()),
             ("svm_clf",SVC(kernel='rbf',gamma=gamma,C=C))
        ]
    )
    rbf_pipeline.fit(X,y)
    svm_clfs.append(rbf_pipeline)
plt.figure(figsize=(11,7))
for  i,svm_clf in enumerate(svm_clfs):
    plt.subplot(221+i)
    plot_pred(svm_clf,[-1.5,2.5,-1,1.5])
    plot_dataset(X,y,[-1.5,2.5,-1,1.5])
    gamma,C = params[i]
    plt.title("gamma = {},C = {}".format(gamma,C))

plt.show()

  • gamma参数越大,高斯分布越窄

  • 常数C越大,容错空间越小

在这里插入图片描述

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

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

相关文章

【刷题记录】stack queue的题目练习

文章目录 1. 最小栈2. 逆波兰表达式3. 栈的压入弹出序列4. 栈实现队列5. 队列实现栈 1. 最小栈 题目链接:155. 最小栈 - 力扣(LeetCode) 题干: 设计一个支持 push ,pop ,top 操作,并能在常数时…

使用django_celery_beat在admin后台配置计划任务

一、依赖包的安装 django中使用celery做异步任务和计划任务最头疼的点就是包之间版本兼容性问题,项目一启动花花报错,大概率都是版本问题。每次都会花很大时间在版本兼容性问题上。本例使用如下版本: Django3.2 celery5.2.7 django-celery-b…

记一次 Windows10 内存压缩模块 崩溃分析

一:背景 1. 讲故事 在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相对缺乏&a…

CASAIM高精度自动化三维扫描系统检测塑料件,自动检测形位公差

随着塑料工业的迅速发展,以及塑料制品在航空、航天、电子、机械、船舶和汽车等工业部门的推广应用,对塑料件的质量要求也越来越高。 为了检测塑料件的尺寸偏差以及测量关键部位的3D尺寸和形位公差,对影响总成零件精度的产品、工装、工艺进行精…

Spring手写模拟源码篇(你值得拥有)

概念篇 下面是本文章关于Spring底层原理的章节 Bean的创建的生命周期 类-》推断构造方法-》根据构造方法创建普通对象-》依赖注入(Autowired等进行属性注入)-》初始化前(PostConstruct)->初始化(InitializingBean)-》初始化后…

【Feign扩展】OpenFeign日志打印Http请求参数和响应数据

SpringBoot使用log4j2 在Spring Boot中所有的starter 都是基于spring-boot-starter-logging的&#xff0c;默认使用Logback。使用Log4j2的话&#xff0c;你需要排除 spring-boot-starter-logging 的依赖&#xff0c;并添加 spring-boot-starter-log4j2的依赖。 配置依赖 <…

transformer 网络概述

1. RNN存在的问题 RNN对并行计算并不友好&#xff0c;下一输出依赖于上一输入&#xff0c;难以实现并行高效计算RNN相比较与self-attension模块&#xff0c;缺少对部分变量权重的预估&#xff0c;输出的数据默认拥有一致的权重 2. self-attension self-attension是干嘛的&am…

Shell编程规范与变量使用(再也回不到故事开始的第一章了)

一、Shell编程概述 1.Shell脚本的概念 将要执行的命令按顺序保存到一个文本文件&#xff0c;给该文件可执行权限&#xff0c;可结合各种shell控制语句以完成更复杂的操作。 2.Shell脚本的应用场景 重复性操作 交互性任务 批量事务处理 服务运行状态监控 定时任务执行 … 3…

【MySQL高级】——SQL执行流程

一、MySQL 中的 SQL执行流程 1. 查询缓存 Server 如果在查询缓存中发现了这条 SQL 语句&#xff0c;就会直接将结果返回给客户端&#xff1b;如果没 有&#xff0c;就进入到解析器阶段。需要说明的是&#xff0c;因为查询缓存往往效率不高&#xff0c;所以在 MySQL8.0 之后就抛…

设计模式 -- 组合模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

CKA证书题库-总结

CKA真题&#xff08;考题总结&#xff09; 文章目录 CKA真题&#xff08;考题总结&#xff09;证书个人考试总结申诉结果 CKA题目参考博主重点介绍 CKA模拟题库 注意事项考试概要考试注意事项&#xff1a; CKA题目答案设置自动补全方法一方法二 第⼀题&#xff1a;权限控制RBAC…

C语言编程技巧 --- C语言中左移右移与乘除法的比较

C语言中右移与除法的比较 最近在做项目的时候&#xff0c;遇到了一个有趣的现象。那就是&#xff0c;对于除2的整数次幂的操作而言&#xff0c;为了加快计算速度&#xff0c;一般情况下&#xff0c;会用右移&#xff08;>>&#xff09;来替代除法&#xff08;/&#xff0…

SparkSql(RDD、DataFrame、DataSet详解)idea实例+jdbc读取数据库并保存至数据库或本地

DataFrame 是什么 DataFrame 是一种以 RDD 为基础的分布式数据集&#xff0c;类似于传统数据库中 的二维表格。DataFrame 与 RDD 的主要区别在于&#xff0c;前者带有 schema 元信息&#xff0c;即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL …

QT Data Visualization 模块概述(数据三维显示的模块)

Data Visualization 是 Qt 提供的用于数据三维显示的模块。在 Ot 5.7 以前只有商业版才有此模块&#xff0c;而从Qt5.7 开始此模块在社区版本里也可以免费使用了。Data Visualization 用于数据的三维显示&#xff0c;包括三维柱状图、三维空间散点、三维曲面等。Data Visualiza…

KeepChatGPT插件-提效神器,解决ChatGPT报错!

KeepChatGPT插件-提效神器&#xff0c;解决ChatGPT报错&#xff01; 一、错误提示 最近⼏天&#xff0c;相信不少人在使用OpenAI的ChatGPT时都发现一个问题&#xff0c;就是官⽹报错越来越频繁了。 当你需⽤ChatGPT来处理⼀些⽐较琐碎的任务时&#xff0c;⼀旦你离开⻚⾯时间…

Java多线程基础-7:wait() 和 notify() 用法解析

线程之间是抢占式执行的&#xff0c;线程调度是无序的、随机的&#xff0c;因此线程之间执行的先后顺序是难以预知的。但是&#xff0c;实际开发中&#xff0c;有时我们希望合理地协调多个线程间执行的先后顺序。 虽然 join() 算是一种控制顺序的方式&#xff0c;但它毕竟“功…

4月第3周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年4月17日-4月23日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

【华为机考】模拟题:Words、Vowel、计算字符串重新排列数

前言 刷题之路任重而道远&#xff0c;革命尚未成功&#xff0c;同志仍需努力。由于刷惯了 LeetCode&#xff0c;虽然知道华为机考是需要自己输入输出&#xff0c;也稍稍练了一下&#xff0c;结果真做模拟题的时候&#xff0c;一下子忘了怎么获取字符串了&#xff0c;直接搞了个…

数据降维算法 | Matlab基于局部费歇尔判别(LFDA)的分类数据降维可视化

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 数据降维算法 | Matlab 基于局部费歇尔判别(LFDA)的分类数据降维可视化 部分源码 %--------------------

了解网卡的类型

网卡&#xff0c;即网络接口卡&#xff0c;也叫NIC卡&#xff0c;是一种允许网络连接的计算机硬件设备。网卡应用广泛&#xff0c;市场上有许多不同种类&#xff0c;如PCle网卡&#xff0c;服务器网卡。本文将对网卡的基础&#xff0c;功能&#xff0c;元件与类型进行全方位讲解…