哈喽,大家好~

咱们今天来聊聊SVM 和逻辑回归对比,在分类任务中边界建模与概率输出的选择。

在分类任务中,SVMLR都是非常常用的线性分类模型,但它们在边界建模方式概率输出处理上存在本质区别。

下面,咱们通过理论基础、优化目标、边界建模方式以及概率输出能力等等方面,详细聊聊~

1. 模型目标与损失函数

逻辑回归

逻辑回归是基于概率建模的线性分类模型,建模的是后验概率 

假设形式:

对于输入特征向量 ,逻辑回归模型为:

其中, 是 sigmoid 函数。

损失函数(对数似然):

逻辑回归使用极大似然估计,最大化数据的对数似然,相当于最小化交叉熵损失函数:

可以加上  正则化项,变为:

优点是模型输出为概率,适用于需要概率估计的任务(如排序、风险评估),在很多场景下需要解释的时候,非常容易,参数有明确的含义。

支持向量机(SVM)

SVM 是基于间隔最大化思想的判别模型。目标是学习一个超平面,使得样本离决策边界尽可能远,从而具有良好的泛化能力。

假设形式:

对线性可分情况,SVM 的超平面为:

预测类别为:

损失函数(合页损失):

线性不可分情况下,引入合页(hinge)损失函数,优化目标为:

其中, 是惩罚参数,控制软间隔。

SVM的优点:间隔最大化策略带来较强的泛化能力,对离群点有一定的鲁棒性。可以通过核函数处理非线性分类问题。

2. 边界建模:最大间隔 vs 概率边界

模型
分类边界思想
数学公式
目标函数主要驱动
分类边界特性
Logistic 回归
概率为 0.5 的分界线
 
使得 
概率正确性(最小化交叉熵)
关注整体现象,容忍离群点
SVM
最大间隔边界
,且最大化到最近点的距离
几何间隔最大化(加上合页损失)
关注边界附近的支持向量

从本质上说:逻辑回归关注整体数据的似然拟合。SVM只关注支持向量(靠近边界的样本),不关心边界远处的样本。

3. 概率输出能力比较

Logistic 回归概率输出,直接由模型输出:

SVM 的概率输出(需后处理),由于 SVM 输出的是一个距离边界的函数值 ,其输出值并不能解释为概率。

可通过 Platt Scaling 将其转换为概率:

其中    是通过对验证集拟合一个 sigmoid 函数得到的。

4. 公式总结

项目
Logistic 回归
SVM
模型形式
损失函数
优化目标
最小化交叉熵损失 + 正则
最大化间隔 + 合页损失
输出解释
概率值
边界距离(无概率含义)

完整案例

这里,结合一个可视化友好的二分类任务,对这两种模型进行深入比较:

  • 理论角度解析各自模型原理
  • 使用虚拟数据构建一个清晰边界
  • 绘制至少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() + 1500),
                     np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1500))
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(22, figsize=(1612))

# 图1:逻辑回归 - 概率边界
ax = axes[00]
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[01]
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[10]
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([01], [01], 'k--')
ax.set_title("图3:ROC 曲线比较")
ax.set_xlabel("假阳性率(False Positive Rate)")
ax.set_ylabel("真正率(True Positive Rate)")
ax.legend()

# 图4:决策边界样本分布叠加预测错误
ax = axes[11]
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 Regression
SVM
Accuracy
略高
稍低(视数据)
AUC
稍低(需校准)
可解释性
强(系数意义明确)
弱(边界依赖支持向量)
鲁棒性
一般
更强(不依赖远离边界的数据)
概率输出
原生支持
后处理支持

适用场景建议

Logistic 回归适用场景:

  • 需要清晰概率输出,如:

    • 风险建模、信贷评分
    • 医疗诊断(置信度解释)
  • 需要可解释模型时:

    • 特征权重分析,模型调试
  • 数据特征线性可分或接近线性

SVM 适用场景:

  • 特征维度高,样本数量中等,如:

    • 文本分类、图像识别
  • 对异常值不敏感要求高

  • 关注分类边界精度而非概率

  • 数据不易解释但边界清晰

整体来看,Logistic 回归倾向于拟合整体数据,构建平滑的概率决策边界;SVM 聚焦于边界附近的关键样本,优化几何间隔,边界更加清晰但缺乏概率语义;

在模型选择时应考虑:是否需要概率?是否对异常值敏感?是否需要可解释性?数据是否高维?

正确选择模型,是算法设计的第一步。在实验中,通过交叉验证、实验对比、任务需求匹配来选择合适的分类模型。

最后


宝子们!快来领取16大块的内容,124个算法问题的总结,完整的机器学习小册,免费领取~
资讯配图
领取:备注「算法小册」即可~
资讯配图
围观朋友圈,满满的干货!~