14

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

4

3 回答 3

20

不,管道将始终y不变地通过。在管道之外进行转换。

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

于 2013-09-03T22:33:42.940 回答
19

现在 scikit-learn 内置了一个更好的方法来做到这一点;使用compose.TransformedTargetRegressor.

构造这些对象时,您给它们 aregressor和 a 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)))

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

于 2019-11-08T13:55:56.300 回答
3

您可以将标签列添加到训练数据的末尾,然后应用转换并在训练模型之前删除该列。这不是很专业,但足够了。

于 2019-08-14T11:58:24.437 回答