开始之前我想先捋一捋学习思路,如果你看了前面的文章我是十分建议你花几分钟来看一看的!如果只是了解查看相关知识点内容,可以直翻到下面的知识点目录
那么好,按照我们的惯例,捋一捋今天的逻辑回归 —— 咱不整那些绕人的学术词,就像唠家常似的把事儿说透!在开始之前提点小建议,内容重在理解,最重要的是要搞明白学了什么东西解决了什么问题,还有一个次重要的:就是你怎么去调API去解决相应的问题~
首先:别被 “回归” 骗了,这货是搞分类的!
咱先掰扯个关键事儿:之前学线性回归是 真・回归,比如猜房价、算销售额,输出的是没边儿的数;但今天这 “逻辑回归”,名儿带 “回归”,实则是个分类选手!啥叫分类?就是给东西贴标签 —— 比如判断邮件是不是垃圾邮件、病人得的是良性肿瘤还是恶性、用户点不点广告,结果就俩选项,非黑即白(当然也可能是多色,但主要玩二分类)。
咱从最实际的需求开始:之前学了线性回归能猜房价这种 “连续数”,但生活里更常遇到 “判断是 / 否” 的分类问题 —— 比如这封邮件是不是垃圾邮件、这个肿瘤良不良性、用户会不会点广告。这时候线性回归就不够用了:它输出的数能从负无穷到正无穷,没法直接对应 “是 / 否”,总不能说 “有 120% 的概率是垃圾邮件” 吧?所以才需要逻辑回归 —— 它就是专门解决这种二分类问题的模型,核心目的就是把线性回归的输出,转成 0-1 之间的 “概率”,方便判断 “属于某一类的可能性有多大”。
但逻辑回归咋把线性输出转成概率呢?线性回归的输出是 “wx+b”,这数没范围,所以得找个工具把它 “拧” 到 0-1 区间里 —— 这就需要sigmoid 函数。你想啊,要是线性输出 “wx+b” 很大(比如邮件里全是 “免费领奖” 这种垃圾词),sigmoid 就能把它转成接近 1 的概率(大概率是垃圾邮件);要是 “wx+b” 很小,就转成接近 0 的概率(大概率不是);刚好等于 0 的时候,输出 0.5,这就成了默认的 “分界线”—— 概率超 0.5 算正例,低于算反例。所以 sigmoid 的作用很明确:解决了线性输出无法表示 “概率” 的问题,让逻辑回归能输出直观的分类依据。
有了概率预测,接下来就得知道 “预测得准不准”—— 比如真实是垃圾邮件(标签 1),模型只预测 0.2 的概率,这误差咋衡量?之前线性回归用的是 MSE(均方误差)等等(还有俩就不细说了嗷),但在逻辑回归里不好使:因为 sigmoid 是 nonlinear(非线性)的,用 MSE 会让损失函数变成 “过山车”,到处是小山坡(局部最优),模型训的时候容易卡在半道,找不到真正的最小误差。这时候就需要“对数损失函数”—— 它是从 “让模型预测的概率尽可能贴近真实标签” 这个需求来的,而且它(对数损失函数)的图像是 “光滑的碗”(对数的函数图像,不懂奖励自己两巴掌),不管从哪开始往下滑,都能滑到碗底(全局最优,是不是也相当于下山问题 <_<),不会卡壳。所以对数损失的出现,就是为了解决 MSE 在逻辑回归中 “非凸、易局部最优” 的问题,给模型找一个靠谱的 “误差衡量标准”。
知道了用"对数损失"衡量误差,下一步就是找 “能让这个损失最小的参数”(也就是 wx+b 里的 w 和 b)—— 之前学过正规方程,能直接算出线性回归的最优参数,但到了逻辑回归(或者数据量大、特征多的情况),正规方程就歇菜了:要么算起来特别慢,要么数据维度太高根本算不出来。这时候就需要梯度下降—— 它不用一次性算出最优解,而是像从山顶往山脚走,每次都往 “最陡的方向”(也就是导数 / 偏导数指的方向)迈一小步,慢慢逼近最低点(最小损失)。所以梯度下降的作用,就是解决了正规方程 “大数据 / 高维数据算不动” 的问题,让逻辑回归能在实际场景中高效找到最优参数,你看,这不是又来了嘛。
等模型用梯度下降训好,有了能最小化对数损失的参数,新问题又来了:这模型实战到底行不行?只看 “准确率”(对的样本数 / 总样本数)不够 —— 比如癌症诊断里,漏诊(把恶性肿瘤判成良性)比误诊(把良性判成恶性)严重多了,但准确率没法区分这两种错;再比如电信流失预测,100 个客户里只有 10 个流失,模型全判 “不流失”,准确率也有 90%,但这模型根本没用。所以得先搞清楚 “错在哪”,这就需要混淆矩阵—— 它能清晰列出 “真阳性(对的正例)、假阳性(错的正例)、真阴性(对的反例)、假阴性(错的反例)”,让我们知道是漏诊多还是误诊多。现在搞明白弄了半天的真正丽,真假丽是啥了吧,听课的时候就这儿麻瓜!
但混淆矩阵只是 “列数据”,还得有能针对性评估的指标(这里还蛮重要的,要理解下):
怕误诊(比如广告投放,不想给不想点击的人推广告),就看精确率—— 它算的是 “预测成正例的样本里,真正是正例的比例”,能减少 “把反例错判成正例” 的问题;
怕漏诊(比如癌症诊断,不想漏掉恶性病例),就看召回率—— 它算的是 “真实是正例的样本里,被正确预测的比例”,能减少 “把正例错判成反例” 的问题。
可这俩指标经常打架:想少漏诊就得放宽判断标准,结果误诊变多;想少误诊就得收紧标准,结果漏诊变多。这时候就需要F1-score—— 它是精确率和召回率的 “折中值”,能平衡两者,解决了 “单一指标无法兼顾两种错误” 的问题。
要是想知道模型整体的 “分辨能力”(比如能不能稳定区分正例和反例),精确率、召回率还不够,这就需要ROC 曲线和 AUC 值:ROC 曲线画的是 “假正例率(误诊率)” 和 “真正例率(召回率)” 的关系,AUC 是曲线下面的面积 ——AUC 越接近 1,说明模型在 “少误诊” 和 “少漏诊” 之间平衡得越好,分辨能力越强;AUC=0.5 就跟瞎蒙没区别。所以 ROC-AUC 解决了 “无法评估模型整体分辨能力” 的问题,尤其适合数据不平衡的场景(比如流失客户少、正常客户多),老师说:在实际应用开发中,后端的同志啊,也鲜有人去搞这个来观测模型调试的到底如何。
到了实际用逻辑回归做项目(比如癌症分类、电信流失预测),又会遇到新问题:数据里有 “性别”“合约类型” 这种文字特征,电脑看不懂,所以得用one-hot 编码把文字转成 0 和 1(比如 “男”=1、“女”=0),解决了 “类别特征无法输入模型” 的问题;而且逻辑回归对特征尺度很敏感 —— 比如 “月消费” 是几十到几百,“使用时长” 是几百到几千,模型会偏向数值大的特征,所以得做标准化,把所有特征调成 “均值 0、方差 1” 的尺度,解决了 “特征尺度不一影响模型判断” 的问题;另外模型训得太细,会在训练数据上表现好、新数据上表现差(过拟合),所以得用正则化(比如 LogisticRegression 里的 penalty 参数),给参数 “上紧箍咒”,防止某特征权重太大,解决了 “模型过拟合、泛化能力差” 的问题。
解决一下正则化概念问题:
正则化是机器学习中通过修改学习算法来降低模型泛化误差的技术,通过向目标函数添加参数约束或惩罚项,在减少方差的同时控制偏差增长,从而提高模型对新数据的适应能力。
L1与L2正则化的核心区别:
L1正则化通过绝对值惩罚减少参数的绝对值总和,倾向于将不重要的参数压缩至0(即产生稀疏权重矩阵),常用于特征选择和降维。其优化过程容易使部分参数直接变为0,适合处理高维数据。
L2正则化通过平方和惩罚减少参数平方的总和,倾向于均匀缩小参数规模但不会将其压缩至0。其优化过程参数更新与当前参数值成正比,适合需要平滑参数分布的场景。
应用场景差异
- L1更适合需要特征选择的场景(如逻辑回归),通过稀疏化参数实现自动特征筛选。
- L2适用于需要平滑参数分布的场景(如线性回归),可避免参数过大导致的过拟合。
你看,从 “需要分类→逻辑回归→sigmoid转概率→对数损失衡量误差→梯度下降找最优参数→混淆矩阵看错误→精确率 / 召回率 / F1 针对性评估→ROC-AUC 看整体能力→one-hot / 标准化 / 正则化解决实战问题”,每个概念都是因为前一个环节有 “解决不了的问题” 才出现的,又为后一个环节铺了路 —— 没有孤立的知识点,全是顺着需求串起来的。
为啥非得整个逻辑回归干分类?你想啊,要是直接用线性回归搞分类,线性回归输出能从负无穷到正无穷,咋对应 “是 / 否” 这种结果?总不能说 “有 120% 的概率是垃圾邮件” 吧?这不扯嘛!所以得整个新法子,把那没边儿的数 “摁” 到 0 到 1 之间,这就有了逻辑回归的核心操作。
我觉得有必要这小节最核心的代码放在最前面:学会该调什么函数来解决问题!
#核心代码
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, \
classification_report
def dm1_数据预处理():
pass
# 1.加载数据
data = pd.read_csv('05逻辑回归/churn.csv')
# 2. 标签:客户流失情况(Churn),统计:value_counts
counts = data.value_counts('Churn')
# print(counts)
# 3.热编码(get_dummies):字符串类型(churn 、 gender)
dummies = pd.get_dummies(data)
# print(dummies)
# 4.热编码后删除多余的字段
dummies.drop(columns=['Churn_No', 'gender_Female'], inplace=True)
# print(dummies)
# 5.修改标签的名字
dummies.rename(columns={"Churn_Yes": "Churn", "gender_Male": "gender"}, inplace=True)
print(dummies)
def dm2_逻辑回归模型训练与评估():
pass
# 1.加载数据
data = pd.read_csv('逻辑回归/churn.csv')
# 2. 标签:客户流失情况(Churn),统计:value_counts
# counts = data.value_counts('Churn') # print(counts)
# 3.热编码(get_dummies):字符串类型(churn 、 gender)
# dummies = pd.get_dummies(data)
# 4.热编码后删除多余的字段
# dummies.drop(columns=['Churn_No', 'gender_Female'], inplace=True)
# print(dummies) # 5.修改标签的名字
# dummies.rename(columns={"Churn_Yes": "Churn", "gender_Male": "gender"}, inplace=True)
# print(dummies)
# 6、选择特征 (找业务去确定)
x = data[['PaymentElectronic', 'Contract_Month', 'MonthlyCharges']]
y = data['Churn']
print(x, y)
# 训练集和测试切分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=20)
# 模型训练,预测: LogisticRegression
model = LogisticRegression()
model.fit(x_train, y_train)
y_predict = model.predict(x_test)
# #模型评估
# print('准确分:', accuracy_score(y_test, y_predict))
# 分类评估报告
print('分类评估报告:\n', classification_report(y_test, y_predict))
if __name__ == '__main__':
# dm1_数据预处理()
dm2_逻辑回归模型训练与评估()
1. 逻辑回归概述
1.1 定义与核心思想
逻辑回归是一种分类模型(主要解决二分类,也可扩展至多分类),核心逻辑是:
-
先通过线性函数(类似线性回归)计算特征的加权和;
-
再通过sigmoid 激活函数将线性输出映射到
[0,1]区间,得到样本属于某一类别的概率; -
设置阈值(如 0.5),概率大于阈值则归为正例,否则归为负例。
1.2 典型应用场景
- 二分类任务:疾病诊断(新冠阳性 / 阴性)、情感分析(正面 / 负面评价)、金融风控(放贷 / 不放贷)、广告点击率预测(点击 / 不点击)等。
2. 核心数学基础
2.1 sigmoid 函数(关键映射工具)
1. 公式与作用
s i g m o i d ( x ) = 1 1 + e − x sigmoid(x) = \frac{1}{1+e^{-x}} sigmoid(x)=1+e−x1
-
输入范围: ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞)(线性函数的输出);
-
输出范围: ( 0 , 1 ) (0, 1) (0,1)(概率值),可直接对应 “样本属于正例的概率”。
2. 核心性质
-
单调递增:输入越大,输出概率越高;
-
拐点特性:当 x = 0 x=0 x=0 时, s i g m o i d ( 0 ) = 0.5 sigmoid(0)=0.5 sigmoid(0)=0.5(阈值的默认参考点);
-
导函数简洁: s i g m o i d ′ ( x ) = s i g m o i d ( x ) × ( 1 − s i g m o i d ( x ) ) sigmoid'(x) = sigmoid(x) \times (1 - sigmoid(x)) sigmoid′(x)=sigmoid(x)×(1−sigmoid(x)),便于后续求导优化。
2.2 概率与极大似然估计
1. 基础概率概念
-
联合概率:多个独立事件同时发生的概率(如 “周一早上堵车且周二早上堵车” 的概率 = 0.7×0.7=0.49);
-
条件概率:事件 A 在事件 B 已发生下的概率(如 “周一早上堵车时,中午堵车” 的概率 = 0.7×0.3/0.7=0.3)。
2. 极大似然估计(参数求解核心)
核心思想:从参数的所有可能值中,选择使 “观测到当前样本数据” 概率最大的参数值。
案例(硬币不均匀问题):
-
抛 6 次硬币,结果为 {正、反、反、正、正、正},求正面概率 θ \theta θ;
-
联合概率(似然函数): P ( D ∣ θ ) = θ × ( 1 − θ ) × ( 1 − θ ) × θ × θ × θ = θ 4 ( 1 − θ ) 2 P(D|\theta) = \theta \times (1-\theta) \times (1-\theta) \times \theta \times \theta \times \theta = \theta^4(1-\theta)^2 P(D∣θ)=θ×(1−θ)×(1−θ)×θ×θ×θ=θ4(1−θ)2;
-
求导找极值:令导数为 0,解得 θ = 2 / 3 \theta = 2/3 θ=2/3(即 “正面概率为 2/3 时,观测到当前结果的可能性最大”)。
3. 逻辑回归原理
3.1 假设函数(预测公式)
逻辑回归的预测函数由 “线性部分 + sigmoid 映射” 组成:
h ( w ) = s i g m o i d ( w x + b ) h(w) = sigmoid(wx + b) h(w)=sigmoid(wx+b)
-
w x + b wx + b wx+b:线性部分( w w w 为特征权重, b b b 为截距, x x x 为样本特征);
-
h ( w ) h(w) h(w):输出为样本属于正例的概率(如 h ( w ) = 0.6 h(w)=0.6 h(w)=0.6 表示样本有 60% 概率是正例)。
3.2 损失函数(模型优化目标)
逻辑回归不使用线性回归的 MSE 损失(因 sigmoid 非线性导致 MSE 非凸,易陷入局部最优),而是采用对数损失函数(基于极大似然估计推导),核心是最小化 “预测概率与真实标签的偏差”,保证损失函数为凸函数,可通过梯度下降等方法找到全局最优。
4. 逻辑回归与线性回归的区别
| 对比维度 | 线性回归 | 逻辑回归 |
|---|---|---|
| 核心作用 | 预测连续型目标值(如房价) | 预测分类型目标值(如是否患病) |
| 函数形式 | 线性函数: y = w x + b y = wx + b y=wx+b | 线性 + sigmoid: h ( w ) = s i g m o i d ( w x + b ) h(w)=sigmoid(wx+b) h(w)=sigmoid(wx+b) |
| 输出范围 | ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞) | ( 0 , 1 ) (0, 1) (0,1)(概率值) |
| 参数估计方法 | 最小化 MSE(均方误差) | 最大化似然估计(最小化对数损失) |
5. sklearn 逻辑回归 API
5.1 核心 API
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(solver='liblinear', penalty='l2', C=1.0)
5.2 关键参数说明
| 参数 | 含义与选择建议 |
|---|---|
solver | 损失函数优化方法:- 小数据集:liblinear(速度快,支持 L1/L2 正则);- 大数据集:sag/saga(批量梯度下降,效率高);- 仅支持 L2 正则:newton-cg/lbfgs。 |
penalty | 正则化类型:- l2(默认,防止过拟合,权重更平滑);- l1(适合特征筛选,可能产生稀疏权重)。 |
C | 正则化力度(与正则强度负相关):- C越小:正则越强,避免过拟合;- C越大:正则越弱,模型更贴合训练数据。 |
注意:API 默认将 “类别数量少的样本” 视为正例(如二分类中样本数少的类为正类)。
6. 实战案例
6.1 案例 1:癌症分类(良性 / 恶性)
1. 数据说明
-
699 条样本,11 列数据:第 1 列是 ID,第 2-10 列是医学特征,第 11 列是目标值(2 = 良性,4 = 恶性);
-
含 16 个缺失值(用
?标记)。
2. 核心流程与代码
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 1. 数据加载与预处理
data = pd.read_csv('data/breast-cancer-wisconsin.csv')
data = data.replace('?', np.NaN).dropna() # 处理缺失值
# 2. 特征与目标值分割
X = data.iloc[:, 1:-1] # 第2-10列(特征)
y = data['Class'] # 第11列(目标值)
# 3. 数据分割(训练集80%,测试集20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=21)
# 4. 特征标准化(逻辑回归对特征尺度敏感)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 5. 模型训练与预测
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 6. 模型评估(准确率)
print(f"准确率:{model.score(X_test, y_test):.2f}") # 或 accuracy_score(y_test, y_pred)
6.2 案例 2:电信客户流失预测
1. 数据说明
-
7043 条样本,21 个特征(如性别、合约时长、月消费等),目标值
Churn(1 = 流失,0 = 未流失); -
含类别型特征(需 one-hot 编码)。
2. 核心流程与代码
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score
from sklearn.model_selection import train_test_split
# 1. 数据加载与预处理
data = pd.read_csv('data/churn.csv')
# 类别特征one-hot编码,删除冗余列(Churn_No与Churn_Yes互斥,gender_Male与gender_Female互斥)
data = pd.get_dummies(data).drop(['Churn_No', 'gender_Male'], axis=1)
# 重命名目标列为flag(1=流失,0=未流失)
data.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
# 2. 特征筛选(选择对流失影响大的特征,如合约类型、付款方式)
X = data[['Contract_Month', 'PaymentMethod_Electronic check']]
y = data['flag']
# 3. 数据分割与模型训练
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=21)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 4. 模型评估(准确率+AUC值)
print(f"准确率:{accuracy_score(y_test, y_pred):.2f}")
print(f"AUC值:{roc_auc_score(y_test, y_pred):.2f}") # 评估正负例辨别能力
7. 分类模型评估方法
7.1 混淆矩阵(基础评估工具)
混淆矩阵是分类结果的 “全景图”,定义 4 个核心指标:
| 真实 \ 预测 | 正例(Positive) | 反例(Negative) |
|---|---|---|
| 正例 | TP(真正例) | FN(假反例) |
| 反例 | FP(假正例) | TN(真反例) |
案例(肿瘤预测):6 个恶性(正例)、4 个良性(反例)
-
模型 A:预测对 3 个恶性、4 个良性 → TP=3, FN=3, FP=0, TN=4;
-
模型 B:预测对 6 个恶性、1 个良性 → TP=6, FN=0, FP=3, TN=1。
7.2 精确率(Precision)与召回率(Recall)
1. 精确率(查准率)
-
定义:预测为正例的样本中,真正是正例的比例(关注 “预测准不准”);
-
公式: P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP + FP} Precision=TP+FPTP
-
案例:模型 A 精确率 = 3/(3+0)=100%,模型 B 精确率 = 6/(6+3)=67%。
2. 召回率(查全率)
-
定义:真实为正例的样本中,被正确预测为正例的比例(关注 “漏没漏”);
-
公式: R e c a l l = T P T P + F N Recall = \frac{TP}{TP + FN} Recall=TP+FNTP
-
案例:模型 A 召回率 = 3/(3+3)=50%,模型 B 召回率 = 6/(6+0)=100%。
7.3 F1-score(综合评估指标)
当精确率与召回率冲突时(如模型 B 精确率低但召回率高),用 F1-score 平衡两者:
-
公式: F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = \frac{2 \times Precision \times Recall}{Precision + Recall} F1=Precision+Recall2×Precision×Recall
-
案例:模型 A F1=2×100%×50%/(100%+50%)≈67%,模型 B F1=2×67%×100%/(67%+100%)≈80%。
7.4 ROC 曲线与 AUC 值
1. ROC 曲线
-
横轴(FPR):假正例率 = FP/(FP+TN)(反例被误判为正例的比例);
-
纵轴(TPR):真正例率 = TP/(TP+FN)(正例被正确预测的比例);
-
理想曲线:贴近左上角(FPR 小,TPR 大),完美分类时经过 (0,1) 点。
2. AUC 值
-
定义:ROC 曲线下方的面积,范围
[0,1]; -
意义:AUC 越大,模型对正负例的辨别能力越强(AUC=1 为完美模型,AUC=0.5 为随机模型)。

1974

被折叠的 条评论
为什么被折叠?



