機械学習ライブラリ(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に機能を追加するでしょう。
- 同等の機能に手が届いた後(おおざっぱにSpark2.2と推測されます)、RDDベースのAPIは非推奨になるでしょう。
- RDDベースのAPIはSpark 3.0で削除される予定です。
なぜMLlibはデータフレームに基づいたAPIに切り替わっているのか?
- データフレームはRDDよりももっと使いやすいAPIを提供します。データフレームの多くの利点は、Spark Datasources, SQL/DataFrame クエリ, Tungsten および Catalyst 最適化を含み、言語間でAPIを揃えます。
- MLlibのためのデータフレームに基づいたAPIはMLアルゴリズム間および複数の言語間で均一なAPIを提供します。
- データフレームは実践的なMLパイプライン、特に特徴の変換を容易にします。詳細はパイプライン ガイド を見てください。
依存
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ドキュメントを読んでください。
PythonでMLlibを使用するには、NumPy バージョン1.4以上が必要になるでしょう。
Migration guide
MLlib はアクティブに開発中です。Experimental
/DeveloperApi
と印が付けられているAPIは将来のリリースで変更するかも知れません。以下の移行ガイドはリリース間の全ての変更を説明するでしょう。
1.6 から 2.0
破壊的な変更
Spark 2.0には幾つかの破壊的な変更がありました。それらは以下で説明されます。
データフレームベースのAPIのための線形代数クラス
Sparkの線形代数の依存物は新しいプロジェクト mllib-local
に移動しました (SPARK-13944を見てください)。この変更の一部として、線形代数クラスは新しいパッケージ spark.ml.linalg
にコピーされました。spark.ml
内のデータフレームベースのAPI は、今は spark.ml.linalg
クラスに依存し、結果として2,3の破壊的な変更を引き起こし、 様々なモデルクラスの中に大部分があります (完全なリストは SPARK-14810 を見てください)。
注意: spark.mllib
内のRDDベースのAPIは以前のパッケージのspark.mllib.linalg
に依存し続けています。
ベクトルとマトリックスの変換
ほとんどのパイプラインコンポーネントは読み込みの後方互換性をサポートしますが、ベクトルあるいはマトリックスのカラムを含むSparkのバージョン2.0未満のいくつかの既存の DataFrames
とパイプラインは、新しいspark.ml
のベクトルとマトリックスの種類に移設しなければならないかも知れません。spark.mllib.linalg
から spark.ml.linalg
の種類にDataFrame
カラムを変換するためのユーティリティ(逆もまた同じ)は、spark.mllib.util.MLUtils
で見つかります。
ベクトルとマトリックスの1つのインスタンスを変換するために利用可能なユーティリティメソッドもあります。ml.linalg
の種類に変換するためにはmllib.linalg.Vector
/ mllib.linalg.Matrix
のasML
メソッドを、mllib.linalg
の種類に変換するためには mllib.linalg.Vectors.fromML
/ mllib.linalg.Matrices.fromML
を使ってください。
import org.apache.spark.mllib.util.MLUtils
// convert DataFrame columns
val convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF)
val convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF)
// convert a single vector or matrix
val mlVec: org.apache.spark.ml.linalg.Vector = mllibVec.asML
val mlMat: org.apache.spark.ml.linalg.Matrix = mllibMat.asML
更に詳しくはMLUtils
Scala ドキュメントを参照してください。
import org.apache.spark.mllib.util.MLUtils;
import org.apache.spark.sql.Dataset;
// convert DataFrame columns
Dataset<Row> convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF);
Dataset<Row> convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF);
// convert a single vector or matrix
org.apache.spark.ml.linalg.Vector mlVec = mllibVec.asML();
org.apache.spark.ml.linalg.Matrix mlMat = mllibMat.asML();
更に詳しくは MLUtils
Java ドキュメントを参照してください。
from pyspark.mllib.util import MLUtils
# convert DataFrame columns
convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF)
convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF)
# convert a single vector or matrix
mlVec = mllibVec.asML()
mlMat = mllibMat.asML()
更に詳しくはMLUtils
Python ドキュメントを参照してください。
非推奨のメソッドは削除されました。
spark.mllib
とspark.ml
パッケージ内のいくつかの非推奨のメソッドは削除されました。
ml.evaluation.BinaryClassificationEvaluator
のsetScoreCol
LinearRegression
のweights
と、spark.ml
のLogisticRegression
mllib.optimization.LBFGS
のsetMaxNumIterations
(DeveloperApi
として印が付けられました)mllib.rdd.RDDFunctions
のtreeReduce
とtreeAggregate
(これらの関数は直接RDD
上で利用可能で、DeveloperApi
として印が付けられました)mllib.tree.configuration.Strategy
のdefaultStategy
mllib.tree.Node
のbuild
- 多クラスのためのlibsvmローダーと、
mllib.util.MLUtils
の load/save labeledDataメソッド
破壊的な変更の完全なリストはSPARK-14810で見つけることができます。
非推奨と挙動の変更
非推奨
spark.mllib
と spark.ml
パッケージ内の非推奨は以下を含みます:
- SPARK-14984:
spark.ml.regression.LinearRegressionSummary
では、model
フィールドが非推奨になりました。 - SPARK-13784:
spark.ml.regression.RandomForestRegressionModel
とspark.ml.classification.RandomForestClassificationModel
では、getNumTrees
が支持されてnumTrees
パラメータが非推奨になりました。 - SPARK-13761:
spark.ml.param.Params
では、validateParams
が非推奨になりました。全ての上書きメソッドの機能を対応するtransformSchema
に移動します。 - SPARK-14829:
spark.mllib
パッケージの、LinearRegressionWithSGD
,LassoWithSGD
,RidgeRegressionWithSGD
とLogisticRegressionWithSGD
が非推奨になりました。spark.ml.regression.LinearRegresson
とspark.ml.classification.LogisticRegresson
を使用することをお勧めします。 - SPARK-14900:
spark.mllib.evaluation.MulticlassMetrics
のパラメータprecision
,recall
とfMeasure
では、accuracy
が支持されて非推奨になりました。 - SPARK-15644:
spark.ml.util.MLReader
とspark.ml.util.MLWriter
では、session
が支持されてcontext
が非推奨になりました。 spark.ml.feature.ChiSqSelectorModel
では、setLabelCol
メソッドがChiSqSelectorModel
で使用されないために非推奨になりました。
挙動の変更
spark.mllib
と spark.ml
パッケージ内の挙動の変更は以下を含みます:
- SPARK-7780: 今は、
spark.mllib.classification.LogisticRegressionWithLBFGS
は二値分類のために直接spark.ml.classification.LogisticRegresson
を呼びます。これはspark.mllib.classification.LogisticRegressionWithLBFGS
について以下の挙動の変更を引き起こすでしょう:- L1/L2アップデータを使う二値分類モデルの訓練時にinterceptは正規化されないでしょう。
- 正規化無しにユーザが設定すると、特徴のスケーリングの有りあるいは無しの訓練は、同じ収束レートで同じ解を返すでしょう。
- SPARK-13429:
spark.ml.classification.LogisticRegresson
を使ってより良く矛盾の無い結果を提供するために、spark.mllib.classification.LogisticRegressionWithLBFGS
:convergenceTol
のデフォルト値が 1E-4 から 1E-6 に変更されました。 - SPARK-12363: 結果に変更を与えるかも知れない
PowerIterationClustering
のバグを修正。 - SPARK-13048: チェックポイントが使われている場合は、
EM
オプティマイザを使ったLDA
はデフォルトで最後のチェックポイントを維持するでしょう。 - SPARK-12153:
Word2Vec
は、今では文の境界を考慮します。以前は、それらを正しく処理しませんでした。 - SPARK-10574:
spark.ml
とspark.mllib
の両方で、HashingTF
はMurmurHash3
をデフォルトのハッシュアルゴリズムとして使用します。 - SPARK-14768: PySpark
Param
のためのexpectedType
引数が削除されました。 - SPARK-14931: ScalaとPythonのパイプラインで一致していなかった幾つかのデフォルトの
Param
値が変更されました。 - SPARK-13600:
QuantileDiscretizer
は分割を見つけるためにspark.sql.DataFrameStatFunctions.approxQuantile
を今では使用します(以前は独自の標本化ロジックを使っていました)。同じ入力とパラメータに関して、出力のバケットは異なるでしょう。
以前のSparkのバージョン
以前の移行ガイドはこのページに保管されています。
-
システムに最適化されたネイティブコードの恩恵とバックグラウンドについて知るために、High Performance Linear Algebra in ScalaでのSam HallidayのScalaXトークを見たいと思うかも知れません。↩