svm模型(支持向量机)
svm模型(支持向量机)
1、svm定义
支持向量机(Support Vector Machine, SVM)是一种经典的监督学习算法,用来处理二分类与多分类问题,其基本模型是定义在特征空间上的间隔最大的线性分类器。SVM还包括核技巧,使其成为实质上的非线性分类器。SVM的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题。
2、基本原理
SVM对数据特别敏感
数据的三种情况
- 线性可分情况:对于线性可分的数据,SVM的目标是找到一个超平面(即决策边界),使得两个类别的数据点到这个超平面的最小距离(即间隔)最大化。这个超平面可以用方程 w⋅x+b=0 表示。支持向量是离超平面最近的那些点,它们决定了超平面的位置。
- 线性不可分情况:引入松弛变量(slack variables)和惩罚参数C,允许一些样本分类错误,从而转化为软间隔支持向量机。
- 非线性情况:通过 **核函数 **将原始特征映射到高维特征空间,使得在 **高维空间 **中线性可分。
支持向量:代表的是在分类的过程当中样本点数据落在决策边界上的就是支持向量数据,以支持向量作为划分的依据将两类数据分开,分的结果的好坏由评估指标(混淆矩阵)来决定
当样本点落在 正负样本(kx + b =1 | kx + b = -1 ) 的 决策边界(kx + b = 0 ) 上,则代表分类结束。
核函数的作用:是一系列的函数的统称,将低维数据转换到高维数据,使用超平面分开两类数据。
- 高斯核/径向基核(RBF):适用于非线性可分数据
- sigmoid核->(性能差,一般不考虑)
- 线性核(linear):适用于线性可分数据
- 多项式核(poly)
核函数选择流程:
1】初步判断数据特性
1)可视化数据分布,观测是否线性可分。
2)计算特征间的交互关系(如相关系数)。
2】尝试线性核
1)若线性和效果足够好(如准确率>90%),优先使用。
2)若效果差,转用RBF 或 多项式核。
3】复杂数据选择 RBF 核
1)RBF是默认推荐核函数,尤其当数据非线性且无先验知识时
2)调整γγ(伽马)
①小γγ → 决策边界平滑(欠拟合)
②大γγ → 决策边界复杂(过拟合)
RBF核参数

4】特定场景使用多项式核
1)当数据具有显示多项式关系时(如y = x12 + x22y = x12 + x22)
2)选择较低的 dd(如 2 或 3),避免过拟合。
5】调参优化
1)使用网格搜索 (GridSearchCV) 联合优化 CC 和核参数(如γγ 或 dd )。
2)注意标准化数据(RBF和多项式对特征尺度敏感)。
SVM与Logistic的对比
回归、分类问题,**SVM **都可以实现,但是 Logistic回归 (广义上也被称之为线性回归) 只能用于分类问题
一个模型的复杂度依旧通过大C控制,只不过多了一个 伽马 γ 参数,用来控制范围,以防模型发生过拟合或者欠拟合,模型的拟合能力
3、SVM当中的重要参数
"""
:probability -> bool
False(默认) : 代表计算多分类问题,没有计算模型的概率值
True : 计算二分类问题
:degree : 3
幂次项,默认为3
:C 正则化惩罚力度
正常取值,参数大,惩罚重;参数小,惩罚小;与逻辑回归刚好相反
:kernel 参数介绍
rbf : 高斯核/径向基核(RBF):适用于非线性可分数据(也称为:万能核)
sigmoid
linear
poly
:gamma --> 也跟复杂度有关,参数越小,数据越密集;参数越大,数据越稀疏。
scale 自适应
float [ 0.01 ~ 10 ]
"""
4、sklearm导入svm
from sklearn.svm import SVC ---> 常用
# SVC 支持2分类 / 分类模型 -- > 离散型
------------------ 了解即可 ---------------------
from sklearn.svm import SVR # SVR 回归模型 --> 连续性
from sklearn.svm import LinearSVC # 线性分类 | 线性可分
from sklearn.svm import LinearSVR # 线性回归
示例代码
import numpy as np
from sklearn.model_selection import train_test_split, learning_curve
from sklearn.svm import SVC # ---> 常用
# 正常情况需要寻找最优参数来实例模型
svm = SVC(
C=1.0, # 正则化惩罚力度(正常取值,参数大,惩罚重;参数小,惩罚小),与逻辑回归刚好相反
kernel='rbf', # 核函数
degree=3 ,# 幂次项 默认3
gamma= 'scale', # (gamma) 和 (kernel) 一起配合使用,gamma用来控制数据的分布范围。是稀疏还是密集
# gamma 参数设置的越大越稀疏
)
# --- 以sklearn中的鸢尾花数据集测试
# 测试原因,数据处理流程有点草率,sklearn中的数据集也是比较干净。
data = load_iris()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y) # 将数据切分
svm.fit(X_train,y_train)
print("预测:",svm.predict(X_test))
print("真实:",y_test)
print(svm.score(X_test, y_test)) # 肉眼观察 { 0)^(0 }
print(" --- 验证对于鸢尾花数据集,各个核函数的效率 --- ")
import matplotlib.pyplot as plt
kernels = ['rbf','linear','poly','sigmoid'] # 四种内核
for kernel in kernels:
svm = SVC(kernel=kernel)
svm.fit(X_train, y_train)
print(svm.score(X_test, y_test))
print(f" --- 验证{kernel}核过拟合情况 --- ")
train_sizes, train_score, test_score = learning_curve(
estimator=svm,
X=X_train,
y=y_train
)
plt.plot(train_sizes, np.mean(train_score,axis=1),label=f"{kernel}:train")
plt.plot(train_sizes, np.mean(test_score,axis=1),label=f"{kernel}:test")
plt.legend()
plt.show()
""" 通过绘制的学习曲线来看,四种核都没有过拟合情况 """

以上为个人见解,如有误解,感谢指出 ^o^/ !!!
苦瓜不苦O_o
为方便后续完善补充,这里是修改记录。
发布时间:2025-8-1 -> 基本认识
修改记录:2025-8-1 -> 修改了图片与最后的颜表情,因为之前的加载不出来╰(‵□′)╯,还补充了关于SVM的基本定义。

浙公网安备 33010602011771号