【回归算法】广义线性模型(GLM)详解

广义线性模型(GLM)详解

前言

回归算法是机器学习中预测连续数值 的核心工具,比如预测房价、气温、产品销量等,而线性回归 是最基础的回归模型,核心用线性公式 y=ax+by=ax+by=ax+b 描述输入和输出的关系。

但现实场景的预测问题远更复杂:

  • 想预测某人患病的概率(0~1之间的数值)
  • 想预测商店一天卖出汉堡的个数(非负整数)
  • 想预测医疗费用(非负、右偏的连续值)

这些场景中,输出不再是简单的线性连续值,普通线性回归无法处理,而广义线性模型(Generalized Linear Model, GLM) 作为线性回归的通用扩展形式,完美解决了这类问题,是本科、研究生阶段必学的经典统计建模方法。

本文将从核心概念、数学原理、算法流程、实战案例、算法对比五个维度,用通俗易懂的语言讲解GLM,同时附带可直接运行的Python代码。

一、广义线性模型(GLM)核心认知

1. GLM的核心定义

GLM是对普通线性回归 的扩展,打破了线性回归的两大限制,使其能处理输出非连续、输入输出非线性 的预测问题,核心思想是:通过「链接函数」将线性预测结果与不同分布类型的输出变量关联起来

2. GLM相比线性回归的「广义」之处

普通线性回归的两个强约束:

  1. 输出变量y必须是连续数值,且服从正态分布;
  2. 输入和输出之间必须是直接的线性关系

GLM对这两个约束做了松绑:

  1. 输出类型无限制 :输出可以是概率(0~1)、整数计数、非负右偏值等,只需满足指数分布族即可;
  2. 引入链接函数 :不直接让输入的线性组合作为输出,而是通过链接函数对线性结果做变换,适配输出变量的分布特性。

3. GLM的两个经典应用案例

GLM的具体形式由输出分布链接函数决定,以下两个是本科/研究生阶段最常接触的GLM特例,也是工业界的常用模型:

(1)逻辑回归(Logistic Regression)
  • 适用场景:二分类问题(预测结果为0/1,如是否购买、是否患病)
  • 输出:0~1之间的概率值
  • 输出分布:伯努利分布(0-1分布)
  • 链接函数:logit函数(S型曲线,将线性结果映射到0~1区间)
  • 注意 :虽然名字带「回归」,但本质是分类算法,属于GLM的特例。
(2)泊松回归(Poisson Regression)
  • 适用场景:计数型预测问题(输出为非负整数,如一分钟电话呼入次数、每天商品销量)
  • 输出:非负整数
  • 输出分布:泊松分布
  • 链接函数:对数函数(log),避免预测结果为负数。

二、GLM的数学原理(本科/研究生易懂版)

GLM的数学模型由三大部分组成,这是理解GLM的核心,也是本科/研究生课程的考点,三个部分相互关联,缺一不可。

1. GLM的三大核心组件

(1)随机成分(Random Component)
  • 含义:响应变量(因变量)YYY的概率分布
  • 核心要求:YYY必须属于指数分布族(这是GLM的基本前提);
  • 作用:明确输出变量的分布特性,让模型贴合实际数据的规律。
(2)系统成分(Systematic Component)
  • 含义:自变量(特征)的线性组合 ,也叫线性预测函数
  • 数学形式:η=β0+β1x1+β2x2+⋯+βpxp=xTβ\eta=\beta_{0}+\beta_{1} x_{1}+\beta_{2} x_{2}+\cdots+\beta_{p} x_{p}=x^{T} \betaη=β0+β1x1+β2x2+⋯+βpxp=xTβ
  • 符号说明:
    • η\etaη:线性预测值(并非模型最终输出,需经链接函数变换);
    • xxx:输入特征向量(含所有自变量);
    • β\betaβ:待学习的权重参数向量(模型需要求解的核心);
  • 作用:保留线性模型的简洁性和可解释性,这是GLM相比纯非线性模型的优势。
  • 含义:连接线性预测值η\etaη和响应变量的期望值μ=E[Y]\mu=E[Y]μ=E[Y]的函数;
  • 数学形式:g(μ)=η⇔μ=g−1(η)g(\mu)=\eta \Leftrightarrow \mu=g^{-1}(\eta)g(μ)=η⇔μ=g−1(η)
  • 符号说明:
    • g(⋅)g(\cdot)g(⋅):链接函数(正向变换,将输出期望映射为线性值);
    • g−1(⋅)g^{-1}(\cdot)g−1(⋅):链接函数的逆函数(反向变换,将线性值映射为符合输出分布的期望);
  • 作用:架起线性预测和非线输出的桥梁,让线性模型能适配不同分布的输出变量。

