コンサルでデータサイエンティスト

仕事でPythonを書いてます。機械学習、Webマーケティングに興味があります。趣味は旅です。

Sparkで使える機械学習(ML)パッケージについてまとめる

機械学習を扱うSparkアプリケーションの開発を行うにあたり、Spark上で使用することのできる機械学習パッケージ(ライブラリ)について調べてみたのでまとめます。

はじめに

機械学習を扱うような分析タスクや、機械学習を活用したソリューションの開発タスクなどがますます増えています。そのような中で、ビッグデータと呼ばれるような大規模データを扱わなければいけない場面が増えています。数十GB~数TBのデータに対して機械学習を適用しようとした場合、通常の単一マシンで動作するようなPythonプログラムではそのデータを扱いきれないことがほとんどです。このような場合、分散コンピューティングを実現することのできるHadoopSparkの活用を検討していくことになります。今回はSpark上で使うことのできる機械学習(ML)パッケージについてまとめます。

f:id:hktech:20190823024013p:plain


大規模データに適用する機械学習タスク

扱うデータが大規模であるからといって、必ずしもSpark上で機械学習を実施する必要があるわけではありません。例えば、件数でみれば数十億のレコードを持つログデータがあったとしても、SparkやHiveなどで何かしらの集約処理をすることで単一マシンで扱えるようなデータサイズに圧縮できる場合があります。このような場合には、豊富な機械学習ライブラリが用意されているPythonプログラムで処理をするという選択をとることが多いでしょう。

主に大規模データをSpark上で扱うような機械学習タスクには分類・クラスタリング・異常検知、時系列予測、レコメンデーションなどがあります。

f:id:hktech:20190823015930p:plain

Sparkで使える機械学習パッケージはこのようなタスクを実現する機械学習手法が実装されています。それぞれの機械学習パッケージの特徴に触れつつ、実装されている手法の違いについて比較していきます。

Sparkで使える機械学習パッケージ

Spark上で扱うことのできる機械学習パッケージは年々増えてきていますが、まだまだ数は限られています。近年では、AWSやDatabricksなどのクラウドプラットフォーマーが提供しているSageMaker SparkやDatabricksRunTimeMLなどの機械学習基盤が増えていますが、特定のクラウド上でしか使うことができないという不便さがあります。任意の環境で使用することのできる機械学習パッケージの選択肢は少なく、Sparkが公式で提供しているSparkMLパッケージが有名です。また、Deep LearningをSpark上で扱うことのできるパッケージとしてはYahoo社が開発しているTensorflow on Sparkや、Databricks社が開発しているspark-deep-learningなどがある。

f:id:hktech:20190823021236p:plain

本記事では、このような機械学習パッケージの中からいくつかについて詳しく取り上げ、それらの違いについて比較していきます。

Mahout

Apache Mahout*1は分散コンピューティングの歴史の中で最初期の機械学習パッケージです。MahoutはIBM*2が2011年に発表し、その後Hadoopの発展と共にOSS化が進んだパッケージです。Mahoutの読み方はマハウトであり、アイコンがHadoopの象に乗っていることからもわかるように「象使い」という意味です。現在はほとんど開発が進んでいないようです。

Mahoutは、従来Hadoop上で動く機械学習パッケージでしたが、現在はSpark上で動作します。
用意されている主な機械学習手法は以下の通りです。


このように実装されている手法は極めて限定的であるため、現在では使いどころはないと考えてよいと思います。

SparkMLlib/SparkML

SparkMLlib及びSparkMLはSpark公式*3が提供している機械学習パッケージです。2013年から開発が始まっており、最も広く使われているSparkの機械学習パッケージです。いずれもSpark本体と同様に、Scala, Python, Java, Rなどの言語からアクセスすることができます。SparkMLlibはSpark初期の機械学習パッケージとして一定の支持を得ていましたが、現在ではメンテナンスモードとなっておりこれ以上の追加開発はされない予定となっています。一方で、SparkMLはSpark2.0に向けて開発された比較的新しいパッケージであり、こちらは現在でも広く使われています。

SparkMLlibとSparkMLの違いとしては、SparkMLlibはRDDで扱うことを想定して実装されており、SparkMLはDataFrameおよびDatasetで扱うことを想定して開発されています。このように、大きな違いがある両者ですが、Github上では同一のリポジトリにて管理されています。また、両者に実装されている機械学習手法も共通のものが多いです。以下にその一部を列挙します。

  • 分類器: ナイーブベイズ、ロジスティック回帰、SVM、決定木、ランダムフォレスト、GBT
  • クラスタリング: Kmeans, LDA, 混合ガウスモデル
  • レコメンデーション: Alternating Least Square(ALS), Matrix Factorization
  • 回帰モデル: 一般化線形モデル、Ridge回帰、Lasso回帰

このように用意されている手法は限られているものの、一般的によく使われるアルゴリズムはおさえてあるようです。

MMLSpark

MMLSpark*4(Microsoft Machine Learning for Apache Spark)は2017年にMicrosoft社がAzure向けに開発・リリースした機械学習パッケージです。SparkMLと同様に、Scala, Python, Java, Rなどの言語によりアクセスすることができます。本パッケージはAzureクラウド向けに作られているものの、任意の環境で使用することが可能であるという特長があります。

MML Sparkに実装されている主な機械学習手法は以下の通りです。

  • 分類器: LightGBM
  • レコメンデーション: Smart Adaptive Recommendations (SAR)
  • その他: 自然言語処理、画像認識、DeepLearning系モデル

注目すべき点として、データサイエンティストに人気なLightGBMが実装されているということがあります。SparkMLそのものにはxgboostも実装されていないため、この点では優れたパッケージであるといえます。また、レコメンデーション手法である Smart Adaptive Recommendations (SAR)が実装されていることは、ALSによる協調フィルタリングしか存在しないSparkMLと比較するべき点でもあると思います。この手法では、単純な協調フィルタリングではなく、コンテンツ間の情報も活用することでコールドスタート問題を解決するものであるとのことなので、実用面で活用できるのではないかと考えています。

まとめ

Sparkで使える機械学習パッケージについてまとめました。一般的によく使われているSparkMLやSparkMLlib以外にも、いくつかのパッケージがあることがわかりました。今回は特定のクラウド上で使えるSageMaker SparkやDatabricksRunTimeMLについて紹介できなかったので、それらに触れる機会があれば今回紹介したいくつかのパッケージと比較をしたいと思います。