適切なCVを実行するには、パイプラインを使用して、CVの各フォールドに同じ変換を適用できるようにすることをお勧めします。 sklearn.preprocessing.FunctionTrasformer
またはsubclassing sklearn.base.TransformerMixin
のいずれかを使用して、カスタム変換を定義できます。推奨されるアプローチはどれですか?どうして?
まあそれは完全にあなた次第です、どちらも多かれ少なかれ同じ結果を達成します、あなたがコードを書く方法だけが異なります。
たとえば、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
をお勧めします。
ここでは、より良いアイデアを得るために次のリンクを見てください