Pipeline 参数怎么设置?用双下划线修改嵌套模型并核对生效

用 get_params 查找 Pipeline 的真实嵌套参数路径,用 set_params 修改分类器,再用 clone 和重新拟合验证配置、学习状态与预测。

scikit-learn 的 Pipeline 把预处理和模型串起来后,内部参数要写成“步骤名__参数名”。例如,步骤名叫 clf,逻辑回归的正则化参数是 C,对应路径就是 clf__C。最稳妥的做法是先用 get_params(deep=True)查到实际路径,再用 set_params修改,最后重新拟合确认配置用于了训练。

下面运行的是 scikit-learn Pipeline,不是 Transformers 的文本或图像 pipeline。示例用 Iris 教学数据,已在 Windows、Python 3.11.15、scikit-learn 1.9.1、NumPy 2.4.6 的 CPU 环境验证。任务是检查参数如何生效,没有进行超参数优选,也不把示例预测当作业务效果。

Pipeline 参数怎么设置?用双下划线修改嵌套模型并核对生效

先明确步骤名与参数名的关系

管道包含两步:scale负责 StandardScaler,clf负责 LogisticRegression。官方 Pipeline 文档规定,通过步骤名称和双下划线访问嵌套估计器的参数;get_params(deep=True)同时返回管道本身与内部对象的参数。

要修改的配置 本例真实路径 含义
是否减去均值 scale__with_mean 缩放器的开关
逻辑回归 C clf__C 正则化强度的倒数,较小值对应更强正则化
最大迭代次数 clf__max_iter 训练求解器的迭代上限

步骤名可以由你定义,clf并不是所有管道都通用的固定名称。使用 make_pipeline自动命名时,常见模型步骤可能叫 logisticregression;要以你自己的参数表为准。

在空目录创建环境,以下固定版本用于复现本文。macOS/Linux 激活环境用 source .venv/bin/activate。

本例 C 的含义见 LogisticRegression 官方文档;改变求解配置后仍要重新拟合。

python -m venv .venv
.venv\Scripts\activate
python -m pip install scikit-learn==1.9.1 numpy==2.4.6

查路径、改配置,再检查拟合状态

把代码保存为 pipeline_params.py,执行 python pipeline_params.py。本例先设置 C=0.1 完成训练,再把配置改为 C=2.0;通过断言观察旧系数保留,最后复制配置到新管道并重新训练。

import numpy as np
from sklearn.base import clone
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y)
pipe = Pipeline([
    ('scale', StandardScaler()),
    ('clf', LogisticRegression(C=1.0, max_iter=500))
])
params = pipe.get_params(deep=True)
print('available_paths:', [k for k in params if k in ('scale__with_mean', 'clf__C', 'clf__max_iter')])
assert 'clf__C' in params and 'C' not in params
pipe.set_params(clf__C=0.1, clf__max_iter=1000)
assert pipe.named_steps['clf'].C == 0.1
print('configured_C:', pipe.get_params()['clf__C'])
pipe.fit(X_train, y_train)
assert hasattr(pipe.named_steps['clf'], 'coef_')
print('fitted_classes:', pipe.named_steps['clf'].classes_.tolist())
old_coef = pipe.named_steps['clf'].coef_.copy()
pipe.set_params(clf__C=2.0)
assert np.array_equal(old_coef, pipe.named_steps['clf'].coef_)
print('set_params_keeps_old_coefficients:', True)
fresh = clone(pipe)
assert fresh.get_params()['clf__C'] == 2.0
assert not hasattr(fresh.named_steps['clf'], 'coef_')
assert not hasattr(fresh.named_steps['scale'], 'mean_')
print('clone_C:', fresh.get_params()['clf__C'])
print('clone_is_unfitted:', True)
fresh.fit(X_train, y_train)
assert hasattr(fresh.named_steps['clf'], 'coef_')
print('refit_predictions:', fresh.predict(X_test[:5]).tolist())
try:
    fresh.set_params(model__C=1.0)
except ValueError:
    print('wrong_step_name_rejected:', True)
else:
    raise AssertionError('Invalid parameter path was accepted')

运行结果分别证明了什么

本例得到以下实际输出。前五条预测只用于检查重新训练后的模型可以返回结果。

available_paths: ['scale__with_mean', 'clf__C', 'clf__max_iter']
configured_C: 0.1
fitted_classes: [0, 1, 2]
set_params_keeps_old_coefficients: True
clone_C: 2.0
clone_is_unfitted: True
refit_predictions: [0, 1, 1, 1, 0]
wrong_step_name_rejected: True
  1. configured_C: 0.1说明参数写到了命名为 clf 的对象;代码还直接核对了 pipe.named_steps['clf'].C。
  2. set_params_keeps_old_coefficients: True说明对这个已经拟合的逻辑回归管道修改配置,并没有重新计算已有系数。更改配置后,必须再调用 fit 才能得到按新配置训练的模型。
  3. clone_C: 2.0与 clone_is_unfitted: True一起说明,新对象继承了当前配置,但没有缩放器的均值和分类器系数。
  4. wrong_step_name_rejected: True说明不存在的 model__C被拒绝,不能把异常吞掉后继续宣称参数生效。

官方 clone 文档说明,clone 产生相同参数的新未拟合估计器,不复制训练附带的数据。本例借助它将配置检查与旧训练状态分开;要复用一个已训练模型的预测能力,不能用 clone 代替模型持久化。

遇到 Invalid parameter 怎样找原因

  1. 先输出 list(pipe.named_steps),确认实际步骤名。
  2. 再查看 pipe.get_params(deep=True)中包含目标参数名的键,例如 [k for k in pipe.get_params() if k.endswith('__C')]。
  3. 照实际键名传给 set_params,注意两个下划线,模型参数大小写也要正确。
  4. 回读参数后重新拟合,在同一数据划分和评测口径下比较结果;多个候选配置使用训练阶段的交叉验证选择,不反复看测试集来挑参数。

如果内部还嵌套 ColumnTransformer 或其他管道,路径可能多一层,例如 preprocess__numeric__imputer__strategy。这个名字只是层级写法示意,你的实际路径仍由 get_params 返回值决定。

为什么 C 改了,预测没有变?

先检查是否重新调用了 fit、是否预测的是新对象,然后再看学到的系数和评测指标。即使重新训练,某些样本的最终类别也可能一致;离散类别没变化不能单独证明配置没有生效。本文核对了参数、未拟合状态及重新训练流程,没有保证改变 C 会提高分数。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30596.html

赞 (0)
AI小管家的头像AI小管家
回归数据有极端目标值怎么办?用 HuberRegressor 与普通线性回归对照
上一篇 10小时前
手写数字图像怎么分类?用 scikit-learn 训练 8×8 像素示例
下一篇 10小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部