sklearn机器学习实战——支持向量机四种核函数分类任务全过程(附完整代码和结果图)

sklearn机器学习实战——支持向量机四种核函数分类任务全过程(附完整代码和结果图)



关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱:xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~



1 引言

  在机器学习分类任务中,支持向量机(SVM, Support Vector Machine) 是一种非常强大的算法。SVM模型通过找到决策边界(超平面),以最大化类别之间的间隔(margin)来进行分类。本文将探讨如何使用四种核函数的支持向量机实现分类任务,包括数据预处理、模型训练、交叉验证、性能评估和可视化的完整流程。附完整代码和结果图。



2 理论基础

  SVM的基本思想是:在一个n维空间中,找到一个能够将不同类别分开且具有最大间隔的超平面。换句话说,SVM试图找到一个使得数据点到分类边界的最小距离最大的超平面。

2.1 超平面和支持向量

  • 超平面:在分类任务中,超平面是将数据分开的一条线(对于二维数据)或一个平面(对于三维数据)。它是用来对数据进行分类的边界。

  • 支持向量:支持向量是距离超平面最近的点,这些点对超平面的位置和方向起到决定性作用。

初探支持向量机


2.2 核函数

  由于许多问题无法通过线性超平面有效分割,因此SVM引入了核函数(kernel function),以在高维空间中处理数据。常见的核函数包括:

  • 线性核(Linear Kernel):适用于线性可分的数据,即数据在原始空间中可以被一条直线分开。
  • 多项式核(Polynomial Kernel):用于处理复杂的非线性数据。它将数据映射到更高维度的多项式空间中。
  • 高斯核(RBF Kernel):也是常见的径向基函数核,适合处理复杂的非线性问题,通过将数据映射到无限维空间解决分类问题。
  • Sigmoid核(Sigmoid Kernel):与神经网络中的激活函数类似,适用于某些特定的分类任务。



3 数据预处理

  在机器学习任务中,数据的预处理是非常关键的一步。包括处理缺失值、数据标准化以及数据集划分等。

3.1 数据集介绍与加载

  本文使用的是经典的鸢尾花数据集(Iris Dataset),它包含150个数据点,分为三类(Setosa、Versicolor、Virginica)。每个数据点有4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。加载数据并转换格式:

# 加载鸢尾花数据集
from sklearn.datasets import load_iris
import pandas as pd# 转换格式
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target

3.2 缺失值检测

  在机器学习任务中,处理缺失值至关重要。本文使用 isnull() 函数检测数据集中是否存在缺失值:

# 检测缺失值
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)

3.3 数据标准化与划分

  SVM对数据尺度敏感,因此需要对特征进行标准化,将每个特征的均值归一到 0,标准差归一到 1。接着将数据集划分为训练集和验证集。

sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df.drop('Target', axis=1))# 数据集划分
X_train, X_val, y_train, y_val = train_test_split(X_scaled, df['Target'], test_size=0.2, random_state=42)

4 SVM模型训练(四种核函数)

  本文将使用SVM的四种核函数在训练数据上训练模型:

from sklearn.svm import SVC# 定义不同的核函数
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
models = {}for kernel in kernels:svm_model = SVC(kernel=kernel, random_state=42)svm_model.fit(X_train, y_train)models[kernel] = svm_model



5 十折交叉验证

  为了评估模型的性能稳定性,本文使用十折交叉验证(K-fold cross-validation)。通过对数据集进行多次划分,可以减少模型对特定数据的依赖,获得更稳定的性能评估结果。

from sklearn.model_selection import KFold, cross_val_scorekf = KFold(n_splits=10, shuffle=True, random_state=42)# 十折交叉验证
for kernel, model in models.items():cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')print(f"{kernel}核函数——平均准确率: {np.mean(cv_scores)}")



6 性能评估

  在验证集上进行预测并计算模型的分类性能指标,包括准确率(accuracy)精确率(precision)召回率(recall)F1分数

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 选择核函数(例如 'linear')
kernel = 'linear'
y_val_pred = models[kernel].predict(X_val)# 计算分类评估指标
accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')print(f"{kernel}核函数-准确率: {accuracy_val}")
print(f"{kernel}核函数-精确率: {precision_val}")
print(f"{kernel}核函数-召回率: {recall_val}")
print(f"{kernel}核函数-F1分数: {f1_val}")

