我正在使用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: