Python大数据分析——SVM模型(支持向量机)

news2024/11/24 22:31:33

Python大数据分析——SVM模型(支持向量机)

  • 认知模型
    • 介绍
    • 距离计算
    • 模型思想
    • 目标函数
    • 函数与几何间隔
  • 线性可分SVM模型
    • 目标函数
    • 函数代码
  • 非线性可分SVM模型
    • 目标函数
    • 函数代码
  • 示例
    • 手写体字母识别
    • 森林火灾面积预测

认知模型

介绍

超平面的理解:在一维空间中,如需将数据切分为两段,只需要一个点即可;在二维空间中,对于线性可分的样本点,将其切分为两类,只需一条直线即可;在三维空间中,将样本点切分开来,就需要一个平面。
在这里插入图片描述

距离计算

在这里插入图片描述
点到线的距离:
在这里插入图片描述

平行线间的距离:
在这里插入图片描述

模型思想

在这里插入图片描述

绘制了两条分割直线,利用这两条直线,可以方便地将样本点所属的类别判断出来。虽然从直观上来看这两条分割线都没有问题,但是哪一条直线的分类效果更佳呢(训练样本点的分类效果一致,并不代表测试样本点的分类效果也一样)?甚至于在直线和之间还存在无数多个分割直线,那么在这么多的分割线中是否存在一条最优的“超平面”呢?
在这里插入图片描述

假设直线Li是L1和L2以之间的某条直线(分割面),为了能够寻找到最优的分割面山Li,需要做三件事,首先计算两个类别中的样本点到直线的Li距离;然后从两组距离中各挑选出一个最短的(如图中所示的距离d1和d2),继续比较d1和d2,再选出最短的距离(如图中的d1),并以该距离构造“分割带”(如图中经平移后的两条虚线);最后利用无穷多个分割直线Li,构造无穷多个“分割带”,并从这些“分割带”中挑选出带宽最大的Li。
在这里插入图片描述

“分割带”代表了模型划分样本点的能力或可信度,“分割带”越宽,说明模型能够将样本点划分得越清晰,进而保证模型泛化能力越强,分类的可信度越高;反之,“分割带”越窄,说明模型的准确率越容易受到异常点的响,进而理解为模型的预测能力越弱,分类的可信度越低。

目标函数

在这里插入图片描述

函数与几何间隔

指的就是我们的分隔带
在这里插入图片描述
将图中五角星所代表的正例样本用1表示,将实心圆所代表的负例样本用-1表示;实体加粗直线表示某条分割面;两条虚线分别表示因变量y取值为+1和-1时的情况,它们与分割面平行。
不管是五角星代表的样本点,还是实心圆代表的样本点,这些点均落在两条虚线以及虚线之外,则说明这些点带入到方程w’x+b所得的绝对值一定大于等于1。
进而可以说明如果点对应的取值越小于-1,该样本为负例的可能性越高;点对应的取值越大于+1,样本为正例的可能性越高。
在这里插入图片描述
对于几何间隔,就是对于距离的公式是如何来的。
在这里插入图片描述
||w||二范式也就是平方开根,也就是距离公式。

线性可分SVM模型

目标函数

通过函数间隔、距离公式可得
在这里插入图片描述
在这里插入图片描述

拉格朗日乘子法:
在这里插入图片描述
我们通过拉格朗日乘子法,来简化,得到基于拉格朗日乘子法的目标函数。

在这里插入图片描述

在这里插入图片描述
紧接着我们对目标函数求解:

  1. 首先求偏导,令为0
    在这里插入图片描述
  2. 将导函数反代之目标函数
    将上面得出的w=Σαiyixi带入
    在这里插入图片描述
    最后得
    在这里插入图片描述

函数代码

LinearSVC(tol=0.0001, C=1.0, multi_class=‘ovr’, fit_intercept=True, intercept_scaling=1, class_weight=None, max_iter=1000)
tol:用于指定SVM模型迭代的收敛条件,默认为0.0001
C:用于指定目标函数中松弛因子的惩罚系数值,默认为1
fit_intercept:bool类型参数,是否拟合线性“超平面”的截距项,默认为True
intercept_scaling:当参数fit_intercept为True时,该参数有效,通过给参数传递一个浮点值,就相当于在自变量X矩阵中添加一常数列,默认该参数值为1
class_weight:用于指定因变量类别的权重,如果为字典,则通过字典的形式{class_label:weight}传递每个类别的权重;如果为字符串’balanced’,则每个分类的权重与实际样本中的比例成反比,当各分类存在严重不平衡时,设置为’balanced’会比较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最大迭代次数,默认为1000

非线性可分SVM模型

在这里插入图片描述
我们在三维空间去找超平面

目标函数

