【scikit-learn基础】--『监督学习』之 支持向量机分类
支持向量机也是一种既可以处理分类问题,也可以处理回归问题的算法。
关于支持向量机在回归问题上的应用,请参考:TODO
支持向量机分类广泛应用于图像识别、文本分类、生物信息学(例如基因分类)、手写数字识别等领域。
1. 算法概述
支持向量机的主要思想是找到一个超平面,将不同类别的样本最大化地分隔开。
超平面的位置由支持向量决定,它们是离分隔边界最近的数据点。
对于二分类问题,SVM寻找一个超平面,使得正例和支持向量到超平面的距离之和等于反例和支持向量到超平面的距离之和。
如果这个等式不成立,SVM将寻找一个更远离等式中不利样本的超平面。
下面的示例,演示了支持向量机分类算法在图像识别上的应用。
2. 创建样本数据
这次的样本使用的是scikit-learn自带的手写数字数据集。
import matplotlib.pyplot as plt
from sklearn import datasets
# 加载手写数据集
data = datasets.load_digits()
_, axes = plt.subplots(nrows=2, ncols=4, figsize=(10, 6))
for ax, image, label in zip(np.append(axes[0], axes[1]), data.images, data.target):
ax.set_axis_off()
ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
ax.set_title("目标值: {}".format(label))

这里显示了其中的几个手写数字,这个数据集总共有大约1700多个手写数字。
3. 模型训练
样本数据中,手写数字的图片存储为一个 8x8 的二维数组。
比如:
data.images[0]
# 运行结果
array([[ 0., 0., 5., 13., 9., 1., 0., 0.],
[ 0., 0., 13., 15., 10., 15., 5., 0.],
[ 0., 3., 15., 2., 0., 11., 8., 0.],
[ 0., 4., 12., 0., 0., 8., 8., 0.],
[ 0., 5., 8., 0., 0., 9., 8., 0.],
[ 0., 4., 11., 0., 1., 12., 7., 0.],
[ 0., 2., 14., 5., 10., 12., 0., 0.],
[ 0., 0., 6., 13., 10., 0., 0., 0.]])
所以,在分割训练集和测试集之前,我们需要先将手写数字的的存储格式从 8x8 的二维数组转换为 64x1 的一维数组。
from sklearn.model_selection import train_test_split
n_samples = len(data.images)
X = data.images.reshape((n_samples, -1))
y = data.target
# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)
按照9:1的比例来划分训练集和测试集。
然后用scikit-learn中的SVC模型来训练样本:
from sklearn.svm import SVC
# 定义
reg = SVC()
# 训练模型
reg.fit(X_train, y_train)
模型的训练效果:
# 在测试集上进行预测
y_pred = reg.predict(X_test)
correct_pred = np.sum(y_pred == y_test)
print("预测正确率:{:.2f}%".format(correct_pred / len(y_pred) * 100))
# 运行效果
预测正确率:98.89%
正确率非常高,下面我们看看没识别出来的手写数字是哪些。
wrong_pred = []
for i in range(len(y_pred)):
if y_pred[i] != y_test[i]:
wrong_pred.append(i)
print(wrong_pred)
# 运行效果
[156, 158]
在测试集中,只有两个手写数字识别错了。
我面看看识别错的2个手写数字是什么样的:
_, axes = plt.subplots(nrows=1, ncols=2, figsize=(8, 3))
for i in range(2):
idx = wrong_pred[i]
image = X_test[idx].reshape(8, 8)
axes[i].set_axis_off()
axes[i].imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
axes[i].set_title("预测值({}) 目标值({})".format(y_pred[idx], y_test[idx]))

