机器学习进阶:支持向量机SVM
一、什么是支持向量机(SVM)
支持向量机(Support Vector Machine)本质是:
寻找一个“间隔最大”的最优分类超平面
它不仅追求“分开”,更追求:
分得最稳、泛化最好
这是它和逻辑回归最大的区别。
1)二维直观理解
二维空间中,超平面就是一条直线:
[w^T x + b = 0
]
其中:
- (w):方向
- (b):偏置
- 距离超平面最近的点:支持向量
这些点决定最终边界。(AiDocZh)
二、最大间隔原理(核心)
SVM 的核心目标是:
让两类样本距离分类边界尽可能远
分类边界两侧还有两条间隔边界:
[w^T x + b = 1
][
w^T x + b = -1
]
两条边界距离:
[\frac{2}{|w|}
]
所以:
最大化间隔 = 最小化 (|w|^2)
核心优化目标
\min_{w,b} \frac{1}{2}|w|^2 \quad s.t.; y_i(w^Tx_i+b)\ge 1
这就是经典 Hard Margin SVM。
三、为什么最大间隔泛化更强
因为间隔越大,模型对扰动越不敏感。
例如你的 OCR、合同分类场景里:
- 文本特征有噪声
- OCR 有误字
- 向量空间有偏移
大间隔能显著提高鲁棒性。
这也是 SVM 在:
- 文本分类
- 小样本分类
- 高维稀疏特征
里非常强的原因。(scikit-learn)
四、软间隔 SVM(生产最常用)
现实数据通常线性不可分。
所以引入松弛变量:
[\xi_i
]
允许少量点越界。
优化目标
\min_{w,b,\xi} \frac{1}{2}|w|^2 + C\sum_i \xi_i \quad s.t.; y_i(w^Tx_i+b)\ge 1-\xi_i
其中:
- (C):误分类惩罚系数
- 大 (C):更严格
- 小 (C):更平滑
五、核技巧(SVM 真正强大的地方)
这是 SVM 最核心进阶点。
核心思想
当低维不可分时:
映射到高维空间再线性可分[
\phi(x)
]
但直接升维成本很高。
于是引入:
Kernel Trick
只计算内积:
[K(x_i,x_j)=\phi(x_i)^T\phi(x_j)
]
(AiDocZh)
六、常见核函数
1)线性核
[K(x,z)=x^Tz
]
适合:
- 文本分类
- TF-IDF
- 高维稀疏特征
2)多项式核
[K(x,z)=(x^Tz+c)^d
]
适合非线性交互。
3)RBF 高斯核(最常用)
K(x,z)=\exp(-\gamma|x-z|^2)
特点:
- 默认首选
- 泛化稳定
- 非线性能力强
scikit-learn 默认就非常推荐。(scikit-learn)
七、Python 实战:线性 SVM
1)基础分类
import numpy as np
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = load_iris(return_X_y=True)
X = X[:, :2]
scaler = StandardScaler()
X = scaler.fit_transform(X)
x_train, x_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = SVC(kernel="linear", C=1.0)
model.fit(x_train, y_train)
print("accuracy:", model.score(x_test, y_test))(scikit-learn)
八、RBF SVM(推荐生产)
from sklearn.svm import SVC
rbf_model = SVC(
kernel="rbf",
C=2.0,
gamma="scale"
)
rbf_model.fit(x_train, y_train)
print(rbf_model.score(x_test, y_test))参数经验(非常重要)
C 参数
C = 0.1 / 1 / 10 / 100- 小:防过拟合
- 大:拟合更强
gamma 参数
gamma = "scale"经验:
- 大 gamma:边界复杂
- 小 gamma:边界平滑
九、可视化决策边界(深入理解)
import matplotlib.pyplot as plt
def plot_boundary(model, X, y):
x_min, x_max = X[:,0].min()-1, X[:,0].max()+1
y_min, y_max = X[:,1].min()-1, X[:,1].max()+1
xx, yy = np.meshgrid(
np.linspace(x_min, x_max, 300),
np.linspace(y_min, y_max, 300)
)
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:,0], X[:,1], c=y)
plt.show()这个对理解:
- 核函数效果
- C 对边界影响
- gamma 复杂度
特别重要。
十、适合你的实战场景(重点)
结合你当前方向,SVM 很适合:
1)OCR 文本分类
例如:
- 合同类型分类
- 版权文件分类
- 工单分类
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
text_svm = Pipeline([
("tfidf", TfidfVectorizer(max_features=10000)),
("svm", SVC(kernel="linear"))
])高维文本特征里,线性 SVM 非常强。(scikit-learn)
2)图像小样本分类
例如:
- 缺陷检测
- OCR 字符分类
- 边缘纹理识别
3)异常检测边界学习
One-Class SVM 也非常适合:
- 风险合同检测
- 非法文本检测
- OCR 异常页
十一、SVM vs XGBoost 怎么选
这是生产里最常见问题。
| 场景 | 推荐 |
|---|---|
| 小样本高维 | SVM |
| 文本 TF-IDF | Linear SVM |
| 非线性中小数据 | RBF SVM |
| 百万级结构化表 | XGBoost |
| 超大规模在线服务 | LR / GBDT |
十二、生产级调参方案(推荐)
from sklearn.model_selection import GridSearchCV
params = {
"C": [0.1, 1, 10],
"gamma": ["scale", 0.1, 0.01],
"kernel": ["rbf"]
}
grid = GridSearchCV(SVC(), params, cv=5)
grid.fit(x_train, y_train)
print(grid.best_params_)十三、面试高频总结
核心记忆:
SVM 本质
最大间隔分类器
核心目标
最小化 (|w|^2)
最强能力
核技巧处理非线性
评论已关闭