共计 1911 个字符,预计需要花费 5 分钟才能阅读完成。
在机器学习领域,二分类问题是最基础也是最常见的问题之一。核心任务是找到一条决策边界,将数据分为两类。但看似简单的任务背后,隐藏着一个关键挑战:如何选择泛化能力最强的决策边界?

决策边界选择的困境
观察以下两种决策边界:
- 紧贴数据型边界:完美分离训练数据但紧贴样本点
- 最大间隔型边界:与最近样本点保持最大距离
实验表明,前者在训练集上表现完美但测试集表现差,后者虽然训练集可能不完全准确,但实际应用中表现更稳定。这就是支持向量机 (SVM) 要解决的核心问题。
SVM 的独特优势
相比其他分类算法,SVM 有三大特点:
- 间隔最大化:不是简单找分界线,而是找最 ” 宽 ” 的分隔带
- 核技巧:通过核函数处理非线性可分问题
- 稀疏性:最终模型仅依赖少量支持向量
与逻辑回归相比,SVM 更关注边界附近的样本点;与决策树相比,SVM 能提供明确的数学最优解。
数学原理剖析
1. 硬间隔线性可分
最优超平面求解可表示为约束优化问题:
$$
\min_{w,b} \frac{1}{2}||w||^2 \
\text{s.t.} y_i(w^Tx_i + b) \geq 1, \forall i
$$
2. 软间隔(非线性可分)
引入松弛变量 $\xi$:
$$
\min_{w,b} \frac{1}{2}||w||^2 + C\sum_{i}\xi_i
$$
3. 核函数
通过 $\phi(x)$ 映射到高维空间,常用核函数:
- 线性核:$K(x_i,x_j) = x_i^Tx_j$
- 多项式核:$K(x_i,x_j) = (\gamma x_i^Tx_j + r)^d$
- RBF 核:$K(x_i,x_j) = \exp(-\gamma||x_i-x_j||^2)$
代码实战
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
import numpy as np
# 数据准备
X, y = make_classification(n_samples=1000, n_features=2,
n_redundant=0, random_state=42)
X = StandardScaler().fit_transform(X) # 标准化
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 模型训练
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)
# 评估
print(classification_report(y_test, model.predict(X_test)))
# 可视化决策边界
def plot_decision_boundary():
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 = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor='k')
plt.title('SVM 决策边界')
plt.show()
plot_decision_boundary()
性能优化要点
- 数据标准化:SVM 对特征尺度敏感
- 核函数选择:
- 线性核:特征数 >> 样本数
- RBF 核:样本数 >> 特征数
- 参数调优:
- C 值:权衡分类准确与间隔大小
- gamma(RBF 核):控制单个样本影响范围
常见问题解决方案
- 类别不平衡:使用 class_weight 参数
- 大数据集:考虑线性 SVM 或使用 SGDClassifier
- 高维数据:优先尝试线性核
思考题
- 当特征维度远大于样本数量时,为什么线性核通常表现更好?
- RBF 核中的 gamma 参数如何影响模型复杂度?
- 如何证明 SVM 得到的解是全局最优解而非局部最优?
通过本文的实践,相信你已经掌握了 SVM 的核心应用技巧。建议在实际项目中先从简单的线性 SVM 开始,逐步尝试更复杂的核函数,通过交叉验证选择最佳模型配置。
正文完
发表至: 未分类
近一天内
