ML の Feature Engineering を ETL の一部として行う
💻

ML の Feature Engineering を ETL の一部として行う

はじめに

DROBE で ETL の一部として行なっている ML 向け feature engineering の概要を記載します

ML 向け feature engineering の概要

DROBE では ETL による ML の Feature engineering を行なっているコンテナを ((ML 向けの Transform 処理なので) ml_transform と呼んで管理しています

ml_transform は以下のように、ETL の一部として実行されます

ETL の一部として実行される ml_transform
ETL の一部として実行される ml_transform

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 に組み込んでいます

  1. 正確に動作する事がわかっている入力 (BQ からダウンロードしたデータセット) と出力 (正解となる整形されたデータセット) を用意
  2. CI にてテストが開始されたら 1 っで準備した入力を使ってデータを整形する
  3. 1 で予め準備した正解データと、2 で作られたデータを比較し、diff が無い事を確認する