SVM(支持向量机)
背景: 90 年代提出的二分类算法,解决线性不可分问题(比如用直线分不开的数据)。
目标: 找到一个”最佳分界线”(超平面),使得两侧数据点到分界线的距离最大化(最大间隔)。
核心思想
最大间隔: 想象两堆点分布在马路两侧,SVM 会找到最宽的马路(间隔),马路边缘的点叫”支持向量”(离马路最近的点)。
核技巧: 如果数据像缠在一起的毛线(线性不可分),用”核函数”把数据投影到高维空间,变成可分的(类似从平面变成立体)。
重要概念
- 超平面方程
- 间隔计算
- 对偶问题转换: 通过拉格朗日乘子法,把原始问题转换为只与支持向量相关的优化问题
- RBF 核函数: ||x-y|| 表示 x 到 y 的欧式距离
核心优势
处理小样本、高维、非线性数据(文本分类如垃圾邮件检测,每个单词是一个特征,特征维度上千,但样本仅几千条)。SVM 依赖支持向量而非全部数据,高维空间中容易找到分隔超平面。
缺点
- 可解释性低: 黑箱模型,无法直接理解特征重要性(相比决策树)
- 大数据场景无力: 时间复杂度约 O(n²) ~ O(n³),万级以上样本建议改用线性 SVM(Liblinear)或神经网络
- 维度低特征少别用,实时要求高别用
场景推荐
| 场景 | 推荐算法 | 原因 |
|---|---|---|
| 样本 < 10k,维度高 | SVM(RBF/线性核) | 高维小样本优势明显 |
| 样本 > 100k,结构化数据 | XGBoost/RandomForest | SVM 计算慢,树模型并行高效 |
| 需要概率输出 | 逻辑回归 | 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