首页 > 解决方案 > sklean 管道中的 set_params() 不能与 TransformTargetRegressor 一起使用

问题描述

我想对我的随机森林的一棵树进行预测。但是,如果我环绕我的管道TransformedTargetRegressor .set_params似乎不起作用。

请在下面找到一个示例:

from sklearn.datasets import load_boston
from sklearn.compose import TransformedTargetRegressor
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import StandardScaler

# loading data
boston = load_boston()
X = boston["data"]
Y = boston["target"]

# pipeline and training
pipe = Pipeline([      
                    ('scaler', StandardScaler()),
                    ('model', RandomForestRegressor(n_estimators = 100, max_depth = 4, random_state = 0))
                 ])
treg = TransformedTargetRegressor(regressor=pipe, transformer=StandardScaler())
treg.fit(X, Y)

# single tree from random forest
tree = treg.regressor_.named_steps['model'].estimators_[0]


x_sample = X[0:1]
print('baseline: ', treg.predict(x_sample))

x_scaled = treg.regressor_.named_steps['scaler'].transform(x_sample)
y_predicted = tree.predict(x_scaled)
y_transformed = treg.transformer_.inverse_transform([y_predicted])
print("internal pipeline changes: ", y_transformed)

new_model = treg.set_params(**{'regressor__model': tree})
y_predicted = new_model.predict(x_sample)
print('with set_params(): ', y_predicted)

我得到的输出如下所示。我希望“with set_params()”与“内部管道更改”相同:

基线:[26.41013313]

内部管道更改:[[30.02424242]]

使用 set_params():[26.41013313]

标签: pythonscikit-learnpipelinerandom-forest

解决方案


显然,scikit-learnTransformedTargetRegressor对象不允许您更改用于预测的回归量,除非您在 set_params 中的新回归量上重新拟合数据集。如果你这样做:

new_model = treg.set_params(**{'regressor__model': tree})
print(new_model)

可以看到新的参数已经设置好了。但是,正如您正确发现的那样,其中使用的估算器predict仍然是旧的估算器。如果要更改对象中的估算器,可以执行以下操作:

new_model = treg.set_params(**{'regressor__model': tree})
new_model.fit(X, Y)

new_model.predict(x_sample)

您可以看到预测发生变化并使用单棵树来执行估计。如果您对单树的预测感兴趣并且不重新拟合整个数据集,您可以tree.predict()单独调用。


推荐阅读