python支持向量机回归_机器学习实战-支持向量机原理、Python实现和可视化(分类)...

支持向量机(SVM)广泛应用于模式分类和非线性回归领域。 SVM算法的原始形式由Vladimir N.Vapnik和Alexey Ya提出。自从那以后,SVM已经被巨大地改变以成功地用于许多现实世界问题。

1.什么是支持向量机(SVM)?

支持向量机是一种有监督的机器学习算法,可用于分类和回归问题。它遵循一种用核函数技巧来转换数据的技术,并且基于这些转换,它找到可能输出之间的最佳边界。简单来说,它做一些非常复杂的数据转换,以找出如何根据标签或输出定义的数据分离。本文我们将看到SVM分类算法如何通过python实现并可视化。

2.SVM的原理

寻找一个分离超平面,使得它到各分类的平均距离是最大的。

什么是分离超平面?

把数据划分为多个类别的一个图形,如线、面、超平面,我们统称为超平面。一个最简单的示例,即数据集位于2维平面中,一条线就可以把样本分成两类。但是支持向量机也可以用于一般的n维数据集,所以我们统称超平面。更正式地说,它是n维欧几里德空间的n-1维子空间。

所以一个1维数据集,单点表示超平面。

2维数据集,线是超平面。

3维数据集,平面是超平面。

在更高的维度上,就被称为超平面。

SVM的目标是找到最佳分离超平面。那么什么时候分离超平面是最优的?让我们通过一组图来理解最佳超平面。有多个超平面,但其中哪一个是分离超平面? 可以很容易地看出,线B是比较好地分离这两个类的线,但我们如何计算出来最佳的超平面呢?

直观地,如果我们选择接近一个类的数据点的超平面,那么它可能不能很好地推广。因此,要选择尽可能远离每个类别的数据点的超平面。

在上图中,满足指定条件的最佳超平面为B。

因此,最大化每个类的最近点和超平面之间的距离就能找到最优分离超平面。这个距离称为边距,下图是边距的计算原理图。

SVM的目标是找到最佳超平面,因为它不仅分类现有数据集,而且有助于预测未知数据的类。最优超平面是边距最大的平面。

3、支持向量机的优缺点

每个分类算法都有自己的优点和缺点,它们根据正在分析的数据集发挥作用。

SVM的一些优点如下:凸优化方法的本质是保证最优性。该解决方案保证是全局最小值,而不是局部最小值

SVM是一种适用于线性和非线性可分离数据(使用核函数技巧)的算法。唯一要做的是找出正则化项C

SVM在低维和高维数据空间上工作良好。它能有效地对高维数据集工作,因为SVM中的训练数据集的复杂度通常由支持向量的数量而不是维度来表征。即使删除所有其他训练示例并重复训练,我们将获得相同的最佳分离超平面。

SVM可以在较小的训练数据集上工作,因为它们不依赖于整个数据。

SVM的缺点如下:它们不适合较大的数据集,因为在较大的数据集上使用SVM的训练时间可能很高,并且计算量更大。

它们在具有重叠类的嘈杂数据集上效率较低。

4、Python实现

4.1 加载需要用到的模块

import numpy as np

from sklearn import datasets

from sklearn.pipeline import Pipeline

from sklearn.svm import SVC

import seaborn as sns

import pandas as pd

from sklearn.model_selection import cross_val_score

from sklearn.grid_search import GridSearchCV

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

import matplotlib.pyplot as plt

4.2 初始化数据

从datasets数据集中加载iris数据,提取data中的两列作为特征值,提取target为分类值,并把特征值和分类值转换为pandas的DataFrame数据框,并合并到data中,重命名各特征为x1,x2和y。

找出x1和x2的最大值和最小值,生成满布坐标系的点,用于描绘超平面。

iris = datasets.load_iris()

X = iris['data'][:,[2,3]]

y = iris['target']

X = pd.DataFrame(X)

y = pd.DataFrame(y)

data = pd.merge(X,y,left_index=True,right_index=True,how='outer')

data.columns=['x1','x2','y']

h = 0.002

x_min, x_max = data.x1.min() - 0.2, data.x1.max() + 0.2

y_min, y_max = data.x2.min() - 0.2, data.x2.max() + 0.2

xx, yy = np.meshgrid(np.arange(x_min, x_max, h),

np.arange(y_min, y_max, h))

sns.scatterplot(data.x1, y=data.x2,hue=data.y)

X = data[['x1','x2']]

y = data.y

我们用seaborn的scatterplot把x1和x2用散点图描绘出来,如下图。

在这个图中我们看到有三个分类,接下来我们用SVM支持向量机为这些训练数据建立一个模型。

4.3 线性SVM模型

X_train,X_val,y_train,y_val = train_test_split(X,y,test_size=0.2) #80%和20%划分X和y

clf = SVC(C=0.1,kernel='linear')

clf.fit(X_train,y_train)

