scikit-learn の Pipeline を使うと,データセットの前処理や機械学習アルゴリズムなどを「1つのオブジェクトに」まとめることができる.
前回の記事で紹介した「Kaggle Courses」の「Intermediate Machine Learning」コースでも使われていたこともあり,もう少しドキュメントを読みながら試していく.
Pipeline に入門する
「Kaggle Courses」のコースを参考にサンプルコードを書くと,以下のようになる(重要なコードのみを抜粋している).Pipeline を使わずにコードを書くと SimpleImputer や OneHotEncoder や RandomForestRegressor など,それぞれで fit() や fit_transform() を実行する必要があるため,コード量を減らしつつ,可読性が高く実装できる.イイネ👏
from sklearn.ensemble import RandomForestRegressor from sklearn.impute import SimpleImputer from sklearn.pipeline import Pipeline from sklearn.preprocessing import OneHotEncoder X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=0) pipeline = Pipeline( steps=[ ('imputer', SimpleImputer(strategy='most_frequent')), ('encoder', OneHotEncoder(handle_unknown='ignore')), ('model', RandomForestRegressor(n_estimators=50, random_state=0)) ] ) pipeline.fit(X_train, y_train) pipeline.predict(X_test)
また Pipeline に verbose=True パラメータを追加すると fit() を実行しながら以下のように進捗を表示することもできる.
pipeline = Pipeline(
steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('encoder', OneHotEncoder(handle_unknown='ignore')),
('model', RandomForestRegressor(n_estimators=50, random_state=0))
],
verbose=True
)
# [Pipeline] ........... (step 1 of 3) Processing imputer, total= 0.1s
# [Pipeline] ........... (step 2 of 3) Processing encoder, total= 0.1s
# [Pipeline] ............. (step 3 of 3) Processing model, total= 10.1s
そして,以下のドキュメントを参考に set_config() を使って「ダイアグラム表示」を有効化すると,以下のように Pipeline 構成を図として表示できる.実際には枠をクリックすることができて,パラメータを表示したり,非表示にしたりできる.
from sklearn import set_config set_config(display='diagram') pipeline

Pipeline で前処理をカテゴライズする
さらに Pipeline の中で前処理をカテゴライズすることもできる.例えば,以下のように numeric_preprocessor(量的変数) と categorical_preprocessor(カテゴリ変数) としてまとめている(重要なコードのみを抜粋している).最終的には make_pipeline() を使って RandomForestRegressor とまとめている.今回のサンプルコード以上に前処理などが多いときに効果が出そう.
from sklearn.compose import ColumnTransformer from sklearn.ensemble import RandomForestRegressor from sklearn.impute import SimpleImputer from sklearn.pipeline import make_pipeline from sklearn.pipeline import Pipeline from sklearn.preprocessing import OneHotEncoder, StandardScaler numeric_preprocessor = Pipeline( steps=[ ('imputer', SimpleImputer(strategy='most_frequent')), ('scaler', StandardScaler()), ] ) categorical_preprocessor = Pipeline( steps=[ ('onehot', OneHotEncoder(handle_unknown='ignore')), ] ) pipeline = make_pipeline( ColumnTransformer( [ ('numerical', numeric_preprocessor, numerical_cols), ('categorical', categorical_preprocessor, categorical_cols) ] ), RandomForestRegressor(n_estimators=50, random_state=0) )
同じく set_config() を使って「ダイアグラム表示」を有効化すると,より整理された Pipeline 構成を表示することができた.
from sklearn import set_config set_config(display='diagram') pipeline

まとめ
scikit-learn の Pipeline を使うと,データセットの前処理や機械学習アルゴリズムなどを「1つのオブジェクトに」まとめることができる.今回はシンプルな Pipeline 構成とカテゴライズをした構成を紹介した.ドキュメントを読むと,他にも GridSearchCV と組み合わせてハイパーパラメータを探索することもできて,便利だった.