2. GLM的整体数学形式

将三大组件结合,GLM的完整数学表达为:
Y∼指数分布族,g(E[Y])=xTβY \sim \text{指数分布族}, \quad g(E[Y])=x^T\betaY∼指数分布族,g(E[Y])=xTβ

一句话总结:响应变量服从指数分布族,且其期望值的链接函数等于自变量的线性组合

3. 指数分布族(Exponential Family)

GLM对输出分布的唯一要求是「属于指数分布族」,其通用数学形式 为:
fY(y;θ,ϕ)=exp(yθ−b(θ)ϕ+c(y,ϕ))f_{Y}(y ; \theta, \phi)=exp \left(\frac{y \theta-b(\theta)}{\phi}+c(y, \phi)\right)fY(y;θ,ϕ)=exp(ϕyθ−b(θ)+c(y,ϕ))

  • 符号说明:
    • θ\thetaθ:自然参数(核心参数,与输出期望μ\muμ一一对应);
    • ϕ\phiϕ:尺度参数(如方差、标准差的平方,用于控制分布的离散程度);
    • b(θ)b(\theta)b(θ):规范函数(保证分布的正则性,即概率和为1/积分值为1);
    • c(y,ϕ)c(y, \phi)c(y,ϕ):仅与(y)和(\phi)相关的函数,与核心参数(\theta)无关。
本科/研究生必记的4类指数分布族(附链接函数)

这4类是GLM最常用的分布,对应不同的业务场景,直接整理为表格,方便记忆和使用:

分布类型 链接函数g(μ)g(\mu)g(μ) 对应GLM模型 适用场景
正态分布 恒等函数g(μ)=μg(\mu)=\mug(μ)=μ 普通线性回归 输出为连续正态分布(如身高、体重)
伯努利分布 Logit函数g(μ)=ln(μ1−μ)g(\mu)=ln(\frac{\mu}{1-\mu})g(μ)=ln(1−μμ) 逻辑回归 二分类问题(输出0/1概率)
泊松分布 对数函数g(μ)=ln(μ)g(\mu)=ln(\mu)g(μ)=ln(μ) 泊松回归 计数型预测(输出非负整数)
伽马分布 倒数函数g(μ)=1μg(\mu)=\frac{1}{\mu}g(μ)=μ1 伽马回归 非负右偏连续值(如医疗费用、索赔金额)

4. GLM的参数求解:极大似然估计(MLE)

GLM的参数β\betaβ通过极大似然估计 (Maximum Likelihood Estimation, MLE)求解,核心思想是:找到一组参数β\betaβ,让观测到当前数据的概率最大

(1)似然函数与对数似然函数

给定n个独立样本(xi,yi)(x_i, y_i)(xi,yi),且yiy_iyi服从指数分布族,则联合似然函数 为:
L(β)=∏i=1nf(yi;θi,ϕ)L(\beta)=\prod_{i=1}^{n} f\left(y_{i} ; \theta_{i}, \phi\right)L(β)=∏i=1nf(yi;θi,ϕ)

