在scikitlearn GridSearchCV中只计算一次中间结果

2024-05-13 22:59:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个估计器:

    from sklearn.base import BaseEstimator, TransformerMixin
    import numpy as np

    class customEstimator(BaseEstimator, TransformerMixin):
        def __init__(self, estimator_var):
            self.estimator_var = estimator_var
        def transform(self, X):
            self.tmpVar = np.random.randn(estimator_var, estimator_var)
            return np.hstack((self.tmpVar, X)) # this is just an example
        def fit(self, X, y=None):
            return self
        def get_params(self, deep=False):
            return {'estimator_var': self.estimator_var, 'tmpVar': tmpVar}

然后,我创建一个包含估计器的管道(以及其他人),并将其输入GridSearchCV进行k折交叉验证。k-fold交叉验证如下所示:

^{pr2}$

问题是,对于给定的参数组合,我只想计算一次self.tmpVar(这可能计算起来很慢),并将其用于共享相同参数组合的所有折叠拆分。在

在scikit learn中这是可能的吗,还是有一个解决办法?在


Tags: fromimportselfbase参数returnvardef
1条回答
网友
1楼 · 发布于 2024-05-13 22:59:12

只需将此变量存储为类的静态属性,或任何其他全局名称范围。在

from sklearn.base import BaseEstimator, TransformerMixin
import numpy as np

class customEstimator(BaseEstimator, TransformerMixin):

    tmpVar = None

    def __init__(self, estimator_var):
        self.estimator_var = estimator_var
    def transform(self, X):
        if customEstimator.tmpVar is None:
            customEstimator.tmpVar = np.random.randn(estimator_var, estimator_var)
        return np.hstack((customEstimator.tmpVar, X)) # this is just an example
    def fit(self, X, y=None):
        return self
    def get_params(self, deep=False):
        return {'estimator_var': self.estimator_var}

当然,这里的问题是,如果你用不同的数据多次重用你的估计器,有时你需要重置。然后,您只需为每个估计器指定一个名称,并将这些tmpvar存储在一个map(字典)中,并将这些名称作为键。您甚至可以通过以下行中的某些内容自动生成名称:

^{pr2}$

这样,如果您创建一个customEstimator的新实例,它将获得一个新名称,但是如果它被scikit learn克隆,它们将共享相同的名称(因此是-data)。在

相关问题 更多 >