TATECHATLAS
◎ 简体中文
数学与模型 / 指南

在 scikit-learn 中评估多输出回归

学习如何使用 scikit-learn 中的 multioutput 参数来获取每个目标的误差,或在多输出回归预测中应用自定义权重,以实现更精细的模型性能诊断。

本文内容

要在 scikit-learn 中评估具有多个输出序列的模型,请在支持的指标(如 mean_absolute_error 或 r2_score)中使用 multioutput 参数。将 multioutput 设置为 'raw_values' 将返回一个包含每个输出流独立得分的数组,从而允许进行细粒度的诊断。如果某些输出比其他输出更关键,可以通过向 multioutput 参数传递类数组对象(例如 [0.3, 0.7])来计算单个加权得分。这取代了默认的 'uniform_average' 行为,后者将所有目标变量视为同等重要。

理解多输出回归指标

在多目标回归中,模型会同时预测多个连续变量。标准的评估指标通常返回一个标量值,如果某些输出表现良好而某个特定输出表现糟糕,这种单一数值可能会掩盖后者的性能问题。Scikit-learn 通过提供相应的机制来解决这一问题,允许用户将误差按输出分解,或者使用特定的加权策略对它们进行聚合。

指标的选择应与目标函数保持一致。例如,如果目标是预测分布的均值,则平方损失函数是合适的;如果目标是预测中位数,则绝对损失更为理想。在多输出场景中,这种一致性必须在所有目标维度上保持统一。

在使用多输出指标的自定义权重时,请确保权重之和为 1.0,以保持指标的原始量级及其作为加权平均值的可解释性。

使用 raw_values 进行单输出评估

'raw_values' 选项对于诊断具体哪个目标变量导致模型性能下降至关重要。Scikit-learn 不再对结果进行平均,而是返回一个数组,其中每个元素对应于为一个输出列计算的指标。

当目标变量具有不同的量级或不同的噪声水平时,这种方法尤为有用,因为它能防止量级较高的变量误差主导整体得分。

from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); scores = mean_absolute_error(y_true, y_pred, multioutput='raw_values'); print(scores) # Illustrative output: [0.5, 1. ]

为多输出实现自定义加权

当某些输出序列比其他序列在业务上更关键时,统一平均法会产生误导。Scikit-learn 允许向 multioutput 参数传递一个权重数组。最终得出的得分是各独立误差的加权和。

例如,如果第二个输出的重要性是第一个输出的两倍,可以应用 [0.33, 0.67] 这样的权重。这确保了最终的标量值能够反映特定目标变量的优先重要性。

from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); weighted_mae = mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]); print(weighted_mae) # Illustrative output: 0.85

加权平均与统一平均的比较

统一平均 ('uniform_average') 是默认行为,将每个输出视为具有相同的权重。当所有目标性质相同且重要性一致时,此方法较为适用。

相比之下,加权平均允许用户对特定维度的误差施加更重的惩罚。通过将 'raw_values' 与加权平均值进行对比,可以确定全局得分是被单个有问题的输出所扭曲,还是模型在所有目标上的表现都平庸。

将多输出逻辑应用于不同指标

并非所有 scikit-learn 指标都支持 multioutput 参数。常见的回归指标如平均绝对误差 (MAE)、均方根误差 (RMSE) 和 R2 分数均支持该参数。

然而,一些鲁棒性指标(如 median_absolute_error)不支持多输出输入。在这种情况下,用户必须手动遍历输出列并为每一列计算指标。

为加权多输出创建自定义评分器

要在 GridSearchCV 或 cross_val_score 中使用加权多输出指标,必须使用 make_scorer 对指标进行包装。由于 multioutput 参数是一个关键字参数,必须在创建评分器期间传递该参数。

由于这些指标通常是损失函数(数值越低越好),在 make_scorer 中必须将 greater_is_better 参数设置为 False,以确保搜索算法能够正确地最大化负损失值。

from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.model_selection import GridSearchCV; from sklearn.linear_model import LinearRegression; weighted_mae_scorer = make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False); grid = GridSearchCV(LinearRegression(), param_grid={}, scoring=weighted_mae_scorer)

同时评估多个指标

为了获得全面的视角,可以使用 cross_validate 跟踪多个性能指标。通过向 scoring 参数传递一个字典,您可以同时监控加权聚合指标和其他指标(如 R2)。

这使得开发人员能够观察到,改善加权 MAE 是否是以牺牲所有输出的整体解释方差 (R2) 为代价的。

from sklearn.model_selection import cross_validate; from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.linear_model import LinearRegression; import numpy as np; X = np.random.rand(10, 3); y = np.random.rand(10, 2); scoring_dict = {'weighted_mae': make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False), 'r2': 'r2'}; results = cross_validate(LinearRegression(), X, y, scoring=scoring_dict, cv=2); print(results['test_weighted_mae'])

选择一致的评分函数

评分的一致性意味着指标应与预测的目标函数相匹配。如果模型被训练用于预测均值,则 RMSE 或 MAE 是合适的。

在处理多输出任务时,请确保加权策略不会无意中改变指标的统计含义。例如,在进行平均处理时应谨慎处理 RMSE,因为在从 MSE 转换为 RMSE 的过程中应保留平方根,以维持原始的误差量级。

检查清单

  • 验证 y_true 和 y_pred 具有匹配的形状 (n_samples, n_outputs)。
  • 确认所选指标支持 multioutput 参数。
  • 确保在 make_scorer 中为基于误差的指标设置 greater_is_better=False。
  • 检查权重数组的长度是否与输出列的数量匹配。

multioutput 参数并非所有指标都支持,特别是 median_absolute_error 不支持。它要求目标数组和预测数组具有匹配的维度。

参考来源

  1. scikit-learn: model evaluation ↗
  2. scikit-learn: mean_absolute_error ↗
  3. scikit-learn: root_mean_squared_error ↗
返回顶部 ↑