共计 1528 个字符,预计需要花费 4 分钟才能阅读完成。
1. 从二维空间理解 SVM 的核心思想
想象我们在平面上有两类点,想要画一条直线将它们分开。SVM 的独特之处在于,它会寻找那条能让两类点都离得最远的直线——这就是 最大化间隔 的思想。用数学表达就是找到超平面 $w^Tx + b = 0$ 使边际 $\frac{2}{|w|}$ 最大。

2. 硬间隔 vs 软间隔的数学本质
2.1 硬间隔(完美可分时)
目标函数:
$$\min \frac{1}{2}|w|^2 \quad \text{s.t.} \quad y_i(w^Tx_i + b) \geq 1$$
2.2 软间隔(现实更常见)
引入松弛变量 $\xi$ 后的优化问题:
$$\min \frac{1}{2}|w|^2 + C\sum \xi_i \quad \text{s.t.} \quad y_i(w^Tx_i + b) \geq 1-\xi_i$$
- $C$ 是惩罚系数,控制对误分类的容忍度
- $\xi_i$ 表示第 i 个样本允许偏离间隔的距离
3. Python 实战代码模板
3.1 基础分类演示
from sklearn.svm import SVC
import matplotlib.pyplot as plt
# 线性核示例
clf = SVC(kernel='linear', C=1.0)
clf.fit(X_train, y_train)
# 可视化决策边界
def plot_decision_boundary(clf, X):
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.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
plt.contourf(xx, yy, Z.reshape(xx.shape), alpha=0.4)
3.2 超参数调优
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10, 100],
'gamma': [1, 0.1, 0.01, 0.001],
'kernel': ['rbf', 'linear']
}
grid = GridSearchCV(SVC(), param_grid, cv=5)
grid.fit(X_train, y_train)
4. 避坑实践指南
4.1 特征标准化
- SVM 对特征尺度敏感,必须做标准化:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
4.2 样本不均衡处理
# 通过 class_weight 参数调整
clf = SVC(class_weight={0:1, 1:10}) # 第二类样本权重设为 10 倍
4.3 核函数选择策略
- 特征数 >> 样本数:尝试线性核
- 有明显非线性边界:RBF 核
- 先验知识提示多项式关系:多项式核
5. 性能优化技巧
5.1 大数据集处理
# 使用线性 SVM 的优化实现
from sklearn.svm import LinearSVC
clf = LinearSVC(dual=False) # 样本数 > 特征数时设置 dual=False
5.2 加速训练
# 调整核缓存大小(单位 MB)clf = SVC(kernel='rbf', cache_size=1000)
6. 延伸学习建议
推荐在 Kaggle 上实践以下任务:
1. Titanic 生存预测(二分类)
2. 鸢尾花分类(多分类)
通过调整 C 值观察决策边界变化,尝试不同核函数比较准确率差异,这是掌握 SVM 的最佳方式。
正文完
发表至: 未分类
近两天内