由于连乘计算复杂,取对数转化为对数似然函数 (连乘变连加,不改变极值点):
ℓ(β)=∑i=1n[yiθi−b(θi)ϕ+c(yi,ϕ)]\ell(\beta)=\sum_{i=1}^{n}\left[\frac{y_{i} \theta_{i}-b\left(\theta_{i}\right)}{\phi}+c\left(y_{i}, \phi\right)\right]ℓ(β)=∑i=1n[ϕyiθi−b(θi)+c(yi,ϕ)]

关键关联 :θi\theta_iθi(自然参数)是μi=E[Yi]\mu_i=E[Y_i]μi=E[Yi]的函数,而μi=g−1(ηi)\mu_i=g^{-1}(\eta_i)μi=g−1(ηi),ηi=xiTβ\eta_i=x_i^T\betaηi=xiTβ,因此对数似然函数最终是参数(\beta)的函数

(2)求解思路:迭代加权最小二乘法(IRLS)

对对数似然函数求导并令其为0,可得到参数β\betaβ的解析解,但多数情况下(如逻辑回归、泊松回归)解析解难以直接求解,因此GLM通常使用迭代加权最小二乘法(Iteratively Reweighted Least Squares, IRLS) 进行数值逼近求解,这是本科/研究生需要理解的核心算法流程。

三、GLM的核心算法流程:IRLS迭代加权最小二乘法

IRLS的核心思想是:将非线性的GLM求解问题,转化为一系列加权线性回归的迭代问题 ,通过不断迭代更新参数β\betaβ,直到参数收敛(前后变化极小)。

以下是IRLS的详细步骤,步骤清晰且可落地,适配本科/研究生的理解难度:

步骤1:参数初始化

设定参数β\betaβ的初始值β(0)\beta^{(0)}β(0),一般设为全0向量(简单且易收敛)。

步骤2:计算各类中间变量

对每个样本iii,依次计算以下变量(核心是「工作变量」和「加权矩阵」):

  1. 线性预测值:ηi=xiTβ\eta_{i}=x_{i}^{T} \betaηi=xiTβ
  2. 输出期望:μi=g−1(ηi)\mu_{i}=g^{-1}(\eta_{i})μi=g−1(ηi)(链接函数的逆变换)
  3. 工作变量(伪响应变量):zi=ηi+yi−μidμidηiz_{i}=\eta_{i}+\frac{y_{i}-\mu_{i}}{\frac{d \mu_{i}}{d \eta_{i}}}zi=ηi+dηidμiyi−μi
    (dμidηi\frac{d \mu_{i}}{d \eta_{i}}dηidμi是μi\mu_iμi对ηi\eta_iηi的一阶导数,由链接函数决定)
  4. 权重系数:Wi=(dμidηi)2/Var(Yi)W_{i}=(\frac{d \mu_{i}}{d \eta_{i}})^{2} / Var(Y_{i})Wi=(dηidμi)2/Var(Yi)
    (Var(Yi)Var(Y_i)Var(Yi)是响应变量的方差,由其分布决定)
  5. 加权矩阵W:对角矩阵 ,主对角线元素为每个样本的WiW_iWi,非对角线元素为0。

步骤3:拟合加权最小二乘,更新参数

用加权最小二乘法求解新的参数β(t+1)\beta^{(t+1)}β(t+1),更新公式为:
β(t+1)=(XTWX)−1XTWz\beta^{(t+1)}=\left(X^{T} W X\right)^{-1} X^{T} W zβ(t+1)=(XTWX)−1XTWz

  • 符号说明:
    • X:设计矩阵(每行对应一个样本的特征向量);
    • z:工作变量向量(由所有样本的(z_i)组成);
    • W:步骤2得到的加权对角矩阵。

步骤4:迭代收敛

重复步骤2~步骤3 ,直到参数β\betaβ满足收敛条件 (如前后两次参数的差值的绝对值小于阈值10−610^{-6}10−6),此时的β\betaβ即为GLM的最优参数。

四、GLM实战案例:预测医疗保险费用(Python可直接运行)

案例背景

