非常游戏网
Python中Scikit-learn 1.3版有哪些重大更新_了解MetadataRouting新机制

Python中Scikit-learn 1.3版有哪些重大更新_了解MetadataRouting新机制

2026-05-27日常编程38135

MetadataRouting是scikit-learn 1.3引入的元数据传递机制,要求显式声明并启用路由(如pipe.set_params(clf__sample_weight=True) + pipe.enable_metadata_routing()),否则sample_weight等参数将静默失效或报错。

scikit-learn 1.3 引入的 MetadataRouting 不是“可选增强”,而是底层元估计器行为的根本性调整——如果你在 PipelineGridSearchCVCalibratedClassifierCV 中传了 sample_weightgroups 等参数,不显式适配,大概率会静默失效或报 TypeError: got unexpected keyword argument

MetadataRouting 是什么,为什么不能跳过

它把原来“硬编码传递元数据”的方式,改为可声明、可验证、可路由的机制。以前你写 pipeline.fit(X, y, sample_weight=w) 能跑通,靠的是 estimator 内部手动提取和转发;现在必须明确告诉每个环节:“这个 sample_weight 应该送给谁”。否则,Pipeline 不知道该传给哪一步,GridSearchCV 甚至可能完全忽略它。

  • 所有支持该机制的类(如 PipelineColumnTransformer)默认启用新路由逻辑
  • fitscorepredict 等方法现在检查传入的元数据是否被声明支持,不支持就直接报错
  • 旧代码若没调用 set_params(**{...})enable_metadata_routing(),多数情况会中断执行

如何快速让 Pipeline 支持 sample_weight

核心动作只有两步:声明路由目标 + 显式启用。比如你有一个带 StandardScalerLogisticRegression 的 pipeline,而只想把 sample_weight 传给后者:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

pipe = Pipeline([ ("scaler", StandardScaler()), ("clf", LogisticRegression()), ])

声明:只有 clf 步骤接收 sample_weight

pipe.set_params(clf__sample_weight=True)

Python中Scikit-learn 1.3版有哪些重大更新_了解MetadataRouting新机制
Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

下载

启用全局路由(必须!)

pipe.enable_metadata_routing()

现在可以安全传参

pipe.fit(X, y, sample_weight=w)

  • clf__sample_weight=True 表示把 sample_weight 路由到 clf 子估计器的 fit 方法
  • 漏掉 enable_metadata_routing()fit 会拒绝接收任何元数据参数
  • 如果某步不支持(如 StandardScalerfit 不接受 sample_weight),设成 False 或不设即可

cross_val_score 和 GridSearchCV 的兼容要点

这两个常用工具已内置路由支持,但前提是你的 estimator 或 pipeline 已正确配置。常见陷阱:

  • cross_val_score(pipe, X, y, sample_weight=w) 会失败,除非 pipe 已调用 enable_metadata_routing() 并声明了路由规则
  • GridSearchCVfit_params 参数已被弃用,改用 param_distributions 中的 __sample_weight 键(如 {"clf__sample_weight": [True]}
  • 自定义 estimator 必须实现 get_metadata_routing() 方法,否则无法参与路由;简单起见,可继承 BaseEstimator 并用 @_routing_enabled 装饰器

容易被忽略的兼容性断裂点

不是所有 estimator 都已完全适配。截至 1.3.2,以下情况仍需手动干预:

  • calibration.CalibratedClassifierCV 在 1.3.2 才修复了对大预测分值的数值稳定性,但其内部 sample_weight 路由仍需确认子模型是否声明支持
  • model_selection.StratifiedKFold 等 splitter 不参与路由,groupssample_weight 必须由外层(如 cross_val_score)直接处理
  • 第三方 estimator 若未升级至兼容 1.3+ 的接口,即使包装进 Pipeline,也会导致路由失败——错误信息往往只提示“sample_weight not supported”,不会指出具体是哪一步