• 2025年10月10日 星期五

2.14处理多类问题

8 月 17, 2025

SVM有三种方式处理多类问题(类别>2)

1.改造优化的目标函数和限制条件,使之能处理多类

2.一类VS其他类(一类对K-1类)K为类数 n个svm

3.一类VS另一类 n*(n-1)/2个svm

说直接点就是打分系统。

来看这个例子:

SVM1: 类1 VS 类2:0.5

SVM2: 类1 VS 类3:-0.2

SVM1: 类2 VS 类3:0.4

打分结果:

类1:0.5-0.2=0.3

类2:-0.5+0.4=-0.1

类3:0.2-0.4=-0.2

聚类算法结合决策树算法 二分类器->多分类器

处理8个问题构建7个分类器:

1 2 3 4 vs 5 6 7 8

↓ ↓

1 2 vs 3 4 | 5 6 vs 7 8

↓ ↓ ↓ ↓

1vs2 | 3vs4 | 5vs6 | 7vs8

保证每个分类器区分的两类差别显著

思考:如果支持向量机的两类训练样本数量不平衡,将会导致什么样的结果?

1. 原始软间隔 SVM 目标函数

C 对所有松弛变量 ξi采用同一权重。

若正负样本数量极度失衡(设正类 N+≫N​),则惩罚项变为

优化器更关心多数类(正类)的误差,因为它们数目多、总惩罚大。

2. 对偶形式验证

对偶问题(L1 损失):

  • 需要 ∑iαiyi=0(正负 α 总和抵消)。
  • 如果正类样本太多,为满足平衡,正类 αi​ 往往被压得很小;少数类 αi必须较大才能抵消。这会把决策超平面推向少数类一侧,导致少数类更容易被误分类。

3. 典型现象

指标 / 现象数学原因结果表现
总体准确率高多数类主导损失看似效果不错
少数类召回低少数类误分惩罚小少数类经常被错分
支持向量分布少数类 α 大、正类 α 小支持向量数量失衡
决策面偏移目标函数更“关心”多数类间隔靠近少数类

4. 解决思路

(1)类别加权 Ci.​

使每类样本的总惩罚相近,常用做法:class_weight='balanced'

(2)重采样
对少数类进行过采样(如 SMOTE)或对多数类下采样。

(3)成本敏感 SVM
在目标函数显式写成 ∑iCiξi,手动设定重要度。

(4)阈值后移
训练模型保持原样,预测时使用 sign⁡(f(x)−τ) 调整决策阈值。

(5)异常检测/一类 SVM
当少数类极少时,将其视为“异常”进行检测。


结论
样本数量不平衡会使支持向量机主要关注多数类误差,决策边界向少数类一侧偏移,从而降低少数类的识别率。通过类别加权、数据重采样或成本敏感学习等方法可有效缓解这一问题。

那么如何改造支持向量机的优化函数来缓解前面这个问题所带来的负面影响?

把“样本不平衡”写进 SVM 目标函数的三种经典改造

下面用最常见的 L1 软间隔 为例,若用 L2 软间隔或 ν-SVM、Twin-SVM,思路完全类似,只是公式里把 ∑ξi​ 换成 ∑ξi2 或者多一条超平面而已。


1️⃣ 类别加权 C+C_(最常用)

改造后的原始问题

一般设

使两类误差对目标函数的贡献相当。

对偶形式 0≤αi≤C+ 或 C——上界因类别不同而不同,少数类 α 可以取到更大的值,进而推回更合理的超平面。

工程落地

  • libsvm:-w1 ρ1 -w-1 ρ-1
  • scikit-learn:class_weight='balanced' 或传 dict {1:w1,-1:w-1}

2️⃣ 样本级权重 ω​(Cost-Sensitive / Fuzzy SVM)

改造后的原始问题

  • ωi​ 可以
    • 取 N/2Nyi(退化回类别权重);
    • 根据样本置信度 / 噪声打分(Fuzzy SVM);
    • 手工指定误分成本(Cost-Sensitive SVM)。
  • 对偶: 0≤αi≤Cωi

好处:粒度更细,可对个别关键样本放大权重。
风险:权重极端时,会导致数值不稳定,需调参或归一化。


3️⃣ 调整间隔阈值(不同类别的 margin)

有时希望 正类 >1、负类 >1 的规定不一样,例如令少数类 margin 更大:

配合类别权重,这就是 Margin-Rescaling SVM

  • 取 m+>m​ 可强迫模型“远离”少数类,提高其识别率。
  • 对偶约束仍是 0≤αi≤C,但 KKT 中出现 myi​​ ——最终等价于重新平移阈值。

这些改造如何缓解问题?

改造优化目标中发生了什么直接效果
类别加权 C±多数类每错 1 个只罚 C+,少数类罚 C≫C+决策面远离少数类,召回↑
样本权重 ω惩罚项精确到样本可针对局部稀疏区、极端样本加强影响
margin 重缩放少数类要求更大间隔对偏移特别敏感的数据集更有效

参考代码:

from sklearn.svm import SVC
# 方法1:类别加权
model = SVC(kernel='rbf', class_weight='balanced', C=1.0)

# 方法2:自定义样本权重
sample_weights = np.where(y==1, N/(2*N_pos), N/(2*N_neg))
model = SVC(kernel='rbf', C=1.0)
model.fit(X, y, sample_weight=sample_weights)

# 方法3:自定义 margin(需改源码或用 PyTorch 自写 loss)

结论:样本数量不平衡会导致支持向量机的主要关注多数类误差,决策边界向少数类一侧偏移。从而降低少数类的识别率。通过类别加权、数据重采样或成本敏感学习等方法解决。



微信扫描下方的二维码阅读本文

Avatar photo

李星海

简介: 2025-今 浙江农林大学 | 2022-今 广州白蓝碗蛋科技有限公司 | 2022-2024 广州商学院 | 2019-2022 广东工贸职业技术学院 | 服务宗旨:心始至客,行亦致远。