機械学習ライブラリ(MLlib)ガイド
MLlibはSparkの機械学習(ML)ライブラリです。その目的は実用的な機械学習をスケーラブルおよび簡単にすることです。高レベルでは、それは以下のようなツールを提供します:
- ML アルゴリズム: 分類、回帰、クラスタリング、および協調フィルタリングのような一般的な学習アルゴリズム
- 特徴化: 特徴抽出、変換、次元削減、および選択
- パイプライン: 構築、評価、およびMLパイプラインのチューニングのためのツール
- 永続性: アルゴリズム、モデル、およびパイプラインの保存とロード
- ユーティリティ: 線形代数、統計、データ処理など
発表: データフレームに基づいたAPIは主要なAPIです
MLlib RDDベースのAPIは、今はメンテナンスモードにあります。
Spark 2.0の時点で、spark.mllib
パッケージ内のRDDに基づいたAPIはメンテナンスモードに入りました。Sparkのための主要な機械学習APIは、今はspark.ml
パッケージ内のDataFrameに基づいたAPIです。
何を意味するのか?
- MLlib はまだバグ修正のために
spark.mllib
内のRDDベースのAPIをサポートするでしょう。 - MLlibはRDDベースのAPIに新しい機能を追加しないでしょう。
- Spark 2.xリリースで、MlLibはRDDベースのAPIと同等の機能に手を届かすためにデータフレームベースのAPIに機能を追加するでしょう。
なぜMLlibはデータフレームに基づいたAPIに切り替わっているのか?
- データフレームはRDDよりももっと使いやすいAPIを提供します。データフレームの多くの利点は、Spark Datasources, SQL/DataFrame クエリ, Tungsten および Catalyst 最適化を含み、言語間でAPIを揃えます。
- MLlibのためのデータフレームに基づいたAPIはMLアルゴリズム間および複数の言語間で均一なAPIを提供します。
- データフレームは実践的なMLパイプライン、特に特徴の変換を容易にします。詳細はパイプライン ガイド を見てください。
"Spark ML"とは何か?
- “Spark ML” は公式の名前ではありませんが、データフレームAPIに基づいたMLlibを参照する時にしばしば用いられます。データフレームに基づいたAPIによって使われる
org.apache.spark.ml
Scala パッケージ名に大きくよるもので、“Spark ML Pipelines” という単語はパイプラインの概念を強調するために初期に使われました。
MLlibは非推奨ですか?
- いいえ。MLlib はRDDベースのAPIとデータフレームベースのAPIの両方を含みます。RDDベースのAPIは今ではメンテナンスモードです。ですが、全体としてはAPIもMLlibの両方とも非推奨ではありません。
依存
MLlib は線形代数パッケージ Breezeを使用します。これは最適化された数学処理のためにnetlib-javaに依存します。実行時にネイティブライブラリ1が利用できない場合は、警告メッセージが表示され、ピュアJVM実装が代わりに使われるでしょう。
ランタイムのプロプライエタリ バイナリのライセンスの問題で、デフォルトではnetlib-java
のネイティブ proxiesを含んでいません。システムに最適化されたバイナリを使用するために netlib-java
/ Breeze を設定するには、プロジェクトの依存としてcom.github.fommil.netlib:all:1.1.2
をインクルード(あるいはSparkを -Pnetlib-lgpl
付きでビルド)して、プラットフォームの追加のインストレーション説明のために netlib-javaドキュメントを読んでください。
Intel MKL, OpenBLASのような最も一般的な native BLASは1つの層さで複数のスレッドを使うことができます。これらはSparkの実行モデルと衝突するかもしれません。
操作のために1つのスレッドを使うようにこれらのBLAS実装を設定すると、実際にはパフォーマンス改善するかもしれません (SPARK-21305を見てください)。これを各Sparkタスクが使用するように設定されたコアの数に一致させるのが通常は最良です。これはデフォルトでは1で、一般的には1のままにされます。
これらのBLAS実装が使用するスレッドの数を設定する方法を理解するには、以下のようなリソースを参照してください: Intel MKL あるいは Intel oneMKL および OpenBLAS。Note that if nativeBLAS is not properly configured in system, java implementation(f2jBLAS) will be used as fallback option.
PythonでMLlibを使用するには、NumPy バージョン1.4以上が必要になるでしょう。
3.0 の見どころ
以下のリストはSpark 3.0
リリースでMLlibに追加された特徴と拡張の幾つかを強調します:
- 複数カラムのサポートが、
Binarizer
(SPARK-23578),StringIndexer
(SPARK-11215),StopWordsRemover
(SPARK-29808) and PySparkQuantileDiscretizer
(SPARK-22796) に追加されました。 - ツリーベースの特徴変換が追加されました (SPARK-13677)。
- 2つの新しい評価器
MultilabelClassificationEvaluator
(SPARK-16692) とRankingEvaluator
(SPARK-28045) が追加されました。 - 標本化ウェイトのサポートが
DecisionTreeClassifier/Regressor
(SPARK-19591),RandomForestClassifier/Regressor
(SPARK-9478),GBTClassifier/Regressor
(SPARK-9612),MulticlassClassificationEvaluator
(SPARK-24101),RegressionEvaluator
(SPARK-24102),BinaryClassificationEvaluator
(SPARK-24103),BisectingKMeans
(SPARK-30351),KMeans
(SPARK-29967),GaussianMixture
(SPARK-30102) に追加されました。 PowerIterationClustering
の R API が追加されました (SPARK-19827)。- ML パイプラインの状態を追跡するための Spark ML listener が追加されました (SPARK-23674)。
- Fit with validation set was added to Gradient Boosted Trees in Python (SPARK-24333).
RobustScaler
変換器が追加されました (SPARK-28399)。Factorization Machines
分類器と regressor が追加されました (SPARK-29224)。- ガウスナイーブベイズ Classifier (SPARK-16872) と Complement ナイーブベイズ Classifier (SPARK-29942) が追加されました。
- ML function parity between Scala and Python (SPARK-28958).
predictRaw
is made public in all the Classification models.predictProbability
is made public in all the Classification models exceptLinearSVCModel
(SPARK-30358).
移行ガイド
移行ガイドは今はこのページに保管されています。
-
システムに最適化されたネイティブコードの恩恵とバックグラウンドについて知るために、High Performance Linear Algebra in ScalaでのSam HallidayのScalaXトークを見たいと思うかも知れません。 ↩