对于非线性SVM模型而言,需要经过两个步骤,一个是将原始空间中的样本点映射到高维的新空间中,另一个是在新空间中寻找一个用于识别各类别样本点线性“超平面”。
假设原始空间中的样本点为x,将样本通过某种转换fai(x)映射到高维空间中,则非线性SVM模型的目标函数可以表示为:
在这里插入图片描述
对其求解:
在这里插入图片描述
其中核函数是:
在这里插入图片描述
线性核函数:
在这里插入图片描述
多项式核函数:
在这里插入图片描述
高斯核函数:
在这里插入图片描述
Sigmoid核函数:
在这里插入图片描述

函数代码

SVC(C=1.0, kernel=‘rbf’, degree=3, gamma=‘auto’, coef0=0.0, tol=0.001, class_weight=None, verbose=False, max_iter=-1, random_state=None)
C:用于指定目标函数中松弛因子的惩罚系数值,默认为1(惩罚系数越大,模型越精准,但是需要消耗得运算成本会加高)
kernel:用于指定SVM模型的核函数,该参数如果为’linear’,就表示线性核函数;如果为’poly’,就表示多项式核函数,核函数中的r和p值分别使用degree参数和gamma参数指定;如果为’rbf’,表示径向基核函数(也叫高斯核函数),核函数中的r参数值仍然通过gamma参数指定;如果为’sigmoid’,表示Sigmoid核函数,核函数中的r参数值需要通过gamma参数指定;如果为’precomputed’,表示计算一个核矩阵
degree:用于指定多项式核函数中的p参数值
gamma:用于指定多项式核函数或径向基核函数或Sigmoid核函数中的r参数值
coef0:用于指定多项式核函数或Sigmoid核函数中的r参数值
tol:用于指定SVM模型迭代的收敛条件,默认为0.001
class_weight:用于指定因变量类别的权重,如果为字典,则通过字典的形式{class_label:weight}传递每个类别的权重;如果为字符串’balanced’,则每个分类的权重与实际样本中的比例成反比,当各分类存在严重不平衡时,设置为’balanced’会比较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最大迭代次数,默认为-1,表示不限制迭代次数

示例

手写体字母识别

  1. 导入功能包
# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics # 模型度量方法
  1. 查看数据
# 读取外部数据
letters = pd.read_csv(r'D:\pythonProject\data\letterdata.csv')
# 数据前5行
letters.head()

在这里插入图片描述

  1. 处理数据
    拆分数据集
# 将数据拆分为训练集和测试集
predictors = letters.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(letters[predictors], letters.letter, test_size = 0.25, random_state = 1234)
  1. 模型拟合与预测
    首先来看看线性SVM,SVM有个缺点就是计算特别慢,对于大数据来说现在是不合适用此模型的。
# 选择线性可分SVM模型
linear_svc = svm.LinearSVC()
# 模型在训练数据集上的拟合
linear_svc.fit(X_train,y_train)
# 模型在测试集上的预测
pred_linear_svc = linear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test, pred_linear_svc)

输出:0.4412
能看到准确率是很低的,紧接着我们用高斯SVM

# 选择非线性SVM模型
nolinear_svc = svm.SVC(kernel='rbf')
# 模型在训练数据集上的拟合
nolinear_svc.fit(X_train,y_train)
# 模型在测试集上的预测
pred_svc = nolinear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test,pred_svc)

输出:0.9238
可以看到效果好了很多。

森林火灾面积预测

  1. 导入功能包
# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics # 模型度量方法
  1. 查看数据
# 读取外部数据
forestfires = pd.read_csv(r'D:\pythonProject\data\forestfires.csv')
# 数据前5行
forestfires.head()

在这里插入图片描述

  1. 处理数据
# 我们认为天不是影响因素所以删除day变量
forestfires.drop('day',axis = 1, inplace = True)
# 将月份作数值化处理
forestfires.month = pd.factorize(forestfires.month)[0]
# 预览数据前5行
forestfires.head()

在这里插入图片描述
紧接着查看数据分布,是否有什么规律

# 导入第三方模块
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import norm
# 绘制森林烧毁面积的直方图
sns.distplot(forestfires.area, bins = 50, kde = True, fit = norm, hist_kws = {'color':'steelblue'}, 
             kde_kws = {'color':'red', 'label':'Kernel Density'}, 
             fit_kws = {'color':'black','label':'Nomal', 'linestyle':'--'})
# 显示图例
plt.legend()
# 显示图形
plt.show()

在这里插入图片描述

发现数据是极端右偏,偏态式分布,那么我们就要对其进行一个变化,然后计算

  1. 数学变换——对数变换,并作标准化处理
