支持向量机(Support Vector Machine, SVM) 是一种用于分类和回归任务的监督学习算法,尤其在小样本、高维数据的分类问题中表现优异。SVM 的核心思想是找到一个最优的决策边界,将不同类别的样本分开,并尽量让边界离各类别的样本尽可能远。
1. 支持向量机的核心思想
假设我们有两类点(正类和负类),SVM 的目标是找到一条能够最大化 分类间隔(margin) 的直线或超平面,将这两类点分开。
线性可分情况
在二维空间中:
- 一个超平面就是一条直线。
- SVM 会寻找这样一个直线,使得它不仅能分开两类点,还能让离这条线最近的点的距离最大化。
分类间隔(Margin)
- 分类间隔是指超平面到最近的正类点和负类点的距离之和。
- SVM 希望这个分类间隔尽量大,因为更大的间隔意味着模型对噪声和误差更有鲁棒性。
支持向量
- 离决策边界最近的点被称为支持向量。
- 决策边界是由这些支持向量唯一决定的,其余的点不会影响边界的位置。
2. 数学公式
3. 非线性可分问题
现实中,数据通常是非线性可分的。SVM 通过以下两种方式解决:
(1)核方法(Kernel Trick)
-
核方法通过将数据从低维空间映射到高维空间,在高维空间中寻找线性可分的决策边界。
-
常见的核函数包括:
- 线性核:适用于线性可分问题。
- 多项式核:适用于数据之间具有多项式关系的问题。
- 高斯核(RBF 核) :适用于复杂的非线性问题。
(2)软间隔(Soft Margin)
- 如果数据中存在噪声或少量异常点,SVM 引入了"软间隔"概念。
4. SVM 的工作流程
- 输入数据: 训练集包含特征和对应标签。
- 选择核函数: 根据数据的分布,选择适合的核函数。
- 训练模型: 通过优化算法(如 SMO 算法)找到最优超平面。
- 预测类别: 将新样本输入模型,依据决策边界预测所属类别。
5. 优点与缺点
优点
- 对高维数据效果好:适合维度较高但样本数量较少的问题。
- 鲁棒性强:通过最大化分类间隔,降低对噪声的敏感性。
- 灵活性高:可以通过核方法处理非线性问题。
缺点
- 对超参数敏感:需要选择合适的核函数和参数 C。
- 计算复杂度高:对于大规模数据集,训练可能较慢。
- 不适合大数据:当样本数量非常大时,内存消耗和计算成本会急剧增加。
6. 应用场景
- 文本分类:如垃圾邮件检测。
- 图像分类:处理小样本任务。
- 生物信息学:如基因分类。
- 金融风险预测:通过少量特征预测信用违约。
案例分析:鸢尾花分类
我们使用经典的 Iris 鸢尾花数据集 来展示如何使用支持向量机(SVM)完成分类任务。鸢尾花数据集是一个小型开源数据集,包含 150 条记录,分为 3 类,每类 50 条记录。
1. 数据集简介
- 数据来源:Scikit-learn 自带的鸢尾花数据集。
- 特征:4 个特征,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度。
- 目标变量:鸢尾花的种类(Setosa、Versicolor、Virginica)。
2. 案例分析代码
python
import numpy as np
import matplotlib.pyplot as plt
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 classification_report, accuracy_score
# 加载数据集
iris = datasets.load_iris()
X = iris.data # 特征
y = iris.target # 标签
# 数据集划分:80% 训练集,20% 测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 初始化并训练 SVM 模型
svm_model = SVC(kernel='linear', C=1.0, random_state=42) # 使用线性核
svm_model.fit(X_train, y_train)
# 模型预测
y_pred = svm_model.predict(X_test)
# 评估模型性能
print("分类报告:\n", classification_report(y_test, y_pred))
print("准确率:", accuracy_score(y_test, y_pred))
# 可视化(选择两个特征进行二维展示)
def plot_decision_boundary(X, y, model):
X = X[:, :2] # 取前两个特征
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.01),
np.arange(y_min, y_max, 0.01))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.8, cmap=plt.cm.Paired)
scatter = plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.title("SVM Decision Boundary")
plt.legend(*scatter.legend_elements(), title="Classes")
plt.show()
# 绘制决策边界
plot_decision_boundary(X_train, y_train, svm_model)
3. 代码解释
-
数据加载与划分:
- 从 Scikit-learn 提供的
datasets
中加载鸢尾花数据。 - 使用
train_test_split
将数据集划分为训练集(80%)和测试集(20%)。
- 从 Scikit-learn 提供的
-
特征标准化:
- 使用
StandardScaler
对特征进行标准化,确保每个特征具有相同的量纲。
- 使用
-
SVM 模型训练:
- 初始化一个支持向量机模型,使用线性核函数。
- 设置超参数 C=1.0,控制分类边界的平滑程度。
-
模型评估:
- 使用
classification_report
和accuracy_score
查看模型在测试集上的性能。
- 使用
-
决策边界可视化:
- 选取两个特征(前两个)进行二维展示,绘制 SVM 的分类决策边界。
4. 示例输出
指标解析
1. 每个类别的指标
-
Precision(精确率)
- 含义: 在模型预测为某类的样本中,实际属于该类的比例。
- 案例解释 :
类别 2 的精确率是 92%,即预测为类别 2 的样本中,92% 是正确的。
-
Recall(召回率)
- 含义: 实际属于某类的样本中,被正确预测为该类的比例。
- 案例解释 :
类别 1 的召回率是 89%,即实际属于类别 1 的样本中,有 89% 被正确分类。
-
F1-score(F1 分数)
- 含义: 精确率和召回率的调和平均值,权衡二者的表现。
- 案例解释 :
类别 1 的 F1 分数是 0.94,说明该类在平衡精确率和召回率上表现不错。
-
Support(样本数)
- 含义: 每个类别的样本数量,表示实际测试数据中属于该类别的样本总数。
- 案例解释 :
类别 0 的样本数是 10,类别 1 的样本数是 9,总共 30 个样本。
2. 全局指标
-
Accuracy(准确率)
- 案例解释 :
准确率是 97%,说明在所有测试样本中,97% 被正确分类。
- 案例解释 :
-
Macro Average(宏平均)
- 含义: 所有类别的指标均等加权的平均值。
- 案例解释 :
宏平均的 F1 分数是 0.97,表示模型在各类别的整体表现,适合类别样本数分布均衡的情况。
-
Weighted Average(加权平均)
- 含义: 按类别样本数加权计算的平均值。
- 案例解释 :
加权平均的 F1 分数是 0.97,综合考虑了各类别的样本数量,更适合类别样本数不均衡的场景。
如何解读分类报告?
-
类别是否均衡:
- 检查
Support
列,类别样本数是否分布均匀。 - 如果某些类别的
Support
很少,可能会导致指标偏向样本多的类别。
- 检查
-
重点指标选择:
- 精确率优先:在关注误报代价较高的场景(如垃圾邮件分类)中,精确率更重要。
- 召回率优先:在关注漏报代价较高的场景(如疾病检测)中,召回率更重要。
- F1 分数:在精确率和召回率需要平衡的场景中,F1 分数是核心指标。
-
模型是否适用:
- 如果模型在某些类别的
Precision
或Recall
很低,可能需要重新调整数据或算法。
- 如果模型在某些类别的
改进方法
- 类别样本分布不均:尝试上采样(Over-sampling)或下采样(Under-sampling)。
- 模型调优 :通过调整超参数(如 SVM 的
C
值、树模型的深度)提升性能。 - 特征工程:引入更多区分度高的特征或移除冗余特征。
补充:通俗解释:线性模型/SVM/决策树
- 线性模型: 想象你要用一根直尺来画一条最佳拟合线,将所有点尽可能贴近这条线。这是线性模型的方式,关注全局效果。
- SVM: 想象你站在两组数据之间,用一根绳子(超平面)把它们分开,同时尽可能让绳子离两组数据都远一点。支持向量是决定绳子位置的关键点。
- 决策树: 想象你在分类水果。你可以先问"这是红色的吗?"如果是,就接着问"它是圆的吗?"以此类推,直到明确这是什么水果。决策树的分裂规则就是这样的"问答逻辑"。