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

这篇具有很好参考价值的文章主要介绍了机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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_)

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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()

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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

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)

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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')

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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

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

3.3 最大间隔决定分类

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

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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

# 画散点图
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)

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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

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')

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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

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)

svm-rfe,机器学习,Python,机器学习,支持向量机,python

因此软间隔,就是相比于硬间隔,可以容受个别变量处于间隔带中**“墙头草”,但如果没有一个原则进行约束,满足软间隔的分类器也会出现很多条。
所以需要对分错的数据进行惩罚,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')

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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')

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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')

svm-rfe,机器学习,Python,机器学习,支持向量机,python

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

### 将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)

svm-rfe,机器学习,Python,机器学习,支持向量机,python

在 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');

svm-rfe,机器学习,Python,机器学习,支持向量机,python

5 讨论

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

概念性的原理,又干又硬还是要去细读理解,ChatGPT给推荐的:文章来源地址https://www.toymoban.com/news/detail-755663.html

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

到了这里,关于机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习——支持向量机SVM

    支持向量机(SVM)是一种二类分类模型,其基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大,间隔最大使它有别于感知机,支持向量机也可通过核技巧使它成为非线性分类器。支持向量机的学习策略是间隔最大化,可将其转化为一个求解凸二次

    2024年01月17日
    浏览(57)
  • SVM(支持向量机)-机器学习

    支持向量机(Support Vector Machine,SVM) 是一种用于分类和回归分析的监督学习算法 。它属于机器学习中的一类强大而灵活的模型,广泛应用于模式识别、图像分类、自然语言处理等领域。 基本原理: SVM的基本原理是通过找到能够有效分隔不同类别的超平面来进行分类。在二维

    2024年02月03日
    浏览(52)
  • 【FPGA教程案例95】机器学习2——基于FPGA的SVM支持向量机二分类系统实现之Verilog编程设计

    FPGA教程目录 ​​​​​​MATLAB教程目录 本课程成果预览(o_check=0表示分类1,o_check=1表示分类2,识别率为98.7%) 目录 1.软件版本

    2023年04月08日
    浏览(60)
  • 机器学习算法:支持向量机(SVM)

    Solem《python计算机视觉编程》、李航《统计学习方法》、周志华《机器学习》 要理解好支持向量机需要较好的数学功底,且能不被公式以及文字绕晕,这里我们就理清楚支持向量机的大体过程。具体的数学计算推导其实已经封装好了,那么理解算法的原理也对我们将来的学习

    2024年02月03日
    浏览(51)
  • 【机器学习】SVM支持向量机模型

     本站原创文章,转载请说明来自 《老饼讲解-机器学习》 ml.bbbdata.com 目录 一. SVM的目标和思想    1.1 SVM硬间隔模型的原始目的 1.2 SVM的直接目标 1.3 什么是支持向量  二. SVM的支持平面的表示方式 2.1 支持面表示方式的初步思路 2.2 初步思路的缺陷与改进 2.3 支持面的最终表示

    2023年04月23日
    浏览(205)
  • 机器学习(六)支持向量机(SVM)

    目录 1.间隔与支持向量 1.1线性可分 1.2支持向量 1.3 最大间隔超平面 2.对偶问题 2.1拉格朗日乘子法 2.2 SMO算法 2.3SMO算法代码实现 3.核函数 4. SVM实例(手写体数字识别) 5.实验总结 支持向量机(SVM) 是有监督学习中最有影响力的机器学习算法之一,一般用于解决二分类问题(

    2024年02月09日
    浏览(57)
  • 【机器学习】支持向量机SVM入门

    相较于之前学习的线性回归和神经网络,支持向量机(Supprot Vector Machine,简称SVM)在拟合复杂的非线性方程的时候拥有更出色的能力,该算法也是十分经典的算法之一。接下来我们需要学习这种算法 首先我们回顾逻辑回归中的经典假设函数,如下图: 对于任意一个实例 (

    2024年02月15日
    浏览(57)
  • Python | 机器学习之SVM支持向量机

    ​​​​​​ ​ 🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《人工智能奇遇记》 🔖墨香寄清辞:诗馀墨痕深,梦漫星辰寂。 曲径通幽意犹在,剑指苍穹气势立。 目录结构 1. 机器学习之SVM支持向量机概念 1.1 机器学习 1.2 SVM支持向量机 2. SVM支持向量机算法 2.1 实验目的

    2024年02月05日
    浏览(39)
  • 一文全解经典机器学习算法之支持向量机SVM(关键词:SVM,对偶、间隔、支持向量、核函数、特征空间、分类)

    之前所介绍的逻辑回归是基于似然度的分类方法,通过对数据概率进行建模来得到软输出。但这种分类方法其实稍加“繁琐”,因为要 估计数据的概率分布作为中间步骤 。这就像当一个人学习英语时,他只要直接报个班或者自己看书就行了,而不需要先学习诘屈聱牙的拉丁

    2024年02月03日
    浏览(63)
  • [学习笔记] [机器学习] 10. 支持向量机 SVM(SVM 算法原理、SVM API介绍、SVM 损失函数、SVM 回归、手写数字识别)

    视频链接 数据集下载地址:无需下载 学习目标: 了解什么是 SVM 算法 掌握 SVM 算法的原理 知道 SVM 算法的损失函数 知道 SVM 算法的核函数 了解 SVM 算法在回归问题中的使用 应用 SVM 算法实现手写数字识别器 学习目标: 了解 SVM 算法的定义 知道软间隔和硬间隔 在很久以前的

    2024年02月09日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包