如何使用 sklearn 管道缩放 Keras 自动编码器模型的目标值?

Posted

技术标签:

【中文标题】如何使用 sklearn 管道缩放 Keras 自动编码器模型的目标值?【英文标题】:How to scale target values of a Keras autoencoder model using a sklearn pipeline? 【发布时间】:2020-11-15 13:48:48 【问题描述】:

我正在使用 sklearn 管道构建 Keras 自动编码器模型,并使用网格搜索来查找最佳超参数。如果我使用多层感知器模型进行分类,这很好用;但是,在自动编码器中,我需要输出值与输入相同。换句话说,我在管道中使用StandardScalar 实例来缩放输入值,因此这导致了我的问题:如何使管道内的StandardScalar 实例同时处理输入数据以及目标数据,以便它们最终相同?

我提供一个代码 sn-p 作为示例。

from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV, KFold
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop, Adam
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor

X, y = make_classification (n_features = 50, n_redundant = 0, random_state = 0,
                            scale = 100, n_clusters_per_class = 1)

# Define wrapper
def create_model (learn_rate = 0.01, input_shape, metrics = ['mse']):
  model = Sequential ()
  model.add (Dense (units = 64, activation = 'relu',
                   input_shape = (input_shape, )))
  model.add (Dense (32, activation = 'relu'))
  model.add (Dense (8,  activation = 'relu'))
  model.add (Dense (32, activation = 'relu'))
  model.add (Dense (input_shape, activation = None))
  model.compile (loss = 'mean_squared_error',
                 optimizer = Adam (lr = learn_rate),
                 metrics = metrics)
  return model

# Create scaler
my_scaler = StandardScaler ()
steps = list ()
steps.append (('scaler', my_scaler))
standard_scaler_transformer = Pipeline (steps)

# Create classifier
clf = KerasRegressor (build_fn = create_model, verbose = 2)

# Assemble pipeline
# How to scale input and output??
clf = Pipeline (steps = [('scaler', my_scaler),
                         ('classifier', clf)],
                verbose = True)

# Run grid search
param_grid = 'classifier__input_shape' : [X.shape [1]],
              'classifier__batch_size' : [50],
              'classifier__learn_rate' : [0.001],
              'classifier__epochs' : [5, 10]
cv = KFold (n_splits = 5, shuffle = False)
grid = GridSearchCV (estimator = clf, param_grid = param_grid,
                     scoring = 'neg_mean_squared_error', verbose = 1, cv = cv)
grid_result = grid.fit (X, X)

print ('Best: %f using %s' % (grid_result.best_score_, grid_result.best_params_))

【问题讨论】:

【参考方案1】:

您可以通过提供函数(即使用func 参数)或转换器(即transformer 参数)来使用TransformedTargetRegressor 对目标值(即y)应用任意转换。

在这种情况下(即拟合自动编码器模型),由于您也想在目标值上应用相同的 StandardScalar 实例,因此可以使用 transformer 参数。它可以通过以下方式之一完成:

您可以将其用作管道步骤之一,包装回归器:

scaler = StandardScaler()
regressor = KerasRegressor(...)

pipe = Pipeline(steps=[
    ('scaler', scaler),
    ('ttregressor', TransformedTargetRegressor(regressor, transformer=scaler))
])

# Use `__regressor` to access the regressor hyperparameters
param_grid = 'ttregressor__regressor__hyperparam_name' : ...

gridcv = GridSearchCV(estimator=pipe, param_grid=param_grid, ...)
gridcv.fit(X, X)

或者,您可以将其包裹在 GridSearchCV 周围,如下所示:

 ttgridcv = TransformedTargetRegressor(GridSearchCV(...), transformer=scalar)
 ttgridcv.fit(X, X)

 # Use `regressor_` attribute to access the fitted regressor (i.e. `GridSearchCV` instance) 
 print(ttgridcv.regressor_.best_score_, ttgridcv.regressor_.best_params_))

【讨论】:

这似乎解决了缩放目标的问题。但是现在还可以给网格内的分类器设置参数吗?访问pipe.get_params ().keys () 时,只有与新TransformedTargetRegressor 对象相关的参数。 @kaylani2 是的,我在代码 sn-p 中提到了使用 cmets,您可以使用 __regressor 访问它们(请参阅我设置 param_grid 的行)。 我现在明白了。没有看到管道返回密钥看起来很奇怪,但这正是 sklearn 的实现方式。今天,我会接受答案。非常感谢! @kaylani2 对我来说,运行pipe.get_params() 会显示所有参数,包括由TransformedTargetRegressor 包装的回归器的参数。更具体地说,您可以使用pipe['ttregressor'].get_params()。甚至你可以更进一步,使用pipe['ttregressor'].regressor.get_params() 只获取regressor 的参数。

以上是关于如何使用 sklearn 管道缩放 Keras 自动编码器模型的目标值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mlflow.pyfunc.log_model() 通过 Keras 步骤记录 sklearn 管道?类型错误:无法腌制 _thread.RLock 对象

将 Keras 集成到 SKLearn 管道?

将 keras 集成到 sklearn 管道中的问题

Keras Sklearn Tuner 模块“sklearn”没有属性“管道”

在 Sklearn 管道和交叉验证中使用缩放器

sklearn:应用相同的缩放来训练和预测管道