当前位置: 首页 > 面试题库 >

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

孔睿
2023-03-14
问题内容

我正在使用scickit-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个简历
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()而不是您所描述的多次调用。

编辑:

True当在管道内使用GridSearchCV时,将refit更改为。如文档中所述:

refit:boolean,default = True用整个数据集重新拟合最佳估计量。如果为“
False”,则拟合后将无法使用此GridSearchCV实例进行预测。

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

因此,如果要建立管道,仅查看网格搜索的分数,则只有refit=False合适。如果要调用该clf.predict()方法,则refit=True必须使用,否则将引发“未拟合”错误。



 类似资料:
  • 问题内容: 我正在处理不平衡的数据集,并希望使用scikit的gridsearchcv进行网格搜索以调整模型的参数。为了对数据进行超采样,我想使用SMOTE,我知道我可以将其作为管道的一个阶段,并将其传递给gridsearchcv。我担心的是,我认为训练和验证折纸都将使用击打,这不是您应该做的。验证集不应过采样。我是否正确,整个管道将应用于两个数据集拆分?如果是的话,我该如何扭转呢?在此先多谢 问

  • 关于Jenkins管道和Groovy方法,我这里有两个问题。首先,我有多个共享公共方法的构建,所以我认为最好将所有这些都放在一个类中,然后为每个构建导入文件。 Groovy脚本中的一段代码如下所示 在我的管道脚本中,我有 我遇到的第一个问题是如何在我的方法中使用,其次,当我收到错误时,如何在我的脚本中使用 哈德逊。远程处理。ProxyException:groovy。lang.MissingMet

  • 问题内容: 考虑以下代码: 该程序的输出为: 当然,当我从外壳运行时,它可以按预期工作: 互联网告诉我,由于管道行为不是跨平台的事实,在生产Java的Java工厂工作的才华横溢的人无法保证管道能正常工作。 我怎样才能做到这一点? 我不会使用Java构造而不是grepand 来进行所有解析sed,因为如果我想更改语言,将被迫用该语言重新编写解析代码,这完全是不行的。 调用Shell命令时,如何使Ja

  • 我正在使用boilerpipe从html中获取文本。然而,有一些问题我还没有解决。我有一个50k元素的列表。我正在创建一个包含1000个元素的rdd,然后对它们进行处理,并将结果rdd保存在hdfs中。我遇到的错误是: 在hdfs文件中,前1000个元素的结果被保存,但继续下去会抛出上述错误。这个问题有什么解决办法?

  • 问题内容: 我有两段代码用于学习Python 3.1中的多处理。我的目标是使用所有可用处理器中的100%。但是,此处的代码段在所有处理器上仅达到30%-50%。 无论如何,要“强制” python使用全部100%?操作系统(Windows 7、64位)是否限制了Python对处理器的访问?当下面的代码段运行时,我打开任务管理器并观察处理器的峰值,但从未达到并维持100%。除此之外,我还可以看到在此

  • 问题内容: 每个开启器基本版本是否可以通过一个袜子服务器上的SOCKS代理使用urllib2来获取页面?我已经看到了使用setdefaultproxy方法的解决方案,但是我需要在不同的开瓶器中使用不同的袜子。 因此,有一个SocksiPy库,它很好用,但是必须以这种方式使用: 也就是说,它为所有urllib2请求设置相同的代理。如何为不同的开瓶器使用不同的代理? 问题答案: 尝试使用pycurl: