基于梯度提升的序数回归(Gradient Boosting for Ordinal Regression)的原理与实现过程
题目描述
在机器学习中,序数回归(Ordinal Regression)处理的是类别标签具有自然顺序的分类问题,例如“差、中、良、优”、“低风险、中风险、高风险”等。传统的分类方法(如逻辑回归、SVM)通常忽略这种顺序信息。本题目将详细讲解如何将梯度提升(Gradient Boosting)框架应用于序数回归任务,包括其核心思想、损失函数设计、梯度计算步骤以及预测过程。
解题过程
第一步:理解序数回归问题的形式化
假设我们有训练集 \(D = \{(\mathbf{x}_i, y_i)\}_{i=1}^n\),其中 \(y_i\) 是离散的序数标签,共有 \(K\) 个等级,通常用整数 \(\{1, 2, \dots, K\}\) 表示,且 \(1 < 2 < \dots < K\) 表示等级的递增顺序。目标是根据特征 \(\mathbf{x}_i\) 预测样本的序数等级。
- 关键挑战:需建模等级间的有序性,而不是将每个等级视为独立类别。
第二步:将序数回归转化为一系列二分类问题
一种有效策略是“序数分拆”(ordinal partitioning)。我们将 \(K\) 个等级的序数问题转化为 \(K-1\) 个二元阈值比较问题。
- 对于每个阈值 \(k = 1, 2, \dots, K-1\),定义一个二元变量:
\[ z_{i}^{(k)} = \begin{cases} +1 & \text{if } y_i > k \\ -1 & \text{otherwise (i.e., } y_i \le k\text{)} \end{cases} \]
这相当于判断样本 \(i\) 的等级是否大于 \(k\)。
- 例如,对于等级 \(y_i = 3\)、\(K = 5\):
\(z_i^{(1)} = +1\) (因为 3 > 1),
\(z_i^{(2)} = +1\) (因为 3 > 2),
\(z_i^{(3)} = -1\) (因为 3 ≤ 3),
\(z_i^{(4)} = -1\) (因为 3 ≤ 4)。
第三步:在梯度提升框架中集成序数约束
梯度提升通过加法模型 \(F(\mathbf{x})\) 拟合数据,每次迭代添加一个基学习器(如决策树)来减少损失。在序数回归中,我们需要一个模型同时处理所有 \(K-1\) 个二元任务,并保持预测的一致性。
常用方法:学习一个实值函数 \(F(\mathbf{x}) \in \mathbb{R}\),并引入 \(K-1\) 个阈值(截距)参数 \(\theta_1 < \theta_2 < \dots < \theta_{K-1}\) 来划分等级。
- 预测规则:
\[ \hat{y}_i = \min\left\{ k \in \{1, \dots, K\} : F(\mathbf{x}_i) < \theta_k \right\} \]
其中定义 \(\theta_K = +\infty\),即如果 \(F(\mathbf{x}_i) < \theta_1\),则预测为等级 1;如果 \(\theta_1 \le F(\mathbf{x}_i) < \theta_2\),则预测为等级 2,依此类推。
- 这确保了有序性:随着 \(F(\mathbf{x})\) 增大,预测等级单调不减。
第四步:设计序数回归的损失函数
我们可以利用“序数分拆”定义的二元变量,为每个阈值 \(k\) 定义二元分类损失,然后求和。
常用损失:序数逻辑损失(或称比例优势模型损失),它是负的序数对数似然。
- 将实值函数 \(F(\mathbf{x})\) 转化为阈值比较的概率形式。定义:
\[ P(y_i > k | \mathbf{x}_i) = \sigma(F(\mathbf{x}_i) - \theta_k) \]
其中 \(\sigma(t) = 1 / (1 + e^{-t})\) 是逻辑函数。
2. 则样本 \(i\) 对于阈值 \(k\) 的二元标签 \(z_i^{(k)}\) 的负对数似然(交叉熵)为:
\[ L_{ik} = -I(z_i^{(k)} = +1) \log \sigma(F(\mathbf{x}_i) - \theta_k) - I(z_i^{(k)} = -1) \log \left(1 - \sigma(F(\mathbf{x}_i) - \theta_k)\right) \]
- 总损失是对所有样本和所有阈值求和:
\[ L = \sum_{i=1}^n \sum_{k=1}^{K-1} L_{ik} \]
第五步:在梯度提升中优化损失函数
梯度提升通过梯度下降来最小化损失。我们需要计算损失函数关于模型输出 \(F(\mathbf{x}_i)\) 的负梯度(即伪残差)。
- 对固定的阈值参数 \(\theta_k\),计算 \(F(\mathbf{x}_i)\) 的梯度:
\[ r_{ik} = -\frac{\partial L_{ik}}{\partial F(\mathbf{x}_i)} = z_i^{(k)} \cdot \sigma\!\left(z_i^{(k)} (F(\mathbf{x}_i) - \theta_k)\right) \cdot \left[1 - \sigma\!\left(z_i^{(k)} (F(\mathbf{x}_i) - \theta_k)\right)\right] \]
简化后可得:
\[ r_{ik} = I(z_i^{(k)} = +1) - \sigma(F(\mathbf{x}_i) - \theta_k) \]
这表示对于阈值 \(k\),样本 \(i\) 的伪残差是“指示其等级大于 k 的真实值”与“模型预测的概率”之差。
2. 由于我们使用同一个函数 \(F\) 应对所有阈值,需将来自不同阈值的梯度合并。对每个样本 \(i\),将 \(K-1\) 个梯度相加作为最终的伪残差:
\[ r_i = \sum_{k=1}^{K-1} r_{ik} \]
- 在每次提升迭代中,用基学习器(如回归树)拟合伪残差 \(\{r_i\}\),得到本次的增量 \(h_m(\mathbf{x})\),然后更新模型:
\[ F_m(\mathbf{x}) = F_{m-1}(\mathbf{x}) + \nu \cdot h_m(\mathbf{x}) \]
其中 \(\nu\) 是学习率。
4. 阈值参数 \(\theta_k\) 也需要更新。通常在每次迭代中,固定 \(F\),通过优化损失 \(L\) 更新 \(\theta_k\)(例如用牛顿法),并强制保持顺序 \(\theta_1 < \theta_2 < \dots < \theta_{K-1}\)。
第六步:预测新样本的序数等级
- 给定训练好的模型 \(F^*(\mathbf{x})\) 和阈值 \(\theta_1^* < \theta_2^* < \dots < \theta_{K-1}^*\)。
- 对新样本 \(\mathbf{x}_\text{new}\),计算实值 \(s = F^*(\mathbf{x}_\text{new})\)。
- 找到最小的 \(k\) 使得 \(s < \theta_k^*\),则预测等级为 \(k\);如果对所有 \(k\) 都有 \(s \ge \theta_k^*\),则预测等级为 \(K\)。
- 等价地,可计算所有阈值上的概率:
\[ p_k = P(y > k | \mathbf{x}) = \sigma(s - \theta_k^*) \]
则预测等级为 \(1 + \sum_{k=1}^{K-1} I(p_k \ge 0.5)\)。
总结
基于梯度提升的序数回归通过阈值比较将有序分类分解为多个二元任务,在统一的提升框架中优化序数逻辑损失,利用梯度提升的强拟合能力学习一个实值函数,并结合可学习的阈值进行等级划分。该方法既保持了序数信息,又继承了梯度提升对复杂数据模式的捕捉能力。实际实现中,通常对阈值添加单调性约束(如用指数参数化确保顺序),并在每轮迭代中交替优化函数 \(F\) 和阈值 \(\theta\)。