Python 使用嵌套回归器上的Pipeline和TransformedTargetRecessor处理数据和目标缩放
我想使用Pipeline和TransformedTargetRegressor来处理BaggingRegressor及其所有估计器的所有缩放(数据和目标) 我的第一次尝试效果很好(没有使用管道和转换目标过滤器) 哪一个是确定的:bagging回归器叠加到所有估计量上 现在我想使用Pipeline和TransformedTargetRegressor来处理数据和目标的所有缩放,但它不起作用,因为bagging量表不同于估计器量表:Python 使用嵌套回归器上的Pipeline和TransformedTargetRecessor处理数据和目标缩放,python,scikit-learn,Python,Scikit Learn,我想使用Pipeline和TransformedTargetRegressor来处理BaggingRegressor及其所有估计器的所有缩放(数据和目标) 我的第一次尝试效果很好(没有使用管道和转换目标过滤器) 哪一个是确定的:bagging回归器叠加到所有估计量上 现在我想使用Pipeline和TransformedTargetRegressor来处理数据和目标的所有缩放,但它不起作用,因为bagging量表不同于估计器量表: $ cat test2.py #!/usr/bin/python
$ cat test2.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import BaggingRegressor
from sklearn.svm import SVR
from sklearn import preprocessing
from sklearn.pipeline import Pipeline
from sklearn.compose import TransformedTargetRegressor
def f(x):
return x*np.cos(x) + np.random.normal(size=500)*2
def main():
# Generate random data.
x = np.linspace(0, 10, 500)
rng = np.random.RandomState(0)
rng.shuffle(x)
x = np.sort(x[:])
y = f(x)
# Plot random data.
fig, axis = plt.subplots(1, 1, figsize=(20, 10))
axis.plot(x, y, 'o', color='black', markersize=2, label='random data')
# Create bagging models.
model = BaggingRegressor(n_estimators=5, base_estimator=SVR())
x_augmented = np.array([x, x**2, x**3, x**4, x**5]).T
pipe = Pipeline([('scale', preprocessing.StandardScaler()), ('model', model)])
treg = TransformedTargetRegressor(regressor=pipe, transformer=preprocessing.MinMaxScaler())
treg.fit(x_augmented, y)
# Plot intermediate regression estimations.
axis.plot(x, treg.predict(x_augmented), '-', color='red', label=model.__class__.__name__)
for i, tree in enumerate(treg.regressor_['model'].estimators_):
y_hat = tree.predict(x_augmented)
y_transformer = preprocessing.MinMaxScaler().fit(y.reshape(-1, 1))
y_pred = y_transformer.inverse_transform(y_hat.reshape(-1, 1))
axis.plot(x, y_pred, '--', label='tree '+str(i))
axis.axis('off')
axis.legend()
plt.show()
if __name__ == '__main__':
main()
如何正确处理bagging回归器及其所有嵌套估计量的标度
这两种测试之间的区别在于使用管道和转换目标过滤器
$ cat test1.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import BaggingRegressor
from sklearn.svm import SVR
def f(x):
return x*np.cos(x) + np.random.normal(size=500)*2
def main():
# Generate random data.
x = np.linspace(0, 10, 500)
rng = np.random.RandomState(0)
rng.shuffle(x)
x = np.sort(x[:])
y = f(x)
# Plot random data.
fig, axis = plt.subplots(1, 1, figsize=(20, 10))
axis.plot(x, y, 'o', color='black', markersize=2, label='random data')
# Create bagging models.
model = BaggingRegressor(n_estimators=5, base_estimator=SVR())
x_augmented = np.array([x, x**2, x**3, x**4, x**5]).T
model.fit(x_augmented, y)
# Plot intermediate regression estimations.
axis.plot(x, model.predict(x_augmented), '-', color='red', label=model.__class__.__name__)
for i, tree in enumerate(model.estimators_):
y_pred = tree.predict(x_augmented)
axis.plot(x, y_pred, '--', label='tree '+str(i))
axis.axis('off')
axis.legend()
plt.show()
if __name__ == '__main__':
main()
$ diff test1.py test2.py
7a8,10
> from sklearn import preprocessing
> from sklearn.pipeline import Pipeline
> from sklearn.compose import TransformedTargetRegressor
27c30,32
< model.fit(x_augmented, y)
---
> pipe = Pipeline([('scale', preprocessing.StandardScaler()), ('model', model)])
> treg = TransformedTargetRegressor(regressor=pipe, transformer=preprocessing.MinMaxScaler())
> treg.fit(x_augmented, y)
30,32c35,39
< axis.plot(x, model.predict(x_augmented), '-', color='red', label=model.__class__.__name__)
< for i, tree in enumerate(model.estimators_):
< y_pred = tree.predict(x_augmented)
---
> axis.plot(x, treg.predict(x_augmented), '-', color='red', label=model.__class__.__name__)
> for i, tree in enumerate(treg.regressor_['model'].estimators_):
> y_hat = tree.predict(x_augmented)
> y_transformer = preprocessing.MinMaxScaler().fit(y.reshape(-1, 1))
> y_pred = y_transformer.inverse_transform(y_hat.reshape(-1, 1))
我认为您的代码没有问题,而是绘图部分有问题
#绘制中间回归估计。
坐标轴绘图(x,treg.predict(x_增强),'-',颜色为红色,标签为模型。_u类__;名称_;
对于i,枚举中的树(treg.regressor.['model'].估计量):
y_hat=tree.predict(x_扩充)
y_transformer=preprocessing.MinMaxScaler().fit(y.reformate(-1,1))
y_pred=y_transformer.逆变换(y_hat.整形(-1,1))
轴图(x,y_pred,'--',label='tree'+str(i))
树
这里将是一个SVR()
,您正在预测x\u增强
,而在上一部分中,x\u增强
是用标准缩放器缩放的。因此,预测结果与您的预期不符
因此,通过使用以下代码段更改代码,您将很好:
#绘制中间回归估计。
坐标轴绘图(x,treg.predict(x_增强),'-',颜色为红色,标签为模型。_u类__;名称_;
对于i,枚举中的树(treg.regressor.['model'].估计量):
x_增大的x_缩放=treg.regressor_u.named_steps['scale'].变换(x_增大)
y_hat=树。预测(x_扩大的_比例)
y_transformer=preprocessing.MinMaxScaler().fit(y.reformate(-1,1))
y_pred=y_transformer.逆变换(y_hat.整形(-1,1))
轴图(x,y_pred,'--',label='tree'+str(i))
axis.axis('off')
轴图例()
plt.show()
如果解决方案足够通用,可以与RandomForest
(回归器、分类器)和朋友(AdaBoost、GradientBoosting)一起使用,那就太棒了!完美的谢谢
$ diff test2.py test3.py
38c38
< y_transformer = preprocessing.MinMaxScaler().fit(y.reshape(-1, 1))
---
> y_transformer = treg.transformer_