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

24

我理解在sklearn.pipeline中可以链接多个实现转换方法的估算器,以转换X(特征集)。然而,我有一个使用案例,我希望能够将目标标签转换为[1...K]而不是[0,K-1],并且我希望将其作为管道中的一个组件来完成。是否可能在sklearn.pipeline中实现这一点?

3个回答

28
现在Scikit-learn中有一种更好的方法来完成这项任务;使用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_ 访问包含的回归器,但存储在那里的系数未经转换。这意味着如果您想要回到生成数据的方程,则需要跳过一些额外的步骤。


7
你知道分类器类似的功能吗? - Selman Tunc Yilmaz
3
Python库mlinsights扩展了scikit-learn,并添加了这个功能,称之为TransformedTargetClassifier2 - Ari Cooper-Davis

27

不会的,流水线会始终原样传递y。请在流水线外进行转换。

(这是scikit-learn中已知的设计缺陷,但它从未紧迫到足以改变或扩展API。)


3
这个有被审核过吗?如果在有界超参数的情况下并行化管道的某些方面,这将非常方便。 - jtromans
4
我认为引用TransformedTargetRegressor对你最初回答问题之后被添加到API是有意义的。 - mcguip

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接