在 scikit-learn 中为非负数据选择回归指标
通过首先确定预测目标,然后选择一致的损失(如 MAE、RMSE 或 pinball 损失),最后使用 D2 风格的分数与常数基线进行比较,为非负数据选择回归指标。
本文内容
简明答案
从预测目标和决策目标出发,而不是从指标列表出发。对于非负数量(如计数或金额),mean_absolute_error 是一个简单的非负损失,最佳值为 0.0,具有线性成本解释;而 root_mean_squared_error 也是非负的,最佳值为 0.0,但对较大误差的惩罚更重。如果需要保守的上限估计,可以训练一个分位数回归器,并使用基于 pinball 的评分器(如 make_scorer(mean_pinball_loss, alpha=0.95))进行评估。使用 D2 风格的分数与常数基线进行比较,并在交叉验证或搜索中一起评估多个指标。如果外部强加了评分函数,则直接使用它;否则,优先为训练和评估使用相同的严格一致的指标。
从预测目标出发,而不是从指标列表出发
指标选择应遵循决策目标和正在预测的函数,而不是可用分数的列表。在 scikit-learn 的模型评估指南中,第一个问题是评分函数是否由外部强加,例如通过竞赛或业务合同。如果是强加的,则直接使用该评分函数。如果您可以自由选择,指南建议从预测的最终目标和应用出发,然后区分预测和决策制定。
对于回归,响应通常被视为具有分布的随机变量,因此点预测通常针对一个函数,如均值、中位数或分位数。一旦确定了该函数,指南建议为该函数使用严格一致的评分函数。严格一致的评分函数与使用观测值测量预测与真实目标函数之间的距离相一致,并且可以同时用作训练损失和评估指标。这种一致性很重要,因为它使训练和评估使用相同的语言。
对于非负目标(如计数或金额),这意味着您应该决定是需要均值型点预测、中位数型点预测还是分位数(如上限),然后选择与该选择一致的指标。指标列表是次要于该决策的。
实用建议
当业务影响在非负数量的绝对误差上大致呈线性时,从 mean_absolute_error 开始,因为它易于向利益相关者解释且最佳值为 0.0。如果较大的误判成本不成比例地高,则切换到 root_mean_squared_error,并明确说明它对较大偏差的惩罚更重。对于分位数目标(如保守的上限估计),训练一个分位数回归器,并使用所选 alpha 的基于 pinball 的评分器进行评估,然后使用 D2 风格的分数与常数基线进行比较,以便相对于简单规则而非任意数字衡量改进。
当计数或金额的绝对误差很重要时使用 MAE
平均绝对误差是一个非负回归损失,最佳值为 0.0,并且因为它平均绝对偏差而易于解释。scikit-learn 文档将其描述为一个非负浮点值,最佳值为 0.0,并支持样本权重和多输出聚合。
对于非负目标,当业务影响在绝对误差上大致呈线性时,MAE 通常是一个好的首选。如果 3 个单位的误差成本大约是 1 个单位误差成本的三倍,MAE 比平方损失指标更直接地匹配这种直觉。工作示例显示了一个小的非负序列,其中平均绝对误差为 1.0。
一个实际的注意事项是 MAE 在每个绝对误差上是线性的,因此它对非常大的误差不如平方误差指标敏感,但它并非对其免疫。较低的异常值敏感性并不意味着忽略极端误差。
from sklearn.metrics import mean_absolute_error
y_true = [0, 2, 5, 9]
y_pred = [1, 2, 4, 10]
mae = mean_absolute_error(y_true, y_pred)
print(mae)
# 1.0当较大误差成本高时使用 RMSE 或均方根误差
均方根误差也是一个非负回归损失,最佳值为 0.0,并且它是在 scikit-learn 1.4 版本中添加的。因为它在平均之前对误差进行平方,然后取平方根,所以它比 MAE 更强调较大偏差。
这使得 RMSE 成为一个合理的选择,当较大的误判成本不成比例地高时,例如当非负金额的低估或高估具有非线性成本时。工作示例使用与 MAE 示例相同的输入,并显示一个稍大的值,因为最大误差在平方下贡献更多。
一个常见的误解是将 RMSE 视为误差的标准差。那个等式需要特殊条件,如零均值误差和匹配的除数,因此将 RMSE 描述为其敏感性特征而不是将其等同于误差标准差更安全。此外,在转换相对变化时,从原始分母重新计算它们,并在每个 RMSE 转换中保留平方根。
from sklearn.metrics import root_mean_squared_error
y_true = [0, 2, 5, 9]
y_pred = [1, 2, 4, 10]
rmse = root_mean_squared_error(y_true, y_pred)
print(rmse)
# 1.118033988749895考虑分位数和 pinball 损失以处理非负数据的非对称风险
当目标不是中心点预测,而是非负需求的保守上限估计时,分位数回归和 pinball 损失很有用。scikit-learn 文档展示了 mean_pinball_loss,并解释说您可以使用特定 alpha 构建评分器,例如 make_scorer(mean_pinball_loss, alpha=0.95)。
该评分器可用于通过交叉验证评估分位数回归器的泛化性能,如果符号切换为 greater 意味着 better,它也可以用于超参数调整。文档还指向了一个关于梯度提升回归预测区间的示例,其中 pinball 损失用于评估和调整具有非对称噪声和异常值的分位数回归数据。
这对非负数据很重要,因为风险可能是不对称的:低估需求的成本可能高于高估需求,反之亦然。分位数目标允许您直接针对这种不对称性,pinball 损失提供了评估它的一致方法。
from sklearn.metrics import mean_pinball_loss, make_scorer
mean_pinball_loss_95p = make_scorer(mean_pinball_loss, alpha=0.95)
# Illustrative use with a quantile regressor:
# cross_val_score(estimator, X, y, cv=5, scoring=mean_pinball_loss_95p)使用 D2 风格的技能分数与常数基线进行比较
D2 在 scikit-learn 文档中被描述为解释的偏差比例,它是 R2 的推广,其中平方误差被替换为所选偏差,如 Tweedie、pinball 或平均绝对误差。它是一种技能分数形式,计算为 1 减去模型偏差与零模型偏差的比率。
零预测取决于所选的偏差:对于 Tweedie,它是 y_true 的均值;对于绝对误差,它是中位数;对于 pinball 损失,它是 alpha 分位数。一个始终预测该零值的常数模型得到 D2 为 0.0,最佳可能分数为 1.0,且分数可以为负,因为模型可能比零模型差任意多。
对于非负回归,这很有帮助,因为它将改进相对于简单的常数基线而不是任意绝对数来框架。如果您选择基于 pinball 的 D2,基线本身成为相关分位数,这与分位数预测目标相匹配。
在交叉验证和搜索中一起评估多个指标
scikit-learn 允许在 GridSearchCV、RandomizedSearchCV 和 cross_validate 中评估多个指标。文档描述了指定多个评分指标的三种方式:作为字符串指标名称的可迭代对象、作为将评分器名称映射到评分函数或预定义字符串的字典,或作为返回分数字典的可调用对象。
对于非负回归,这很有用,因为一个指标很少讲述整个故事。您可能希望 MAE 用于线性可解释性,RMSE 用于对较大误差的敏感性,以及基于 pinball 的评分器用于分位数目标,所有这些都在相同的交叉验证拆分上评估。
文档中的一个实际注意事项是,当与 n_jobs 大于 1 一起使用时,从另一个模块导入的自定义评分器比内联定义的更健壮。另外,当将损失包装为评分器时,请注意符号约定,因为 greater_is_better 必须与指标是损失还是分数相匹配。
from sklearn.model_selection import cross_validate
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, make_scorer
scoring = {
'mae': make_scorer(mean_absolute_error),
'rmse': make_scorer(root_mean_squared_error),
}
# cv_results = cross_validate(estimator, X, y, scoring=scoring, cv=5)使用虚拟估计器作为回归健全性检查
scikit-learn 文档将虚拟估计器描述为监督学习时的简单健全性检查:将您的估计器与简单的经验法则进行比较。DummyClassifier 为分类实现了几种策略,同样的想法在精神上适用于回归基线,其中常数或简单规则有助于判断模型是否优于平凡预测。
文档强调,使用这些虚拟策略,predict 方法完全忽略输入数据,这正是它们作为基线有用的原因:它们显示了当模型不使用任何特征信息时性能是什么样的。
对于非负回归,当与 D2 风格的分数配对时,常数基线可能特别有信息,因为零模型是相对于所选偏差定义的。如果您的模型无法击败一个合理的常数规则,这是重新审视特征、目标转换或评估指标的强烈信号。
对齐训练损失、评估指标和业务评分
模型评估指南说,一旦选择了严格一致的评分函数,最好将其同时用于训练和评估。这个建议对于非负回归特别相关,因为目标函数和成本结构应该驱动指标,而不是便利性。
如果评分函数由外部强加,则直接使用该评分函数,即使它不是最方便的训练损失。如果您可以自由选择,选择与预测目标匹配的指标,然后在可能的情况下将训练和评估与其对齐。
在实践中,这可能意味着对均值或中位数导向的点预测使用 MAE 或 RMSE,对分位数目标使用 pinball 损失,并使用 D2 风格的分数来传达相对于常数基线的改进。关键是指标应反映决策问题,并且当您有选择自由时,相同的逻辑应指导训练和评估。
检查清单
- 首先确认预测函数:均值、中位数、分位数或完整分布,因为指标选择遵循该选择。
- 当非负计数或金额的绝对误差很重要且业务影响大致呈线性时,使用 mean_absolute_error。
- 当较大误差的成本不成比例地高时,使用 root_mean_squared_error,因为它比 MAE 更强调较大偏差。
- 对于分位数目标,使用 make_scorer(mean_pinball_loss, alpha=...) 构建评分器,并用它评估或调整分位数回归器。
- 使用 D2 风格的分数将模型与常数基线进行比较,记住零预测取决于所选的偏差。
- 通过传递列表、字典或返回字典的可调用对象,在 GridSearchCV、RandomizedSearchCV 或 cross_validate 中一起评估多个指标。
- 使用虚拟估计器作为回归健全性检查,以查看模型是否优于平凡规则。
- 如果外部强加了评分函数,则直接使用它;否则,将训练损失和评估指标与相同的严格一致的评分函数对齐。
适用范围
提供的来源没有为每个非负回归案例提供完整的决策规则。指标选择仍然取决于应用程序、成本结构以及正在预测的目标函数。非负数据本身不能确定最佳指标。自定义评分器和多指标评估可能需要对并行化和符号约定格外小心,例如当必须为损失正确设置 greater_is_better 时。来源中的示例是说明性的,可能取决于数据集细节、随机状态或库版本。