机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)

文章目录

    • 1 前言
      • 1.1 支持向量机的介绍
      • 1.2 支持向量机的应用
    • 2 demo数据集演示
      • 2.1 导入函数
      • 2.2 构建数据集拟合
      • 2.3 预测模型及可视化
    • 3 实例演示分类(非SVM)
      • 3.1 导入函数和数据
      • 3.2 简单线性分类
      • 3.3 最大间隔决定分类
    • 4 实例演示分类(SVM)
      • 4.1主角登场
      • 4.2 软间隔
      • 4.3 超平面
    • 5 讨论

1 前言

1.1 支持向量机的介绍

支持向量机(Support Vector Machine,SVM)是一种监督学习的分类算法。它的基本思想是找到一个能够最好地将不同类别的数据分开的超平面,同时最大化分类器的边际(margin)。SVM的训练目标是最大化间隔(margin),即支持向量到超平面的距离。

具体地,对于给定的训练集,SVM会找到一个最优的分离超平面,使得距离该超平面最近的样本点(即支持向量)到该超平面的距离最大化。SVM是一种二分类算法,但可以通过多次调用SVM实现多分类问题的解决。SVM的优化问题可以通过凸优化来求解,其中使用拉格朗日乘子法将约束优化问题转化为无约束优化问题。

优点:

  • 在高维空间中表现良好:SVM通过寻找一个可以将数据分离的超平面来实现分类,这使得SVM在高维空间中表现良好。

  • 可以避免过拟合:SVM在最大化边际的同时,也要尽可能地避免分类错误。这样可以有效地避免过拟合的问题。

  • 可以处理非线性问题:SVM可以使用核函数将数据从原始空间映射到高维空间,从而解决非线性问题。

缺点:

  • 对参数敏感:SVM的性能依赖于选择的核函数和正则化参数C。这些参数的选择对算法的性能有很大影响,但通常需要手动进行调整。

  • 不适用于大规模数据集:SVM的训练时间随着数据量的增加而增加。这使得SVM不适用于大规模数据集。

  • 可能受到噪声的影响:SVM对于噪声敏感,如果训练集中存在错误的标签或者异常点,可能会对分类器的性能产生负面影响。

总的来说,SVM是一种强大的分类算法,特别适用于高维空间和小数据集。但在实际应用中需要针对具体问题进行参数的调整和模型的优化。

1.2 支持向量机的应用

本篇不过多涉及原理和算法,在处理线性不可分的情况,支持向量机还是很优雅的,在上世纪90年代左右,SVM曾红极一时。常应用于:

  1. 图像分类和识别:SVM常被用于图像分类和识别任务中,例如人脸识别、数字识别等。

  2. 自然语言处理:SVM在文本分类、情感分析、文本检索等领域中得到广泛应用。

  3. 生物信息学:SVM在蛋白质结构预测、DNA分类等生物信息学领域中得到应用。

  4. 工业应用:SVM在质量控制、故障诊断、预测性维护等领域中得到广泛应用。

  5. 金融领域:SVM在股票预测、信用评级、欺诈检测等金融领域中应用广泛。

2 demo数据集演示

2.1 导入函数

##  基础函数库和画图库
import numpy as np 
import matplotlib.pyplot as plt
import seaborn as sns## 导入svm
from sklearn  import svm

2.2 构建数据集拟合

## 构造数据集
x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
y_label = np.array([0, 0, 0, 1, 1, 1])## 调用SVC模型 (支持向量机分类)
svc = svm.SVC(kernel='linear')
## 用SVM模型拟合构造的数据集
svc = svc.fit(x_fearures, y_label) ## 查看其对应模型的w
print('the weight of Logistic Regression:',svc.coef_)
## 查看其对应模型的w0
print('the intercept(w0) of Logistic Regression:',svc.intercept_)

2.3 预测模型及可视化

y_train_pred = svc.predict(x_fearures)
print('The predction result:',y_train_pred)# 可视化
x_range = np.linspace(-3, 3)
w = svc.coef_[0]
a = -w[0] / w[1]
y_3 = a*x_range - (svc.intercept_[0]) / w[1]# 可视化决策边界
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.plot(x_range, y_3, '-c')
plt.show()

这个结果区分的很明显,方便大家看和理解。

3 实例演示分类(非SVM)

这里模拟一下场景问题,在实际情况中,拿到一个二分类数据后怎么处理?

3.1 导入函数和数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
%matplotlib inline# 可视化
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=60, cmap=plt.cm.Paired)

3.2 简单线性分类

# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)x_fit = np.linspace(0, 3)
# 画函数
y_1 = 1 * x_fit + 0.8
plt.plot(x_fit, y_1, '-c')
y_2 = -0.3 * x_fit + 3
plt.plot(x_fit, y_2, '-k')

分法很多种,根据结果大家也能看到,但是,这两种分类哪种更好呢?

因此为了判断好坏,需要引入一个准则:好的分类器不仅仅是能够很好的分开已有的数据集,还能对未知数据集进行两个的划分

3.3 最大间隔决定分类

这里引入一个点(3, 2.8),很明显两种分类会出现两种不同的结果

因此,引入一个重要的概念:最大间隔,笔者这里类比成置信区间也可

# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)x_fit = np.linspace(0, 3)# 画函数
y_1 = 1 * x_fit + 0.8
plt.plot(x_fit, y_1, '-c')
# 画边距
plt.fill_between(x_fit, y_1 - 0.6, y_1 + 0.6, edgecolor='none', color='#AAAAAA', alpha=0.4)y_2 = -0.3 * x_fit + 3
plt.plot(x_fit, y_2, '-k')
plt.fill_between(x_fit, y_2 - 0.4, y_2 + 0.4, edgecolor='none', color='#AAAAAA', alpha=0.4)

蓝线的区间是大于黑线的,因此这样看好像选蓝线的分类更优

但是确定没有更大的间隔了?

4 实例演示分类(SVM)

4.1主角登场

from sklearn.svm import SVC
# SVM 函数
clf = SVC(kernel='linear')
clf.fit(X, y)# 最佳函数
w = clf.coef_[0]
a = -w[0] / w[1]
y_3 = a*x_fit - (clf.intercept_[0]) / w[1]# 最大边距 下界
b_down = clf.support_vectors_[0]
y_down = a* x_fit + b_down[1] - a * b_down[0]
# 最大边距 上界
b_up = clf.support_vectors_[-1]
y_up = a* x_fit + b_up[1] - a * b_up[0]# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)
# 画函数
plt.plot(x_fit, y_3, '-c')
# 画边距
plt.fill_between(x_fit, y_down, y_up, edgecolor='none', color='#AAAAAA', alpha=0.4)
# 画支持向量
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], edgecolor='b',s=80, facecolors='none')

结果显而易见,且图中三个蓝色圆圈即为支持向量,支持向量机提供了在众多可能的分类器之间进行选择的原则,从而确保对未知数据集具有更高的泛化性。

4.2 软间隔

在大多数实际情况中我们遇到的数据:

# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.9)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)

因此软间隔,就是相比于硬间隔,可以容受个别变量处于间隔带中**“墙头草”,但如果没有一个原则进行约束,满足软间隔的分类器也会出现很多条。
所以需要对分错的数据进行惩罚,SVC 函数中,有一个参数 C 就是
惩罚参数**。惩罚参数越小,容忍性就越大。

以c=1为例:

# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.9)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)
# 惩罚参数:C=1 
clf = SVC(C=1, kernel='linear')
clf.fit(X, y)# 最佳函数
w = clf.coef_[0]
a = -w[0] / w[1]
y_3 = a*x_fit - (clf.intercept_[0]) / w[1]
# 最大边距 下界
b_down = clf.support_vectors_[0]
y_down = a* x_fit + b_down[1] - a * b_down[0]
# 最大边距 上界
b_up = clf.support_vectors_[-1]
y_up = a* x_fit + b_up[1] - a * b_up[0]# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)
# 画函数
plt.plot(x_fit, y_3, '-c')
# 画边距
plt.fill_between(x_fit, y_down, y_up, edgecolor='none', color='#AAAAAA', alpha=0.4)
# 画支持向量
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], edgecolor='b',s=80, facecolors='none')

c=0.2时,兼容性更强

X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.9)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)
# 惩罚参数:C=0.2 
clf = SVC(C=0.2, kernel='linear')
clf.fit(X, y)x_fit = np.linspace(-1.5, 4)
# 最佳函数
w = clf.coef_[0]
a = -w[0] / w[1]
y_3 = a*x_fit - (clf.intercept_[0]) / w[1]
# 最大边距 下界
b_down = clf.support_vectors_[10]
y_down = a* x_fit + b_down[1] - a * b_down[0]
# 最大边距 上界
b_up = clf.support_vectors_[1]
y_up = a* x_fit + b_up[1] - a * b_up[0]# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)
# 画函数
plt.plot(x_fit, y_3, '-c')
# 画边距
plt.fill_between(x_fit, y_down, y_up, edgecolor='none', color='#AAAAAA', alpha=0.4)
# 画支持向量
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], edgecolor='b',s=80, facecolors='none')

