2017-08-26 45 views
0

我需要构建自定义变压器,将其用于流水线,并使用GridSearchCV评估该流水线的参数。scikit学习。 GridSearchCV管道中的自定义变压器set_params逻辑。

我设法实现简单的自定义变压器,遵循here的建议,但 在尝试使用内部估计器实现变压器时发生的问题,并在GridSearchCV中使用此构造。我自己找不到答案,因为我认为,因为我没有完全理解搜索方法(如网格/随机)SearchCV和set_params的细微之处。

书“介绍与Python ML”形容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必须通过参数调用适合之前初始化内部估计,因此内部估计应该是选在__init__

看来,第一种方式工作正常,但我只是不明白为什么。 可以请有人向我解释这个现象吗?

回答

1

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

这个类区域必须被传递给构造那些值,而不是一些“衍生物”从他们被初始化,因为每个重新初始化估计器scikit调用__init__,在CV开始之前传递通过方法get_params从实例中提取的参数。

get_params的本质在于它扫描方法的类__init__的签字,并经估算领域的实例拉与对应的__init__的参数名称名称(除了当然是自我)。

因此,如果我们写“源自”值到字段内__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]