sklearn中TransformedTargetRegressor包裹Pipeline后set_params不生效问题
问题成因
- scikit-learn 中所有以单下划线结尾的属性(例如
regressor_、transformer_)都是模型调用fit()方法后生成的拟合后属性,和初始化阶段传入的原始参数相互独立。 set_params()方法只能修改模型初始化时传入的原始参数,不会修改已经生成的拟合后属性。TransformedTargetRegressor执行预测时,默认调用拟合完成的regressor_属性做计算,你通过set_params修改的regressor__model属于未参与拟合的原始参数,因此不会生效。
解决方法
直接修改拟合后的 regressor_ 属性内的模型即可,不需要调用 set_params,将你示例中修改参数的代码替换为以下内容:
# 直接修改拟合后Pipeline中的model为提取出的单棵决策树 treg.regressor_.named_steps['model'] = tree y_predicted = treg.predict(x_sample) print('after modify regressor_: ', y_predicted)
运行后输出结果就会和你手动调用内部组件计算的 internal pipeline changes 结果一致。如果需要保留原始模型不被修改,可以先通过 copy.deepcopy 复制原模型后再修改副本。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

