广义线性模型(GLM)详解
前言
回归算法是机器学习中预测连续数值 的核心工具,比如预测房价、气温、产品销量等,而线性回归 是最基础的回归模型,核心用线性公式 y=ax+by=ax+by=ax+b 描述输入和输出的关系。
但现实场景的预测问题远更复杂:
- 想预测某人患病的概率(0~1之间的数值)
- 想预测商店一天卖出汉堡的个数(非负整数)
- 想预测医疗费用(非负、右偏的连续值)
这些场景中,输出不再是简单的线性连续值,普通线性回归无法处理,而广义线性模型(Generalized Linear Model, GLM) 作为线性回归的通用扩展形式,完美解决了这类问题,是本科、研究生阶段必学的经典统计建模方法。
本文将从核心概念、数学原理、算法流程、实战案例、算法对比五个维度,用通俗易懂的语言讲解GLM,同时附带可直接运行的Python代码。
一、广义线性模型(GLM)核心认知
1. GLM的核心定义
GLM是对普通线性回归 的扩展,打破了线性回归的两大限制,使其能处理输出非连续、输入输出非线性 的预测问题,核心思想是:通过「链接函数」将线性预测结果与不同分布类型的输出变量关联起来。
2. GLM相比线性回归的「广义」之处
普通线性回归的两个强约束:
- 输出变量y必须是连续数值,且服从正态分布;
- 输入和输出之间必须是直接的线性关系。
GLM对这两个约束做了松绑:
- 输出类型无限制 :输出可以是概率(0~1)、整数计数、非负右偏值等,只需满足指数分布族即可;
- 引入链接函数 :不直接让输入的线性组合作为输出,而是通过链接函数对线性结果做变换,适配输出变量的分布特性。
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相比纯非线性模型的优势。
(3)链接函数(Link Function)
- 含义:连接线性预测值η\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,依次计算以下变量(核心是「工作变量」和「加权矩阵」):
- 线性预测值:ηi=xiTβ\eta_{i}=x_{i}^{T} \betaηi=xiTβ
- 输出期望:μi=g−1(ηi)\mu_{i}=g^{-1}(\eta_{i})μi=g−1(ηi)(链接函数的逆变换)
- 工作变量(伪响应变量):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的一阶导数,由链接函数决定) - 权重系数: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)是响应变量的方差,由其分布决定) - 加权矩阵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()
案例核心结果分析(本科/研究生重点理解)
- 模型拟合 :伽马分布+对数链接函数的GLM能很好地拟合非负右偏的医疗费用,参数摘要中P值(P>|z|)小于0.05的特征为显著特征(如是否吸烟、年龄、BMI);
- 数据规律 :
- 吸烟是医疗费用的最核心影响因素,吸烟者的费用远高于非吸烟者;
- 年龄与医疗费用呈正相关,且吸烟者的费用随年龄呈指数上升;
- 性别对医疗费用的影响不显著,男女费用差异极小;
- 预测效果:真实值vs预测值的散点图越靠近对角线,说明模型拟合效果越好,GLM在该场景下的预测效果远优于普通线性回归。
五、GLM的优缺点(本科/研究生必记)
GLM作为经典的统计建模方法,优势和局限性都非常明确,适合在解释性优先、数据分布明确的场景下使用,以下整理为清晰的表格,方便记忆:
优点
| 优点 | 详细说明 |
|---|---|
| 适配非正态输出变量 | 打破线性回归的正态分布限制,支持指数分布族的所有分布(伯努利、泊松、伽马等) |
| 链接函数灵活建模非线性 | 无需手动对特征做非线性变换,通过链接函数即可捕捉输入输出的非线性关系,同时保留线性模型的可解释性 |
| 模型可解释性极强 | 参数β\betaβ有明确的物理意义,可直接解释每个特征对输出的影响方向和强度(如吸烟使医疗费用增加XX倍) |
| 训练高效、收敛稳定 | 基于IRLS算法求解,在中小型数据集上训练速度极快,且参数收敛性好,不易震荡 |
| 鲁棒性优于线性回归 | 对异常值的敏感度低于普通最小二乘(OLS)线性回归,尤其在伽马/泊松分布下更稳健 |
缺点
| 缺点 | 详细说明 |
|---|---|
| 本质仍是线性模型 | 仅能建模「链接函数下的线性关系」,无法自动捕捉特征间的复杂非线性交互(如吸烟×BMI×年龄的联合影响) |
| 高度依赖分布假设 | 若输出变量不服从预设的指数分布族,模型拟合效果会大幅下降,预测偏差大 |
| 特征预处理要求高 | 类别变量需独热编码,连续变量需标准化/归一化,无法像树模型那样自动处理特征 |
| 需手动添加交互项/高阶项 | 若想建模复杂关系,必须手动构造特征交互项、多项式项,增加了模型设计的复杂度 |
| 对极端异常值仍敏感 | 虽优于线性回归,但仍会受少数极端值影响,尤其在数据量小、分布极度不平衡时 |
六、GLM与主流回归算法的对比(本科/研究生选型参考)
为了方便大家在实际场景中选择合适的回归算法 ,将GLM与本科/研究生阶段必学的线性回归、XGBoost/GBDT、随机森林、神经网络 从10个核心维度做对比,整理为表格,清晰直观:
| 对比维度 | 广义线性模型(GLM) | 线性回归(OLS) | XGBoost/GBDT | 随机森林回归 | 神经网络回归(MLP) |
|---|---|---|---|---|---|
| 支持非正态输出变量 | ✅ 是(指数分布族) | ❌ 否(仅正态) | ✅ 是 | ✅ 是 | ✅ 是 |
| 显式建模输出分布 | ✅ 是 | ❌ 否 | ❌ 否 | ❌ 否 | ❌ 否 |
| 模型可解释性 | ⭐⭐⭐ 强 | ⭐⭐⭐ 强 | ⭐ 弱 | ⭐ 弱 | ⭐ 弱(黑箱) |
| 建模非线性关系能力 | ⭐⭐ 中等(链接函数) | ⭐ 弱(仅线性) | ⭐⭐⭐ 强(自动) | ⭐⭐⭐ 强(自动) | ⭐⭐⭐ 强(自动) |
| 对缺失值的容忍度 | ❌ 弱(需提前处理) | ❌ 弱(需提前处理) | ✅ 强(自动处理) | ✅ 强(自动处理) | ❌ 弱(需提前处理) |
| 类别变量处理方式 | 需独热编码 | 需独热编码 | 可直接处理 | 可直接处理 | 需编码/嵌入层 |
| 支持非负输出变量 | ✅ 是(如伽马/泊松) | ❌ 否(可能预测负数) | ✅ 是 | ✅ 是 | ✅ 是(激活函数) |
| 对异常值的鲁棒性 | ⭐⭐ 一般 | ⭐ 差 | ⭐⭐⭐ 好 | ⭐⭐⭐ 好 | ⭐ 差 |
| 模型训练速度 | ⭐⭐⭐ 快(IRLS) | ⭐⭐⭐ 非常快 | ⭐⭐ 中等偏慢 | ⭐⭐ 中等偏慢 | ⭐ 慢(尤其深层) |
| 调参复杂度 | ⭐ 简单(仅分布+链接函数) | ⭐ 简单(无调参) | ⭐⭐⭐ 高(多超参数) | ⭐⭐⭐ 高(多超参数) | ⭐⭐⭐ 高(层数/神经元等) |
算法选型核心原则(本科/研究生必懂)
优先选择GLM的场景
- 输出分布明确:如医疗费用(伽马)、二分类概率(伯努利)、计数数据(泊松)等;
- 解释性优先:医疗、保险、金融、政策分析等领域,要求模型透明、参数可解释;
- 中小型数据集:数据量小、特征维度低,且变量间线性结构明显;
- 快速原型设计:需要快速训练模型、验证业务规律,无需极致的预测精度。
考虑其他算法的场景
- 变量关系复杂:特征间存在强非线性、多阶交互,如用户行为数据、图像特征;
- 精度优先,解释性可放弃:如Kaggle比赛、电商推荐、精准营销等;
- 高维/稀疏/多类别特征:如文本数据、地理编码、用户标签等,树模型/神经网络更友好;
- 输出分布极复杂:目标变量无明确分布(多峰、长尾、不规则),GLM无法精准建模。
七、核心总结(本科/研究生必背考点)
- 广义线性模型(GLM)是普通线性回归的通用扩展 ,核心是通过链接函数连接线性预测值和指数分布族的输出变量;
- GLM由随机成分(指数分布族)、系统成分(线性组合)、链接函数 三部分组成,整体形式为g(E[Y])=xTβg(E[Y])=x^T\betag(E[Y])=xTβ;
- 本科/研究生必记的GLM特例:逻辑回归(伯努利+Logit)、泊松回归(泊松+对数)、伽马回归(伽马+倒数);
- GLM的参数通过极大似然估计(MLE)求解,实际中使用迭代加权最小二乘法(IRLS)进行数值逼近;
- GLM的核心优势是可解释性强、适配非正态分布、训练高效 ,核心局限性是本质线性、依赖分布假设、预处理要求高;
- GLM适合解释性优先、输出分布明确、中小型数据集的场景,若追求极致精度或处理复杂数据,优先选择XGBoost、神经网络等模型。