# 导入第三方模块
from sklearn import preprocessing
import numpy as np
from sklearn import neighbors
# 对area变量作对数变换
y = np.log1p(forestfires.area)
# 将X变量作标准化处理
predictors = forestfires.columns[:-1]
X = preprocessing.scale(forestfires[predictors])
# 将数据拆分为训练集和测试集
X_train,X_test,y_train,y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)
  1. 拟合与预测
# 构建默认参数的SVM回归模型
svr = svm.SVR()
# 模型在训练数据集上的拟合
svr.fit(X_train,y_train)
# 模型在测试上的预测
pred_svr = svr.predict(X_test)
# 计算模型的MSE
metrics.mean_squared_error(y_test,pred_svr)	

误差项得:1.9268192310372871

但这不一定是最好的,我们可以采用网格搜索法,通过自己给定的不同的参数,通过各种组合自己找到最佳的

# 使用网格搜索法,选择SVM回归中的最佳C值、epsilon值和gamma值
epsilon = np.arange(0.1,1.5,0.2)
C= np.arange(100,1000,200)  
gamma = np.arange(0.001,0.01,0.002)
parameters = {'epsilon':epsilon,'C':C,'gamma':gamma}
grid_svr = model_selection.GridSearchCV(estimator = svm.SVR(max_iter=10000),param_grid =parameters, scoring='neg_mean_squared_error',cv=5,verbose =1, n_jobs=2)
# 模型在训练数据集上的拟合
grid_svr.fit(X_train,y_train)
# 返回交叉验证后的最佳参数值
print(grid_svr.best_params_, grid_svr.best_score_)

输出:
Fitting 5 folds for each of 175 candidates, totalling 875 fits
{‘C’: 300, ‘epsilon’: 1.1000000000000003, ‘gamma’: 0.001} -1.9946668196316562
也就是拟合5重,有175种组合,总计完成875次流程计算,得到最佳组合
对比下我们改变后的预测

# 模型在测试集上的预测
pred_grid_svr = grid_svr.predict(X_test)
# 计算模型在测试集上的MSE值
metrics.mean_squared_error(y_test,pred_grid_svr)

输出:
1.745501223882639

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

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

相关文章

Stable Diffusion绘画 | 进阶语法

控制提示词生效时间 使用格式1:[提示词:0-1数值] 举例:forest,lots of trees and stones,[flowers:0.7] 其中 [flowers:0.7] 表示整体画面采样值达到70%的进程以后,才开始计算花的采样。 因此,花的数量仅仅只跑了末段的30%&am…

LeetCode之回溯

