Hivemallを使ってSQLで機械学習

馬場はるか氏:ブレインパッドの馬場と申します。今日は、Hivemallという機械学習のライブラリについて、実際に使っている経験を踏まえて紹介します。よろしくお願いします。

先に今日「お話しすること」と、「お話ししないこと」を伝えます。今日は2点に絞って、お話しします。まず「そもそもHivemallとは何か?、どうやって使うのか?」というお話が一つ。次に「Hivemallを使うと何がうれしいのか(メリットか)?」ということをお話しします。

ですので、今日はアルゴリズムや実装の詳細については触れません。Hivemallの使い方に関しては、公式のドキュメントやGitHubの実装例を参照してもらえればと思います。それ以外だと開発者の方が書かれているQiitaやブログなどがおすすめです。

ちょっとだけ自己紹介させていただきます。私はブレインパッドという会社でデータサイエンティストをしています。ブレインパッドの人間ではありますが、普段はクライアントである企業のオフィスに常駐していて、ここ(ブレインバッドの本社)にはいないので、今日は若干アウェイな感じがします。

学生のときは物理学をやっていて、専門は天体物理学でした。天体物理学に興味ある方は懇親会で声かけてください。

今の仕事は、クライアントである企業のオウンドメディアで会員データやアンケートデータの分析をして、データをマーケティングにどうやって活かしていくかというところの支援をしています。

機械学習の一連の処理をSQLのクエリで

ということで、ここから本題に入ります。今日紹介するHivemallは、名前の中にHiveが入っています。

ご存じでない方もおられると思うので少しだけ解説しますと、そもそもHadoopという、ビッグデータを扱うための並列分散処理ができるミドルウェアがあります。そのHadoop上でDBMS(データベース管理システム)の機能を提供しているのがHiveです。そしてそのHiveで使うことができる、SQLのように書けるデータ操作言語のことをHiveQLと呼びます。

ではHivemallは何かということですが、先ほど紹介したHiveQLクエリを使って機械学習の一連の処理、学習やバリデーション、予測などをすべて実行することが可能なライブラリです。Hivemallの開発元は、Treasure Dataという会社です。

ライブラリの中身自体は、SQLで書けると言いつつ、Javaで実装されています。ちなみに、Hivemallのロゴはすごくかわいいなと思います。

SQLを使った機械学習の実際の流れ

(スライドを指して)釈迦に説法ではありますが、普通SQLはこんな感じで書きます。

参照したいテーブル名「order」というのがあって、SELECTで欲しいカラム名を打つと、こんな感じで結果が返ってきます。

「このSQLを使ってじゃあどうやって機械学習をするんだろう?」と疑問に思われるかもしれません。実は最近、HivemallにXGBoostが実装されました。それを例にちょっとだけクエリ自体を見てもらおうと思いますが、学習はこんな感じで行われます。

(スライドを指して)ちょっと字の色が見づらくて申し訳ないですけど、FROMのところに書いてあるテーブル名は学習用のデータマートになります。学習用データマートはHivemall用に少し加工が必要なので、使う前に別に整備しておく必要があります。

その学習用データマートに対してHivemallの中では、このSELECTの後ろにある「train_xgboost」という関数として機械学習ライブラリが使えるようになっており、このような書き方をするとxgboostのモデルを作成できてしまいます。引数もいろいろ指定できるようになっています。

実際にできるモデルは、このような感じでテーブルに保存されます。私たちが見ても「なんのこっちゃ?」なのですが、このテーブルをさらに参照することで予測できます。

このFROMには、先ほどのモデルが入っているテーブル名を入れます。SELECTでは「xgboost_predict」をまた呼んで、引数の中にいろいろ指定することで、いろいろな条件で予測可能です。

まとめると、おおまかには「学習」「バリデーション」「予測」といった感じで、それぞれクエリで実行していくイメージになります。モデルや予測結果はすべてテーブルで管理できるので、例えば予測するときは、モデルのテーブルと予測したいデータマートのテーブルをLEFT JOINなどで結合し、そこに対して先ほどのxgboostの予測用クエリを叩く感じになります。

機械学習用の環境を用意するのは大変

ここまでHivemallの説明をしてきましたが、「どういうときに有効なの?」とか「別にHivemallじゃなくても普通のPythonでもいいじゃん?」と思う方もいるかもしれません。最後に、Hivemallがどのようにうれしいのかをお話します。

(スライドを指して)機械学習をビジネスに活用するといった文脈や、機械学習システムを組み込む場合に、こういったシステム構成の図を見かけることがあります。

少し(運用面も絡めた)MLOps的な話になりますが、機械学習を使う場合は、基盤システムやデータベースから外にデータを出して、そこで分析用の環境を用意し、その中で機械学習して、またデータベースなどに結果を戻すようなことが行われると思います。

このような場合に高いハードルとなるのが、外に分析用の環境を用意することです。まず、環境を用意するリソースがそもそも必要です。データを外に(書き)出すので、加工や転送部分の実装も必要になります。運用していく上では、その加工や転送の箇所でエラーが起こりやすくなります。

実際、加工や転送のところで、障害というほどの規模ではないにせよエラーが出ることは多く、その原因としては、データベース側に何かしらの変更が生じたというようなことが多かったりします。

Hivemallを使えば、分析用の環境が不要

そのような場合にHivemallが非常に便利です。データベースの中でHiveが使える場合は分析用の環境が不要になり、この中だけで一連の機械学習のフローを完結させられます。

そうすると、先ほど述べたようなデータ連携を省略できるので、運用を考慮した上でも比較的気軽に機械学習システムを組みやすいと思います。

とくに(これは宣伝でではありませんが)、このデータベースのところにTreasure Dataが入っている場合は、特別な環境構築も必要なくこの中でHivemallのクエリやコマンドが打てるようになるので、かなり便利に使える状態になっていると思います。

Hivemallでより手軽に機械学習を

最後にまとめになります。HivemallというSQLで書ける機械学習ライブラリを紹介しました。データ転送のプロセスがいらないので、手軽に機械学習システムができると思っています。

(今回は)触れませんでしたが、使えるアルゴリズムも比較的多岐にわたっているので、そこまで不便に感じることもなく使えると思います。

データサイエンティストが関わっているような会社は、大きい企業やデータ活用に注力しようとしている企業だと思います。そのような企業であれば、多くの場合はHiveやTreasure Dataが使えると思うので、今日はHivemallという言葉をぜひ覚えて帰っていただければうれしいです。お時間ありがとうございました。

(会場拍手)