4.3 超平面

还有一种线性不可分的情况:

### 遇到这种数据无法分类
from sklearn.datasets import make_circles
# 画散点图
X, y = make_circles(100, factor=.1, noise=.1, random_state=2019)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)clf = SVC(kernel='linear').fit(X, y)# 最佳函数
x_fit = np.linspace(-1.5, 1.5)
w = clf.coef_[0]
a = -w[0] / w[1]
y_3 = a*X - (clf.intercept_[0]) / w[1]plt.plot(X, y_3, '-c')

这种情况,不难想到,直接把它立起来!映射到超平面作划分

### 将2d投放到3d超平面
# 数据映射
r = np.exp(-(X[:, 0] ** 2 + X[:, 1] ** 2))ax = plt.subplot(projection='3d')
ax.scatter3D(X[:, 0], X[:, 1], r, c=y, s=50, cmap=plt.cm.Paired)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')x_1, y_1 = np.meshgrid(np.linspace(-1, 1), np.linspace(-1, 1))
z =  0.01*x_1 + 0.01*y_1 + 0.5
ax.plot_surface(x_1, y_1, z, alpha=0.3)

在 SVC 中,可以用高斯核函数来实现这以功能:kernel=‘rbf’

# 画图
X, y = make_circles(100, factor=.1, noise=.1, random_state=2019)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)
clf = SVC(kernel='rbf')
clf.fit(X, y)ax = plt.gca()
x = np.linspace(-1, 1)
y = np.linspace(-1, 1)
x_1, y_1 = np.meshgrid(x, y)
P = np.zeros_like(x_1)
for i, xi in enumerate(x):for j, yj in enumerate(y):P[i, j] = clf.decision_function(np.array([[xi, yj]]))
ax.contour(x_1, y_1, P, colors='k', levels=[-1, 0, 0.9], alpha=0.5,linestyles=['--', '-', '--'])plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], edgecolor='b',s=80, facecolors='none');

5 讨论

支持向量机是笔者认为既有魅力又“来拒去留”的方法,在筛选特征基因的时候运算也不慢,效果也是挺好的。

概念性的原理,又干又硬还是要去细读理解,ChatGPT给推荐的:

  • wiki:Support vector machine
  • Support Vector Machines (SVM) clearly explained
  • Support Vector Machines for Machine Learning

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

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

相关文章

周期性分析

周期性分析就是探索某个变量是否随着时间的变化而呈现出周期性变化的趋势。具体的周期时间的选取可以根据情况而自定。 具体的代码展现如下: 我遇到的问题: 解决办法: 已解决SyntaxError: (unicode error) ‘unicodeescape’ codec can’t…

从0到1理解ChatGPT, GPT-4【文末送书】