y_pre = clf.predict(X)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

sns.scatterplot(data.x1, y=data.x2,hue=y_pre)

plt.contourf(xx, yy, Z, cmap=plt.cm.ocean, alpha=0.2)

accuracy_score(data.y,y_pre)

用数据集合的80%作为训练集,建立一个C=0.1的线性SVM模型,并用data的所有x1和x2用这个SVM模型去预测y,预测的y和原来的y计算准确率。

accuracy_score(data.y,y_pre)

结果0.95333333333333337,即约95.33%的准确率,可以和上面第一个图进行精细对比是哪个点分类错了。

4.4 寻找最好的模型

我们通过网格搜索,寻找一个最好的模型。GridSearchCV可以配置一个参数列表(超参数)、模型,在这个超参数中自动寻找最好的模型。GridSearchCV已经自动按照cv=5把样本分成5等分进行训练和验证的了。

params = {'C':np.arange(0.1,1,0.1),'kernel':['linear', 'poly', 'rbf', 'sigmoid']}

gsearch = GridSearchCV(estimator = SVC(kernel='linear'),

param_grid = params, scoring='accuracy',iid=False, cv=5)

gsearch.fit(X,data.y)

gsearch.grid_scores_, gsearch.best_params_, gsearch.best_score_

结果如下:

自动寻找到上面的红色框的模型参数,准确率是96.67%。

从上表可以看出来核函数rbf的拟合比较好。那么我们再用GridSearchCV去变量rbf的degree看看能不能有进一步优化的空间。

params = {'C':np.arange(0.1,1,0.1),'degree':np.arange(1,5,1)}

gsearch = GridSearchCV(estimator = SVC(kernel='poly'),

param_grid = params, scoring='accuracy',iid=False, cv=5)

gsearch.fit(X,data.y)

gsearch.grid_scores_, gsearch.best_params_, gsearch.best_score_

最好的结果是:

{‘C’: 0.10000000000000001, ‘degree’: 2},

0.9666666666666668)

没有得到进一步优化。

接下来我们就用rbf核函数c=0.1去重新建立模型并看看可视化的效果。

4.5 最优模型

我们直接用全集去拟合这个c=0.1,核函数rbf的SVM模型。我们看看可视化的结果。

clf = SVC(C=0.2,kernel='rbf')

clf.fit(X,y)

y_pre = clf.predict(X)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

ax = sns.scatterplot(data.x1, y=data.x2,hue=y_pre)

ax.legend(loc="lower right")

plt.contourf(xx, yy, Z, cmap=plt.cm.ocean, alpha=0.2)

accuracy_score(data.y,y_pre)

准确率为0.96666666666666667,即96.67%

4.6 学习曲线

接下来我们就用这个模型看看样本的学习曲线

scores = []

for m in range(2,X_train.size):#循环2-79

clf.fit(X_train[:m],y_train[:m])

y_train_predict = clf.predict(X_train[:m])

y_val_predict = clf.predict(X_val)

scores.append(accuracy_score(y_train_predict,y_train[:m]))

plt.plot(range(2,X_train.size),scores,c='green', alpha=0.6)

可以看出来,样本引入50个后,模型的准确率已经稳定下来了。

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

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

相关文章

ajax保存乱码,Ajax 乱码详细

前面说了 Ajax 乱码的原因,以及解决乱码的示例,下面来个全面的分析。XMLHTTP 返回的数据默认的字符编码是 UTF-8,如果前台页面是 GB2312 或者其它编码数据就会产生乱码。POST 方法提交数据默认的字符编码是 UTF-8,如果后台是 GB23…

gin context和官方context_Go语言gin框架从入门到精通(3)

