SVM(支持向量机)

背景: 90 年代提出的二分类算法,解决线性不可分问题(比如用直线分不开的数据)。

目标: 找到一个”最佳分界线”(超平面),使得两侧数据点到分界线的距离最大化(最大间隔)。

核心思想

最大间隔: 想象两堆点分布在马路两侧,SVM 会找到最宽的马路(间隔),马路边缘的点叫”支持向量”(离马路最近的点)。

核技巧: 如果数据像缠在一起的毛线(线性不可分),用”核函数”把数据投影到高维空间,变成可分的(类似从平面变成立体)。

重要概念

  • 超平面方程
  • 间隔计算
  • 对偶问题转换: 通过拉格朗日乘子法,把原始问题转换为只与支持向量相关的优化问题
  • RBF 核函数: ||x-y|| 表示 x 到 y 的欧式距离

核心优势

处理小样本、高维、非线性数据(文本分类如垃圾邮件检测,每个单词是一个特征,特征维度上千,但样本仅几千条)。SVM 依赖支持向量而非全部数据,高维空间中容易找到分隔超平面。

缺点

  • 可解释性低: 黑箱模型,无法直接理解特征重要性(相比决策树)
  • 大数据场景无力: 时间复杂度约 O(n²) ~ O(n³),万级以上样本建议改用线性 SVM(Liblinear)或神经网络
  • 维度低特征少别用,实时要求高别用

场景推荐

场景推荐算法原因
样本 < 10k,维度高SVM(RBF/线性核)高维小样本优势明显
样本 > 100k,结构化数据XGBoost/RandomForestSVM 计算慢,树模型并行高效
需要概率输出逻辑回归SVM 需额外校准(如 Platt Scaling)
图像/语音大数据CNN/深度学习SVM 无法自动提取特征,且计算资源爆炸

代码示例

# 环境准备:pip install scikit-learn numpy matplotlib
# 环境准备:pip install scikit-learn numpy matplotlib
 
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
 
# 1. 加载数据
cancer = datasets.load_breast_cancer()
X, y = cancer.data, cancer.target
 
# 2. 数据预处理(SVM对尺度敏感,必须标准化!)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
 
# 3. 划分训练集/测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
 
# 4. 创建SVM模型(使用RBF核)
model = SVC(kernel='rbf', C=1.0, gamma='scale')  # ⭐关键参数
model.fit(X_train, y_train)
 
# 5. 预测与评估
y_pred = model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, y_pred):.2f}")
 
# 输出结果:准确率通常约0.96~0.98