某保险公司希望根据被保险人的年龄、性别、BMI、是否吸烟、子女数、居住地区 等特征,预测其年度医疗保险费用

  • 问题难点:医疗费用是非负、右偏的连续值 ,不满足普通线性回归的正态分布假设,因此选用GLM(伽马分布+对数链接函数)建模;
  • 数据集:经典的Medical Cost Personal Dataset(开源可直接读取);
  • 工具:Python + pandas + statsmodels(统计建模专用,适合GLM实现)+ seaborn(可视化)。

完整代码(CSDN可直接复制,注释详细)

python 复制代码
# 导入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 全局设置:解决中文显示问题 + 可视化风格
plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文显示
plt.rcParams['axes.unicode_minus'] = False    # 负号显示
sns.set_style('whitegrid')
sns.set_palette("Set1")

# 1. 读取开源数据集(无需本地文件,直接在线读取)
df = pd.read_csv("https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/insurance.csv")

# 2. 数据预览与基本信息
print("数据集前5行:")
print(df.head())
print("\n数据集基本信息:")
print(df.info())
print("\n数据集描述性统计:")
print(df.describe())

# 3. 数据预处理
# 3.1 类别变量独热编码(sex/smoker/region),drop_first=True避免多重共线性
df_encoded = pd.get_dummies(df, drop_first=True)
# 3.2 划分特征(X)和目标变量(y)
X = df_encoded.drop("charges", axis=1)  # charges:年度医疗费用(目标)
y = df_encoded["charges"]
# 3.3 划分训练集(80%)和测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3.4 特征标准化(提高GLM训练的稳定性,避免量纲影响)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 4. 构建GLM模型:伽马分布 + 对数链接函数(适配非负右偏的医疗费用)
# 4.1 为训练集添加常数项(statsmodels建模需要)
X_train_const = sm.add_constant(X_train_scaled)
# 4.2 定义GLM模型
glm_gamma = sm.GLM(
    endog=y_train,          # 目标变量
    exog=X_train_const,     # 特征(含常数项)
    family=sm.families.Gamma(link=sm.families.links.log())  # 分布+链接函数
)
# 4.3 训练模型(IRLS算法自动求解)
result = glm_gamma.fit()
# 4.4 输出模型结果摘要(含参数、显著性、拟合指标)
print("\nGLM模型训练结果摘要:")
print(result.summary())

# 5. 模型预测
X_test_const = sm.add_constant(X_test_scaled)  # 测试集添加常数项
y_pred = result.predict(X_test_const)          # 预测医疗费用
# 输出测试集前10个真实值和预测值
pred_df = pd.DataFrame({"真实值": y_test.values[:10], "预测值": y_pred[:10].round(2)})
print("\n测试集前10个真实值vs预测值:")
print(pred_df)

# 6. 数据可视化分析(核心规律)
# 6.1 不同性别+吸烟状态的医疗费用分布
plt.figure(figsize=(8, 5))
sns.boxplot(data=df, x="sex", y="charges", hue="smoker")
plt.title("不同性别&吸烟状态的医疗费用分布", fontsize=14)
plt.xlabel("性别", fontsize=12)
plt.ylabel("年度医疗费用(美元)", fontsize=12)
plt.legend(title="是否吸烟")
plt.tight_layout()
plt.show()

# 6.2 年龄与医疗费用的关系(含吸烟标记)
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x="age", y="charges", hue="smoker", alpha=0.6, s=50)
sns.lineplot(data=df, x="age", y="charges", color="red", linewidth=2, label="整体趋势线")
plt.title("年龄与医疗费用的关系(吸烟/非吸烟)", fontsize=14)
plt.xlabel("年龄", fontsize=12)
plt.ylabel("年度医疗费用(美元)", fontsize=12)
plt.legend(title="是否吸烟")
plt.tight_layout()
plt.show()

# 6.3 真实值vs预测值散点图(评估模型拟合效果)
plt.figure(figsize=(8, 8))
sns.scatterplot(x=y_test, y=y_pred, alpha=0.6, s=50)
# 绘制对角线(完美预测线)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', linewidth=2, label="完美预测线")
plt.title("GLM模型:真实值vs预测值", fontsize=14)
plt.xlabel("真实医疗费用(美元)", fontsize=12)
plt.ylabel("预测医疗费用(美元)", fontsize=12)
plt.legend()
plt.tight_layout()
plt.show()

