GridSearch 中的管道重复次数超过预期

Pipeline within GridSearch repeats more than expected

我想在我的数据框上执行网格搜索简历。

在我的管道中,我使用自定义转换器来格式化数据。虽然当我在我的自定义转换器中打印数据的形状时,它被打印了 11 次(转换器被调用了 11 次)

我认为它应该打印 10 次,因为它转换训练和测试数据帧,每次打印 5 次,因为它是交叉验证。所以 5 x 2 = 10.

但是显示的是第11个shape,其实就是全df的维度(没有分成train/test)

你知道第11次来电的原因吗?

这里是理解问题的部分代码:

def binary_data(df):
    df.gender = df.gender.map({'Female': 0, 'Male': 1})
    print(df.shape)
    return df

pipeline = ColumnTransformer([('binarydata', FunctionTransformer(binary_data), ['gender'])])
param_grid = {}
search = GridSearchCV(pipeline, param_grid, scoring='accuracy')
search.fit(X, y)

编辑:refit=True(默认)标志实际上是额外调用的原因

我已经构建了一个示例来检查行为

import pandas as pd
from sklearn.model_selection import GridSearchCV
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import FunctionTransformer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline

values = [{'gender':'Female'} if i%2==0 else {'gender':'Male'} for i in range(100)]

X = pd.DataFrame(values)
y = [0 if i%2==0 else 1 for i in range(100)]

def binary_data(df):
    df.gender = df.gender.map({'Female': 0, 'Male': 1})
    print(df.shape)
    return df

columntransf = ColumnTransformer([('binarydata', FunctionTransformer(binary_data), ['gender'])])
model_pipeline = Pipeline([
    ('preprocessing', columntransf),
    ('classifier', LogisticRegression(solver='lbfgs'))
])
param_grid = {}
search = GridSearchCV(model_pipeline, param_grid, scoring='accuracy')
search.fit(X, y) 

是的,我按照你说的,11打印:

(80, 1)
(20, 1)
(80, 1)
(20, 1)
(80, 1)
(20, 1)
(80, 1)
(20, 1)
(80, 1)
(20, 1)
(100, 1)

但是,你能看到最后一组的大小吗?它是所有数据集的大小。

您忘记了机器学习模型的主要内容是什么 objective。从数据集中学习。来自您数据集中的所有数据。

您尝试使用 CrossValidation 做的是在使用网格搜索

搜索最佳超参数时获得模型性能估计

为了更清楚地说明,cv 用于评估您的模型与您的参数集的好坏程度,然后,您的总数据集(具有最佳参数)用于学习。

另一个观察:否则方法 .predict() 将如何执行?最后我们只需要 一个 个模型,而不是五个模型来进行预测

最后使用的模型,适用于所有数据集,是您可以从中提取的模型:

search.best_estimator_

在一般情况下,这就是我们从数据集中提供测试集的原因。评估我们的模型是否能很好地泛化

来自scikit-learn

3.1. Cross-validation: evaluating estimator performance

Learning the parameters of a prediction function and testing it on the same data is a methodological mistake: a model that would just repeat the labels of the samples that it has just seen would have a perfect score but would fail to predict anything useful on yet-unseen data. This situation is called overfitting.