2017-08-26 44 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]