案例核心结果分析(本科/研究生重点理解)

  1. 模型拟合 :伽马分布+对数链接函数的GLM能很好地拟合非负右偏的医疗费用,参数摘要中P值(P>|z|)小于0.05的特征为显著特征(如是否吸烟、年龄、BMI);
  2. 数据规律
    • 吸烟是医疗费用的最核心影响因素,吸烟者的费用远高于非吸烟者;
    • 年龄与医疗费用呈正相关,且吸烟者的费用随年龄呈指数上升;
    • 性别对医疗费用的影响不显著,男女费用差异极小;
  3. 预测效果:真实值vs预测值的散点图越靠近对角线,说明模型拟合效果越好,GLM在该场景下的预测效果远优于普通线性回归。

五、GLM的优缺点(本科/研究生必记)

GLM作为经典的统计建模方法,优势和局限性都非常明确,适合在解释性优先、数据分布明确的场景下使用,以下整理为清晰的表格,方便记忆:

优点

优点 详细说明
适配非正态输出变量 打破线性回归的正态分布限制,支持指数分布族的所有分布(伯努利、泊松、伽马等)
链接函数灵活建模非线性 无需手动对特征做非线性变换,通过链接函数即可捕捉输入输出的非线性关系,同时保留线性模型的可解释性
模型可解释性极强 参数β\betaβ有明确的物理意义,可直接解释每个特征对输出的影响方向和强度(如吸烟使医疗费用增加XX倍)
训练高效、收敛稳定 基于IRLS算法求解,在中小型数据集上训练速度极快,且参数收敛性好,不易震荡
鲁棒性优于线性回归 对异常值的敏感度低于普通最小二乘(OLS)线性回归,尤其在伽马/泊松分布下更稳健

缺点

缺点 详细说明
本质仍是线性模型 仅能建模「链接函数下的线性关系」,无法自动捕捉特征间的复杂非线性交互(如吸烟×BMI×年龄的联合影响)
高度依赖分布假设 若输出变量不服从预设的指数分布族,模型拟合效果会大幅下降,预测偏差大
特征预处理要求高 类别变量需独热编码,连续变量需标准化/归一化,无法像树模型那样自动处理特征
需手动添加交互项/高阶项 若想建模复杂关系,必须手动构造特征交互项、多项式项,增加了模型设计的复杂度
对极端异常值仍敏感 虽优于线性回归,但仍会受少数极端值影响,尤其在数据量小、分布极度不平衡时

六、GLM与主流回归算法的对比(本科/研究生选型参考)

为了方便大家在实际场景中选择合适的回归算法 ,将GLM与本科/研究生阶段必学的线性回归、XGBoost/GBDT、随机森林、神经网络10个核心维度做对比,整理为表格,清晰直观:

对比维度 广义线性模型(GLM) 线性回归(OLS) XGBoost/GBDT 随机森林回归 神经网络回归(MLP)
支持非正态输出变量 ✅ 是(指数分布族) ❌ 否(仅正态) ✅ 是 ✅ 是 ✅ 是
显式建模输出分布 ✅ 是 ❌ 否 ❌ 否 ❌ 否 ❌ 否
模型可解释性 ⭐⭐⭐ 强 ⭐⭐⭐ 强 ⭐ 弱 ⭐ 弱 ⭐ 弱(黑箱)
建模非线性关系能力 ⭐⭐ 中等(链接函数) ⭐ 弱(仅线性) ⭐⭐⭐ 强(自动) ⭐⭐⭐ 强(自动) ⭐⭐⭐ 强(自动)
对缺失值的容忍度 ❌ 弱(需提前处理) ❌ 弱(需提前处理) ✅ 强(自动处理) ✅ 强(自动处理) ❌ 弱(需提前处理)
类别变量处理方式 需独热编码 需独热编码 可直接处理 可直接处理 需编码/嵌入层
支持非负输出变量 ✅ 是(如伽马/泊松) ❌ 否(可能预测负数) ✅ 是 ✅ 是 ✅ 是(激活函数)
对异常值的鲁棒性 ⭐⭐ 一般 ⭐ 差 ⭐⭐⭐ 好 ⭐⭐⭐ 好 ⭐ 差
模型训练速度 ⭐⭐⭐ 快(IRLS) ⭐⭐⭐ 非常快 ⭐⭐ 中等偏慢 ⭐⭐ 中等偏慢 ⭐ 慢(尤其深层)
调参复杂度 ⭐ 简单(仅分布+链接函数) ⭐ 简单(无调参) ⭐⭐⭐ 高(多超参数) ⭐⭐⭐ 高(多超参数) ⭐⭐⭐ 高(层数/神经元等)

