机器学习之支持向量机(SVM)

支持向量机(SVM)

  1. 基本概念:

    SVM(Support Vector Machine)是一种强大的监督学习算法 ,主要用于分类任务和回归任务。

    • 分类任务:model = SVC()
    • 回归任务:model = SVR()
  2. 核心思想【重点!】:间隔最大化

    • 通俗理解 :在特征空间中找到一个最优超平面(理解为:分界线),将不同类别的数据点分开,并使两类中最近的样本点到超平面的距离尽可能大。

    • 什么是间隔 :分类超平面(理解为:分界线)到两类数据中最近点的距离之和,代表分类的"安全距离"。

      • 硬间隔:要求所有数据必须分对,容易过拟合(现实中基本不存在)。
      • 软间隔 :允许一些数据点分错,通过 C 参数来控制惩罚力度(C越大,越接近硬间隔;C越小,容错率越高)。
    • 为什么要最大化 :间隔越大,模型对新数据的容错空间就越大,误分类风险越低,模型的泛化能力(在测试集上的表现)就越强。

    • 如何实现:转化为凸优化问题,通过拉格朗日乘数法求解。

  3. 支持向量(概念理解):训练数据中里决策边界最近的那些数据点。

    SVM只需靠这些关键点即可确定整个分类模型,其他远离边界的点对模型没有影响,因此称该算法为:支持向量机。

  4. 核函数(概念理解) :主要用于让 SVM 处理非线性问题 【线性核是特例,用于线性问题】。

    深入理解:核函数让 SVM 隐式地在高维特征空间做线性分类,从而处理原始空间中的非线性问题。

    • 工作原理:核技巧

      指的是核函数不需要显式地将数据映射到高维空间,而是直接计算高维空间中的内积。

    • 主要分类:

      核函数 对应SVC参数 讲解
      线性核 kernel='linear' 适用于线性可分数据,计算速度快, 适合高维数据和大规模数据集
      RBF核(高斯核) kernel='rbf' 最常用的非线性核函数
      多项式核 kernel='poly' 适合处理具有多项式关系的数据 可以通过degree参数控制多项式的阶数
  5. SVM的模型参数:

    对应的代码:model = SVC(C=...,kernel=...,gamma=...)

    参数 作用 调参要点
    C 惩罚系数,控制对误分类的容忍度 C 越大:误分类惩罚越重,间隔越窄,易过拟合;C 越小:容忍误分类,间隔越宽,易欠拟合
    kernel 核函数,决定决策边界的形态 linear:线性;rbf:最常用非线性;poly:多项式。通常先选 kernel
    gamma RBF/多项式核系数,控制单样本影响范围 gamma 越大:影响范围小,边界复杂,易过拟合;gamma 越小:影响范围大,边界平滑,易欠拟合 默认为gamma='scale',一般不需要写该参数。
  6. 案例:手写数字识别

    第一步:网格搜索 + 交叉验证(确定参数)

    采用网格搜索调参 :利用GridSearchCV 系统搜索最佳参数组合。

    python 复制代码
    from sklearn.datasets import load_digits
    from sklearn.model_selection import train_test_split
    from sklearn.model_selection import GridSearchCV
    from sklearn.svm import SVC
    from sklearn.pipeline import Pipeline
    
    # 准备数据
    digits = load_digits()
    x = digits.data
    y = digits.target
    
    # 划分数据集和测试集
    x_train,x_test,y_train,y_test = train_test_split(
        x,y,test_size=0.2,random_state=42
    )
    
    # 数据标准化【必需!!】
    from sklearn.preprocessing import StandardScaler
    # 把标准化和SVM模型打包在一起(Pipe会将x_test和x_train自动标准化)
    # 使用pipe管道,放置数据泄露
    pipe = Pipeline([
        ('scaler', StandardScaler()),  # 第一步:标准化
        ('svc', SVC())                 # 第二步:SVM分类器
    ])
    
    # 定义参数网格
    param_grid = {
        'svc__C': [0.1, 1, 10, 100],
        'svc__kernel': ['linear', 'rbf', 'poly'],
        'svc__gamma': [0.001, 0.01, 0.1, 1, 'auto']
    }
    
    # 用 GridSearchCV 自动交叉验证找最佳参数
    grid = GridSearchCV(
        estimator=pipe,
        param_grid=param_grid,
        cv=5,                 # 5折交叉验证
        scoring='accuracy',   # 分类用准确率
        n_jobs=-1,            # 并行
    )
    
    # 执行网格搜索
    grid.fit(x_train,y_train)
    
    #输出最佳参数
    print(f"最佳参数:{grid.best_params_}")
    print(f"最佳交叉验证得分:{grid.best_score_:.4f}")
    print(f"测试集准确率:{grid.score(x_test, y_test):.4f}")
    ------------------------------------------------------------------------------------
    最佳参数:{'svc__C': 100, 'svc__gamma': 0.01, 'svc__kernel': 'rbf'}
    最佳交叉验证得分:0.9812
    测试集准确率:0.9806
    ------------------------------------------------------------------------------------

    第二步:模型构建与应用

    python 复制代码
    from sklearn.datasets import load_digits
    from sklearn.model_selection import train_test_split
    from sklearn.svm import SVC
    from sklearn.metrics import accuracy_score
    
    # 准备数据
    digits = load_digits()
    x = digits.data
    y = digits.target
    
    # 划分数据集和测试集
    x_train,x_test,y_train,y_test = train_test_split(
        x,y,test_size=0.2,random_state=42
    )
    
    # 数据标准化【必需!!】
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    x_train_scaler = scaler.fit_transform(x_train)
    x_test_scaler = scaler.transform(x_test)
    
    # 模型
    model = SVC(
        C=100,
        gamma=0.01,
        kernel = 'rbf'
    )
    
    # 模型训练
    model.fit(x_train_scaler,y_train)
    
    # 计算指标
    y_pred = model.predict(x_test_scaler)
    accuracy = accuracy_score(y_test,y_pred)
    print(f"准确率:{accuracy:.4f}")
    ---------------------------------------------------------------
    准确率:0.9806
    ---------------------------------------------------------------
  7. SVM vs 其他算法

    对比算法 SVM 的特点 其他算法特点 选择建议
    SVM vs 逻辑回归 更适合高维数据,通过间隔最大化提高泛化能力 逻辑回归:训练速度快,输出概率值,模型可解释性强 特征数远大于样本数时选 SVM;需要概率输出时选逻辑回归
    SVM vs 决策树 对噪声鲁棒(健壮、抗干扰能力强),不易过拟合,但难以解释 决策树:直观易懂,可以处理非线性关系,但容易过拟合 需要模型可解释性时选决策树;追求性能时选 SVM
    SVM vs 神经网络 小样本情况下表现好,无需大量调参 神经网络:可以自动学习特征,适合超大规模数据 小规模项目选 SVM;大规模复杂任务选神经网络
