通透!SVM 和逻辑回归对比 !!
- 2025-07-29 15:16:00
哈喽,大家好~
咱们今天来聊聊SVM 和逻辑回归对比,在分类任务中边界建模与概率输出的选择。
在分类任务中,SVM与LR都是非常常用的线性分类模型,但它们在边界建模方式和概率输出处理上存在本质区别。
下面,咱们通过理论基础、优化目标、边界建模方式以及概率输出能力等等方面,详细聊聊~
1. 模型目标与损失函数
逻辑回归
逻辑回归是基于概率建模的线性分类模型,建模的是后验概率 。
假设形式:
对于输入特征向量 ,逻辑回归模型为:
其中, 是 sigmoid 函数。
损失函数(对数似然):
逻辑回归使用极大似然估计,最大化数据的对数似然,相当于最小化交叉熵损失函数:
可以加上 正则化项,变为:
优点是模型输出为概率,适用于需要概率估计的任务(如排序、风险评估),在很多场景下需要解释的时候,非常容易,参数有明确的含义。
支持向量机(SVM)
SVM 是基于间隔最大化思想的判别模型。目标是学习一个超平面,使得样本离决策边界尽可能远,从而具有良好的泛化能力。
假设形式:
对线性可分情况,SVM 的超平面为:
预测类别为:
损失函数(合页损失):
线性不可分情况下,引入合页(hinge)损失函数,优化目标为:
其中,, 是惩罚参数,控制软间隔。
SVM的优点:间隔最大化策略带来较强的泛化能力,对离群点有一定的鲁棒性。可以通过核函数处理非线性分类问题。
2. 边界建模:最大间隔 vs 概率边界
| ||||
从本质上说:逻辑回归关注整体数据的似然拟合。SVM只关注支持向量(靠近边界的样本),不关心边界远处的样本。
3. 概率输出能力比较
Logistic 回归概率输出,直接由模型输出:
SVM 的概率输出(需后处理),由于 SVM 输出的是一个距离边界的函数值 ,其输出值并不能解释为概率。
可通过 Platt Scaling 将其转换为概率:
其中 和 是通过对验证集拟合一个 sigmoid 函数得到的。
4. 公式总结
完整案例
这里,结合一个可视化友好的二分类任务,对这两种模型进行深入比较:
理论角度解析各自模型原理 使用虚拟数据构建一个清晰边界 绘制至少4幅图像进行比较说明 从可解释性、精度、边界控制、鲁棒性等方面进行对比 最终总结每种模型的优势与适用场景
数据集
使用 sklearn.datasets.make_classification
和 make_blobs
模拟一个清晰但有重叠的二分类数据集,并引入少量噪声以测试模型鲁棒性。
代码实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import (
accuracy_score,
roc_auc_score,
confusion_matrix,
roc_curve,
precision_recall_curve
)
import seaborn as sns
from matplotlib.colors import ListedColormap
# 1. 生成虚拟数据集
X, y = make_classification(
n_samples=500, n_features=2, n_redundant=0,
n_informative=2, n_clusters_per_class=1,
flip_y=0.05, class_sep=1.0, random_state=42
)
# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 2. 训练模型
model_lr = LogisticRegression()
model_svm = SVC(kernel='linear', probability=True)
model_lr.fit(X_train, y_train)
model_svm.fit(X_train, y_train)
# 3. 模型预测
y_pred_lr = model_lr.predict(X_test)
y_pred_svm = model_svm.predict(X_test)
y_prob_lr = model_lr.predict_proba(X_test)[:, 1]
y_prob_svm = model_svm.predict_proba(X_test)[:, 1]
# 4. 绘图准备
xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 500),
np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 500))
grid = np.c_[xx.ravel(), yy.ravel()]
Z_lr = model_lr.predict_proba(grid)[:, 1].reshape(xx.shape)
Z_svm = model_svm.decision_function(grid).reshape(xx.shape)
# 5. 创建四幅图像的可视化
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
# 图1:逻辑回归 - 概率边界
ax = axes[0, 0]
contour = ax.contourf(xx, yy, Z_lr, alpha=0.75, cmap="coolwarm", levels=20)
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap="coolwarm", edgecolors='k')
ax.set_title("图1:逻辑回归概率边界(Probability Boundary)")
# 图2:SVM - 间隔边界
ax = axes[0, 1]
contour = ax.contourf(xx, yy, Z_svm, alpha=0.75, cmap="Spectral", levels=20)
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap="Spectral", edgecolors='k')
ax.set_title("图2:SVM 间隔边界(Margin Boundary)")
# 图3:ROC 曲线比较
ax = axes[1, 0]
fpr_lr, tpr_lr, _ = roc_curve(y_test, y_prob_lr)
fpr_svm, tpr_svm, _ = roc_curve(y_test, y_prob_svm)
ax.plot(fpr_lr, tpr_lr, label="Logistic Regression (AUC={:.2f})".format(roc_auc_score(y_test, y_prob_lr)), color='red')
ax.plot(fpr_svm, tpr_svm, label="SVM (AUC={:.2f})".format(roc_auc_score(y_test, y_prob_svm)), color='blue')
ax.plot([0, 1], [0, 1], 'k--')
ax.set_title("图3:ROC 曲线比较")
ax.set_xlabel("假阳性率(False Positive Rate)")
ax.set_ylabel("真正率(True Positive Rate)")
ax.legend()
# 图4:决策边界样本分布叠加预测错误
ax = axes[1, 1]
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap="coolwarm", edgecolors='k', label='真实标签')
misclassified = y_test != y_pred_svm
ax.scatter(X_test[misclassified][:, 0], X_test[misclassified][:, 1], facecolors='none', edgecolors='black', s=100, label='SVM 错误分类')
ax.set_title("图4:SVM 误分类分析(Misclassified Points)")
ax.legend()
plt.tight_layout()
plt.show()
-1.png)
图1(逻辑回归概率边界):展示了逻辑回归模型输出的概率等值线,分类边界较为平滑,颜色表示属于正类的概率值,对远离边界的点依旧在建模考虑范围内。
图2(SVM 间隔边界):展示了 SVM 的判别函数输出,分类边界是间隔最大化的结果,注意中间清晰的“带状区域”是 margin 区域,支持向量决定了这个边界,远离边界的点没有影响。
图3(ROC 曲线):逻辑回归曲线整体向左上角靠近,AUC 值略高,SVM 的概率是经过 Platt Scaling 得到的,表现也不错但更依赖调参,可见两者都有不错的分类能力。
图4(误分类可视化):展示 SVM 模型在哪些点上发生了误分类,空心圆为预测错误的样本,多发生在边界附近或被噪声污染的数据点。
最终结论对比
适用场景建议
Logistic 回归适用场景:
需要清晰概率输出,如:
风险建模、信贷评分 医疗诊断(置信度解释) 需要可解释模型时:
特征权重分析,模型调试 数据特征线性可分或接近线性
SVM 适用场景:
特征维度高,样本数量中等,如:
文本分类、图像识别 对异常值不敏感要求高
关注分类边界精度而非概率
数据不易解释但边界清晰
整体来看,Logistic 回归倾向于拟合整体数据,构建平滑的概率决策边界;SVM 聚焦于边界附近的关键样本,优化几何间隔,边界更加清晰但缺乏概率语义;
在模型选择时应考虑:是否需要概率?是否对异常值敏感?是否需要可解释性?数据是否高维?
正确选择模型,是算法设计的第一步。在实验中,通过交叉验证、实验对比、任务需求匹配来选择合适的分类模型。
最后



- 点赞 (0)
-
分享
微信扫一扫
-
加入群聊
扫码加入群聊