可以看出,即使人眼去识别,这两个手写数字也不太容易识别。
4. 总结
支持向量机分类算法的优势有:
- 有效处理高维数据:对高维数据非常有效,即使在数据维度超过样本数量的情况下也能工作得很好。
- 高效:只使用一部分训练数据(即支持向量)来做决策,这使得算法更加内存高效。
- 稳定性较好:由于其决策边界取决于支持向量而不是所有的数据点,因此模型的稳定性较好,对噪声和异常值的敏感度较低。
它的劣势主要有:
- 对参数和核函数敏感:性能高度依赖于参数设置(如惩罚参数C和核函数的选择)。如果参数选择不当,可能会导致过拟合或欠拟合。
- 难以解释:不像决策树那样直观,难以理解和解释。
- 处理大规模数据时速度较慢:训练过程涉及到二次规划问题,需要使用复杂的优化算法,因此在处理大规模数据时可能较慢。
【scikit-learn基础】--『监督学习』之 支持向量机分类的更多相关文章
- Python基础『一』
内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...
- Python基础『二』
目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...
- 『cs231n』计算机视觉基础
线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...
- Python机器学习(基础篇---监督学习(支持向量机))
支持向量机(分类) 支持向量机分类器根据训练样本的分布,搜索所有可能的线性分类器中最佳的那个.我们会发现决定其直线位置的样本并不是所有训练数据,而是其中的两个空间间隔最小的两个不同类别的数据点,而我们 ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- 『TensorFlow』专题汇总
TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...
- 『TensorFlow』批处理类
『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...
- 『TensorFlow』梯度优化相关
tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...
- 『TensorFlow』模型保存和载入方法汇总
『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...
随机推荐
- 探索Redis与MySQL的双写问题
本文已收录至GitHub,推荐阅读 Java随想录 微信公众号:Java随想录 原创不易,注重版权.转载请注明原作者和原文链接 目录 双写一致问题 缓存读写策略 Cache-Aside Pattern ...
- XCODE9.1的一些新问题
自从XCODE7苹果就允许用免费的开发者账号进行真机测试了,但是还是有很多限制的. 在用的过程中发现限制如下: 1.只能生成*.app文件,不能打包成ipa.官方这么说的,但是奇诡的是,我archiv ...
- 虹科干货|Redis企业版数据库为企业「数据安全」叠加最强Buff!
"这是一场可预见的噩梦!" 近期,黑客通过攻击亚洲最大两家数据中心-万国数据和新科电信媒体,获取国际巨头企业的登录凭证,引发了2000多家企业史诗级数据泄露.中国作为全球第二大托管 ...
- 针对Jupter Kernel error的问题解决
首先打开Anaconda Prompt 输入jupyter kernelspec list查看安装的内核和位置 到显示的的目录下面找到 kernel.josn这个文件 修改为现在的python环境路径 ...
- Production Environment Difference Between Development, Stage, And Production
There are three different environments that you'll probably deal with at some point. Each environmen ...
- Ansible自动化部署工具-组件及语法介绍
大家好,我是蓝胖子,我认为自动化运维要做的事情就是把运维过程中的某些步骤流程化,代码化,这样在以后执行类似的操作的时候就可以解放双手了,让程序自动完成.避免出错,Ansible就是这方面非常好用的工具 ...
- L2-030 冰岛人
需要注意的地方: 我们只记录维京人的祖先,除了维京人的其他人不能记录它的祖先 #include <bits/stdc++.h> using namespace std; struct pe ...
- 新手VSCode配置C++20
最近买了本C++20的书,想要自己配置下在VScode的环境 例子代码: #include <iostream> #include <format> int main() { ...
- 主数据管理系统(MDM)集成方案
在当今社会,数据已成为企业发展的宝贵财富.然而,大多数企业面临着数据散落在多个系统中.无法互相印证和共享的问题,导致数据使用效率低下.为解决这个问题,目前有两种典型途径:建设公司级系统或建立数据共享平 ...
- 用友NCC&WMS&泛微 系统对接案例分享
用户故事 产品版本:NCC2105 故事是这么开始的,用友全国伙伴社区的社区成员,对我们的多系统集成架构很感兴趣,经常跟我讨论相关系统集成层面的问题:随着企业的发展,由于信息产业的技术含量高,信息系统 ...