相关推荐
Fnetlink11 小时前
2026年安全组网供应商怎么选,SDWAN从可选项变成必选项
人工智能
田里的水稻1 小时前
IL_策略训练---CNN/1D神经网络种类三
人工智能·神经网络·机器学习·cnn·机器人·迁移学习
Omics Pro1 小时前
强生:以机理为中心!虚拟细胞世界模型
数据库·人工智能·python·深度学习·算法·机器学习·自然语言处理
高升说1 小时前
多路相机带宽与存储怎么算?从单路码率到盘位规划的完整链路
人工智能·数码相机
全栈道1 小时前
AI 时代,软件开发应该如何学习
人工智能·学习
YOLO数据集集合1 小时前
遥感滑坡图像识别数据集 | 滑坡识别 遥感影像 语义分割 灾害监测 无人机航拍 目标检测 深度学习数据集 计算机视觉9172期
人工智能·yolo·目标检测·计算机视觉·无人机·滑坡
czq_26867194871 小时前
Python打卡第34天
开发语言·python·机器学习
FPGA信号处理1 小时前
【凸优化】第一节课(下):保凸运算、分离超平面与 Farkas 引理
人工智能·算法·机器学习
stsdddd2 小时前
v11扑克牌数字检测数据集8992张实测:标注质量与划分比例一览
人工智能·计算机视觉·目标跟踪