06.逻辑回归学习笔记

开始之前我想先捋一捋学习思路,如果你看了前面的文章我是十分建议你花几分钟来看一看的!如果只是了解查看相关知识点内容,可以直翻到下面的知识点目录

那么好,按照我们的惯例,捋一捋今天的逻辑回归 —— 咱不整那些绕人的学术词,就像唠家常似的把事儿说透!在开始之前提点小建议,内容重在理解,最重要的是要搞明白学了什么东西解决了什么问题,还有一个次重要的:就是你怎么去调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 定义与核心思想

逻辑回归是一种分类模型(主要解决二分类,也可扩展至多分类),核心逻辑是:

  1. 先通过线性函数(类似线性回归)计算特征的加权和;

  2. 再通过sigmoid 激活函数将线性输出映射到 [0,1] 区间,得到样本属于某一类别的概率

  3. 设置阈值(如 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+ex1

  • 输入范围: ( − ∞ , + ∞ ) (-\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)×(1sigmoid(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 为随机模型)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter_Monster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值