百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

支持向量机(SVM)说明及示例

toyiye 2024-06-21 12:31 8 浏览 0 评论


支持向量机(SVM)可以解决支持分类和回归问题,这两个问题的解决都是通过构造函数h来实现的,该函数将输入向量x与输出y进行匹配:y = h(x )

优缺点

优点:该算法可以基于内核对线性和非线性问题的极限进行建模。它对于“过拟合”也非常可行,尤其是在大空间中。

劣势:支持向量机需要大量的内存,由于选择正确的核(kernel)很重要,所以很难调整,而且在相当大的数据集下也无法获得良好的结果。

简要说明

假设我们有6点的数据集,如下所示

你可以看到它们是线性可分的,但问题是有成千上万的直线可以做到这一点

所有这些线均有效,并且可以100%正确的进行分类。但问题是,这些线是有效的,但不是最优的。

如下图所示,它们的原理很简单:它们的目的是使用尽可能“简单”的边界将数据分离到类中,从而使不同数据组之间的距离和它们之间的边界达到最大。这个距离也被称为“margin”,支持向量机因此被称为“wide margin separators”,“支持向量”是最接近边界的数据。

要使用的机器学习数据集

1)进行分类的SVM:我们将使用“ Social Network Ads”机器学习数据集,这是此数据集的链接(https://www.kaggle.com/rakeshrau/social-network-ads)。数据集由5列组成(User ID、Gender、 Age、 Estimated Salary 和 Purchased),共有400行。

2)第二个SVM进行回归:我们将使用“Position Salaries”机器学习数据集,这是此数据集(https://www.kaggle.com/farhanmd29/position-salaries)的链接。数据集由3列组成(Position、 Level、Salary),有10行。

要达到的结果

分类:可视化并识别不同类,并按数据集绘制分界线以进行测试

回归:可视化数据点并绘制回归线,并预测level为4.5和8.5员工的薪水

遵循的步骤

分类

  1. 导入必要的库
  2. 导入数据集
  3. 将数据分为训练集和测试集
  4. 根据需要建立特征缩放
  5. 从SVM库创建用于分类的SVC对象
  6. 拟合数据集(训练集)
  7. 预测结果(测试集)
  8. 评估机器学习模型

回归

  1. 导入必要的Python库
  2. 导入机器学习数据集
  3. 根据需要建立特征缩放
  4. 从SVM库创建用于回归的SVC对象
  5. 拟合数据集
  6. 预测结果

算法实现(分类)

这部分代码进行了数据预处理,特征缩放,将数据划分为训练集和测试集,然后从支持向量机类中声明我们的SVC分类模型以进行拟合和预测

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# Fitting classifier to the Training set
from sklearn.svm import SVC
classifier = SVC(random_state=0) # for non-linear model use this parametre kernel='rbf'
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

数据可视化部分的Python代码如下:

# Visualising the Training set results
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Classifier (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

结果

我们将使用线性和非线性的核来可视化svc对象的测试集

线性核

非线性核

算法实现(回归)

与上面的SVR模型相类似。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# import and split the data and classes
dataset = pd.read_csv("Position_Salaries.csv")
X = dataset.iloc[:, 1:-1].values
Y = dataset.iloc[:, 2].values


# features scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_Y = StandardScaler()
X = sc_X.fit_transform(X)
Y = sc_Y.fit_transform(np.reshape(Y, (10,1)))

# Fitting Regression modelto the dataset
from sklearn.svm import SVR
regressor = SVR() # add this parametre kernel='rbf'
regressor.fit(X,Y)

# predicts a new result with polyn reg
y_pred = sc_Y.inverse_transform(regressor.predict(sc_X.transform(np.array([[8.5]]))))

# Visualisation the regression result
plt.scatter(x=X, y=Y,color='red')
plt.plot(X, regressor.predict(X), color='green')
plt.title('Truth of Bluff / SVR')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()

结果

我们需要了解SVM有几种类型的核(‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’)。

4.5的预测为130101.64,8.5为303706.02

我们将regressor = SVR()替换为regressor = SVR(kernel='rbf'),然后重新运行程序

而预测这里有115841.63(4.5)和403162.82(8.5)

最后

SVM的限制包括:

  • SVM算法不适用于大型数据集。
  • 当数据集的噪声较大时,支持向量机不能很好地工作。
  • 如果每个数据点的样本数量超过了训练数据样本的数量,SVM将会表现不佳。
  • 由于支持向量分类器通过在分类超平面的上方和下方放置数据点来工作,因此没有概率解释。

相关推荐

如何用 coco 数据集训练 Detectron2 模型?

随着最新的Pythorc1.3版本的发布,下一代完全重写了它以前的目标检测框架,新的目标检测框架被称为Detectron2。本教程将通过使用自定义coco数据集训练实例分割模型,帮助你开始使...

CICD联动阿里云容器服务Kubernetes实践之Bamboo篇

本文档以构建一个Java软件项目并部署到阿里云容器服务的Kubernetes集群为例说明如何使用Bamboo在阿里云Kubernetes服务上运行RemoteAgents并在agents上...

Open3D-ML点云语义分割实验【RandLA-Net】

作为点云Open3D-ML实验的一部分,我撰写了文章解释如何使用Tensorflow和PyTorch支持安装此库。为了测试安装,我解释了如何运行一个简单的Python脚本来可视化名为...

清理系统不用第三方工具(系统自带清理软件效果好不?)

清理优化系统一定要借助于优化工具吗?其实,手动优化系统也没有那么神秘,掌握了方法和技巧,系统清理也是一件简单和随心的事。一方面要为每一个可能产生累赘的文件找到清理的方法,另一方面要寻找能够提高工作效率...

【信创】联想开先终端开机不显示grub界面的修改方法

原文链接:【信创】联想开先终端开机不显示grub界面的修改方法...

如意玲珑成熟度再提升,三大发行版支持教程来啦!

前期,我们已分别发布如意玲珑在deepinV23与UOSV20、openEuler24.03发行版的操作指南,本文,我们将为大家详细介绍Ubuntu24.04、Debian12、op...

118种常见的多媒体文件格式(英文简写)

MP4[?mpi?f??]-MPEG-4Part14(MPEG-4第14部分)AVI[e?vi??a?]-AudioVideoInterleave(音视频交错)MOV[m...

密码丢了急上火?码住7种console密码紧急恢复方式!

身为攻城狮的你,...

CSGO丨CS2的cfg指令代码分享(csgo自己的cfg在哪里?config文件位置在哪?)

?...

使用open SSL生成局域网IP地址证书

某些特殊情况下,用户内网访问多可文档管理系统时需要启用SSL传输加密功能,但只有IP,没有域名和证书。这种情况下多可提供了一种免费可行的方式,通过openSSL生成免费证书。此方法生成证书浏览器会提示...

Python中加载配置文件(python怎么加载程序包)

我们在做开发的时候经常要使用配置文件,那么配置文件的加载就需要我们提前考虑,再不使用任何框架的情况下,我们通常会有两种解决办法:完整加载将所有配置信息一次性写入单一配置文件.部分加载将常用配置信息写...

python开发项目,不得不了解的.cfg配置文件

安装软件时,经常会见到后缀为.cfg、.ini的文件,一般我们不用管,只要不删就行。因为这些是程序安装、运行时需要用到的配置文件。但对开发者来说,这种文件是怎么回事就必须搞清了。本文从.cfg文件的创...

瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

本文适用OpenHarmony开源鸿蒙系统,本次使用的是开源鸿蒙主板,搭载瑞芯微RK3568芯片。深圳触觉智能专注研发生产OpenHarmony开源鸿蒙硬件,包括核心板、开发板、嵌入式主板,工控整机等...

Python9:图像风格迁移-使用阿里的接口

先不多说,直接上结果图。#!/usr/bin/envpython#coding=utf-8importosfromaliyunsdkcore.clientimportAcsClient...

Python带你打造个性化的图片文字识别

我们的目标:从CSV文件读取用户的文件信息,并将文件名称修改为姓名格式的中文名称,进行规范资料整理,从而实现快速对多个文件进行重命名。最终效果:将原来无规律的文件名重命名为以姓名为名称的文件。技术点:...

取消回复欢迎 发表评论:

请填写验证码