sklearn 管道中的 set_params() 不适用于 TransformedTargetRegressor

set_params() in sklean pipeline not working with 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()' 与“内部管道更改:

”相同

baseline: [26.41013313]

internal pipeline changes: [[30.02424242]]

with set_params(): [26.41013313]

显然,scikit-learn TransformedTargetRegressor 对象不允许您更改用于预测的回归变量,除非您在 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()

TransformedTargetRegressor 有一个参数 regressor 和一个属性 regressor_。前者可以设置set_params,被认为是超参数,但不用于预测;相反,它在安装 TTR 时被克隆和安装,并存储在 regressor_ 属性中。

所以你不能使用set_params来更新拟合回归量属性。 (你可以在你的代码中检查,new_model.regressor_['model'] 仍然是一个随机森林。)你能做的最好的就是直接修改属性(尽管这可能是非正统的,并且在某些情况下可能会导致其他问题):

import copy
mod_model = copy.deepcopy(treg)
mod_model.regressor_.steps[-1] = ('model', tree)
y_predicted = mod_model.predict(x_sample)
print('with modifying regressor: ', y_predicted)