python - 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]
解决方案
显然,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()
单独调用。
推荐阅读
- mysql - SQL 查询执行缓慢
- c# - 如何隐藏添加到数据库的记录的增量插入?
- identityserver4 - IdentityServer和客户端外部登录
- r - 如何使用 seq() 创建以毫秒(分秒)为增量的日期/时间列
- gitlab - 未找到 Gitlab CI 页面
- node.js - 节点中的 Google AppEngine createUploadUrl
- xamarin.forms - 通过 gmail/playstore 检测 Xamarin Forms 移动应用更新
- haskell - Haskell将多个参数缩写为单个变量
- google-app-engine - dev_appserver.py 抛出无法识别的参数:--datastore_emulator_cmd
- c# - 运行使用 MailItem.Display() 和 MailItem.Close() 后的 Outlook 实例 null