支持向量机(SVM)入门指南:从数学原理到Python实战

1次阅读
没有评论

共计 1528 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

1. 从二维空间理解 SVM 的核心思想

想象我们在平面上有两类点,想要画一条直线将它们分开。SVM 的独特之处在于,它会寻找那条能让两类点都离得最远的直线——这就是 最大化间隔 的思想。用数学表达就是找到超平面 $w^Tx + b = 0$ 使边际 $\frac{2}{|w|}$ 最大。

支持向量机 (SVM) 入门指南:从数学原理到 Python 实战

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 核函数选择策略

  1. 特征数 >> 样本数:尝试线性核
  2. 有明显非线性边界:RBF 核
  3. 先验知识提示多项式关系:多项式核

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 的最佳方式。

正文完
 0
评论(没有评论)