【问题标题】:Using a transformer (estimator) to transform the target labels in sklearn.pipeline使用转换器(估计器)转换 sklearn.pipeline 中的目标标签
【发布时间】:2019-11-08 21:55:56
【问题描述】:

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

【问题讨论】:

    标签: scikit-learn


    【解决方案1】:

    现在 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)))
    

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这有过审查吗?这对于并行化管道的各个方面非常方便,其中 y 也在有界超参数中。
    • fred-foo 我认为引用 TransformedTargetRegressor 在您最初回答这个问题之后很好地添加到 API 是有意义的。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-13
      • 2011-04-14
      • 2016-10-04
      • 2018-04-26
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多