MetadataRouting是scikit-learn 1.3引入的元数据传递机制,要求显式声明并启用路由(如pipe.set_params(clf__sample_weight=True) + pipe.enable_metadata_routing()),否则sample_weight等参数将静默失效或报错。
scikit-learn 1.3 引入的 MetadataRouting 不是“可选增强”,而是底层元估计器行为的根本性调整——如果你在 Pipeline、GridSearchCV 或 CalibratedClassifierCV 中传了 sample_weight、groups 等参数,不显式适配,大概率会静默失效或报 TypeError: got unexpected keyword argument。
MetadataRouting 是什么,为什么不能跳过
它把原来“硬编码传递元数据”的方式,改为可声明、可验证、可路由的机制。以前你写 pipeline.fit(X, y, sample_weight=w) 能跑通,靠的是 estimator 内部手动提取和转发;现在必须明确告诉每个环节:“这个 sample_weight 应该送给谁”。否则,Pipeline 不知道该传给哪一步,GridSearchCV 甚至可能完全忽略它。
- 所有支持该机制的类(如
Pipeline、ColumnTransformer)默认启用新路由逻辑 -
fit、score、predict等方法现在检查传入的元数据是否被声明支持,不支持就直接报错 - 旧代码若没调用
set_params(**{...})或enable_metadata_routing(),多数情况会中断执行
如何快速让 Pipeline 支持 sample_weight
核心动作只有两步:声明路由目标 + 显式启用。比如你有一个带 StandardScaler 和 LogisticRegression 的 pipeline,而只想把 sample_weight 传给后者:
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegressionpipe = Pipeline([ ("scaler", StandardScaler()), ("clf", LogisticRegression()), ])
声明:只有 clf 步骤接收 sample_weight
pipe.set_params(clf__sample_weight=True)
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会拒绝接收任何元数据参数 - 如果某步不支持(如
StandardScaler的fit不接受sample_weight),设成False或不设即可
cross_val_score 和 GridSearchCV 的兼容要点
这两个常用工具已内置路由支持,但前提是你的 estimator 或 pipeline 已正确配置。常见陷阱:
-
cross_val_score(pipe, X, y, sample_weight=w)会失败,除非pipe已调用enable_metadata_routing()并声明了路由规则 -
GridSearchCV的fit_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 不参与路由,groups或sample_weight必须由外层(如cross_val_score)直接处理 - 第三方 estimator 若未升级至兼容 1.3+ 的接口,即使包装进
Pipeline,也会导致路由失败——错误信息往往只提示“sample_weightnot supported”,不会指出具体是哪一步