1.全排列 1.1 题目 1.2 题解 LeetCode 力扣官方题解 1.3 代码 class Solution {public List<List<Integer>> permute(int[] nums) {// 创建一个空的列表 res&#xff0c;用于存储所有的排列结果List<List<Integer>> res new ArrayList<>();/…

C++入门基础:数据类型与条件判断语句

数据类型 基础数据类型 整型&#xff08;Integral Types&#xff09; int&#xff1a;基本的整型&#xff0c;大小依赖于编译器和平台&#xff0c;通常是32位或64位。 short&#xff1a;短整型&#xff0c;通常是16位。 long&#xff1a;长整型&#xff0c;大小依赖于编译…

本地部署Code Llama大模型结合Text generation Web UI远程运行LLM

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

pdf拆分成一页一页,怎么操作?pdf拆分的好用方法

pdf拆分成一页一页&#xff0c;怎么操作&#xff1f;PDF文件的拆分通常涉及到以下几个常见场景和需求&#xff1a;首先&#xff0c;PDF文件可能包含大量的页面&#xff0c;例如数百页的电子书或详尽的技术手册。在某些情况下&#xff0c;用户可能只需要处理其中的几页或者想要单…

揭秘!亚马逊与速卖通自养号测评:必备资源与技术要点

面对测评服务商的种种承诺&#xff0c;其真实性往往难以验证&#xff0c;而在像Facebook这样的社交平台上自行寻找测评资源&#xff0c;也显得相当困难和不切实际。随着产品即将上架&#xff0c;寻找一个可靠的测评服务似乎并不那么容易。因此&#xff0c;对于亚马逊等跨境平台…

运动耳机哪个品牌好用?五款质量一流品牌推荐!

运动耳机无疑是运动爱好者的绝佳伴侣&#xff0c;让每一次挥汗如雨的瞬间都伴随着无与伦比的音乐盛宴与舒适的佩戴感受。特别是对于跑步爱好者而言&#xff0c;一款优秀的运动耳机更是不可或缺的装备。然而&#xff0c;市场上的运动耳机种类繁多&#xff0c;质量也千差万别&…

Mirror学习笔记(五)概念指南

文章目录 一、Authority(权限)二、IDs(身份编号)三、Attributes(属性)四、Time Synchronization(同步时间)五、Data types(数据类型)六、Serialization(序列化)七、Synchronization(同步)八、Communications(通讯)九、GameObject(游戏对象) 顶层脚本API: Mirror是一个高级网络库…

Qt信号与槽-思维导图-学习笔记

Qt 信号与槽 Qt 信号与槽机制 基本概念 信号与槽机制&#xff1a;Qt 编程的基础与创新&#xff0c;使得处理界面组件交互操作更加直观和简单 信号&#xff08;Signal&#xff09;&#xff1a;在特定情况下被发射的事件&#xff0c;如按钮点击的 clicked() 信号、组合框项变化…

服务器数据恢复—服务器raid常见故障产生原因数据恢复方案

磁盘阵列&#xff08;raid&#xff09;是一种将多块物理硬盘整合成一个虚拟存储的技术。raid模块相当于一个存储管理中间层&#xff0c;上层接收并执行操作系统及文件系统的数据读写指令&#xff0c;下层管理数据在各个物理硬盘上的存储及读写。相对于单独的物理硬盘&#xff0…

超算互联网-Stable Diffusion 2.1文生图教程

一、名词简介 1. 超算互联网 超算互联网是一种基于云计算的高性能计算平台&#xff0c;用户可以通过互联网接入超级计算资源。它集成了大量的计算节点&#xff0c;提供强大的计算能力&#xff0c;适用于科学计算、深度学习、人工智能等领域。用户可以利用超算互联网平台运行复…

Neural Architecture Search:使用Ultralytics框架进行YOLO-NAS目标检测

Neural Architecture Search&#xff1a;使用Ultralytics框架进行YOLO-NAS目标检测 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行YOLO-NAS目标检测进行预测进行验证 参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c…

旧照片如何修复翻新?这3个方法值得收藏

旧照片如何修复翻新&#xff1f;旧照片的修复翻新是一项既具有挑战性又充满意义的工作。它不仅仅是一个简单的图像处理过程&#xff0c;更是一次穿越时空的旅行&#xff0c;让那些被岁月遗忘的珍贵回忆重新焕发光彩。每一张旧照片都承载着独特的历史和情感价值&#xff0c;通过…

CTF-PWN-web pwn初探

文章目录 参考简介生命周期php扩展模块搭建php扩展模块初始化编写扩展模块编译扩展模块测试 检查调试相关技巧/proc/self/maps泄露php堆PHP 内存管理机制空闲堆块管理示例解释1. 内存分配示例2. 内存释放示例3. tcache poison 攻击 溢出mprotect改栈权限反弹shell 常用phpexp 参…

[Pytorch案例实践008]基于卷积神经网络和通道注意力机制的图像分类实战

一、项目介绍 这是一个蜜蜂、蚂蚁图像分类项目&#xff0c;旨在使用卷积神经网络&#xff08;CNN&#xff09;结合SE&#xff08;Squeeze-and-Excitation&#xff09;模块进行二分类任务。以下是项目的详细介绍&#xff1a; 项目背景 图像分类是计算机视觉中的一个基本任务&a…

一图看懂数据仓库、数据平台、数据中台、数据湖的内涵和区别!

当大数据平台出现的时候&#xff0c;有人是说这不就是大号的数据仓库吗?当数据中台出现的时候&#xff0c;有人说这不就是数据仓库的进一步包装吗?数据湖的出现更是让很多人陷入困惑。 事实上&#xff0c;数据仓库、数据平台、数据中台、数据湖还是有区别的&#xff0c;不仅…

算法 三

堆 满二叉树&#xff1a;节点满的。 完全二叉树定义&#xff1a;最下层从左往右满&#xff0c;不跳。 下标性质 大根堆&#xff1a;某个节点为根节点&#xff0c;其下的所有结点都小于根节点。 小根堆 重要的变量 heapSize&#xff1a;当前堆的有效节点个数 重要的两个过程…

RCE-无字母数字绕过正则表达式

目录 一、源码展示 二、分析源码 2.1异或运算 2.2或运算 2.3取反运算 一、源码展示 <?php error_reporting(0); highlight_file(__FILE__); $code$_GET[code]; if(preg_match(/[a-z0-9]/i,$code)){die(hacker); } eval($code); 二、分析源码 根据源码&#xff0c;我…

数据治理:国家标准 GB/T 43697-2024《数据安全技术 数据分类分级规则》

按照国家数据分类分级保护有关要求,参照本文件制定本行业本领域的数据分类分级标准规范,重点可明确以下内容: 明确行业数据分类细则,确定数据分类所依据的业务属性,给出按照业务属性划分的数据类别:分析行业领域数据的领域、群体、区域、精度、规模、深度、重要性等分级要素…

设计模式-单一职责模式

DecoratorBridge Decorator 动机 在某些情况下我们可能会 “过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b;并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的…