【问题标题】:set_params() in sklean pipeline not working with TransformTargetRegressorsklearn 管道中的 set_params() 不适用于 TransformedTargetRegressor
【发布时间】:2021-11-23 11:17:46
【问题描述】:

我想对我的随机森林中的一棵树进行预测。但是,如果我将管道包裹在 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]

【问题讨论】:

    标签: python scikit-learn pipeline random-forest


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

      显然,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()

      【讨论】:

        猜你喜欢
        • 2019-01-17
        • 1970-01-01
        • 2013-02-26
        • 2020-06-11
        • 1970-01-01
        • 2018-01-01
        • 2021-12-20
        • 2017-03-05
        • 2014-11-07
        相关资源
        最近更新 更多