はじめに
DROBE で ETL の一部として行なっている ML 向け feature engineering の概要を記載します
ML 向け feature engineering の概要
DROBE では ETL による ML の Feature engineering を行なっているコンテナを ((ML 向けの Transform 処理なので) ml_transform と呼んで管理しています
ml_transform は以下のように、ETL の一部として実行されます
ETL としては、ml_transform が実行される前に各種データを application で使う DB から Bigquery にあげる (snapshot をとる) 処理があり、Bigquery の持っているデータに整合性があってかつ最新であるという前提に基づいて ml_transform を実行しています
ml_transoform で作られるデータは以下のようなものがあります
├── ml_items // 機械学習向けに使いやすく item 情報をまとめたもの
├── ml_user_boxes // user に発送した箱の情報をまとめたもの (例えば発送日など)
├── ml_users // user の情報をまとめたもの
...
例えば ml_users
は user の情報をまとめたものですが、DB にはアプリケーションの都合上複数のテーブルに分割して格納されているものを ETL 処理で非正規化を行い、機械学習で使いやすいようにしています
ml_transform の実装
ml_transform の実装は、python で書かれたスクリプトで、主に以下の機能ブロックで構成されます
- Bigquery からデータをダウンロードする機能
- Bigquery からダウンロードしたデータを整形する機能
- 整形したデータを S3 にアップロードする機能
コードとしては、poetry を使って作った project で、以下のようなフォルダ構造にしています
├── Dockerfile // ETL で使われるコンテナの定義
├── Makefile // 各種スクリプト
├── README.md
├── data // BQ からダウンロードしたデータを置いておく場所
├── parquet // Transform したデータを置いておく場所
├── poetry.lock
├── pyproject.toml
├── src
│ ├── main.py // entry point
│ ├── transformer // Bigquery からダウンロードしたデータを整形する関数の定義
│ └── util
├── test // unit test 用のフォルダ
│ ├── artifacts
│ ├── data
│ ├── expect
│ └── test_transformer_result.py
└── zip
ETL からは docker の起動コマンドとして src/main.py
を叩く事を想定しています
Docker container に上記の機能を持ったスクリプトを焼き込み、ETL の方で起動コマンドをオプションと共に叩いて起動しているというシンプルな構造です
unit test について
unit test についての要件は以下としています
- pandas など使っているライブラリのバージョンの更新によって意図せずデータが壊れない事
- transformer の修正などリファクタによって、意図せずデータが壊れない事
要件を満たす為に、以下のような形のテストを CI に組み込んでいます
- 正確に動作する事がわかっている入力 (BQ からダウンロードしたデータセット) と出力 (正解となる整形されたデータセット) を用意
- CI にてテストが開始されたら 1 っで準備した入力を使ってデータを整形する
- 1 で予め準備した正解データと、2 で作られたデータを比較し、diff が無い事を確認する