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.
我想在我的数据框上执行网格搜索简历。
在我的管道中,我使用自定义转换器来格式化数据。虽然当我在我的自定义转换器中打印数据的形状时,它被打印了 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.