跳到主要内容

支持向量机

本节定位

SVM 不是“过时算法”。
在很多中小数据任务里,它仍然是很强的基线,特别是:

  • 特征维度高
  • 数据量不算大
  • 类别边界比较清楚

这节课的重点不是把公式堆满,而是先把它的工程直觉抓住:

SVM 的核心是找一条分类边界,而且要让这条边界离两边样本都尽量远。

学习目标

  • 理解最大间隔和支持向量的直觉
  • 理解线性核和核技巧分别适合什么情况
  • 理解为什么特征缩放对 SVM 特别重要
  • 通过可运行示例建立对 SVM 的第一层实战判断

一、SVM 到底在做什么?

1.1 不是只找一条分界线,而是找“最稳”的那条

假设你要把两类样本分开。
能把它们分开的线可能很多条,但 SVM 不会随便挑一条,而是会倾向选择:

  • 离两边最近样本都尽量远的那条

这就是:

  • 最大间隔(max margin)

1.2 为什么“间隔大”有意义?

因为间隔越大,模型通常越不容易被边界附近的小扰动影响。
你可以把它理解成:

  • 不只是分开
  • 还要分得更稳

1.3 什么是支持向量?

并不是所有样本都同样重要。
真正决定分界线位置的,往往是最靠近边界的那一小部分样本。

这部分样本就叫:

  • 支持向量

也就是说,
SVM 的边界是被“最关键的少数样本”撑起来的。


二、什么时候 SVM 特别值得试?

2.1 中小数据集

如果数据量不是特别大,
SVM 往往很值得作为基线。

2.2 高维特征

例如:

  • TF-IDF 文本特征
  • 手工特征工程后的表格特征

SVM 在这类任务里经常表现不错。

2.3 类别边界相对清晰

如果不同类别在特征空间里本来就有较清楚的分隔,
SVM 会更容易发挥。


三、先跑一个真正有意义的最小示例

这个例子会同时做两件事:

  1. 用线性 SVM 做分类
  2. 打印出支持向量数量

这样你能直接看到 SVM 的两层关键输出:

  • 分类器效果
  • 边界由哪些点决定
import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

X = np.array([
[1.0, 1.2],
[1.3, 0.9],
[1.1, 1.0],
[4.0, 4.2],
[4.3, 3.8],
[3.9, 4.1],
])
y = np.array([0, 0, 0, 1, 1, 1])

clf = make_pipeline(
StandardScaler(),
SVC(kernel="linear", C=1.0),
)

clf.fit(X, y)
pred = clf.predict([[1.2, 1.1], [4.2, 4.0]])

svc = clf.named_steps["svc"]

print("predictions:", pred.tolist())
print("n_support_ :", svc.n_support_.tolist())
print("support_vectors shape:", svc.support_vectors_.shape)

3.1 这段代码为什么比只 fit/predict 更有用?

因为它不仅让你看到:

  • 预测结果

还让你看到:

  • 每类有多少支持向量

这有助于你把 SVM 的“最大间隔”直觉和模型行为连起来。

3.2 为什么这里要加 StandardScaler()

因为 SVM 对特征尺度非常敏感。
如果某一列数值范围特别大,它会在距离计算里占过大权重。

这也是 SVM 最常见的工程坑之一:

  • 不做缩放,效果会莫名其妙变差

四、核技巧到底在解决什么?

4.1 线性 SVM 适合边界近似线性的情况

如果两类样本本来就能被一条直线分开,
线性核通常已经足够。

4.2 核技巧的直觉

当原空间里不好分时,可以通过核方法隐式映射到更高维空间,
让问题在新空间里变得更容易线性可分。

最常见的是:

  • RBF kernel

4.3 什么时候该谨慎用核方法?

核 SVM 虽然更灵活,但也通常意味着:

  • 调参更敏感
  • 训练和预测更重

所以在工程里,通常建议:

  1. 先试线性
  2. 线性明显不够,再考虑更复杂核

五、SVM 最常见的两个参数

5.1 C

它控制“错误容忍”和“边界硬度”的平衡。

你可以先粗略记成:

  • C 大:更努力把训练集分对,但可能更容易过拟合
  • C 小:允许一些误差,但边界更宽松

5.2 kernel

它决定模型使用:

  • 线性边界
  • 还是更灵活的非线性边界

六、SVM 最容易踩的坑

6.1 误区一:不做特征缩放

这几乎是最常见问题。

6.2 误区二:数据量很大时还默认上核 SVM

数据量大后,核方法常常会变得比较重。

6.3 误区三:把 SVM 当成“自动最优”

SVM 常常是很强基线,
但它不是所有任务的默认最优解。


小结

这节最重要的,不是把支持向量机记成一堆公式,
而是建立一个判断:

SVM 的强项在于中小数据、高维特征和较清晰边界问题;它通过最大间隔找到更稳的分类边界,而支持向量是这个边界真正的关键样本。

只要这层理解清楚了,你以后就知道它什么时候值得上,什么时候不该硬用。


练习

  1. 去掉 StandardScaler() 再跑一次,观察结果是否变化。
  2. kernel 改成 "rbf",看看模型还能否正常工作。
  3. 想一想:为什么文本分类里线性 SVM 往往是很强的基线?
  4. 用自己的话解释:支持向量为什么叫“支持”向量?