こんにちは。テックラボの岸部です。
本日は技術ブログというよりも、お仕事紹介ということで、最近社内にリリースした、特徴量を運用・公開する仕組みである「Feature Store」を紹介したいと思います。
はじめに
いきなりですが、みなさんは特徴量エンジニアリングはお好きでしょうか。
一般にテーブルデータの分類問題の機械学習の精度を向上させるためにデータサイエンティストが取る手段は、大きくは以下の2つかと思います。
- 特徴量を工夫する(いわゆる特徴量エンジニアリング)
- 機械学習のアルゴリズムを工夫する
2点目の「機械学習のアルゴリズムを工夫する」については、XGBoostやLightGBMなどのBoosting系のアルゴリズムが登場以降、劇的な精度向上につながらない印象です。
例えば、Kaggle等の分析コンペで精度向上のテクニックとしてよく使われる複数のモデルの出力を合わせるアンサンブルアルゴリズムは、たしかに精度は向上するかもしれませんが、実務上の実行速度やコストを考えると、いい選択肢になるとは限りません。
やや暴論ですが、特徴量エンジニアリングが精度向上のすべてだと私は考えています。
弊社では、多くのデータサイエンティストやデータアナリストが在籍しており、精度向上に限らず可視化などの目的で、日々特徴量エンジニアリングが行われています。
しかし、その特徴量の多くは個人利用にとどまっており、共有されていませんでした。 また、弊社でデータ分析に携わっているメンバーが共有で使用しているデータウェアハウスに良さげなデータがあっても、それが 「誰によって作られ」「どのような処理で生成され」「いつ実行されたのか」がわからず、安心して利用できない問題もありました。
こうした問題を解消すべく、特徴量エンジニアリングを自動運用・公開できる仕組みを考え、「Feature Store」という名前で社内にリリースしました。 (ちなみにFeature Storeは一般用語です)
Feature Store を支えるクラウドサービス Databricks
Feature Storeに求められるのは以下の4点です。
- 開発がしやすい(コードが書きやすい)
- コードが共有できる
- 処理が早い
- ジョブ化が容易
すべてを満たしてくれるのはDatabricksでした。 それぞれ簡単にポイントを紹介します。
開発がしやすい(コードが書きやすい)
Databricksでのコード開発はnotebookベースで行います。
pythonでデータ分析をやっている人はだいたい利用したことがある、jupyter notebookやjupyterLabのようなUIです。
コード開発という点では、notebookは賛否両論ありますが、コードを書いて即座に実行し、結果を見ながら修正するのには長けています。
またdatabricksのnotebookでは、PythonとSQLとRに対応しており、データ分析人材が使用するだいたいの開発言語に対応しています。
コードが共有できる
databricksでは、gitと連携できる仕組みがあり、また権限管理も細かくできます。
gitでのコード管理に慣れていない人がgithubなどでコードを確認するのはハードルが高いですが、日頃利用しているdatabricksでコードが確認できれば、ちょっとしたときに処理の内容を見ることができます。
コードを参照して開発をするForkも、notebook単位でも行えるため、横展開が容易です。
処理が早い
特徴量エンジニアリングは、単純な集計レベルから機械学習を活用したものまでさまざまです。
そもそも処理が早くないと開発も遅くなりますし、運用も大変です。
言うまでもありませんが、databricksは分散処理のSparkの開発者が作ったサービスで、Sparkを活用して大規模データを高速に処理できます。
ジョブ化が容易
databricksでは実行を自動化する仕組みが用意されています。
スケジュール実行であれば、notebookの画面から設定できますし、複数のnotebookを組み合わせたジョブを作成して、それをスケジュール実行させたり、APIで外部から実行させることもできます。
notebookの外部から、パラメータとして値を受け取る仕組みも提供されています。
おわりに
Feature Storeの紹介といいながら、実質 Databricksの魅力を伝えるような内容になってしまいました。
Feature Storeの運用はまだ始まったばかりで、まだ運用している特徴量もそれほど多くありませんが、これからどんどん増やしていきたいと思っています。
データリネージュの機能を利用して、自分が作った特徴量がどんなところで活用されているかを可視化したり、参照されているnotebook数や参照された回数などを指標化して、いい特徴量を作ったのであればそれをインセンティブに変えられるような仕組みを考えていきたいと思っています。