Python GridSearch中的管道重复次数超出预期
我想在我的数据框上执行网格搜索cv 在我的管道中,我使用自定义转换器格式化数据。虽然当我在自定义转换器中打印数据的形状时,它会被打印11次(该转换器被称为11次) 我认为它应该打印10次,因为它转换了训练和测试数据帧,每个打印5次,因为它是一个交叉验证。所以5x2=10 但显示的是第11个形状,实际上是完整df的尺寸(不分为列车/测试) 你知道第11次打电话的原因吗 下面是理解问题的部分代码: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(
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。交叉验证:评估估计器性能
学习预测函数的参数并在计算机上进行测试
同样的数据是一个方法上的错误:一个只会重复的模型
它刚刚看到的样品的标签会有一个完美的外观
得分,但无法根据尚未看到的数据预测任何有用的东西。
这种情况称为过度装配
现在有道理了,谢谢你的解释