支持向量机(Support Vector Machine)是一种经典的监督学习算法,最初由Vapnik和Cortes在1995年提出。它的核心思想是通过寻找最优超平面来实现分类任务,这个超平面能够最大化不同类别数据点之间的间隔(margin)。与传统的逻辑回归等算法不同,SVM特别适合处理小样本、非线性及高维数据分类问题。
我第一次接触SVM是在处理一个医学图像分类项目时。当时数据集只有几百个样本,但特征维度高达上千,传统方法效果都不理想。SVM凭借其出色的泛化能力,在测试集上达到了90%以上的准确率,这让我深刻体会到它在小样本场景下的优势。
SVM最迷人的特性是它通过核技巧(Kernel Trick)将线性不可分问题转化为高维空间中的线性可分问题。这就好比在二维平面上无法用直线分开的两个类别,如果将它们投射到三维空间,就可能找到一个平面完美分离它们。这种思想在数学上优雅,在实践中强大。
SVM的核心是寻找最大间隔超平面。想象我们要在两个类别之间画一条分界线,SVM会选择那条离两边最近的样本点都最远的线。这些最近的样本点就是"支持向量"——它们就像支撑着这条分界线的柱子,决定了分界线的最终位置。
数学上,这转化为一个凸优化问题:
code复制最小化:1/2 ||w||²
约束条件:y_i(w·x_i + b) ≥ 1, ∀i
其中w是超平面的法向量,b是偏置项。这个优化问题的解具有很好的性质——最终的解只依赖于少数支持向量,这使得SVM对大多数数据点的扰动具有鲁棒性。
当数据线性不可分时,SVM通过核函数将数据映射到高维特征空间。常用的核函数包括:
我在文本分类项目中对比过不同核函数的效果。RBF核在大多数情况下表现最好,但计算成本较高;线性核虽然简单,但在特征维度很高时(如文本的TF-IDF表示)往往也能取得不错效果。
重要提示:使用RBF核时,γ参数的选择至关重要。γ过大容易过拟合,γ过小则模型欠拟合。建议通过网格搜索确定最优值。
SVM对数据尺度非常敏感,因此标准化是必须的步骤:
python复制from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
对于类别不平衡问题,可以采用以下策略:
使用scikit-learn实现SVM的基本流程:
python复制from sklearn.svm import SVC
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, refit=True, cv=5)
grid.fit(X_train, y_train)
调参经验分享:
SVM也可用于回归问题,称为支持向量回归(SVR)。与分类不同,SVR试图找到一个超平面,使大部分数据点落在间隔带(ε-tube)内。在预测房价的任务中,我发现SVR对异常值比传统线性回归更鲁棒。
SVM本质是二分类器,实现多分类的常用方法有:
实践中,一对多通常足够好且计算成本更低。但在类别很多时,一对一可能更准确。
当数据量很大时,标准SVM可能变得很慢。可以考虑:
在实际项目中,我经常需要选择SVM还是其他算法。以下是我的经验总结:
vs 逻辑回归:
vs 随机森林:
vs 神经网络:
最终选择哪种算法,还是要通过交叉验证来比较。在我的实践中,对于结构化数据且样本量不大时,SVM通常是首选。