作为一项人工智能技术,ChatGPT正在以飞快的速度向前发展,其强大的学习能力甚至可以用超乎想象来形容。 OpenAI公司带着最新的GPT-4开始“大杀四方”了~OpenAI推出GPT-4文本生成AI系统。紧随其后百度发布文心一言,开启智能对话新时代。(文末送…

chatgpt赋能python:Python画图符号详解:入门必知的基础功能

Python画图符号详解:入门必知的基础功能 如果你是初学者,刚刚接触Python编程的话,你可能会感到一点无从下手。但是,随着你的学习深入,你会发现Python的一些非常有用的功能——如画图功能,非常实用又好玩。…

chatgpt赋能python:Python快速画图的不可替代性

Python快速画图的不可替代性 Python作为一个高级编程语言,在科学计算和数据处理领域已经越来越受欢迎。不仅如此,Python也拥有强大的图形库,使其成为一种快速、简便且便于部署的绘图方案。 1. Matplotlib 在Python的图形库中,M…

AIGC浪潮下裁员已至,谈谈居安思危

目录 1、创始人的裁员公告 2、18个月奇迹 3、ChatGPT终结了一切 4、大树之下寸草不生 6、任何一家企业都应居安思危 5、写在最后:既是风口也是浪尖 参考链接: 让所有人都没想到的是,正值人工智能之火烧遍全球之时,一家估值…

2月datawhale组队学习:大数据

文章目录 一、大数据概述二、 Hadoop2.1 Hadoop概述2.2 su:Authentication failure2.3 使用sudo命令报错xxx is not in the sudoers file. This incident will be reported.2.4 创建用户datawhale,安装java8:2.5 安装单机版Hadoop2.5.1 安装Hadoop2.5.2 …

这里有110+公开的专业数据集

👆点击关注|设为星标|干货速递👆 哈喽大家好,我是俊欣 如果你不是会爬虫的技术流,那下面这110网站可以解决你90%的数据需求。 首先,常见的公开数据网站在 https://hao.199it.com/ 都可以搜索到。…

基于Python的世界各个国家的幸福度的公开数据集的数据挖掘

目录 一. 问题背景 1 二. 准备工作 2 三. 具体实施 2 1.数据存储及基本加载 2 数据整理到数组之中 2 2.数据清洗 2 ① 多余列清除 2 ② 列属性归一 3 ③ 空值处理 4 3.数据挖掘算法 6 ① 基本特征 6 ② 总体热力图分析 7 ③ 对指定数据的热…

【博览群书】《实战大数据》——属于我的第一本大数据图书

文章目录 前言简介目录其他 前言 Hello家人们,博主前不久参加了CSDN图书馆和机械工业出版社联合举办的图书类活动,很荣幸在活动中获得了属于自己的第一本大数据图书,《实战大数据—— 分布式大数据分析处理系统开发与应用》。作为大数据专业…

大数据与AI的16个实践分享

↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale活动 主办方:DataFun,指导单位:北京智源研究院 文章作者:Hoh Xil 出品平台:DataFunTalk 导读:12.19-20&…

用最诙谐的语言提升你对大数据的认知

写在前面 本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定大数据理论体系 引子 小明又来了~ …

大数据平台技术回忆版

liu老师当时也没给我们怎么画重点 我主要是到mooc上面 还有刷题软件上找了题做做 确实有原题 怎么说呢 光看ppt是不太行的 因为有的知识点出的很细。 可以到刷题神器上看看做做题 简单举几个例子 比如这种是吧 选择题跟判断题也是到网上找找题做 确实碰到了原题目 是吧 …

hahabet05:com浅谈大数据一之认识大数据

浅谈大数据一之认识大数据 ***数据,相信在大部分人的脑海中会有一个大概的意识。没错,数据并不是一个新的概念,在这几天年的发展中,人类一直在利用着数据做着记录,而数据的价值,特别是大数据的价值却是近几…

话题讨论征文--谈论大数据时我们在谈什么 获奖名单公布

从社会发展趋势的角度,很明显大数据会是目前肉眼可及的视野范围里能看到的最大趋势之一。从传统IT 业到互联网、互联网到移动互联网,从以智能手机和Pad 为主要终端载体的移动互联网到可穿戴设备的移动互联网,然后再到万物互联的物联网&#x…

从图像处理到语音识别,25款数据科学家必知的深度学习开放数据集

选自Analytics Vidhya,作者:Pranav Dar,机器之心编译。 本文介绍了 25 个深度学习开放数据集,包括图像处理、自然语言处理、语音识别和实际问题数据集。 介绍 深度学习(或生活中大部分领域)的关键在于实践…

程序人生 - 祝贺登榜《大数据领域内容榜》NO.20

博客文章传送门:LeetCode(数据库)- 报告系统状态的连续日期

【大数据模型】LeonardoAi让心中所想跃然纸上

汝之观览,吾之幸也! 本文主要聊聊LeonardoAi绘图工具 一、注册Discord账号 不管LeonardoAi还是midjourney,都需要注册一个Discord账号,Discord是一个社区软件,在这里可以进行讨论和交流使用心得 LeonardoAi官网地址 …

《数据分析咖哥十话》包邮送3本

文末留言包邮送三本 小雪求职记 入秋以来,市场就开始不景气,我们的女主人公小雪从一家互联网公司的运营岗毕(cai)业(yuan)以来,三个月都没接到任何面试。冬天到了,表姐小冰告诉她&am…

微信小程序通讯地址授权拒绝后的处理方式

在小程序开发时,在用户拒绝获取通讯地址的授权后,在一段时间内将无法在弹出授权提示导致无法获取通讯地址。通过看微信的api文档,发现其中有一个wx.openSetting()方法可以打开设置页面进行授权。但wx.openSetting()方法打开的设置页面只能显示…

微信第三方平台对接小程序发版

微信第三方平台对接小程序发版(工作笔记) 微信第三方平台是商家把公众号或小程序代交给服务商来管理,当商家把小程序授权给第三方平台后,同时授权小程序开发与数据分析,小程序后台就无法发版,必须开发人员…