算法选型核心原则(本科/研究生必懂)

优先选择GLM的场景
  1. 输出分布明确:如医疗费用(伽马)、二分类概率(伯努利)、计数数据(泊松)等;
  2. 解释性优先:医疗、保险、金融、政策分析等领域,要求模型透明、参数可解释;
  3. 中小型数据集:数据量小、特征维度低,且变量间线性结构明显;
  4. 快速原型设计:需要快速训练模型、验证业务规律,无需极致的预测精度。
考虑其他算法的场景
  1. 变量关系复杂:特征间存在强非线性、多阶交互,如用户行为数据、图像特征;
  2. 精度优先,解释性可放弃:如Kaggle比赛、电商推荐、精准营销等;
  3. 高维/稀疏/多类别特征:如文本数据、地理编码、用户标签等,树模型/神经网络更友好;
  4. 输出分布极复杂:目标变量无明确分布(多峰、长尾、不规则),GLM无法精准建模。

七、核心总结(本科/研究生必背考点)

  1. 广义线性模型(GLM)是普通线性回归的通用扩展 ,核心是通过链接函数连接线性预测值和指数分布族的输出变量
  2. GLM由随机成分(指数分布族)、系统成分(线性组合)、链接函数 三部分组成,整体形式为g(E[Y])=xTβg(E[Y])=x^T\betag(E[Y])=xTβ;
  3. 本科/研究生必记的GLM特例:逻辑回归(伯努利+Logit)、泊松回归(泊松+对数)、伽马回归(伽马+倒数);
  4. GLM的参数通过极大似然估计(MLE)求解,实际中使用迭代加权最小二乘法(IRLS)进行数值逼近;
  5. GLM的核心优势是可解释性强、适配非正态分布、训练高效 ,核心局限性是本质线性、依赖分布假设、预处理要求高
  6. GLM适合解释性优先、输出分布明确、中小型数据集的场景,若追求极致精度或处理复杂数据,优先选择XGBoost、神经网络等模型。
相关推荐
王解1 小时前
第十篇:实战演练 —— 用 nanobot 打造一个私人助手
人工智能·ai agent·nanobot
隔壁大炮1 小时前
02.深度学习——简介
人工智能·深度学习·神经网络
Melody20501 小时前
风格lora的数据准备流程
人工智能
沪漂阿龙1 小时前
大模型采样策略终极指南:Top-k、Top-p与结构化输出最佳实践
人工智能·算法·机器学习
一个努力编程人1 小时前
NLP领域————Transformer
人工智能·自然语言处理·transformer
沪漂阿龙1 小时前
温度参数深度解析:大模型生成的“创意旋钮”怎么调?
人工智能
你的论文学长1 小时前
文本处理的 CI/CD:用 NLP 静态分析解决查重飘红与 Format Error
人工智能·ci/cd·自然语言处理·重构·论文·学习方法
DeepModel1 小时前
【回归算法】局部加权回归(LWR)详解
人工智能·算法·回归
Matrix_112 小时前
论文阅读--Agent AI 探索多模态交互的前沿领域(一)
论文阅读·人工智能