web-dev-qa-db-ja.com

Sklearnカスタムトランスフォーマー:FunctionTransformerの使用とTransformerMixinのサブクラス化の違い

適切なCVを実行するには、パイプラインを使用して、CVの各フォールドに同じ変換を適用できるようにすることをお勧めします。 sklearn.preprocessing.FunctionTrasformerまたはsubclassing sklearn.base.TransformerMixinのいずれかを使用して、カスタム変換を定義できます。推奨されるアプローチはどれですか?どうして?

7
artemis

まあそれは完全にあなた次第です、どちらも多かれ少なかれ同じ結果を達成します、あなたがコードを書く方法だけが異なります。

たとえば、sklearn.preprocessing.FunctionTransformerを使用しているときに、使用する関数を定義して、次のように直接呼び出すことができます( 公式ドキュメントのコード

def all_but_first_column(X):
    return X[:, 1:]

def drop_first_component(X, y):
    """
    Create a pipeline with PCA and the column selector and use it to
    transform the dataset.
    """
    pipeline = make_pipeline(PCA(), FunctionTransformer(all_but_first_column),)

    X_train, X_test, y_train, y_test = train_test_split(X, y)
    pipeline.fit(X_train, y_train)
    return pipeline.transform(X_test), y_test

一方、subclassing sklearn.base.TransformerMixinを使用している間は、クラスのfitおよびtransform関数とともにクラス全体を定義する必要があります。したがって、次のようなクラスを作成する必要があります(サンプルコードは このブログ投稿 から取得)

class FunctionFeaturizer(TransformerMixin):
    def __init__(self, *featurizers):
        self.featurizers = featurizers

    def fit(self, X, y=None):
        return self

   def transform(self, X):
        #Do transformations
        return transformed data

ご覧のとおり、TransformerMixinは、変換関数に関してFunctionTransformerと比較して柔軟性があります。値などに応じて、複数の変換または部分変換を適用できます。たとえば、ログに記録する最初の50個の値に対して、逆ログを取得する次の50個の値などを使用できます。データを選択的に処理するための変換メソッドを簡単に定義できます。

関数をそのまま直接使用したい場合は、sklearn.preprocessing.FunctionTrasformerを使用します。それ以外の場合は、さらに変更を加えたり、複雑な変換を行ったりする場合は、subclassing sklearn.base.TransformerMixinをお勧めします。

ここでは、より良いアイデアを得るために次のリンクを見てください

8
Mohammed Kashif