代码之家  ›  专栏  ›  技术社区  ›  Max Power

为什么sklearn管道调用transform()的次数比fit()多?

  •  3
  • Max Power  · 技术社区  · 7 年前

    在大量阅读和检查管道后。不同条件下的fit()操作 verbose 参数设置,我仍然不明白为什么我的管道访问某个步骤的 transform 方法如此多次。

    下面是一个简单的例子 pipeline , fit 具有 GridSearchCV ,使用3倍交叉验证,但参数网格只有一组超参数。所以我预计管道中会有三条管道。二者都 step1 step2 按预期调用了三次,但每个步骤都有 使改变 又打了几次电话。为什么会这样?下面的最小代码示例和日志输出。

    # library imports
    import pandas as pd
    from sklearn import datasets
    from sklearn.model_selection import KFold
    from sklearn.linear_model import LogisticRegression
    from sklearn.base import TransformerMixin, BaseEstimator
    from sklearn.pipeline import Pipeline
    
    # Load toy data
    iris = datasets.load_iris()
    X = pd.DataFrame(iris.data, columns = iris.feature_names)
    y = pd.Series(iris.target, name='y')
    
    # Define a couple trivial pipeline steps
    class mult_everything_by(TransformerMixin, BaseEstimator):
    
        def __init__(self, multiplier=2):
            self.multiplier = multiplier
    
        def fit(self, X, y=None):
            print "Fitting step 1"
            return self
    
        def transform(self, X, y=None):
            print "Transforming step 1"
            return X* self.multiplier
    
    class do_nothing(TransformerMixin, BaseEstimator):
    
        def __init__(self, meaningless_param = 'hello'):
            self.meaningless_param=meaningless_param
    
    
        def fit(self, X, y=None):
            print "Fitting step 2"
            return self
    
        def transform(self, X, y=None):
            print "Transforming step 2"
            return X
    
    # Define the steps in our Pipeline
    pipeline_steps = [('step1', mult_everything_by()),
                      ('step2', do_nothing()), 
                      ('classifier', LogisticRegression()),
                      ]
    
    pipeline = Pipeline(pipeline_steps)
    
    # To keep this example super minimal, this param grid only has one set
    # of hyperparams, so we are only fitting one type of model
    param_grid = {'step1__multiplier': [2],   #,3],
                  'step2__meaningless_param': ['hello']   #, 'howdy', 'goodbye']
                  }
    
    # Define model-search process/object
    # (fit one model, 3-fits due to 3-fold cross-validation)
    cv_model_search = GridSearchCV(pipeline, 
                                   param_grid, 
                                   cv = KFold(3),
                                   refit=False, 
                                   verbose = 0) 
    
    # Fit all (1) models defined in our model-search object
    cv_model_search.fit(X,y)
    

    输出:

    Fitting step 1
    Transforming step 1
    Fitting step 2
    Transforming step 2
    Transforming step 1
    Transforming step 2
    Transforming step 1
    Transforming step 2
    Fitting step 1
    Transforming step 1
    Fitting step 2
    Transforming step 2
    Transforming step 1
    Transforming step 2
    Transforming step 1
    Transforming step 2
    Fitting step 1
    Transforming step 1
    Fitting step 2
    Transforming step 2
    Transforming step 1
    Transforming step 2
    Transforming step 1
    Transforming step 2
    
    1 回复  |  直到 7 年前
        1
  •  6
  •   Vivek Kumar    7 年前

    因为你用过 GridSearchCV 具有 cv = KFold(3)

    1. 它将数据分为两部分:训练和测试。
    2. 对于训练,它将拟合和变换管道的每个部分(不包括最后一部分,即分类器)。这就是你看到的原因 fit step1, transform step1, fit step2, transform step2 .
    3. 它将在分类器上拟合转换后的数据(未打印在输出中)。
    4. 已编辑 现在是得分部分。在这里,我们不想重新装配零件。我们将使用之前安装过程中学习到的信息。因此,管道的每个部分将仅调用transform()。这就是 Transforming step 1, Transforming step 2 .

      它显示了两次,因为在GridSearchCV中,默认行为是计算训练和测试数据的分数。这种行为是由 return_train_score . 您可以设置 return_train_score=False 只会见到他们一次。

    5. 转换后的测试数据将用于预测分类器的输出。(同样,测试中没有拟合,只有预测或转换)。

    6. 预测值将用于与实际值进行比较,以对模型进行评分。
    7. 步骤1-6将重复3次 (KFold(3)) .
    8. 现在看看你的参数:

      “step2\uu Unassessful\u param”:[“hello”]#、“你好”、“再见”] }

      扩展时,它成为唯一的单一组合,即:

      组合1

      如果您提供了更多选项(您已对其进行了评论),则可能会有更多组合,如:

      组合1 :“step1\uu乘数”=2,“step2\uu无意义参数”=“你好”

      组合2 :“step1\uu乘数”=3,“step2\uu无意义参数”=“你好”

      组合3 :“step1\uu乘数”=2,“step2\uu无意义参数”=“你好”

      等等

    9. 对于每个可能的组合,将重复步骤1-7。

    10. 将选择在交叉验证的测试折叠中平均得分最高的组合,以最终用完整数据拟合模型(不分为训练和测试)。
    11. refit=False . 因此,不会再次安装该模型。否则你会看到

      转换步骤1 安装步骤2

    希望这能解决这个问题。请随时询问更多信息。