结果如下:

结果



7 模型可视化——混淆矩阵

  通过混淆矩阵,我们可以更直观地分析模型在分类任务中的预测情况。以下是混淆矩阵的可视化代码:

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt# 计算混淆矩阵
conf_matrix = confusion_matrix(y_val, y_val_pred)# 可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.title(f'混淆矩阵 ({kernel}核函数)')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()

结果如下:

混淆矩阵



8 完整代码

import numpy as np
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
import warningswarnings.filterwarnings("ignore")# 设置中文字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 加载数据集
from sklearn.datasets import load_iris
data = load_iris()# 数据转换
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target# 缺失值检测
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)# 数据提取
X = df.drop('Target', axis=1)
y = df['Target']# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)# 构建支持向量机模型
kernels = ['linear', 'poly', 'rbf', 'sigmoid']  # 四种不同的核函数
models = {}for kernel in kernels:svm_model = SVC(kernel=kernel, random_state=42)svm_model.fit(X_train, y_train)models[kernel] = svm_model# 十折交叉验证
kf = KFold(n_splits=10, shuffle=True, random_state=42)for kernel, model in models.items():cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')print(f"{kernel}核函数——平均准确率: {np.mean(cv_scores)}")# 评估模型
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 选择核函数(例如 'linear')
kernel = 'linear'
y_val_pred = models[kernel].predict(X_val)# 计算混淆矩阵
conf_matrix = confusion_matrix(y_val, y_val_pred)# 计算分类评估指标
accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')print(f"{kernel}核函数-准确率: {accuracy_val}")
print(f"{kernel}核函数-精确率: {precision_val}")
print(f"{kernel}核函数-召回率: {recall_val}")
print(f"{kernel}核函数-F1分数: {f1_val}")# 可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.title(f'混淆矩阵 ({kernel}核函数)')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()



9 总结

  本文实现了使用支持向量机(SVM)不同核函数进行分类任务的完整流程。每个核函数在处理不同数据时具有各自的优势:

  • 线性核函数适合线性可分的数据,计算效率高,易于解释。
  • 多项式核函数可以处理复杂的非线性关系,但计算复杂度较高。
  • RBF核函数常用于解决大多数非线性问题,因其能够将数据映射到高维空间,但需要合理选择超参数。
  • Sigmoid核函数与神经网络中的激活函数类似,适合某些特定任务。

  希望文章对你有所帮助!如果有任何疑问或建议,欢迎在评论区留言!


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

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

相关文章

vue 解决高德地图Uncaught Error: Invalid Object: Pixel(NaN, NaN)

有点啰嗦,可以直接跳到最后看解决方法。 问题排查过程 原因起始于一个新需求:在编辑列表信息时需要修改设备位置。 按照文档一番操作,发现完美需求解决了。后续测试的时候就发现浏览器报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)…

【2024最新】基于springboot+vue的人职匹配推荐系统lw+ppt

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…

【课程设计/毕业设计】Java家政预约管理系统源码+开发文档

项目介绍 一直想做一款家政管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套管理系统。学习过程中遇到问题可以咨询留言。 在线体验 http://jiazheng.gitapp.cn/ 源码地址 https://github.com/geeeeeeeek/java_jiazh…

Mycat引领MySQL分布式部署新纪元:性能与扩展性的双重飞跃

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高,资源占用少,对于翻译要求不高的应用场景可以使用,比如单词,简单句式的中英文翻译。 该示例使用的模型下载地址:【免费】Helsinki-NLP中英文翻译本…

Java程序打包成jar包

步骤1 打开项目结构 步骤2 配置工件 选择你要打包的模块选择主类(程序的主入口main类)提取到目标会把库文件的jar包打包到目标,一般选择这个,更方便在不同电脑上运行 步骤3 构建并生成jar包 最后,在对应的out/artifacts文件夹中找到jar包,在终端输入java -jar xxxx.jar就可以正…

Sentinel 1.80(CVE-2021-44139)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 Report a Sentinel Security Vulnerability …

