gpt4 book ai didi

python - 将 sklearn 的 GridSearchCV 与管道一起使用,只需预处理一次

转载 作者:IT老高 更新时间:2023-10-28 21:01:17 24 4
gpt4 key购买 nike

我正在使用 sickit-learn 来调整模型的超参数。我正在使用管道将预处理与估计器链接起来。我的问题的一个简单版本如下所示:

import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression


grid = GridSearchCV(make_pipeline(StandardScaler(), LogisticRegression()),
param_grid={'logisticregression__C': [0.1, 10.]},
cv=2,
refit=False)

_ = grid.fit(X=np.random.rand(10, 3),
y=np.random.randint(2, size=(10,)))

在我的例子中,预处理(玩具示例中的 StandardScale())非常耗时,而且我没有调整它的任何参数。

因此,当我执行示例时,StandardScaler 会执行 12 次。 2 拟合/预测 * 2 cv * 3 参数。但是每次为参数 C 的不同值执行 StandardScaler 时,它都会返回相同的输出,因此它会更有效,计算一次,然后只运行管道的估计器部分。

我可以手动拆分预处理(未调整超参数)和估计器之间的管道。但是要将预处理应用于数据,我应该只提供训练集。所以,我必须手动实现拆分,根本不使用 GridSearchCV。

是否有一种简单/标准的方法可以避免在使用 GridSearchCV 时重复预处理?

最佳答案

更新:理想情况下,不应使用以下答案,因为它会导致评论中讨论的数据泄漏。在这个答案中,GridSearchCV 将调整已由 StandardScaler 预处理的数据的超参数,这是不正确的。在大多数情况下,这应该无关紧要,但对缩放过于敏感的算法会给出错误的结果。


本质上,GridSearchCV 也是一个估计器,实现了管道使用的 fit() 和 predict() 方法。

所以而不是:

grid = GridSearchCV(make_pipeline(StandardScaler(), LogisticRegression()),
param_grid={'logisticregression__C': [0.1, 10.]},
cv=2,
refit=False)

这样做:

clf = make_pipeline(StandardScaler(), 
GridSearchCV(LogisticRegression(),
param_grid={'logisticregression__C': [0.1, 10.]},
cv=2,
refit=True))

clf.fit()
clf.predict()

它将做的是,只调用一次 StandardScalar(),一次调用 clf.fit() 而不是您描述的多次调用。

编辑:

在管道内使用 GridSearchCV 时,将 retrofit 更改为 True。如mentioned in documentation :

refit : boolean, default=True Refit the best estimator with the entire dataset. If “False”, it is impossible to make predictions using this GridSearchCV instance after fitting.

如果 refit=False,clf.fit() 将不起作用,因为管道内的 GridSearchCV 对象将在 fit() 之后重新初始化。当 refit=True 时,GridSearchCV 将在 fit() 中传递的整个数据上使用最佳评分参数组合进行重新拟合。

所以如果你想制作管道,只看网格搜索的分数,只有 refit=False 是合适的。如果要调用clf.predict()方法,必须使用refit=True,否则会抛出Not Fitted错误。

关于python - 将 sklearn 的 GridSearchCV 与管道一起使用,只需预处理一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com