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)
我想预测我的随机森林中的一棵树。但是,如果我将我的管道环绕 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)