Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GridSearch中的管道重复次数超出预期_Python_Machine Learning_Scikit Learn_Data Science_Gridsearchcv - Fatal编程技术网

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

Python GridSearch中的管道重复次数超出预期,python,machine-learning,scikit-learn,data-science,gridsearchcv,Python,Machine Learning,Scikit Learn,Data Science,Gridsearchcv,我想在我的数据框上执行网格搜索cv 在我的管道中,我使用自定义转换器格式化数据。虽然当我在自定义转换器中打印数据的形状时,它会被打印11次(该转换器被称为11次) 我认为它应该打印10次,因为它转换了训练和测试数据帧,每个打印5次,因为它是一个交叉验证。所以5x2=10 但显示的是第11个形状,实际上是完整df的尺寸(不分为列车/测试) 你知道第11次打电话的原因吗 下面是理解问题的部分代码: def binary_data(df): df.gender = df.gender.map(

我想在我的数据框上执行网格搜索cv

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

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

但显示的是第11个形状,实际上是完整df的尺寸(不分为列车/测试)

你知道第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)
但是,你能看到最后一套的尺寸吗?它是所有数据集的大小

你忘了机器学习模型的主要目标是什么。从数据集中学习。从数据集中的所有数据

交叉验证的目的是在使用网格搜索搜索最佳超参数时,获得模型性能的估计值

更清楚地说,cv用于评估模型与参数集之间的关系,然后,使用具有最佳参数的总数据集进行学习

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

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

search.best_estimator_
在一般情况下,这就是我们从数据集中拿出测试集的原因。评估我们的模型是否能很好地推广

发件人:

3.1。交叉验证:评估估计器性能

学习预测函数的参数并在计算机上进行测试 同样的数据是一个方法上的错误:一个只会重复的模型 它刚刚看到的样品的标签会有一个完美的外观 得分,但无法根据尚未看到的数据预测任何有用的东西。 这种情况称为过度装配


现在有道理了,谢谢你的解释