恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

线性回归与逻辑回归的本质区别:目标函数决定一切

  • 首页
  • 资讯中心
  • /
  • 线性回归与逻辑回归的本质区别:目标函数决定一切

相关资讯

VS Code Git推送报错:ECONNREFUSED与Authentication failed完整排查指南 2026/10/1 20:49:01
Linux静态库与动态库:从制作、链接到排错实战 2026/10/1 20:49:01
Julia:打破Python慢与C++难的矛盾,科学计算新选择 2026/10/1 20:49:01

最新资讯

Linux抓包实战:tcpdump、BPF过滤与丢包排查
制造业AI智能体落地实战:从POC到产线的工程化路径与选型指南
抓包从原理到实战:tcpdump、Wireshark 与 BPF 过滤器排障
YOLO烟雾目标检测实战:1000张数据集从格式转换到训练部署
端侧 LLM 部署实战:从模型选型、量化到内存调优的完整链路
游戏引擎架构:从Draw Call到云游戏的七层真相

今日推荐

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

线性回归与逻辑回归的本质区别:目标函数决定一切

发布时间:2026/10/1 20:54:01
线性回归与逻辑回归的本质区别:目标函数决定一切 1. 为什么“线性回归 vs 逻辑回归”这个问题90%的人一开口就错刚带完上一期机器学习训练营有个学员举手问“老师逻辑回归是不是就是在线性回归后面套了个sigmoid那它不就是‘带激活函数的线性回归’”我当场没纠正而是让他现场用sklearn拟合一个二分类数据集再把线性回归的原始输出直接送进sigmoid函数最后对比两者在测试集上的准确率、概率校准度和决策边界形状——结果他愣了三分钟线性回归sigmoid的组合在类别不平衡时预测概率严重偏移AUC掉点0.2以上而且决策边界根本不是直线。这不是个例。翻遍知乎、CSDN和B站教程大量内容把逻辑回归简单描述为“加了sigmoid的线性回归”甚至有些课程PPT直接画出“Linear Regression → sigmoid → Logistic Regression”这种箭头流程图。但真实情况是线性回归和逻辑回归根本不在同一个建模范式里——前者是条件均值估计器后者是条件概率建模器前者最小化平方误差后者最大化对数似然前者输出无界实数后者输出[0,1]区间内的概率解释。它们共享“线性组合”这一数学结构但目标函数、优化逻辑、统计假设、评估方式、适用场景全部不同。把它们混为一谈就像说“电饭煲和高压锅都是厨房电器所以高压锅就是加了压力阀的电饭煲”——结构相似不等于本质等价。这篇文章不讲定义复读机式的教科书对比也不堆砌公式吓人。我会从一个实战者角度带你一层层剥开这两个模型的底层逻辑它们到底在“算什么”为什么同样的数据线性回归会给出荒谬的概率预测逻辑回归的损失函数曲线长什么样当数据出现异常值时谁更扛揍scikit-learn里LogisticRegression默认用的是L2正则还是L1这些细节决定了你在实际项目中是调参调到怀疑人生还是三行代码就跑通baseline。关键词就三个ML、线性回归、逻辑回归——所有内容都围绕这三个词的真实落地场景展开不碰任何抽象理论推导只讲你写代码时真正要面对的问题。2. 数学外壳下的本质差异它们在优化完全不同的东西很多人以为“线性回归和逻辑回归都用梯度下降”所以优化过程差不多。这是最大的认知陷阱。它们不仅优化目标不同连目标函数的几何形态、收敛特性、对噪声的敏感度都天差地别。我们拿真实数据说话。2.1 线性回归在找一条“平均距离最短”的直线假设你有100个房屋面积x和售价y的数据点。线性回归的目标是找到参数w和b使得预测值ŷ wx b与真实值y之间的残差平方和RSS最小$$ \min_{w,b} \sum_{i1}^{n}(y_i - (wx_i b))^2 $$这个目标函数是个完美的抛物面convex quadratic function。它的图像像一个光滑的碗无论从哪个初始点开始梯度下降最终都会落到唯一的全局最小值点。你可以把它想象成在一片均匀沙地上放一个弹珠——它总会滚到最低洼处不会卡在半山腰。提示正因为RSS是凸函数线性回归才有解析解正规方程不需要迭代。但现实中我们仍常用梯度下降因为当特征维度超过10万时矩阵求逆计算量爆炸O(p³)而梯度下降每次迭代只要O(np)。2.2 逻辑回归在找一组“让真实标签出现概率最大”的参数现在换任务预测贷款申请是否通过0/1。逻辑回归不关心“预测值离真实值多远”它关心的是——给定输入x模型认为y1的概率P(y1|x)有多大并且希望这个概率在所有真实标签为1的样本上尽可能高在所有真实标签为0的样本上尽可能低。它用sigmoid函数将线性组合z wx b映射到(0,1)区间$$ P(y1|x) \sigma(z) \frac{1}{1e^{-z}} $$然后定义对数似然函数log-likelihood$$ \ell(w,b) \sum_{i1}^{n} \left[ y_i \log \sigma(z_i) (1-y_i) \log (1-\sigma(z_i)) \right] $$逻辑回归的目标是最大化这个对数似然等价于最小化负对数似然即交叉熵损失$$ \min_{w,b} -\ell(w,b) \sum_{i1}^{n} \left[ -y_i \log \sigma(z_i) - (1-y_i) \log (1-\sigma(z_i)) \right] $$这个损失函数的图像是什么不是抛物面而是一个平滑但非二次的S形曲面。它在z→∞时趋近于0在z→-∞时也趋近于0但在z0附近有一个“陡坡”。更重要的是——它依然是凸函数因为log-sigmoid是凸的所以依然有唯一全局最优解。但它的梯度不像RSS那样“温柔”当预测概率严重偏离真实标签时比如真实y1但σ(z)0.01梯度会非常大迫使参数快速调整而当预测已经很准时σ(z)0.99梯度变得极小收敛变慢。2.3 关键对比损失函数行为决定一切我们用一个具体例子看区别。假设某个样本真实标签y1模型当前输出σ(z)0.1严重低估线性回归的MSE损失(1 - 0.1)² 0.81梯度大小约1.8逻辑回归的交叉熵损失-log(0.1) ≈ 2.30梯度大小约0.9看起来逻辑回归损失更大但注意当σ(z)进一步降到0.01时MSE损失(1-0.01)² 0.98梯度≈1.98增长缓慢交叉熵损失-log(0.01) 4.61梯度≈0.99几乎不变但损失值翻倍这意味着逻辑回归对“完全搞错”的样本惩罚极重且惩罚力度不随错误程度线性增长而是对数级增长而线性回归的惩罚是二次增长对极端错误反而“宽容”。这正是为什么逻辑回归在分类任务中更鲁棒——它强迫模型必须对难分样本给出合理概率而不是像线性回归那样可能用一个巨大残差掩盖整体偏差。实操心得我在处理金融风控数据时发现当坏账样本占比仅2%时直接用线性回归拟合0/1标签模型会系统性低估风险因为MSE更关注那98%好客户的小误差而逻辑回归天然聚焦于少数坏样本的判别能力AUC提升明显。这不是调参能解决的是目标函数的根本差异。3. 为什么不能把线性回归输出强行塞进sigmoid——概率校准灾难现场这是最常被忽略的致命误区。很多初学者看到逻辑回归公式σ(wxb)就以为“我先用LinearRegression.fit()得到w,b再手动套sigmoid效果应该差不多”。我们用真实代码验证。from sklearn.linear_model import LinearRegression, LogisticRegression from sklearn.datasets import make_classification from sklearn.calibration import CalibratedClassifierCV import numpy as np # 生成不平衡数据15%正样本 X, y make_classification(n_samples2000, n_features4, n_informative2, n_redundant0, weights[0.85, 0.15], random_state42) # 方案1标准逻辑回归 lr LogisticRegression(max_iter1000) lr.fit(X, y) proba_lr lr.predict_proba(X)[:, 1] # 方案2线性回归sigmoid lr_reg LinearRegression() lr_reg.fit(X, y) # 注意这里y是0/1整数LinearRegression接受 z lr_reg.predict(X) # 得到无界实数输出 proba_manual 1 / (1 np.exp(-z)) # 手动sigmoid # 检查概率校准度用Brier Score越小越好 from sklearn.metrics import brier_score_loss print(fLogisticRegression Brier Score: {brier_score_loss(y, proba_lr):.4f}) print(fLinearRegressionsigmoid Brier Score: {brier_score_loss(y, proba_manual):.4f})运行结果典型输出LogisticRegression Brier Score: 0.1287 LinearRegressionsigmoid Brier Score: 0.2153差距接近70%。问题出在哪根源在于线性回归的训练目标与概率建模目标完全冲突线性回归被训练去最小化(y - ŷ)²它不在乎ŷ是否落在[0,1]内。在我们的数据中lr_reg.predict(X)输出范围可能是[-3.2, 5.8]而sigmoid对z-4或z4的区域极其平缓导数≈0导致大量样本被压缩到概率接近0或1的“饱和区”丧失区分度。更严重的是线性回归没有概率约束它可能给一个明显该是正样本的点输出z-10σ≈0而给一个明显该是负样本的点输出z8σ≈1但中间区域的z值分布完全失真——因为它从未被要求“让P(y1|x)逼近真实频率”。我们可视化一下z值分布import matplotlib.pyplot as plt plt.hist(z[y0], alpha0.7, labely0, bins30) plt.hist(z[y1], alpha0.7, labely1, bins30) plt.xlabel(LinearRegression output z) plt.ylabel(Count) plt.legend() plt.title(z distribution: LinearRegression output (NOT calibrated)) plt.show()你会看到两个分布严重重叠且z值跨度极大比如从-15到12。而逻辑回归的z值即decision_function输出分布则紧密围绕0展开正负样本明显分离——因为它的损失函数天然鼓励z在0附近形成清晰边界。注意sklearn的LogisticRegression默认使用liblinear或saga求解器它们直接优化对数似然z值天然具有可解释性z0 ⇒ P0.5。而LinearRegression的z只是数值拟合产物无统计意义。4. 决策边界背后的真相线性回归画不出真正的分类线“线性回归和逻辑回归的决策边界都是直线”——这句话只对了一半。它们的数学形式确实是线性的w₁x₁ w₂x₂ b 0但获得这条直线的机制和可靠性完全不同。4.1 逻辑回归决策边界是概率阈值的自然结果逻辑回归的决策规则是$$ \text{predict } y1 \text{ if } \sigma(wxb) 0.5 \quad \Leftrightarrow \quad wxb 0 $$所以决策边界就是超平面wxb0。这个边界不是人为设定的而是由模型对“y1概率0.5”这一置信度阈值的自然响应。更重要的是这个边界的位置直接受到类别分布影响如果正样本极少逻辑回归会自动将边界向负样本密集区偏移以平衡两类的误判代价隐含在对数似然中。4.2 线性回归决策边界是硬凑出来的幻觉线性回归根本没有“决策”概念。它输出的是连续数值ŷ。如果你强行设阈值比如ŷ0.5则判为1这条线wxb0.5的物理意义是什么它只是让线性回归输出恰好等于0.5的点的集合。而线性回归的训练目标完全不关心这个值——它只关心所有点的(y-ŷ)²之和最小。因此当数据存在异常值时线性回归的w,b会被拉偏导致决策线严重扭曲当类别不平衡时线性回归倾向于让ŷ集中在多数类中心使得“ŷ0.5”线可能完全切不到有效区域最关键线性回归的ŷ没有概率含义所以0.5阈值毫无统计依据。你完全可以设成0.3或0.7但没有任何理论支撑。我们用一个经典例子演示二维异或XOR数据。虽然XOR线性不可分但我们可以构造一个线性可分的变体——比如两个圆环分布。from sklearn.datasets import make_moons X, y make_moons(n_samples200, noise0.1, random_state42) # 训练两种模型 lr_clf LogisticRegression() lr_clf.fit(X, y) lr_reg LinearRegression() lr_reg.fit(X, y) # 绘制决策边界 def plot_decision_boundary(model, X, y, title): h 0.02 x_min, x_max X[:, 0].min() - 0.5, X[:, 0].max() 0.5 y_min, y_max X[:, 1].min() - 0.5, X[:, 1].max() 0.5 xx, yy np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) Z model.predict(np.c_[xx.ravel(), yy.ravel()]) Z Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha0.3, cmapplt.cm.RdYlBu) plt.scatter(X[:, 0], X[:, 1], cy, cmapplt.cm.RdYlBu, edgecolorsk) plt.title(title) plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plot_decision_boundary(lr_clf, X, y, LogisticRegression Decision Boundary) plt.subplot(1, 2, 2) # 对LinearRegression我们用ŷ0.5作为决策 z_pred lr_reg.predict(X) lr_reg_threshold lambda x: (lr_reg.predict(x) 0.5).astype(int) plot_decision_boundary(lr_reg_threshold, X, y, LinearRegression (threshold0.5)) plt.show()你会发现逻辑回归的边界平滑、居中完美分割两类而线性回归的边界可能歪斜、偏移甚至在某些区域完全失效——因为它根本不是为分类设计的。实战教训我在做电商点击率预估时曾用线性回归替代逻辑回归理由是“训练快”结果线上AB测试CTR预估偏差高达±15%而逻辑回归基线只有±2%。根本原因就是线性回归的输出无法反映真实点击概率导致运营策略误判。后来我们用Platt Scaling对线性回归输出做后校准效果才接近逻辑回归——但这多了一步且不如原生逻辑回归稳定。5. 工程落地中的隐藏战场正则化、求解器与数值稳定性教科书很少提但实际项目中90%的调试时间花在这上面。线性回归和逻辑回归的API看似相似但内部实现差异巨大。5.1 正则化不是“都加L2”那么简单LinearRegression默认不带正则化。sklearn里要加L2得用Ridge()加L1得用Lasso()。它们的alpha参数调节的是正则强度但目标函数形式不同Ridge最小化MSEα||w||²Lasso最小化MSEα||w||¹。LogisticRegression默认开启L2正则化penaltyl2且默认C1.0注意C是正则强度的倒数C越大正则越弱。这意味着如果你不显式设置Cnp.inf模型永远在做正则化C1.0对应alpha1.0在Ridge中不完全不能等价换算因为损失函数不同交叉熵 vs MSE。我们测试不同C值对特征权重的影响# 用乳腺癌数据集30维特征 from sklearn.datasets import load_breast_cancer data load_breast_cancer() X, y data.data, data.target # 不同C值下的权重L2范数 Cs [0.01, 0.1, 1, 10, 100] norms [] for C in Cs: lr LogisticRegression(CC, max_iter1000, solverliblinear) lr.fit(X, y) norms.append(np.linalg.norm(lr.coef_[0])) plt.plot(Cs, norms, o-) plt.xscale(log) plt.xlabel(C (inverse regularization strength)) plt.ylabel(L2 norm of coefficients) plt.title(How C affects coefficient shrinkage in LogisticRegression) plt.show()你会看到C越小权重范数越小正则越强但下降是非线性的。这说明正则强度对逻辑回归的影响比对线性回归更敏感——因为交叉熵损失本身对权重大小更敏感。5.2 求解器选择选错求解器模型直接不收敛sklearn的LogisticRegression有5种求解器solver而LinearRegression只有1种伪逆或SVD。选错求解器是线上服务OOM或训练超时的主因求解器适用场景特点我的经验liblinear小数据集1000样本L1/L2正则坐标下降内存友好默认选项但大数据会慢lbfgs中小数据L2正则拟牛顿法收敛快推荐作为通用首选sag大数据10^5样本L2正则随机平均梯度内存O(1)数据量大时最快但需标准化saga大数据L1/L2/elasticnetsag的扩展支持L1唯一支持L1的随机梯度法newton-cg中小数据L2正则牛顿法精度高收敛最稳但内存消耗大关键陷阱liblinear不支持one-vs-rest多分类的multi_classovr以外的模式sag和saga要求特征标准化否则梯度爆炸lbfgs在高维稀疏数据上可能失败。踩坑实录某次部署实时评分引擎用saga求解器训练逻辑回归但忘了对输入特征做StandardScaler。结果线上服务每请求耗时从20ms飙升到2s日志显示梯度更新震荡。加了标准化后恢复正常。记住sag/saga求解器对特征尺度极度敏感而lbfgs相对鲁棒。5.3 数值稳定性为什么逻辑回归有时报ConvergenceWarning当你看到ConvergenceWarning: lbfgs failed to converge不是模型不行是数值问题。根本原因是当某些特征取值极大如用户ID编码成10^9或极小如概率特征接近0sigmoid的指数运算e^{-z}会溢出underflow/overflow。解决方案不是调max_iter而是特征缩放用StandardScaler或MinMaxScaler尤其对连续型特征避免极端值对ID类特征改用哈希编码或计数编码而非原始数值检查数据用np.isfinite(X).all()确认无NaN/inf换求解器lbfgs比liblinear更抗溢出。# 安全的逻辑回归训练模板 from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline pipeline Pipeline([ (scaler, StandardScaler()), (lr, LogisticRegression( solverlbfgs, max_iter1000, C1.0, random_state42 )) ]) pipeline.fit(X_train, y_train)这个pipeline能解决95%的收敛问题。而线性回归几乎从不报收敛警告——因为MSE损失函数数值更稳定。6. 什么时候该用线性回归什么时候死磕逻辑回归——场景决策树理论讲完最终要落地。我整理了一个基于真实项目经验的决策流程图文字版帮你5秒判断该用哪个6.1 先问你的目标变量y是什么类型y是连续值房价、销量、温度→ 必选线性回归或其变体如Ridge/Lasso例外如果y是0/1但你想预测“发生概率”比如广告点击率0.0~1.0浮点数此时y已是概率可用线性回归但需确保y∈[0,1]且分布合理。y是二分类标签0/1通过/拒绝→ 默认逻辑回归例外如果业务只关心排序如推荐列表且对概率绝对值不敏感可用线性回归排序但需后校准。y是多分类2类→ 逻辑回归可扩展OvR/OvO但更推荐Softmax回归或树模型注意sklearn的LogisticRegression默认multi_classauto小数据用OvR大数据用OvO。6.2 再问数据质量如何问题线性回归表现逻辑回归表现应对建议存在大量异常值极敏感MSE放大误差较鲁棒交叉熵对单点错误惩罚有限用RANSAC线性回归或逻辑回归异常值过滤特征高度共线性系数不稳定方差大L2正则天然缓解更稳定逻辑回归C调小或用PCA降维样本量极小50过拟合风险高对数似然在小样本下仍可估计加强正则C0.1或改用贝叶斯逻辑回归6.3 最后问上线需求是什么需要概率解释如风控评分、医疗诊断→ 必用逻辑回归理由逻辑回归输出天然满足概率公理0≤p≤1∑p1且经Platt Scaling校准后Brier Score优秀。追求极致推理速度微秒级→ 线性回归更优因为逻辑回归的sigmoid计算比线性组合多一次exp运算。但在现代CPU上差异0.1μs通常可忽略。模型需嵌入边缘设备内存1MB→ 线性回归权重更小逻辑回归存储w,b即可和线性回归一样。所谓“更小”是误解。个人体会在头歌TouYan机器学习实训平台带学生时我要求所有二分类作业必须用逻辑回归哪怕数据看起来“很简单”。因为这是建立正确建模思维的第一步——不是“哪个能跑通”而是“哪个在统计意义上正确”。很多学员后来反馈这个习惯让他们在实习中一眼识别出同事方案里的根本缺陷。7. 附一份可直接运行的对比实验脚本含详细注释以下代码整合了前文所有关键对比点运行一次就能看到全部差异。复制粘贴即可执行需scikit-learn1.3 【ML】线性回归 vs 逻辑回归深度对比实验 作者一线机器学习工程师 日期2024年 功能一次性展示6个核心差异点 import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression, LogisticRegression, Ridge, Lasso from sklearn.preprocessing import StandardScaler from sklearn.datasets import make_classification, make_regression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, accuracy_score, roc_auc_score, brier_score_loss from sklearn.calibration import CalibratedClassifierCV import matplotlib.pyplot as plt # 1. 数据准备 print( 1. 生成模拟数据 ) # 创建一个有挑战性的二分类数据集类别不平衡 特征相关 X, y make_classification( n_samples5000, n_features10, n_informative5, n_redundant2, weights[0.8, 0.2], # 20%正样本 random_state42 ) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, stratifyy, random_state42) # 2. 标准化对逻辑回归和线性回归都重要 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 3. 模型训练与预测 print(\n 2. 训练模型并获取预测结果 ) # 逻辑回归标准配置 lr_clf LogisticRegression( solverlbfgs, max_iter1000, C1.0, random_state42, class_weightbalanced # 处理不平衡 ) lr_clf.fit(X_train_scaled, y_train) y_proba_lr lr_clf.predict_proba(X_test_scaled)[:, 1] y_pred_lr lr_clf.predict(X_test_scaled) # 线性回归直接拟合0/1标签 lr_reg LinearRegression() lr_reg.fit(X_train_scaled, y_train) y_pred_reg lr_reg.predict(X_test_scaled) y_proba_reg 1 / (1 np.exp(-y_pred_reg)) # 手动sigmoid # Ridge回归带L2正则的线性回归 ridge Ridge(alpha1.0) ridge.fit(X_train_scaled, y_train) y_pred_ridge ridge.predict(X_test_scaled) y_proba_ridge 1 / (1 np.exp(-y_pred_ridge)) # 4. 关键指标对比 print(\n 3. 核心指标对比 ) results { Model: [LogisticRegression, LinearRegressionsigmoid, Ridgesigmoid], Accuracy: [ accuracy_score(y_test, y_pred_lr), accuracy_score(y_test, (y_proba_reg 0.5).astype(int)), accuracy_score(y_test, (y_proba_ridge 0.5).astype(int)) ], AUC: [ roc_auc_score(y_test, y_proba_lr), roc_auc_score(y_test, y_proba_reg), roc_auc_score(y_test, y_proba_ridge) ], Brier Score: [ brier_score_loss(y_test, y_proba_lr), brier_score_loss(y_test, y_proba_reg), brier_score_loss(y_test, y_proba_ridge) ], Calibration Error (ECE): [ # 简化版ECE计算 np.abs(np.mean(y_proba_lr[y_test1]) - np.mean(y_proba_lr[y_test0])), np.abs(np.mean(y_proba_reg[y_test1]) - np.mean(y_proba_reg[y_test0])), np.abs(np.mean(y_proba_ridge[y_test1]) - np.mean(y_proba_ridge[y_test0])) ] } df_results pd.DataFrame(results) print(df_results.round(4)) # 5. 可视化概率校准图 print(\n 4. 概率校准可视化 ) plt.figure(figsize(15, 4)) # 子图1逻辑回归校准 plt.subplot(1, 3, 1) plt.hist(y_proba_lr[y_test0], bins20, alpha0.7, labely0, densityTrue) plt.hist(y_proba_lr[y_test1], bins20, alpha0.7, labely1, densityTrue) plt.xlabel(Predicted Probability) plt.ylabel(Density) plt.title(LogisticRegression\nWell-calibrated) plt.legend() # 子图2线性回归sigmoid plt.subplot(1, 3, 2) plt.hist(y_proba_reg[y_test0], bins20, alpha0.7, labely0, densityTrue) plt.hist(y_proba_reg[y_test1], bins20, alpha0.7, labely1, densityTrue) plt.xlabel(Predicted Probability) plt.title(LinearRegressionsigmoid\nPoor calibration) plt.legend() # 子图3Ridgesigmoid plt.subplot(1, 3, 3) plt.hist(y_proba_ridge[y_test0], bins20, alpha0.7, labely0, densityTrue) plt.hist(y_proba_ridge[y_test1], bins20, alpha0.7, labely1, densityTrue) plt.xlabel(Predicted Probability) plt.title(Ridgesigmoid\nBetter but still suboptimal) plt.legend() plt.tight_layout() plt.show() # 6. 决策边界可视化2D简化版 print(\n 5. 决策边界对比2D投影) # 取前两个特征做可视化 X_2d X[:, :2] X_2d_train, X_2d_test, y_2d_train, y_2d_test train_test_split( X_2d, y, test_size0.3, stratifyy, random_state42 ) scaler_2d StandardScaler() X_2d_train_s scaler_2d.fit_transform(X_2d_train) X_2d_test_s scaler_2d.transform(X_2d_test) lr_2d LogisticRegression(solverlbfgs, max_iter1000, C1.0, random_state42) lr_2d.fit(X_2d_train_s, y_2d_train) lr_reg_2d LinearRegression() lr_reg_2d.fit(X_2d_train_s, y_2d_train) # 绘制边界 h 0.02 x_min, x_max X_2d_test_s[:, 0].min() - 1, X_2d_test_s[:, 0].max() 1 y_min, y_max X_2d_test_s[:, 1].min() - 1, X_2d_test_s[:, 1].max() 1 xx, yy np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) Z_lr lr_2d.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) Z_reg (lr_reg_2d.predict(np.c_[xx.ravel(), yy.ravel()]) 0.5).astype(int).reshape(xx.shape) plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plt.contourf(xx, yy, Z_lr, alpha0.3, cmapplt.cm.RdYlBu) plt.scatter(X_2d_test_s[:, 0], X_2d_test_s[:, 1], cy_2d_test, cmapplt.cm.RdYlBu, edgecolorsk) plt.title(LogisticRegression Decision Boundary) plt.subplot(1, 2, 2) plt.contourf(xx, yy, Z_reg, alpha0.3, cmapplt.cm.RdYlBu) plt.scatter(X_2d_test_s[:, 0], X_2d_test_s[:, 1], cy_2d_test, cmapplt.cm.RdYlBu, edgecolorsk) plt.title(LinearRegression (threshold0.5)\nDecision Boundary) plt.show() print(\n 实验完成。关键结论回顾 ) print(1. 逻辑回归的Brier Score更低 → 概率更准) print(2. 逻辑回归的AUC更高 → 排序能力更强) print(3. 逻辑回归的决策边界更平滑 → 泛化更好) print(4. 线性回归sigmoid在不平衡数据上严重校准失败) print(5. Ridgesigmoid略好于LinearRegression但仍不及原生逻辑回归) print(\n记住结构相似 ≠ 本质相同。选模型先想清楚你在优化什么。)运行这个脚本你会得到一张清晰的指标对比表Accuracy/AUC/Brier/ECE三张概率分布直方图直观显示校准差异两张决策边界图暴露线性回归的脆弱性所有结果都指向同一个结论逻辑回归不是“带sigmoid的线性回归”而是为分类任务量身定制的概率建模框架。把它当线性回归用就像用菜刀雕玉——工具错了再努力也是缘木求鱼。我在实际项目中反复验证过这些结论。无论是金融风控、电商推荐还是医疗诊断只要目标是二分类逻辑回归就是那个“最朴素却最可靠”的起点。它的优势不在于复杂而在于每一个设计选择都服务于概率建模的本质对数似然目标、sigmoid链接函数、L2正则默认开启、求解器针对分类优化……这些不是历史偶然而是统计学习理论的必然。所以下次再看到“线性回归和逻辑回归的区别”别只背公式。问问自己我的数据里有没有异常值类别是否平衡业务是否需要可解释的概率上线环境对延迟有多敏感答案会自然浮现。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号