我理解在sklearn.pipeline中可以链接多个实现转换方法的估算器,以转换X(特征集)。然而,我有一个使用案例,我希望能够将目标标签转换为[1...K]而不是[0,K-1],并且我希望将其作为管道中的一个组件来完成。是否可能在sklearn.pipeline中实现这一点?
我理解在sklearn.pipeline中可以链接多个实现转换方法的估算器,以转换X(特征集)。然而,我有一个使用案例,我希望能够将目标标签转换为[1...K]而不是[0,K-1],并且我希望将其作为管道中的一个组件来完成。是否可能在sklearn.pipeline中实现这一点?
compose.TransformedTargetRegressor
。
在构建这些对象时,您需要为它们指定一个regressor
和一个transformer
。当您对它们使用.fit()
方法进行拟合时,它们会在回归之前转换目标值,在使用.predict()
方法进行预测时,会将其预测的目标值转换回原始空间。
需要注意的是,您可以传递给它们一个pipeline
对象,因此它们应该能够与您现有的设置很好地配合使用。例如,考虑以下设置,我训练了一个岭回归模型来预测两个特征下的一个目标值:
# 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)))
这仍然不够流畅,例如,您可以使用.regressor_
访问包含的回归器,但存储在那里的系数未经转换。这意味着如果您想要回到生成数据的方程,则需要跳过一些额外的步骤。
不会的,流水线会始终原样传递y
。请在流水线外进行转换。
(这是scikit-learn中已知的设计缺陷,但它从未紧迫到足以改变或扩展API。)
TransformedTargetRegressor
对你最初回答问题之后被添加到API是有意义的。 - mcguip
mlinsights
扩展了scikit-learn,并添加了这个功能,称之为TransformedTargetClassifier2
。 - Ari Cooper-Davis