skLearn 支持向量机
版权所有,转帖注明出处
章节
前面章节尝试了K均值聚类模型,准确率并不高。接下来我们尝试一种新方法:支持向量机(SVM)。
支持向量机
支持向量机(support vector machine/SVM),通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。本系列教程聚焦于SciKit-Learn 库的使用介绍,关于支持向量机详细原理,限于篇幅不再赘述,读者可参考相关资料。
如前所诉,K均值聚类模型是一种无监督学习模型,与此不同,支持向量机是一种有监督学习模型,是很常用的一种机器学习模型。
创建模型
下面的代码,创建了一个支持向量机模型。
import numpy as np
from sklearn import datasets
# 加载 `digits` 数据集
digits = datasets.load_digits()
# 导入 `train_test_split`
from sklearn.model_selection import train_test_split
# 数据分成训练集和测试集
# `test_size`:如果是浮点数,在0-1之间,表示测试子集占比;如果是整数的话就是测试子集的样本数量,`random_state`:是随机数的种子
X_train, X_test, y_train, y_test, images_train, images_test = train_test_split(digits.data, digits.target, digits.images, test_size=0.33, random_state=42)
# 导入“svm”模型
from sklearn import svm
# 创建SVC/Support Vector Classification/支持向量机分类器模型
svc_model = svm.SVC(gamma=0.001, C=100., kernel='linear')
# 将数据拟合到SVC模型中,此处用到了标签值y_train,是有监督学习
svc_model.fit(X_train, y_train)
可以看到,我们使用X_train
和y_train
数据来训练SVC模型(Support Vector Classification/支持向量机分类器模型),此处用到了标签值y_train
,是有监督学习。
另外,我们手动设置了gamma
的值,通过使用网格搜索和交叉验证等工具,可以自动找到合适的参数值。
测试模型
接下来,我们使用测试数据测试模型。
# 预测“X_test”标签
print(svc_model.predict(X_test))
# 打印' y_test '检查结果
print(y_test)
输出:
[6 9 3 7 2 1 5 2 5 2 1 4 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 9 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4 4 3 5 3 1 3 5 9 4 2 7
7 4 4 1 9 2 7 8 7 2 6 9 4 0 7 2 7 5 8 7 5 7 9 0 6 6 4 2 8 0 9 4 6 9 9 6 9
0 5 5 6 6 0 6 4 3 9 3 9 7 2 9 0 4 5 3 6 5 9 9 8 4 2 1 3 7 7 2 2 3 9 8 0 3
2 2 5 6 9 9 4 1 5 4 2 3 6 4 8 5 9 5 7 8 9 4 8 1 5 4 4 9 6 1 8 6 0 4 5 2 7
4 6 4 5 6 0 3 2 3 6 7 1 5 1 4 7 6 5 8 5 5 1 6 2 8 8 9 9 7 6 2 2 2 3 4 8 8
3 6 0 9 7 7 0 1 0 4 5 1 5 3 6 0 4 1 0 0 3 6 5 9 7 3 5 5 9 9 8 5 3 3 2 0 5
8 3 4 0 2 4 6 4 3 4 5 0 5 2 1 3 1 4 1 1 7 0 1 5 2 1 2 8 7 0 6 4 8 8 5 1 8
4 5 8 7 9 8 5 0 6 2 0 7 9 8 9 5 2 7 7 1 8 7 4 3 8 3 5 6 0 0 3 0 5 0 0 4 1
2 3 4 5 9 6 3 1 8 8 4 2 3 8 9 8 8 5 0 6 3 3 7 1 6 4 1 2 1 1 6 4 7 4 8 3 4
0 5 1 9 4 5 7 6 3 7 0 5 9 7 5 9 7 4 2 1 9 0 7 5 8 3 6 3 9 6 9 5 0 1 5 5 8
3 3 6 2 6 5 7 2 0 8 7 3 7 0 2 2 3 5 8 7 3 6 5 9 9 2 9 6 3 0 7 1 1 9 6 1 8
0 0 2 9 3 9 9 3 7 7 1 3 5 4 6 1 2 1 1 8 7 6 9 2 0 4 4 8 8 7 1 3 1 7 1 8 5
1 7 0 0 2 2 6 9 4 1 9 0 6 7 7 9 5 4 7 0 7 6 8 7 1 4 6 2 8 7 5 9 0 3 9 6 6
1 9 1 2 9 8 9 7 4 8 5 5 9 7 7 6 8 1 3 5 7 9 5 5 2 4 1 2 2 4 8 7 5 8 8 9 4
9 0]
[6 9 3 7 2 1 5 2 5 2 1 9 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 9 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4 4 3 5 3 1 3 5 9 4 2 7
7 4 4 1 9 2 7 8 7 2 6 9 4 0 7 2 7 5 8 7 5 7 7 0 6 6 4 2 8 0 9 4 6 9 9 6 9
0 3 5 6 6 0 6 4 3 9 3 9 7 2 9 0 4 5 3 6 5 9 9 8 4 2 1 3 7 7 2 2 3 9 8 0 3
2 2 5 6 9 9 4 1 5 4 2 3 6 4 8 5 9 5 7 8 9 4 8 1 5 4 4 9 6 1 8 6 0 4 5 2 7
4 6 4 5 6 0 3 2 3 6 7 1 5 1 4 7 6 8 8 5 5 1 6 2 8 8 9 9 7 6 2 2 2 3 4 8 8
3 6 0 9 7 7 0 1 0 4 5 1 5 3 6 0 4 1 0 0 3 6 5 9 7 3 5 5 9 9 8 5 3 3 2 0 5
8 3 4 0 2 4 6 4 3 4 5 0 5 2 1 3 1 4 1 1 7 0 1 5 2 1 2 8 7 0 6 4 8 8 5 1 8
4 5 8 7 9 8 5 0 6 2 0 7 9 8 9 5 2 7 7 1 8 7 4 3 8 3 5 6 0 0 3 0 5 0 0 4 1
2 8 4 5 9 6 3 1 8 8 4 2 3 8 9 8 8 5 0 6 3 3 7 1 6 4 1 2 1 1 6 4 7 4 8 3 4
0 5 1 9 4 5 7 6 3 7 0 5 9 7 5 9 7 4 2 1 9 0 7 5 3 3 6 3 9 6 9 5 0 1 5 5 8
3 3 6 2 6 5 5 2 0 8 7 3 7 0 2 2 3 5 8 7 3 6 5 9 9 2 5 6 3 0 7 1 1 9 6 1 1
0 0 2 9 3 9 9 3 7 7 1 3 5 4 6 1 2 1 1 8 7 6 9 2 0 4 4 8 8 7 1 3 1 7 1 9 5
1 7 0 0 2 2 6 9 4 1 9 0 6 7 7 9 5 4 7 0 7 6 8 7 1 4 6 2 8 7 5 9 0 3 9 6 6
1 9 8 2 9 8 9 7 4 8 5 5 9 7 7 6 8 1 3 5 7 9 5 5 2 1 1 2 2 4 8 7 5 8 8 9 4
9 0]
我们也可以使用matplotlib可视化测试数据及其预测标签:
# 导入 matplotlib
import matplotlib.pyplot as plt
# 将预测值赋给 `predicted`
predicted = svc_model.predict(X_test)
# 将images_test和images_prediction中的预测值压缩在一起
images_and_predictions = list(zip(images_test, predicted))
# 对于images_and_prediction中的前四个元素
for index, (image, prediction) in enumerate(images_and_predictions[:4]):
# 在坐标i+1处初始化一个1×4的网格中的子图
plt.subplot(1, 4, index + 1)
# 不显示坐标轴
plt.axis('off')
# 在网格中的所有子图中显示图像
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
# 添加标题
plt.title('Predicted: ' + str(prediction))
# 显示图形
plt.show()
显示:
可以看到显示的这几张图形,预测的标签都是正确的。
评估模型
最后,我们来评估一下模型的性能,看看它准确率怎么样。
# 导入 `metrics`
from sklearn import metrics
# 打印的分类报告 `y_test` 与 `predicted`
print(metrics.classification_report(y_test, predicted))
# 打印“y_test”和“predicted”的混淆矩阵
print(metrics.confusion_matrix(y_test, predicted))
输出:
precision recall f1-score support
0 1.00 1.00 1.00 55
1 0.98 0.96 0.97 55
2 1.00 1.00 1.00 52
3 0.98 0.96 0.97 56
4 0.97 1.00 0.98 64
5 0.97 0.97 0.97 73
6 1.00 1.00 1.00 57
7 0.98 0.98 0.98 62
8 0.94 0.94 0.94 52
9 0.97 0.97 0.97 68
accuracy 0.98 594
macro avg 0.98 0.98 0.98 594
weighted avg 0.98 0.98 0.98 594
[[55 0 0 0 0 0 0 0 0 0]
[ 0 53 0 0 1 0 0 0 1 0]
[ 0 0 52 0 0 0 0 0 0 0]
[ 0 0 0 54 0 1 0 0 1 0]
[ 0 0 0 0 64 0 0 0 0 0]
[ 0 0 0 0 0 71 0 1 0 1]
[ 0 0 0 0 0 0 57 0 0 0]
[ 0 0 0 0 0 0 0 61 0 1]
[ 0 1 0 1 0 1 0 0 49 0]
[ 0 0 0 0 1 0 0 0 1 66]]
可以看到,这个模型比前面章节的K均值聚类模型,效果要好得多。
我们再看一下预测标签与实际标签的散点图。
# 导入 `Isomap()`
from sklearn.manifold import Isomap
# 创建一个isomap,并将“digits”数据放入其中
X_iso = Isomap(n_neighbors=10).fit_transform(X_train)
# 计算聚类中心并预测每个样本的聚类指数
predicted = svc_model.predict(X_train)
# 在1X2的网格中创建带有子图的图
fig, ax = plt.subplots(1, 2, figsize=(8, 4))
# 调整布局
fig.subplots_adjust(top=0.85)
# 将散点图添加到子图中
ax[0].scatter(X_iso[:, 0], X_iso[:, 1], c=predicted)
ax[0].set_title('Predicted labels')
ax[1].scatter(X_iso[:, 0], X_iso[:, 1], c=y_train)
ax[1].set_title('Actual Labels')
# 加标题
fig.suptitle('Predicted versus actual labels', fontsize=14, fontweight='bold')
# 显示图形
plt.show()
显示
从图中可以看出,模型的预测结果与实际结果匹配度非常好,模型的准确率很高。
参数值
前面在创建模型时,手动设置了gamma
等参数的值,通过使用网格搜索和交叉验证等工具,可以自动找到合适的参数值。
尽管这不是本篇教程的重点,本节内容演示如何使用网格搜索和交叉验证等工具,自动找到合适的参数值。
import numpy as np
from sklearn import datasets
# 加载 `digits` 数据集
digits = datasets.load_digits()
# 导入 `train_test_split`
from sklearn.model_selection import train_test_split
# 将 `digits` 数据分成两个相等数量的集合
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.5, random_state=0)
# 导入“svm”模型
from sklearn import svm
# 导入 GridSearchCV
from sklearn.grid_search import GridSearchCV
# 设置参数候选项
parameter_candidates = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
# 使用参数候选项创建分类器
clf = GridSearchCV(estimator=svm.SVC(), param_grid=parameter_candidates, n_jobs=-1)
# 根据训练数据训练分类器
clf.fit(X_train, y_train)
# 打印结果
print('训练数据的最佳得分:', clf.best_score_)
print('最佳惩罚参数C:',clf.best_estimator_.C)
print('最佳内核类型:',clf.best_estimator_.kernel)
print('最佳gamma值:',clf.best_estimator_.gamma)
# 将分类器应用到测试数据上,查看准确率得分
clf.score(X_test, y_test)
# 用网格搜索参数训练一个新的分类器,评估得分
score = svm.SVC(C=10, kernel='rbf', gamma=0.001).fit(X_train, y_train).score(X_test, y_test)
print(score)
输出
训练数据的最佳得分: 0.9844097995545658
最佳惩罚参数C: 10
最佳内核类型: rbf
最佳gamma值: 0.001
0.9911012235817576
可以看到,我们获取到了合适的参数。
skLearn 支持向量机的更多相关文章
- sklearn—支持向量机
SVC介绍: 拟合出来的模型为一个超平面 解决与样本维数无关,适合做文本分类 解决小样本.非线性.高维 是用于分类.回归.孤立点检测的监督学习方法的集合. 优点: 有效的高维空间 维数大于样本数的时候 ...
- 支持向量机SVM原理_python sklearn建模乳腺癌细胞分类器(推荐AAA)
项目合作联系QQ:231469242 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?cours ...
- 机器学习之支持向量机原理和sklearn实践
1. 场景描述 问题:如何对对下图的线性可分数据集和线性不可分数据集进行分类? 思路: (1)对线性可分数据集找到最优分割超平面 (2)将线性不可分数据集通过某种方法转换为线性可分数据集 下面将带着这 ...
- Python数模笔记-Sklearn(5)支持向量机
支持向量机(Support vector machine, SVM)是一种二分类模型,是按有监督学习方式对数据进行二元分类的广义线性分类器. 支持向量机经常应用于模式识别问题,如人像识别.文本分类.手 ...
- sklearn集成支持向量机svm.SVC参数说明
经常用到sklearn中的SVC函数,这里把文档中的参数翻译了一些,以备不时之需. 本身这个函数也是基于libsvm实现的,所以在参数设置上有很多相似的地方.(PS: libsvm中的二次规划问题的解 ...
- 支持向量机SVM知识梳理和在sklearn库中的应用
SVM发展史 线性SVM=线性分类器+最大间隔 间隔(margin):边界的活动范围.The margin of a linear classifier is defined as the width ...
- 支持向量机(SVM)复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略 ...
- scikit-learn 支持向量机算法库使用小结
之前通过一个系列对支持向量机(以下简称SVM)算法的原理做了一个总结,本文从实践的角度对scikit-learn SVM算法库的使用做一个小结.scikit-learn SVM算法库封装了libsvm ...
- sklearn分类
近期的事务与sklearn有关,且主要用到了分类.在此做一点笔记 进行分类大概涉及三个知识点: 一. 分类器 二.特征选择 三.模型选择 一.分类器(Classification) 实例一:plot_ ...
随机推荐
- CSS如何实现三列布局?如果两端固定、中间是自适应又该如何做?
使用浮动布局来实现 左侧元素与右侧元素优先渲染,分别向左和向右浮动 中间元素在文档流的最后渲染,并将 width 设为 100%,则会自动压到左右两个浮动元素的下面,随后在中间元素中再添加一个div元 ...
- jqGrid 复选框实现单选
参考:https://blog.csdn.net/java0311/article/details/45575517
- eclipse中maven web项目部署时缺少classes文件或者resources文件
写这篇博客的原因 问题描述 昨天发现eclipse中maven web项目部署时缺少classes文件或者resources文件 本来以为是很常见的原因, 依次检查"Java Build P ...
- springCloud 之 Eureka服务治理机制及代码运行
服务提供者 服务注册: 服务提供者在启动的时候通过发送Rest请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息.Eureka Server在收到这个请求后,将元数 ...
- 基于vue-router的移动端网页的路由管理
本篇代码示例:github 前提:不关注移动端浏览器的前进事件 涵盖功能: 1,管理路由的历史记录 2,切页动画的实现 3,处理流程类页面的回退事件 描述: 流程类页面的回退事件的解释: 以注册 ...
- Metasploit学习笔记——客户端渗透攻击
1.浏览器渗透攻击实例——MS11-050安全漏洞 示例代码如下 msf > use windows/browser/ms11_050_mshtml_cobjectelement msf exp ...
- Day4 - M - Roads in Berland CodeForces - 25C
There are n cities numbered from 1 to n in Berland. Some of them are connected by two-way roads. Eac ...
- Jdk8中Stream流的使用,让你脱离for循环
学习要求: 知道一点儿函数式接口和Lambda表达式的基础知识,有利于更好的学习. 1.先体验一下Stream的好处 需求:给你一个ArrayList用来保存学生的成绩,让你打印出其中大于60的成绩. ...
- 013.CI4框架CodeIgniter数据库操作之:查询数据库,并让数据以数组的方式返回查询结果
01. 我们在CI4框架中的Model文件夹新建一个User_model.php的文件,使用的是getResultArray,表示并让数据以数组的方式返回查询结果,代码如下: <?php nam ...
- 关于torchvision.models中VGG的笔记
VGG 主要有两种结构,分别是 VGG16 和 VGG19,两者并没有本质上的区别,只是网络深度不一样. 对于给定的感受野,采用堆积的小卷积核是优于采用大的卷积核的,因为多层非线性层可以增加网络深度来 ...