2017-08-26 9 views
0

カスタムトランスをビルドしてパイプラインで使用し、GridSearchCVを使用してそのパイプラインのパラメータを調整する必要があります。scikit learn。 GridSearchCVパイプラインのカスタムトランスフォーマset_paramsロジック。

hereからのアドバイスに続いて簡単なカスタムトランスを実装できましたが、 内部推定器を使用してトランスを実装しようとしているときに問題が発生し、この構造をGridSearchCVで使用しました。 Search(グリッド/無作為化)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__を呼び出し、メソッドからget_paramsのCV開始前にインスタンスから抽出されたパラメータを渡します。

そして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] 
関連する問題