码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【scikit-learn基础】--『监督学习』之 支持向量机分类


    合集 - scikit-learn基础(35)
    1.【scikit-learn基础】--概述2023-12-022.【scikit-learn基础】--『数据加载』之玩具数据集2023-12-043.【scikit-learn基础】--『数据加载』之真实数据集2023-12-064.【scikit-learn基础】--『数据加载』之样本生成器2023-12-085.【scikit-learn基础】--『数据加载』之外部数据集2023-12-096.【scikit-learn基础】--『预处理』之 标准化2023-12-137.【scikit-learn基础】--『预处理』之 数据缩放2023-12-158.【scikit-learn基础】--『预处理』之 正则化2023-12-189.【scikit-learn基础】--『预处理』之 分类编码2023-12-2010.【scikit-learn基础】--『预处理』之 离散化2023-12-2111.【scikit-learn基础】--『预处理』之 缺失值处理2023-12-2212.【scikit-learn基础】--『监督学习』之 线性回归2023-12-2513.【scikit-learn基础】--『监督学习』之 岭回归2023-12-2614.【scikit-learn基础】--『监督学习』之 LASSO回归2023-12-2815.【scikit-learn基础】--『监督学习』之 支持向量机回归2023-12-3116.【scikit-learn基础】--『监督学习』之 决策树回归01-0217.【scikit-learn基础】--『监督学习』之 随机森林回归01-0318.【scikit-learn基础】--『监督学习』之 K-近邻分类01-0419.【scikit-learn基础】--『监督学习』之 逻辑回归分类01-0520.【scikit-learn基础】--『监督学习』之 贝叶斯分类01-0821.【scikit-learn基础】--『监督学习』之 决策树分类01-0922.【scikit-learn基础】--『监督学习』之 随机森林分类01-10
    23.【scikit-learn基础】--『监督学习』之 支持向量机分类01-12
    24.【scikit-learn基础】--『监督学习』之 均值聚类01-1425.【scikit-learn基础】--『监督学习』之 层次聚类01-1526.【scikit-learn基础】--『监督学习』之 谱聚类01-1827.【scikit-learn基础】--『监督学习』之 空间聚类01-2028.【scikit-learn基础】--『回归模型评估』之误差分析01-2229.【scikit-learn基础】--『回归模型评估』之偏差分析01-2430.【scikit-learn基础】--『回归模型评估』之可视化评估01-2631.【scikit-learn基础】--『回归模型评估』之准确率分析01-2832.【scikit-learn基础】--『回归模型评估』之损失分析01-3033.【scikit-learn基础】--『分类模型评估』之系数分析01-3134.【scikit-learn基础】--『分类模型评估』之评估报告02-0435.【scikit-learn基础】--模型持久化02-08
    收起

    支持向量机也是一种既可以处理分类问题,也可以处理回归问题的算法。
    关于支持向量机在回归问题上的应用,请参考: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))
    

    image.png
    这里显示了其中的几个手写数字,这个数据集总共有大约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]))
    

    image.png
    可以看出,即使人眼去识别,这两个手写数字也不太容易识别。

    4. 总结

    支持向量机分类算法的优势有:

    1. 有效处理高维数据:对高维数据非常有效,即使在数据维度超过样本数量的情况下也能工作得很好。
    2. 高效:只使用一部分训练数据(即支持向量)来做决策,这使得算法更加内存高效。
    3. 稳定性较好:由于其决策边界取决于支持向量而不是所有的数据点,因此模型的稳定性较好,对噪声和异常值的敏感度较低。

    它的劣势主要有:

    1. 对参数和核函数敏感:性能高度依赖于参数设置(如惩罚参数C和核函数的选择)。如果参数选择不当,可能会导致过拟合或欠拟合。
    2. 难以解释:不像决策树那样直观,难以理解和解释。
    3. 处理大规模数据时速度较慢:训练过程涉及到二次规划问题,需要使用复杂的优化算法,因此在处理大规模数据时可能较慢。
  • 相关阅读:
    降低城市内涝风险,万宾科技内涝积水监测仪的作用
    华为机试真题 C++ 实现【过滤组合字符串】【2022.11 Q4新题】
    LVGL---使用物理按键代替触摸(groups)
    如何对服务端进行性能测试
    【复杂网络】网络科学导论学习笔记-第四章度相关性和社团结构
    信号与线性系统分析(吴大正,郭宝龙)(5-系统定义与典型系统)
    k3s安装
    oracle主键自增
    如何在 Rocky Linux 上安装 Apache Kafka?
    构建外部模块(Building External Modules)
  • 原文地址:https://www.cnblogs.com/wang_yb/p/17960147
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号