gpt4 book ai didi

python - scikit 学习。 GridSearchCV 管道中的自定义 Transformer set_params 逻辑。

转载 作者:行者123 更新时间:2023-12-01 02:39:12 25 4
gpt4 key购买 nike

我需要构建自定义转换器,在管道中使用它并使用 GridSearchCV 评估它调整该管道的参数。

按照 here 的建议,我成功实现了简单的自定义转换器。 , 但在尝试使用内部估计器实现转换器并在 GridSearchCV 中使用此结构时出现了问题。在我看来,我自己找不到答案,因为我不完全理解 (Grid/Randomized)SearchCV 和 set_params 等搜索方法的微妙之处。

《Introduction to ML with Python》一书描述的 GridSearchCV 逻辑相当幼稚:

...iterating over each parameters combination...
init estimator
fit estimator
evaluate

但是这种幼稚的方法无法回答我的问题。为了澄清我的问题,让我们看一下这个案例:

class OuterTransformer(BaseEstimator, TransformerMixin):
_options = {'std':StandardScaler(),'mm':MinMaxScaler()}
def __init__(self, option='std'):
...

对我来说主要问题是“我应该把选择内部估计器的逻辑放在哪里?”。根据上面提到的帖子,这应该看起来像这样:

    def __init__(self, option='std'):
self.option = option
def fit(self, data, y=None):
self.option = self._options[option]
...

另一方面,常识表明 GridSearch 必须在调用 fit 之前传递参数来初始化内部估计器,因此应在 __init__ 中选择内部估计器。

似乎第一种方法效果很好,但我就是不明白为什么。有人可以向我解释一下这种现象吗?

最佳答案

看来我理解了估计器参数的初始化和重新初始化的逻辑。这有助于回答我的问题:

类字段必须使用传递给构造函数的原始值进行初始化,而不是它们的一些“派生值”,因为对于每个重新估计器初始化时,scikit 调用 __init__,传递在 CV 启动之前通过 get_params 方法从实例中提取的参数。

get_params 的本质是它扫描类的方法 __init__ 的签名,并从名称与__init__ 的参数(当然除了 self)。

因此,如果我们将“派生”值写入__init__方法内的字段中,这些“派生”值将被传输到下一个重新初始化,这意味着一切都会失败。

class OuterTransformer(BaseEstimator, TransformerMixin):
_options = {'std':StandardScaler(),'mm':MinMaxScaler()}

# good init- all fine
def __init__(self, option='std'):
self.option = option

# bad init - will not work, because option is not an 'original' parameter.
def __init__(self, option='std'):
self.option = self._options[option]

关于python - scikit 学习。 GridSearchCV 管道中的自定义 Transformer set_params 逻辑。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45899221/

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