LoginSignup
3
1

More than 3 years have passed since last update.

コード削減―Pipeline化とFunctionTransformer―

Last updated at Posted at 2020-09-06

きっかけ

メルカリコンペ1位のコードに出てきたmake_pipelineとFunctionTransformerが良く分からなかったから。

まとめ

make_pipeline→[前処理+学習+推定]などのコードを1つの推定器に変換する。コード削減が可能。

FunctionTransformer→任意の関数をtransformer(変換器)に変換する。Pipelineの引数はtransformerである必要があるため。任意の関数の最低要件はfitとtransformが存在すること。

使用例

使用例①

下記例ではPCA()が行われた後に、SVCが実行されている。
前処理と分類を一連の動作で実行することができている。

下記例の参考サイト

qiita.rb
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn import datasets

# サンプルデータの用意
iris = datasets.load_iris()
X, y = iris.data, iris.target

# pipelineの作成
estimators = [('reduce_dim', PCA()), ('clf', SVC())]
pipe = Pipeline(steps=estimators)

# 学習
pipe.fit(X, y)

# 予測
pipe.predict(X)

利用例② メルカリコンペコードの使用例

メルカリコンペ1位のコードの一部抜粋

qiita.rb
from sklearn.pipeline import make_pipeline, make_union, Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer as Tfidf

def on_field(f: str, *vec) -> Pipeline:
    return make_pipeline(FunctionTransformer(itemgetter(f), validate=False), *vec)

 vectorizer = make_union(
        on_field('name', Tfidf(max_features=100000, token_pattern='\w+')),
        on_field('text', Tfidf(max_features=100000, token_pattern='\w+', ngram_range=(1, 2))),
        on_field(['shipping', 'item_condition_id'],
                 FunctionTransformer(to_records, validate=False), DictVectorizer()),
        n_jobs=4)

make_pipelineでitemgetterとTfidfのインスタンスをパイプライン化している。
FunctionTransformerでitemgetterをtransformerに変換して自前の変換器を作成している。
これにより、itemgetter(文字列の抽出)の重要な文字列の特定を一連の流れでこの後行えるようになっている。
itemgetterはこちら

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1