ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

データ分析コンペで使っているワイの学習・推論パイプラインを晒します

f:id:taxa_program:20191214164035p:plain

こんにちは!たかぱい(@takapy0210)です。

本記事はKaggle Advent Calendar 2019の14日目の記事です。

昨日はkaggle masterのアライさんKaggleコード遺産の記事でした!
とても参考になり、いくつか自分の遺産にも取り入れさせていただきました。

さて本日は、以前から何回かLTさせていただいていたオレオレパイプラインを公開しましたので、簡単にご紹介できればと思います。

はじめに

元々、パイプラインが良い感じにできたら公開したいな〜と思っていたのですが、何回かLTする中で、ありがたいことに以下のようなお声をいただき、あっ、Kaggleのアドベントカレンダーで公開すれば丁度よいのでは?と思い、急いで準備してみました。

(が、思っていたより準備が進まず、コードもそこまでキレイになっていないことをご了承ください・・・🙇‍♂️)

パイプラインについて

下記Githubにて公開しています。
タイタニックのデータを入力として、LightGBM、xgboostを利用して学習・推論の一通りの流れを実行できるようにしてあります。

github.com

どのようなものかは以前LTした下記資料をみていただければイメージがつきやすいかと思います。

データ分析コンペにおいて 特徴量管理に疲弊している全人類に伝えたい想い - Speaker Deck

学習・推論パイプラインを構築する上で大切にしていること - Speaker Deck

また、資料中にも記載していますが、下記にて言及されているものを参考に自分なりに少しカスタマイズしたパイプラインとなっています。(筆者の方々ありがとうございます)

amalog.hateblo.jp

gihyo.jp

実行方法

下記コマンドで、タイタニックデータを使って学習・推論ができます。
(GitHubのREADMEにも記載しています)

# クローン
git clone https://github.com/takapy0210/ml_pipeline.git

# フォルダ移動
cd ml_pipeline/code

# 特徴量生成
python 10_titanic_fe.py

# 学習・推論・sub作成
python 20_run.py

補足

パイプラインについて、冒頭のスライドではあまり触れられていない部分について簡単に補足します。

config.yamlについて

下記のようにパスを設定しています。
こうすることで、このyamlファイルを読み込むだけで複数のスクリプトファイルから同じ変数値が使用できます。(逆にこのファイルを変更すれば、全スクリプトに反映されます)

SETTING:
  MODEL_DIR_NAME: '../models/' # 学習結果の諸々を保存するディレクトリ
  SUB_DIR_NAME: '../data/submission/' # sample提出ファイル保存ディレクトリ
  RAW_DATA_DIR_NAME: '../data/raw/' # オリジナルデータの格納先ディレクトリ
  FEATURE_PATH: '../data/features/' # オリジナルデータ

15_show_all_features.pyについて

これは単純に、10_titanic_fe.pyで生成した特徴量のカラム名を取得するためのスクリプトです。
実行すると、ターミナル上にカラム名が下記のように出力されます。

~~~
'age_mis_val_median'
,'family_size'
~~~

これを、20_run.pyで特徴量を指定している箇所(下記)に貼り付けることで、作業負荷を軽減しようというものです。

# pklからロードする特徴量の指定
features = [
        'age_mis_val_median'
        ,'family_size'
        ...
    ]

作成される画像ファイルについて

例えばLightGBMを実行すると、下記のようなfeature importanceをプロットした画像ファイルが出力されます。

f:id:taxa_program:20191214161142p:plain
feature importance(gain)

青いバーは各foldのfeature importanceの平均を示しており、オレンジのバーは各foldのfeature importanceの標準偏差となっています。

赤丸は、上の平均と標準偏差から計算した変動係数(標準偏差/平均)です。この変動係数が大きいと、各foldでのfeature importanceのブレが大きい(あるfoldではとても重要だが、別のfoldではそこまで重要じゃない)ということが分かるので、特徴量選択する際の参考になるのではないかと思います。

終わりに

このパイプラインが少しでもみなさんの参考になれば嬉しい限りです。

今後もコンペに取り組みつつ、自分なりに使いやすいパイプラインにアップデートしていければと思っています。コードも汚いのでリファクタリングしつつ・・・汗
(何かオカシイところあればツッコミお願いします🙇‍♂️)

明日は本記事でも参考にしているブログを書いているamaotoneさんです。

楽しみ!