据我所知,可以链接几个实现变换方法的估算器来转换sklearn.pipeline中的X(特征集)。但是我有一个用例,我想要转换目标标签(比如将标签转换为[1 ... K]而不是[0,K-1],我很乐意将其作为我管道中的一个组件是否有可能使用sklearn.pipeline。
答案 0 :(得分:10)
不,管道将始终通过y
不变。在管道外进行转换。
(这是scikit-learn中一个已知的设计缺陷,但它从来没有足够的压力来改变或扩展API。)
答案 1 :(得分:0)
您可以将标签列添加到训练数据的末尾,然后应用转换并删除该列,然后再训练模型。那不是很专业,但是足够。
答案 2 :(得分:0)
现在,在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)))
这仍然不尽如人意,例如,您可以使用TransformedTargetRegressor
访问.regressor_
所包含的回归变量,但是存储在其中的系数未转换。这意味着,如果您想回到生成数据的方程式中,还需要克服一些额外的障碍。