古いものからの移設ガイド - MLlib
最新のSparkバージョンのための移行ガイドはMLlib ガイド メインページにあります。
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
を今では使用します(以前は独自の標本化ロジックを使っていました)。同じ入力とパラメータに関して、出力のバケットは異なるでしょう。
1.5から1.6
spark.mllib
あるいは spark.ml
パッケージの中で、APIの破壊的な変更はありませんが、非推奨と挙動の変更があります。
非推奨:
- SPARK-11358:
spark.mllib.clustering.KMeans
の中で、runs
ペラメータは非推奨になりました。 - SPARK-10592:
spark.ml.classification.LogisticRegressionModel
とspark.ml.regression.LinearRegressionModel
の中で、weights
フィールドは新しい名前coefficients
が支持されて非推奨になりました。これは、インスタンス(行) のweights"のアルゴリズムに対する曖昧さを無くすのに役立ちます。
挙動の変更:
- SPARK-7770:
spark.mllib.tree.GradientBoostedTrees
:validationTol
は1.6で意味が変わりました。以前は、それは誤差の絶対変位でした。今では、それはGradientDescent
のconvergenceTol
に似ています: 大きな誤差については、相対誤差(以前の誤差の相対); 小さな誤差については (< 0.01
)、絶対誤差を使います。 - SPARK-11069:
spark.ml.feature.RegexTokenizer
: 以前は、トークンに分割する前に文字列を小文字に変換しませんでした。今では、デフォルトで小文字に変換します。しない選択もあります。これはより単純なTokenizer
変換器に一致します。
1.4から1.5
spark.mllib
パッケージの中では、幾つかの挙動の変更がありますが、APIを損なう変更はありません。
- SPARK-9005:
RegressionMetrics.explainedVariance
は二乗の平均回帰合計を返します。 - SPARK-8600:
NaiveBayesModel.labels
ソートされるようになりました。 - SPARK-3382:
GradientDescent
は1e-3
の集約の許容範囲を持ち、従って繰り返しは1.4よりも速く終わるでしょう。
spark.ml
パッケージの中では、一つの破壊的なAPIの変更と、一つの挙動の変更があります:
- SPARK-9268: Java の varargsサポートは Scala compiler bugにより
Params.setDefault
から削除されます。 - SPARK-10097:
Evaluator.isLargerBetter
が測定の順番を示すために追加されます。RMSEのような測定は1.4でのように符号をフリップしません。
1.3から1.4
spark.mllib
パッケージの中では、幾つかの非互換の変更がありますが、全ては開発中のAPI
あるいは 実験的な
API です。
- 勾配ブースト木
- (非互換の変更)
Loss.gradient
メソッドの定義が変更されました。これはGBTのために独自のlossを書いたユーザのみに問題があります。 - (非互換の変更) ケースクラス項目の修正のために、ケースクラス
BoostingStrategy
のためのapply
およびcopy
メソッドが変更されました。 class fields. これはGBTパラメータを設定するためにBoostingStrategy
を使用するユーザのみに問題があります。
- (非互換の変更)
- (非互換の変更)
LDA.run
の返り値が変更されました。今は、具象クラスDistributedLDAModel
の代わりに、抽象クラスLDAModel
が返されます。オブジェクトタイプLDAModel
はまだ適切な具象タイプにキャストされます。これは最適化アルゴリズムに依存します。
spark.ml
パッケージの中では、幾つかの主要なAPIの変更がありました。以下を含みます:
Param
とパラメータを指定するための他のAPIuid
パイプライン コンポーネントのためのユニークなID- 特定のクラスの再編成
spark.ml
API はSPark1.3でアルファコンポーネントだったため、ここでは全ての変更をリスト化しません。しかし、1.4からのspark.ml
はもうアルファコンポーネントではないため、将来のリリースのためのAPIの変更の詳細を提供するつもりです。
1.2から1.3
spark.mllib
パッケージの中で、幾つかの破壊的な変更がありました。最初の変更(ALS
) はアルファあるいは実験的として印を付けてられなかったコンポーネントの中で唯一のものです。
- (破壊的な変更)
ALS
の中で、異質なメソッドsolveLeastSquares
が削除されました。DeveloperApi
メソッドanalyzeBlocks
も削除されました。 - (破壊的な変更)
StandardScalerModel
はアルファコンポーネントのままです。その中で、variance
メソッドがstd
メソッドと置き換えられました。元のvariance
メソッドによって返されるカラムの分散を計算するためには、単純にstd
によって返される偏差を平方します。 - (破壊的な変更)
StreamingLinearRegressionWithSGD
は実験的なコンポーネントのままです。その中で、2つの変更がありました:- デフォルトのコンストラクタにパラメータのsetterメソッドを使うビルダーパターンが指示されて、引数を取るコンストラクタが削除されました。
- 変数
model
はもうpublicではありません。
- (破壊的な変更)
DecisionTree
は実験的なコンポーネントのままです。その中とそれに関連するクラスで、幾つかの変更がありました:DecisionTree
の中で、非推奨のクラスメソッドtrain
が削除されました。(object/statictrain
メソッドは残っています。)Strategy
の中で、checkpointDir
パラメータが削除されました。Checkpointingはまだサポートされていますが、ツリーおよびツリーのアンサンブル訓練の前に checkpoint ディレクトリが設定されなければなりません。
PythonMLlibAPI
(MLLib のための Scala/Java と Python 間のインタフェース) はpublic API でしたが、今ではprivateです。これは外部利用のためのものではありませんでした。- 線形回帰(ラッソとリッジ回帰を含む)で、今は二乗損失は2で割り算されます。つまり、1.2と同じ結果を生成するためには、正規化パラメータは2で割られ、ステップサイズは2倍される必要があります。
spark.ml
パッケージで、Spark SQLの主要なAPIの変更があります。最も重要な変更を以下にリスト化します:
- 古いSchemaRDD は 幾分修正されたAPIのDataFrame に置き換えられました。SchemaRDDを使っていた
spark.ml
内の全てのアルゴリズムは、今ではデータフレームを使います。 - Spark 1.2で、
sqlContext
がSQLContext
のインスタンスであるimport sqlContext._
を呼び出すことで .LabeledPoint
のRDD
からSchemaRDD
への暗黙の変換を使用していました。これらの暗黙の変換は削除され、今ではimport sqlContext.implicits._
を呼びます。 - SQLのためのJava APIもそれに従って変更されました。詳細については、上の例と Spark SQL プログラミング ガイド を見てください。
他の変更はLogisticRegression
です:
scoreCol
出力カラム(デフォルトは"score")はprobabilityCol
(デフォルトは"probability")に名前が変わりました。もともとは種類がDouble
(クラス 1.0の確率のため)でしたが、今はVector
(将来的に各クラスの確率が多クラス分類をサポートするため)です。- Spark 1.2 では、
LogisticRegressionModel
はインターセプトを含みませんでした。Spark 1.3では、インターセプトを含みます; しかし、spark.mllib.LogisticRegressionWithLBFGSのためのデフォルトの設定を使うため、常に0.0でしょう。将来的にはインターセプトを使うためのオプションが追加されるでしょう。
1.1から1.2
MLlib v1.2での唯一のAPIの変更は DecisionTree
で、これはMLlib 1.2の実験的なAPIのままです。
-
(破壊的な変更) 分類のためのScala APIはクラスの数を指定する名前付きの引数を取ります。MLlib v1.1 では、この引数はPythonでは
numClasses
と呼ばれ、ScalaではnumClassesForClassification
と呼ばれます。MLlib v1.2では、両方の名前がnumClasses
に設定されます。このnumClasses
パラメータはStrategy
、あるいはDecisionTree
statictrainClassifier
とtrainRegressor
メソッドを使って指定されます。 -
(破壊的な変更)
Node
のためのAPIが変更されました。(trainClassifier
あるいはtrainRegressor
メソッドを使う代わりに)ユーザが手動で決定木を構築していない場合は、これは一般的にユーザコードには影響しません。ツリーのNode
は、予想されたラベルの確率(分類のため)を含むより多くの情報を、今は含んでいます。 -
Printing メソッドの出力が代わりました。
toString
(Scala/Java) と__repr__
(Python) メソッドが完全なモデルを出力するために使われていました; 今では概要を出力します。完全なモデルについては、toDebugString
を使ってください。
Spark配布物の中の例と、決定木のガイドの中の例が、それに応じて更新されました。
1.0から1.1
MLlib v1.1での唯一のAPIの変更は DecisionTree
で、これはMLlib 1.1の実験的なAPIのままです。
-
(破壊的な変更) scikit-learn とrpartの中での木の実装と合わせるために、木の深さの意味が1つだけ変更されました。MLlib v1.0では、深さ1の木は1つの葉を持ち、深さ2の木は1つのrootノードと2つの葉ノードを持っていました。MLlib v1.1では、a 深さ0の木は1つの葉を持ち、深さ1の木は1つのノードと2つの葉ノードを持ちます。この深さは
Strategy
でのmaxDepth
パラメータ、あるいはDecisionTree
statictrainClassifier
とtrainRegressor
メソッドによって指定されます。 -
(破壊的な変更)
DecisionTree
を構築するためには、古いパラメータクラスStrategy
の使用ではなく、新しく追加されたtrainClassifier
とtrainRegressor
メソッドを使うことをお勧めします。これらの新しい訓練メソッドは明示的に分類と回帰を分割し、それらは特別なパラメータタイプ を単純なString
タイプに置き換えます。
お勧めのtrainClassifier
と trainRegressor
の新しい例は、決定木ガイドの中で与えられます。
0.0から1.0
MLlib v1.0では、統一された方法でdenseとsparseの両方をサポートします。これは新しい破壊的な変更を導入します。もしデータがsparseであれば、ストレージおよび計算の両方でのまばらさを利用するために、denseの代わりにsparse形式でそれを格納してください。詳細は以下で説明されます。