gin的渲染1 各种数据格式的响应json、结构体、XML、YAML类似于java的properties、ProtoBuf分别对所有数据格式举个列子func main() {r : gin.Default() ​//1. json响应r.GET("/someJSON", func(c *gin.Context) {c.JSON(200,gin.H{"message":"someJS…

JavaScript开发中几个常用知识点总结

最近在做项目的时候自己写了一些JavaScipt代码,于是自己又进行简单的查阅资料整理了一下,发现了如下几个比较有用的知识点: 1、三种声明函数的方式 2、jQuery $(document).ready() 与window.onload的区别 3、location.href 4、获取url中的参数…

cas .net 重定向循环_接口测试平台接入企业cas(一)

cas系统简介提供运营系统的 SSO 和 access control功能。类似百度的UC。CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。官方网站:https://www.apereo…

虚拟机安装rsync服务器配置,虚拟机安装rsync服务器配置

虚拟机安装rsync服务器配置 内容精选换一换在分布式HA部署场景下,ASCS主备节点通过共享盘实现数据同步。本章节指导用户将ASCS主节点的数据盘绑定给ASCS备节点并为ASCS主备节点绑定浮动IP。已在SAP ASCS主备节点之间进行过相互的SSH跳转操作。绑定共享盘创建浮动IP并…

程序包android.support.annotation不存在_efcore技巧贴也许有你不知道的使用技巧

前言.net 环境近些年也算是稳步发展。在开发的过程中,与数据库打交道是必不可少的。早期的开发者都是DbHelper一撸到底,到现在的各种各样的ORM框架大行其道。孰优孰劣谁也说不清楚,文无第一武无第二说的就是这个理。没有什么最好的&#xff0…

MySql数据库表类型MYISAM与InnoDB的区别

InnoDB与Myisam的六大区别 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 .frm文件存储表定义。 数据文件的扩展名为.MYD (MYData)。 索引文件的扩展名是.MYI…

centos系统云服务器,Centos系统怎么进云服务器

Centos系统怎么进云服务器 内容精选换一换CentOS 7.5版本操作系统的弹性云服务器默认关闭SELinux功能。通过/etc/selinux/config开启SELinux功能后,在输入密码时,会出现无法登录的问题。如果业务需要开启SELinux 功能,请参照本节内容进行配置…

applicationproperties不是小叶子_为何“砂糖桔”是带着叶子出售?原来其中有着“猫腻”,涨知识了...

大家好,我是你们的好朋友童童,生活中不止有眼前的苟且,还有诗和梦想。童童每天都给大家分享有趣实用的小知识,有什么意见或者建议都可以和童童交流,喜欢我们的可以关注呦。一起和童童来看看今天的小知识吧。随着春节的…

用android制作一个记事本app_用扁平化呈现一个天气APP

作为当下最火的设计风格之一,扁平化设计其实是一种简约的Ul 设计理念,现被广泛应用于图形用户界面上,在图形材料,例如海报,艺术作品,指导文档,各类出版物等方面尤为常用。今天为大家带来了我最近…

hbase hdfs外部表_硬核干货长文!Hbase来了解一下不?

本文公众号来源:互联网侦察 作者:channingbreeze最近我也在入门大数据相关的基础,这篇文章非常通俗易懂讲解了什么是Hbase,推荐阅读!等我学所成,我也来写写大数据相关的入门知识。今天,小史的…

springboot自动配置的原理_SpringBoot实战:详解SpringBoot自动配置原理

SpringBoot 自动配置主要通过 EnableAutoConfiguration, Conditional, EnableConfigurationProperties 或者 ConfigurationProperties 等几个注解来进行自动配置完成的。EnableAutoConfiguration 开启自动配置,主要作用就是调用 Spring-Core 包里的 loadFactoryName…

PYTHON之路(八)

http://www.cnblogs.com/alex3714/articles/5227251.htmlSocket语法及相关socket概念A network socket is an endpoint of a connection across a computer network. Today, most communication between computers is based on the Internet Protocol; therefore most network …

python索引例子_Python实现带下标索引的遍历操作示例

本文实例讲述了Python实现带下标索引的遍历操作。分享给大家供大家参考,具体如下: 代码如下: #codingutf-8 #python - 实现带下标索引的遍历. s…

kafka消息消费有延迟_RabbitMQ与Kafka的技术差异以及使用注意点

导言作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?”。基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别&#x…

android 通知_Android 全局消息通知框架实现(类似EventBus)

Github项目地址 https://github.com/532268948/MessageDemo一、介绍随着页面的增多,页面之间的信息交流也会越来越多,比如一个社交类app,你在个人中心修改了自己的个人信息,在动态展示页面你就要通知该页面有关于自己的动态需要更新自己展示在…

2019运管取消了滴滴还查吗_劳务资质2019年取消吗?劳务资质新标准你真的了解吗?...

施工劳务资质2019新标准!劳务资质已经取消?不可能!虽然这样对于很多企业来说应该比较省事,劳务资质也是越来越受欢迎的,但是企业在办理资质之前一定要将资质标准了解清楚了,新版施工劳务资质仅仅是将专业进…

FFmpeg获取DirectShow设备数据(摄像头,录屏)

这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘。本文所述的方法主要是对应Windows平台的。 1. 列设备 ffmpeg -list_devices true -f dshow -i dummy命令执行后输出的结果如下(注:中文的设备会出现乱码的情…

矩阵的对数运算公式_必修一——对数与对数运算

一、前言(废话)高中数学我们已经学习了二次函数,指数函数(如果不记得的读者可以往前面翻看一下),这次作者为读者们讲解的是对数与对数运算,对数是什么呢?读者们心里有自己的认知吗?二、对数对数函数是高中阶段学习的一…

分拣外观残缺的机器人_复合机器人AGV+协作机器人的应用领域

什么是复合机器人?复合型机器人是一种集成AGV移动机器人和通用工业机器人两项功能为一身的机器人。在工业领域,通用工业机器人被称为机械臂或者机械手,主要是替代人胳膊的抓取功能;而AGV移动机器人是替代人腿脚的行走功能。复合型机器人则是手脚并用&am…