“重阳敬老情,爱心暖夕阳”__郑光荣敬老慰问

“重阳敬老情,爱心暖夕阳”__郑光荣敬老慰问 2024年的重阳节,北京正明圣达叫卖团和窦志联的志愿者们来到润龄养老院和老人一起共庆 重阳节、共同带来、 歌、 舞、 演讲、 尤其是(北京正明圣达叫卖团)非遗项目传承人 郑光荣带来…

爬虫prc技术----小红书爬取解决xs

知识星球:知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具知识星球是创作者连接铁杆粉丝,实现知识变现的工具。任何从事创作或艺术的人,例如艺术家、工匠、教师、学术研究、科普等,只要能获得一…

【JVM】如何判断对象是否可以被回收

引用计数法: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 优点:实现简单,判…

5G NR BWP 简介

文章目录 BWP介绍BWP 分类BWP相关总结 BWP介绍 5G NR 系统带宽比4G LTE 大了很多,4G LTE 最大支持带宽为20MHz, 而5G NR 的FR1 最大支持带宽为100MH在, FR2 最大支持带宽为 400MH在。带宽越大,意味了终端功耗越多。为了减少终端的…

Nginx的正向与反向代理

一、Nginx简介 1. 什么是Nginx Nginx(发音为“engine-x”)是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器。Nginx是由俄罗斯的Igor Sysoev(伊戈尔赛索耶夫)为解决C10k问题(即…

下一代安全:融合网络和物理策略以实现最佳保护

在当今快速发展的技术环境中,网络和物理安全融合变得比以往任何时候都更加重要。随着物联网 (IoT) 和工业物联网 (IIoT) 的兴起,组织在保护数字和物理资产方面面临着独特的挑战。 本文探讨了安全融合的概念、说明其重要性的实际事件以及整合网络和物理安…

RNN心脏病预测

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 前期准备 1.数据导入 import pandas as pd from keras.optimizers import Adam from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.p…

构建高效互通的数字桥梁:香港服务器托管指南

在当今全球化日益加深的商业环境中,出海企业面临着前所未有的机遇与挑战。为了确保国内外业务的顺畅运行,特别是在实现国内外数据高效互通、低延迟访问方面,选择一家合适的香港服务器机房进行托管成为了许多企业的关键决策之一。香港&#xf…

网络协议——IP协议

一、IPv4 1、IPv4:TCP/IP协议规定,IPv4地址使用32位的二进制表示,也就是4个字节,为了方便使用,IPv4地址被写成十进制形式,中间用”.”分开。 【点分十进制表示法】 2、IPv4地址分类 2.1 私有地址在互联网…

基于DSP+ARM+FPGA的电能质量分析仪的软件设计

软件设计是电能质量设备的核心内容,上述章节详细介绍了电能质量参数的 算法,并且通过仿真实验进行了验证,本章将结合现代电能质量监测设备需求实 现算法在实际电网中应用。根据设计的电能质量分析仪的需求分析,进行总体的 软件…

英特尔新旗舰 CPU 将运行更凉爽、更高效,适合 PC 游戏

英特尔终于解决了台式机 CPU 发热和耗电的问题。英特尔的新旗舰 Core Ultra 200S 系列处理器将于 10 月 24 日上市,该系列专注于每瓦性能,比之前的第 14 代芯片运行更凉爽、更高效。这些代号为 Arrow Lake S 的处理器也是英特尔首款内置 NPU(…

【笔记】自动驾驶预测与决策规划_Part5_决策过程(上)

决策过程 0. 前言1.决策过程的引入1.1有了planning,为什么还需要decision-making?1.2 决策规划的一些思考 2.马尔可夫决策过程及其关键要素2.1 马尔可夫过程2.1.1 什么是随机过程?2.1.2 什么是马尔科夫性?2.1.3 马尔可夫决策过程 …

从commit校验失效问题探究husky原理

一、背景 之前创建的项目,发现代码 commit 提交的时候没有了任何校验,具体表现: 一是 feat fix 等主题格式校验没有了二是代码 lint 不通过也能提交 尝试解决这个问题,并深入了解husky的实现原理,将相关的一些知识点…