使用变换器(估算器)转换sklearn.pipeline中的目标标签

vvk*_*itk 5 scikit-learn

我知道可以链接几个实现变换方法的估算器来转换sklearn.pipeline中的X(特征集).但是我有一个用例,我想要转换目标标签(比如将标签转换为[1 ... K]而不是[0,K-1],我很乐意将其作为我管道中的一个组件是否有可能使用sklearn.pipeline.?

Ari*_*vis 15

现在有一种更好的方法可以在 scikit-learn 中实现;使用compose.TransformedTargetRegressor.

在构造这些对象时,您给它们一个regressor和一个transformer。当您使用.fit()它们时,它们会在回归之前转换目标,而当您使用.predict()它们时,它们会将预测的目标转换回原始空间。

重要的是要注意,您可以向它们传递一个pipeline对象,因此它们应该与您现有的设置很好地交互。例如,采用以下设置,我训练岭回归以预测给定 2 个特征的 1 个目标:

# Imports
import numpy as np
from sklearn import compose, linear_model, metrics, pipeline, preprocessing

# Generate some training and test features and targets
X_train = np.random.rand(200).reshape(100,2)
y_train = 1.2*X_train[:, 0]+3.4*X_train[:, 1]+5.6
X_test = np.random.rand(20).reshape(10,2)
y_test = 1.2*X_test[:, 0]+3.4*X_test[:, 1]+5.6

# Define my model and scalers
ridge = linear_model.Ridge(alpha=1e-2)
scaler = preprocessing.StandardScaler()
minmax = preprocessing.MinMaxScaler(feature_range=(-1,1))

# Construct a pipeline using these methods
pipe = pipeline.make_pipeline(scaler, ridge)

# Construct a TransformedTargetRegressor using this pipeline
# ** So far the set-up has been standard **
regr = compose.TransformedTargetRegressor(regressor=pipe, transformer=minmax)

# Fit and train the regr like you would a pipeline
regr.fit(X_train, y_train)
y_pred = regr.predict(X_test)
print("MAE: {}".format(metrics.mean_absolute_error(y_test, y_pred)))
Run Code Online (Sandbox Code Playgroud)

这仍然不像我希望的那样平滑,例如,您可以访问TransformedTargetRegressorusing包含的回归量,.regressor_但存储在那里的系数未转换。这意味着如果您想回到生成数据的方程式,还有一些额外的障碍需要跳过。

  • 您知道分类器有类似的功能吗? (4认同)
  • 扩展了 scikit-learn 的 python 库 [`mlinsights`](https://github.com/sdpython/mlinsights) 添加了此功能,并将其称为 [`TransformedTargetClassifier2`](https://github.com/sdpython /mlinsights/blob/777bbb85d0203f38aeb6bb5b90c3b87426fbf2db/mlinsights/mlmodel/target_predictors.py#L135)。 (3认同)

Fre*_*Foo 12

不,管道将始终y保持不变.在管道外进行转换.

(这是scikit-learn中一个已知的设计缺陷,但它从来没有足够的压力来改变或扩展API.)

  • 这有过审查吗?这对于并行化管道的各个方面非常方便,其中 y 也在有界超参数中。 (2认同)
  • [fred-foo](/sf/users/11672461/) 我认为引用 `TransformedTargetRegressor` 是有意义的,它是在您最初回答这个问题后添加到 API 中的。 (2认同)