逻辑回归:二分类问题的终极解法

张开发
2026/4/16 5:58:39 15 分钟阅读

分享文章

逻辑回归:二分类问题的终极解法
核心定位逻辑回归是解决二分类问题的经典有监督学习算法并非回归算法核心是将线性回归的无界输出映射为 0-1 之间的概率值通过概率阈值实现二分类判断。适用场景仅存在两个互斥类别如阳性 / 阴性、放贷 / 不放贷、正面 / 负面、是 / 否等。一、基础常数与函数核心规则1. 自然常数e逻辑回归专用数学公式所有数的 0 次幂均为 1临界值计算核心e 的负 a 次幂 1÷e 的 a 次幂Sigmoid 函数压缩的关键规则注释e自然常数无理数近似值e≈2.71828a任意实数逻辑回归中为线性分数z核心作用仅支撑Sigmoid函数的概率压缩逻辑是逻辑回归实现 “分数转概率”的数学基础。2. 自然对数log核心运算规则数学公式log(ab)logalogb对数的积 对数的和倒数的对数 对数的相反数注释log自然对数以e为底逻辑回归中所有对数均为此类a、b大于 0 的实数逻辑回归中为预测概率核心作用将 “概率乘法运算” 转为 “加法运算”简化模型计算且不改变结果极值保证参数优化结果不变。二、核心数学基础为模型推导服务2.1 概率基础条件 / 联合概率2.1.1 联合概率定义多个独立事件同时发生的概率用于计算 “所有样本同时预测准确” 的联合概率数学公式P(A∩B)P(A)×P(B)A、B相互独立事件 A 和 B 同时发生的概率 事件 A 发生的概率 × 事件 B 发生的概率核心作用用于计算多个样本同时被正确预测的联合概率是极大似然估计的计算基础。2.1.2条件概率事件 B 已发生时事件 A 发生的概率P(A∣B)是极大似然估计的理论基础。数学公式事件 B 发生后事件 A 发生的概率 A 和 B 同时发生的概率 ÷ 事件 B 发生的概率注释P(A|B)事件 B 为条件的事件 A 的条件概率P(A∩B)A、B 的联合概率核心作用为概率相关的模型推导提供理论基础是理解极大似然估计的前置知识。2.2 极大似然估计核心公式 推导逻辑2.2.1 核心思想根据观测到的样本结果反推最可能产生该结果的模型参数即找到参数θ(西塔)使样本观测结果出现的联合概率最大。2.2.2 单样本似然公式参数 θ 下样本 的似然值 参数 θ 已知时样本 出现的概率注释θ模型待估计的参数逻辑回归中为W和b参数 θ 下样本 的似然值2.2.3 多样本联合似然公式独立样本参数 θ 下所有样本的似然值 参数 θ 已知时每个样本出现的概率连乘注释X所有观测样本的集合单个样本m样本总数∏(派)连乘符号2.2.4 对数似然公式逻辑回归常用参数 θ 下的对数似然值 参数 θ 已知时每个样本出现概率的对数求和注释∑(西格玛)求和符号2.2.5 核心作用逻辑回归交叉熵损失函数的理论推导依据将 “求联合概率最大值” 转化为 “求对数似然最大值”最终等价于 “求交叉熵损失最小值”。2.3 逻辑回归交叉熵损失函数从极大似然推导2.3.1 推导前提逻辑回归中样本标签只有 0 和 1 两种取值模型预测样本为类别 1 的概率是预测为类别 0 的概率是 1−这两个概率可以用一个统一的公式来表示。数学公式在参数 W 和 b 下样本i是正例时它的预测概率就是「正例的概率」样本i是反例时它的预测概率就是「反例的概率」。注释样本 i 预测为正例的概率样本 i 的真实标签0 或 1W权重向量b偏置项2.3.2 多样本联合似然函数数学公式在参数 W 和 b 下所有样本的联合似然值就是把每个样本的「正确预测概率」连乘起来如果样本真实标签是 1正例就取「预测正例概率」如果样本真实标签是 0反例就取「1 - 预测正例概率」最后把所有样本的这个值相乘得到当前参数下的总似然值注释∏(派)连乘符号2.3.3 对数似然函数转化为加法数学公式在参数 W 和 b 下所有样本的总对数似然值就是把每个样本的预测概率的对数值加在一起如果样本真实标签是 1正例就取「预测正例概率的对数」如果样本真实标签是 0反例就取「1 减去预测正例概率的对数」最后把所有样本的这个值相加得到当前参数下所有样本的总对数似然值。2.3.4 通用核心评估逻辑所有似然值评估都遵循核心准则似然值越大 → 参数越优越能匹配真实数据似然值越小 → 参数越差与真实情况偏差越大极端情况似然值 1仅当所有样本的 “正确预测概率 1”完美预测是理论最优情况实际中极少出现似然值→0当大量样本的 “正确预测概率→0”严重误判参数完全不可用核心用途用于参数优化找使似然值最大的参数和参数对比哪个参数组合的似然值大哪个更优而非单独看绝对数值。当似然函数被转化为 “损失函数” 时比如逻辑回归的交叉熵损失会取 “负的对数似然值”此时评估标准反转损失函数越小 → 原似然值越大 → 参数越优但这不是 “似然值的评估标准变了”只是为了适配 “梯度下降最小化损失” 的优化逻辑本质还是在最大化似然值。2.3.5 交叉熵损失函数取负求最小数学公式在参数 W 和 b 下交叉熵损失就是把每个样本的「预测偏差对数」先求和再做两步转换得到最终损失如果样本真实标签是 1正例就取「预测正例概率的对数」如果样本真实标签是 0反例就取「1 - 预测正例概率的对数」先把所有样本的这个值相加得到总偏差对数再给总偏差对数取负号最后除以样本总数得到当前参数下的平均交叉熵损失核心逻辑损失值越小说明当前参数 W 和 b 对应的模型预测越贴近真实标签。注释m样本总数求平均损失消除样本数影响负号将 “最大化对数似然” 转化为 “最小化损失”适配梯度下降优化逻辑核心作用直接量化模型预测概率与真实标签的差异是逻辑回归模型训练的核心优化目标损失越小模型越优。三、逻辑回归核心模型推导按流程拆解步骤 1线性回归计算无界原始分数Logits单个样本数学公式样本 i 的线性分数 特征值 1× 权重 1 特征值 2× 权重 2… 特征值 n× 权重 n 偏置项注释/Z单个 / 所有样本的线性原始分数取值(−∞,∞)W权重向量n×1-为各特征对应权重代表特征对分类的影响程度正权重 特征值越大越易为正例单个样本特征向量1×nn为特征总数x整体特征矩阵样本数 ×nn为特征总数b偏置项常数调节分数基准值消除特征中心化影响⋅矩阵点乘本质为 “特征值 × 对应权重再求和”批量样本矩阵形式数学公式所有样本的分数矩阵 特征矩阵 × 权重向量 偏置项核心作用将样本特征按 “重要程度” 加权整合生成代表 “分类倾向” 的无界数值为后续概率转换做基础。步骤 2Sigmoid 函数分数→0-1 概率二分类核心1.公式数学公式样本 i 预测为正例的概率 1÷1e 的-次方注释第i个样本被预测为 ** 正例记为 1** 的概率取值(0,1) 样本为反例0的概率 1−Sigmoid 激活函数专用于逻辑回归的概率转换第i个样本的线性原始分数表示「e 的- 次方」本质是指数衰减项。当很大时趋近于 0趋近于 1正例概率高当很小时趋近于无穷大趋近于 0正例概率低它的作用是把线性分数平滑地压缩到 0∼1 区间形成可解释的概率值2.核心特性分数→概率的压缩逻辑原始分数取值特征预测概率分类倾向默认阈值 0.5→ ∞大正数→1几乎为正例1 0临界值0.5模棱两可无明确倾向→ −∞小负数→0几乎为反例03.分类判断规则设定概率阈值θ默认θ0.5可按业务调整若≥θ → 预测为正例1若θ → 预测为反例0。4.核心作用将无界的线性分数精准映射为 0-1 的概率值实现从 “数值回归” 到 “概率分类” 的核心跨越是逻辑回归实现二分类的关键。步骤 3梯度下降优化模型参数求最优W和b1.优化目标找到一组最优的权重W∗和偏置b∗使得训练集交叉熵损失L(W,b)达到最小值此时模型预测误差最小。2.核心逻辑将总损失L(W,b)视为以W和b为自变量的 “损失曲面”优化过程是从随机初始参数出发沿损失下降最陡的方向梯度反方向逐步调整参数直到损失不再明显下降收敛。3.核心概念梯度损失函数对参数的偏导数(、)代表损失在当前参数下 “变化最快的方向和速率”学习率α超参数一般取 0.001、0.01、0.1控制参数每次调整的 “步长”是梯度下降收敛的关键。公式 1计算梯度损失变化的最快方向偏置b的梯度数学公式在参数 W 和 b 下损失对偏置的梯度就是把每个样本的「预测概率与真实标签的差值」先求和再取平均值对每个样本 i计算「模型预测为正例的概率减去该样本的真实标签」将所有样本的这个差值从第 1 个到第 m 个依次相加得到差值总和最后将总和除以样本总数 m得到损失对偏置 b 的平均梯度注释损失函数对偏置b的偏导数梯度标量对所有样本的梯度取平均避免样本数量影响梯度大小所有样本「预测概率 - 真实标签」的差值之和用途这个梯度用于梯度下降更新偏置 b梯度的正负和大小指导我们如何调整 b 才能让交叉熵损失最小化。直观理解如果 (模型过度预测为正例)差值为正会推动 b 减小如果 模型漏预测正例差值为负会推动 b 增大最终让预测更贴近真实标签。权重W的梯度矩阵形式数学公式在参数 W 和 b 下损失对权重 W 的梯度是通过矩阵运算得到的平均梯度先计算所有样本的「预测概率矩阵减去真实标签矩阵 Y」得到误差矩阵再将特征矩阵 X 进行转置得到与误差矩阵做矩阵乘法将乘积结果除以样本总数 m得到损失对权重 W 的平均梯度公式 2参数迭代更新核心优化步骤偏置b的更新数学公式:新偏置 原偏置 - 学习率 × 损失对偏置的梯度权重W的更新数学公式:新偏置 原偏置 - 学习率 × 损失对偏置的梯度迭代训练过程将「线性分数计算→Sigmoid 概率转换→损失计算→梯度计算→参数更新」重复执行N次迭代次数如 1000、5000 次直到满足收敛条件总损失L(W,b)的变化量小于预设阈值如10−6达到预设的最大迭代次数。学习率α的关键注意α过小参数调整步长太小训练迭代次数过多模型收敛速度极慢α过大参数调整步长太大易 “冲过” 损失最小值导致损失震荡甚至无法收敛核心原则小步慢走逐步收敛。核心作用沿损失下降方向迭代调整权重W和偏置b找到使总损失最小的最优参数实现模型的自我优化。四、二分类模型评估指标基于混淆矩阵评估的核心是基于混淆矩阵的 4 个基础指标衍生出适配不同业务场景的评估指标准确率并非万能指标类别不平衡时会失真。前置混淆矩阵 4 个基础指标定义针对二分类正例 1反例 0总样本数 TPFNFPTNTP真正例真实为 1预测为 1FN伪反例真实为 1预测为 0漏判FP伪正例真实为 0预测为 1误判TN真反例真实为 0预测为 0。预测正例预测反例真实正例TP真正例FN伪反例真实反例FP伪正例TN真反例1. 准确率Accuracy数学公式准确率 真正例 真反例÷ 总样本数注释Acc准确率取值[0,1]越接近 1整体预测越准适用场景仅适用于正 / 反例样本数量相近的类别平衡场景类别不平衡时无参考价值。2. 精确率Precision / 查准率数学公式精确率 真正例 ÷真正例 伪正例注释P精确率取值[0,1]越接近 1正例预测越准适用场景核心解决“误判”问题如健康人被诊断为癌症、正常用户被判定为欺诈。3. 召回率Recall / 查全率数学公式召回率 真正例 ÷真正例 伪反例注释R召回率取值[0,1]越接近 1正例召回越全适用场景核心解决“漏判”问题如癌症患者未被诊断、欺诈用户未被识别。4. F1-score综合精确率 召回率数学公式F1 分数 2×精确率 × 召回率÷精确率 召回率注释F1F1 分数取值[0,1]越接近 1模型综合性能越好核心特性精确率和召回率的调和平均数比算术平均更侧重两个指标的低值一个指标低F1 分数必然低能平衡 “误判” 和 “漏判” 问题。5. ROC 曲线与 AUC 指标类别不平衡场景核心基础衍生指标真正率TPR数学公式真正率 真正例 ÷真正例 伪反例注释TPR真正率代表正例被正确预测的比例TPR 与召回率完全一致取值[0,1]越接近 1正例召回越全假正率FPR数学公式假正率 伪正例 ÷伪正例 真反例注释FPR假正率代表反例被错误预测为正例的比例ROC 曲线横轴假正率FPR纵轴真正率TPR含义反映模型在不同概率阈值θ下的分类性能曲线越靠近左上角 (0,1)模型性能越好随机猜测的 ROC 曲线过 (0,0) 和 (1,1) 的对角线AUC0.5。AUC 指标Area Under ROC Curve含义ROC 曲线与坐标轴围成的面积取值范围[0,1]指标解读AUC1完美分类器能完全正确区分正 / 反例0.5AUC1模型有一定分类能力AUC 越大性能越好AUC0.5模型分类能力等同于随机猜测AUC0.5模型分类能力差于随机猜测可反向预测改善。核心优势对类别不平衡的样本具有鲁棒性是类别不平衡场景下的核心评估指标。五、Sklearn 核心 API参数 方法 评估1. 逻辑回归核心 APIfrom sklearn.linear_model import LogisticRegression # 实例化模型 estimator LogisticRegression(solverliblinear, penaltyl2, C1.0, random_stateNone)关键参数说明核心必看参数取值 / 核心说明solver优化器梯度下降相关1. liblinear小数据集首选支持 L1/L2 正则2. sag/saga大数据集首选sag 仅支持 L2saga 支持 L1/L2penalty正则化类型l1/l2防止模型过拟合需与 solver 匹配C正则化力度的倒数C 越小→正则化越强C 越大→正则化越弱random_state随机种子保证实验结果可复现max_iter最大迭代次数默认 100若模型未收敛可增大如 1000模型常用方法estimator.fit(X_train, y_train)用训练集训练模型自动完成参数优化estimator.predict(X_test)预测测试集的类别标签0/1estimator.predict_proba(X_test)预测测试集的概率返回每个样本为 0 和 1 的概率estimator.score(X_test, y_test)计算测试集的准确率estimator.coef_获取训练后的权重向量Westimator.intercept_获取训练后的偏置项b。2. 评估相关 APIfrom sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, roc_auc_score, classification_report # 1. 混淆矩阵 confusion_matrix(y_true, y_pred) # y_true真实标签y_pred预测标签 # 2. 精确率/召回率/F1-scorepos_label指定正例标签如1 precision_score(y_true, y_pred, pos_label1) recall_score(y_true, y_pred, pos_label1) f1_score(y_true, y_pred, pos_label1) # 3. AUC值y_score可为预测概率或预测分数 roc_auc_score(y_true, y_score) # 4. 分类报告输出所有指标含样本数 classification_report(y_true, y_pred, target_names[反例, 正例])六、核心总结1. 关键结论必记逻辑回归是分类算法核心是 “线性回归 Sigmoid 激活函数”通过概率实现二分类并非回归算法交叉熵损失函数由极大似然估计推导而来模型训练的本质是寻找最优权重W和偏置b使交叉熵损失最小Sigmoid 函数的唯一作用是将无界线性分数映射为 0-1 概率自然常数e为其提供数学支撑对数函数用于简化概率连乘计算类别不平衡场景下准确率无参考价值需重点关注召回率、F1-score 或 AUC 指标其中 AUC 对不平衡样本鲁棒性最强梯度下降的核心是学习率α的选择小步慢走是保证模型收敛的关键学习率过大易震荡、过小收敛慢Sklearn 中 LogisticRegression 默认将少数类作为正例正则化类型penalty必须与优化器solver匹配否则会报错。七、电信客户流失预测案例案例流程数据清洗处理缺失值、类别特征one-hot编码特征筛选分析特征与标签的关系选择重要特征模型训练处理样本不平衡问题交叉验证调参模型评估精确率、召回率、AUC指标完整代码 案例电信用户流失预测 目的 1 演示逻辑回归的相关操作二分类流失 正样本 不流失 负样本 2 演示逻辑回归的评估操作 混淆矩阵 准确率 精准率 召回率 F1 ROC曲线的AUC值 分类评估报告 # 引入相关库 import pandas as pd # 引入DataFrame import seaborn as sns # 基于matplotlib的高级统计可视化库 import matplotlib.pyplot as plt # 引入matplotlib from sklearn.linear_model import LogisticRegression # 引入逻辑回归模型 from sklearn.model_selection import train_test_split # 引入数据集划分 from sklearn.metrics import (accuracy_score, # 准确率 precision_score, # 精准率 recall_score, # 召回率 f1_score, # F1 confusion_matrix, # 混淆矩阵 roc_curve, # ROC曲线 绘制ROC曲线 roc_auc_score, # 计算 ROC 曲线下的面积 衡量的是模型在不同的二分类阈值下的分类性能 下方面积越大模型性能越好 classification_report) # 详细分类评估报告 from sklearn.preprocessing import StandardScaler # 引入标准化 ## 数据准备 ###### # 读取数据集 churn_data pd.read_csv(file/churn.csv) # 查看数据集信息 # print(churn_data.info()) 当前发现 churn 和 gender列为字符串类型将其转为 bool型 gender -- gender_male gender_femail male 1 0 female 0 1 pd.get_dummies() 自动识别object类型 并对每个类别生成一个二进制列 churn_data pd.get_dummies(churn_data) # 对数据集进行one-hot编码 # print(churn_data.info()) # 去除冗余列 One-hot 编码后对于二分类的类别 churn yes /no 只要保留一列即可 gender列 同理 本项目中选择删除 Churn_no 以及 gender_male 列。 # 删除列, axis1 表示删除列, inplaceTrue 表示直接修改DataFrame churn_data.drop(columns[Churn_No, gender_Male], inplaceTrue, axis1) # print(churn_data.info()) # 重命名标签列使其语义更为清晰为了方便画柱状图 # 将 churn_yes 列重命名为 flag作为模型的目标变量1流失0未流失 churn_data.rename(columns{Churn_Yes: flag}, inplaceTrue) # print(churn_data.info()) # 打印标签类别统计信息 # normalizeTrue 表示将标签类别的个数转化为百分比,打印归一化的类别比例 value_counts churn_data.value_counts(normalize True) # 画柱状图 绘制月度会员的流失情况 sns.countplot(datachurn_data, xContract_Month, hueflag) plt.show() # 显示 ################################################################################## ######### 逻辑回归模型训练 ## 特征工程 # 特征提取 X churn_data[[Contract_Month,internet_other, PaymentElectronic]] # 特征列,必须二维 # 目标变量--标签列 y churn_data[flag] # 标签列, 二分类, 0正常1流失 # 数据集划分 # 划分比例 80% 训练集20% 测试集 # 划分数据集, stratifyy 按照标签列的分布进行划分保证训练集和测试集的标签分布一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # # 数据标准化提升模型性能数据量纲一致所以不需要标准化 # # 创建标准化对象 # transfer StandardScaler() # transfer.fit_transform(X_train[[MonthlyCharges]]) # 仅对月度会员的月度费用进行标准化 # transfer.transform(X_test[[MonthlyCharges]]) # 仅对月度会员的月度费用进行标准化 # 逻辑回归模型训练 # 定义模型 model LogisticRegression() # 训练模型 model.fit(X_train, y_train) # 模型预测 y_pred model.predict(X_test) print(模型预测结果\n, y_pred) print(真实结果\n, y_test) # 模型评估 accuracy_score, # 准确率 (TPTN)/(TPTNFPFN) 适合类别平衡时的模型分类性能评估 precision_score, # 精准率 TP/(TPFP) 所有检测出的阳性样本中有多少是正确的衡量模型的误报 recall_score, # 召回率 TP/(TPFN) 实际的正例中有多少被模型检测出 衡量的是模型的漏报 f1_score, # F1 (2*precision*recall)/(precisionrecall) F1 准确率召回率的调和平均值 confusion_matrix, # 混淆矩阵 roc_curve, # ROC曲线 绘制ROC曲线 roc_auc_score, # 计算 ROC 曲线下的面积 衡量的是模型在不同的二分类阈值下的分类性能 下方面积越大模型性能越好 classification_report # 生成详细的分类评估报告 print(准确率方法一\n, model.score(X_test, y_test)) print(准确率方法二\n, accuracy_score(y_test, y_pred)) print(精准率\n, precision_score(y_test, y_pred)) print(召回率\n, recall_score(y_test, y_pred)) print(F1\n, f1_score(y_test, y_pred)) print(混淆矩阵\n, confusion_matrix(y_test, y_pred)) print(ROC曲线\n, roc_curve(y_test, y_pred)) print(ROC曲线下的面积\n, roc_auc_score(y_test, y_pred)) print(详细分类评估报告\n, classification_report(y_test, y_pred)) # 绘制ROC曲线观察模型在各种二分类阈值下的分类性能 # 调用 predict_proba 输出测试集的预测概率 y_pred model.predict_proba(X_test) y_pred y_pred[:, 1] # 获取预测标签列 # 获取ROC曲线 # 参数1真实标签 # 参数2预测标签 # 返回结果fpr, tpr, thresholds假正例率真正例率阈值 fpr, tpr, thresholds roc_curve(y_test, y_pred) print(阈值, thresholds) # 绘制ROC曲线 # 横坐标(x)假正例率-fpr # 纵坐标(y)真正例率-tpr # 参数1横坐标 # 参数2纵坐标 # 参数3曲线颜色 # 参数4线宽 # 参数5曲线标签 plt.plot(fpr, tpr, colordarkorange, linewidth2, labelROC) # 绘制对角线 plt.plot([0, 1], [0, 1], colornavy, linewidth2, linestyle--) # 设置坐标轴 plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.0]) # 添加标题 plt.xlabel(FPR) plt.ylabel(TPR) plt.title(ROC曲线) # 设置中文显示 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False plt.show() print(AUC值\n, roc_auc_score(y_test, y_pred))

更多文章