MLlib

MLlib (머신러닝) 마이그레이션 가이드 (Migration Guide: MLlib)

MLlib 버전별로 어떻게 업그레이드하는지, 어떤 API가 변경되고 제거·폐기(deprecate)되었는지 정리한 문서예요. 최신 버전(3.5→4.0)부터 오래된 버전(0.9→1.0)까지 버전마다 어떤 breaking change가 있었는지 확인해 볼게요.

출처: 문서

본문

  • MLlib 3.5에서 4.0으로 업그레이드
  • MLlib 2.4에서 3.0으로 업그레이드
  • MLlib 2.2에서 2.3으로 업그레이드
  • MLlib 2.1에서 2.2로 업그레이드
  • MLlib 2.0에서 2.1로 업그레이드
  • MLlib 1.6에서 2.0으로 업그레이드
  • MLlib 1.5에서 1.6으로 업그레이드
  • MLlib 1.4에서 1.5로 업그레이드
  • MLlib 1.3에서 1.4로 업그레이드
  • MLlib 1.2에서 1.3로 업그레이드
  • MLlib 1.1에서 1.2로 업그레이드
  • MLlib 1.0에서 1.1로 업그레이드
  • MLlib 0.9에서 1.0으로 업그레이드

이 마이그레이션 가이드는 MLlib에 특화된 항목만을 다룬다는 점을 기억하세요. DataFrame 기반 API에서 MLlib을 더 높은 버전으로 마이그레이션할 때는 SQL 마이그레이션의 많은 항목이 적용될 수 있어요. Migration Guide: SQL, Datasets and DataFrame 문서를 참고하세요.

MLlib 3.5에서 4.0으로 업그레이드 (Upgrading from MLlib 3.5 to 4.0)

Breaking changes

breaking change는 없어요.

Deprecations and changes of behavior

Deprecations

deprecation은 없어요.

Changes of behavior

  • SPARK-51132: PMML 모델 내보내기에서 내보낸 PMML 형식 모델의 PMML XML 스키마 버전이 PMML-4_3에서 PMML-4_4로 업그레이드됐어요.

MLlib 2.4에서 3.0으로 업그레이드 (Upgrading from MLlib 2.4 to 3.0)

Breaking changes

  • OneHotEncoder는 2.3에서 폐기(deprecated)됐으며 3.0에서 제거됐어요. 그리고 OneHotEncoderEstimator는 이제 OneHotEncoder로 이름이 변경됐어요.
  • 2.3에서 폐기된 org.apache.spark.ml.image.ImageSchema.readImages는 3.0에서 제거됐어요. 대신 spark.read.format('image')를 사용하세요.
  • 2.1에서 폐기된 Int 파라미터 runs를 가진 org.apache.spark.mllib.clustering.KMeans.train은 3.0에서 제거됐어요. runs가 없는 train 메서드를 사용하세요.
  • 2.0에서 폐기된 org.apache.spark.mllib.classification.LogisticRegressionWithSGD는 3.0에서 제거됐어요. 대신 org.apache.spark.ml.classification.LogisticRegression 또는 spark.mllib.classification.LogisticRegressionWithLBFGS를 사용하세요.
  • 2.1에서 폐기된 org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted는 3.0에서 제거됐어요. 하위 클래스에서 사용하도록 의도되지 않아요.
  • 2.0에서 폐기된 org.apache.spark.mllib.regression.RidgeRegressionWithSGD는 3.0에서 제거됐어요. 대신 elasticNetParam = 0.0인 org.apache.spark.ml.regression.LinearRegression을 사용하세요. 참고로 기본 regParamRidgeRegressionWithSGD에서 0.01이지만, LinearRegression에서는 0.0이에요.
  • 2.0에서 폐기된 org.apache.spark.mllib.regression.LassoWithSGD는 3.0에서 제거됐어요. 대신 elasticNetParam = 1.0인 org.apache.spark.ml.regression.LinearRegression을 사용하세요. 참고로 기본 regParamLassoWithSGD에서 0.01이지만, LinearRegression에서는 0.0이에요.
  • 2.0에서 폐기된 org.apache.spark.mllib.regression.LinearRegressionWithSGD는 3.0에서 제거됐어요. 대신 org.apache.spark.ml.regression.LinearRegression 또는 LBFGS를 사용하세요.
  • 2.1에서 폐기된 org.apache.spark.mllib.clustering.KMeans.getRunssetRuns는 3.0에서 제거됐어요. Spark 2.0.0 이후로는 효과가 없었어요.
  • 2.4에서 폐기된 org.apache.spark.ml.LinearSVCModel.setWeightCol은 3.0에서 제거됐어요. 사용자용이 아니에요.
  • 3.0부터 org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel은 학습 파라미터를 노출하기 위해 MultilayerPerceptronParams를 상속해요. 그 결과 MultilayerPerceptronClassificationModellayersArray[Int]에서 IntArrayParam으로 변경됐어요. 레이어 크기를 가져오려면 MultilayerPerceptronClassificationModel.layers 대신 MultilayerPerceptronClassificationModel.getLayers를 사용해야 해요.
  • 2.4.5에서 폐기된 org.apache.spark.ml.classification.GBTClassifier.numTrees는 3.0에서 제거됐어요. getNumTrees를 사용하세요.
  • 2.4에서 폐기된 org.apache.spark.ml.clustering.KMeansModel.computeCost는 3.0에서 제거됐어요. ClusteringEvaluator를 사용하세요.
  • 2.0에서 폐기된 org.apache.spark.mllib.evaluation.MulticlassMetrics의 멤버 변수 precision은 3.0에서 제거됐어요. accuracy를 사용하세요.
  • 2.0에서 폐기된 org.apache.spark.mllib.evaluation.MulticlassMetrics의 멤버 변수 recall은 3.0에서 제거됐어요. accuracy를 사용하세요.
  • 2.0에서 폐기된 org.apache.spark.mllib.evaluation.MulticlassMetrics의 멤버 변수 fMeasure는 3.0에서 제거됐어요. accuracy를 사용하세요.
  • 2.0에서 폐기된 org.apache.spark.ml.util.GeneralMLWriter.context는 3.0에서 제거됐어요. session을 사용하세요.
  • 2.0에서 폐기된 org.apache.spark.ml.util.MLWriter.context는 3.0에서 제거됐어요. session을 사용하세요.
  • 2.0에서 폐기된 org.apache.spark.ml.util.MLReader.context는 3.0에서 제거됐어요. session을 사용하세요.
  • abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]]는 3.0에서 abstract class UnaryTransformer[IN: TypeTag, OUT: TypeTag, T <: UnaryTransformer[IN, OUT, T]]로 변경됐어요.

Deprecations and changes of behavior

Deprecations

  • SPARK-11215: StringIndexerModellabels는 폐기됐으며 3.1.0에서 제거될 예정이에요. labelsArray를 사용하세요.
  • SPARK-25758: BisectingKMeansModelcomputeCost는 폐기됐으며 향후 버전에서 제거될 예정이에요. ClusteringEvaluator를 사용하세요.

Changes of behavior

  • SPARK-11215: Spark 2.4 이전 버전에서는 StringIndexer에서 stringOrderType 파라미터로 frequencyDescfrequencyAsc를 지정할 때, 빈도가 같은 경우 문자열의 순서가 정의되지 않았어요. Spark 3.0부터는 빈도가 같은 문자열이 알파벳 순으로 추가 정렬돼요. 그리고 Spark 3.0부터 StringIndexer는 여러 컬럼 인코딩을 지원해요.
  • SPARK-20604: 3.0 이전 릴리스에서는 Imputer가 입력 컬럼이 Double 또는 Float일 것을 요구했어요. 3.0에서는 이 제한이 완화되어 Imputer가 모든 숫자 타입을 처리할 수 있어요.
  • SPARK-23469: Spark 3.0에서 HashingTF Transformer는 요소를 벡터로 해싱할 때 수정된 murmur3 해시 함수 구현을 사용해요. Spark 3.0의 HashingTF는 Spark 2에서보다 벡터의 다른 위치에 요소를 매핑해요. 하지만 Spark 2.x로 만든 HashingTF를 Spark 3.0으로 로드하면 여전히 이전 해시 함수를 사용하며 동작이 바뀌지 않아요.
  • SPARK-28969: PySpark의 OneVsRestModel에 있던 setClassifier 메서드는 Scala 구현과 동일하게 맞추기 위해 3.0에서 제거됐어요. 호출자는 생성 후에 모델에서 classifier를 설정할 필요가 없어요.
  • SPARK-25790: PCA는 Spark 3.0에서 65535 컬럼 이상의 행렬 지원을 추가했어요.
  • SPARK-28927: 비결정적(nondeterministic) 입력 데이터로 ALS 모델을 피팅할 때, 이전에는 재실행이 일어나면 In/Out user/item 블록 불일치로 인한 ArrayIndexOutOfBoundsException이 발생했어요. 3.0부터는 더 명확한 메시지를 가진 SparkException이 던져지고, 원래 ArrayIndexOutOfBoundsException은 래핑돼요.
  • SPARK-29232: 3.0 이전 릴리스에서는 RandomForestRegressionModel이 내부의 DecisionTreeRegressionModels의 파라미터 맵을 갱신하지 않았어요. 이는 3.0에서 수정됐어요.

MLlib 2.2에서 2.3으로 업그레이드 (Upgrading from MLlib 2.2 to 2.3)

Breaking changes

  • 로지스틱 회귀 모델 요약의 클래스·트레이트 계층 구조가 더 깔끔하게, 그리고 다중 클래스 요약의 추가를 더 잘 수용하도록 변경됐어요. LogisticRegressionTrainingSummaryBinaryLogisticRegressionTrainingSummary로 캐스팅하는 사용자 코드에는 breaking change예요. 사용자는 대신 model.binarySummary 메서드를 사용해야 해요. 자세한 내용은 SPARK-17139를 참고하세요 (이것은 Experimental API라는 점 주의). 이는 Python summary 메서드에는 영향을 주지 않는데, 이 메서드는 다항(multinomial)·이진(binary) 두 경우 모두에서 여전히 올바르게 동작해요.

Deprecations and changes of behavior

Deprecations

  • OneHotEncoder는 폐기됐으며 3.0에서 제거될 예정이에요. 새 OneHotEncoderEstimator로 대체됐어요 (SPARK-13030 참고). 3.0에서 OneHotEncoderEstimatorOneHotEncoder로 이름이 바뀔 예정이에요 (하지만 OneHotEncoderEstimator는 별칭으로 유지돼요).

Changes of behavior

  • SPARK-21027: OneVsRest에 사용되는 기본 병렬도가 이제 1(즉, 직렬)로 설정돼요. 2.2 이전 버전에서는 병렬도가 Scala의 기본 스레드풀 크기로 설정됐어요.
  • SPARK-22156: Word2Vec의 학습률 갱신이 numIterations1보다 크게 설정했을 때 잘못됐어요. 이로 인해 2.3과 이전 버전 사이에 학습 결과가 달라져요.
  • SPARK-21681: 일부 피처의 분산이 0일 때 잘못된 계수를 초래했던 다항 로지스틱 회귀의 엣지 케이스 버그를 수정했어요.
  • SPARK-16957: 트리 알고리즘은 이제 분할 값의 중간점(mid-point)을 사용해요. 이로 인해 모델 학습 결과가 바뀔 수 있어요.
  • SPARK-14657: 절편(intercept)이 없는 RFormula가 생성한 피처가 R의 출력과 일치하지 않던 문제를 수정했어요. 이 시나리오에서 모델 학습 결과가 바뀔 수 있어요.

MLlib 2.1에서 2.2로 업그레이드 (Upgrading from MLlib 2.1 to 2.2)

Breaking changes

breaking change는 없어요.

Deprecations and changes of behavior

Deprecations

deprecation은 없어요.

Changes of behavior

  • SPARK-19787: ALS.train 메서드(DeveloperApi로 표시)의 regParam 기본값이 1.0에서 0.1로 변경됐어요. 이는 ALS Estimator나 Model, 그리고 MLlib의 ALS 클래스에는 영향을 주지 않아요.
  • SPARK-14772: Param.copy 메서드의 Python과 Scala API 사이 불일치를 수정했어요.
  • SPARK-11569: StringIndexer는 이제 NULL 값을 미지의(unseen) 값과 같은 방식으로 처리해요. 이전에는 handleInvalid 파라미터 설정과 관계없이 항상 예외가 던져졌어요.

MLlib 2.0에서 2.1로 업그레이드 (Upgrading from MLlib 2.0 to 2.1)

Breaking changes

제거된 폐기 메서드 (Deprecated methods removed)

  • feature.ChiSqSelectorModelsetLabelCol
  • classification.RandomForestClassificationModelnumTrees (이제 numTrees라는 Param을 가리켜요)
  • regression.RandomForestRegressionModelnumTrees (이제 numTrees라는 Param을 가리켜요)
  • regression.LinearRegressionSummarymodel
  • PipelineStagevalidateParams
  • EvaluatorvalidateParams

Deprecations and changes of behavior

Deprecations

  • SPARK-18592: DecisionTreeClassificationModel, GBTClassificationModel, RandomForestClassificationModel, DecisionTreeRegressionModel, GBTRegressionModel, RandomForestRegressionModel에서 입력/출력 컬럼 Param을 제외한 모든 Param setter 메서드를 폐기했어요.

Changes of behavior

  • SPARK-17870: ChiSqSelector의 버그를 수정했는데 결과가 바뀔 가능성이 높아요. 이제 ChiSquareSelector는 원시 통계량 대신 pValue를 사용해 고정된 수의 상위 피처를 선택해요.
  • SPARK-3261: KMeans는 k개의 고유한 중심점이 없거나 선택되지 않은 경우, k보다 적은 수의 클러스터 중심을 반환할 수 있어요.
  • SPARK-17389: KMeans는 k-means|| 초기화 모드에서 기본 단계 수를 5에서 2로 줄였어요.

MLlib 1.6에서 2.0으로 업그레이드 (Upgrading from MLlib 1.6 to 2.0)

Breaking changes

Spark 2.0에는 몇 가지 breaking change가 있었는데, 아래에 정리했어요.

DataFrame 기반 API를 위한 선형대수 클래스 (Linear algebra classes for DataFrame-based APIs)

Spark의 선형대수 의존성은 새 프로젝트인 mllib-local로 이동됐어요 (SPARK-13944 참고). 이 변경의 일부로 선형대수 클래스는 spark.ml.linalg이라는 새 패키지로 복사됐어요. spark.ml의 DataFrame 기반 API는 이제 spark.ml.linalg 클래스에 의존하므로, 주로 다양한 모델 클래스에서 몇 가지 breaking change가 발생했어요 (전체 목록은 SPARK-14810 참고).

참고: spark.mllib의 RDD 기반 API는 이전 패키지인 spark.mllib.linalg에 계속 의존해요.

벡터와 행렬 변환 (Converting vectors and matrices)

대부분의 파이프라인 구성 요소는 로딩 시 하위 호환성을 지원하지만, 벡터 또는 행렬 컬럼을 포함하는 일부 기존 DataFrame과 파이프라인(Spark 2.0 이전 버전)은 새 spark.ml 벡터·행렬 타입으로 마이그레이션해야 할 수 있어요. DataFrame 컬럼을 spark.mllib.linalg에서 spark.ml.linalg 타입으로(그리고 그 반대로) 변환하는 유틸리티는 spark.mllib.util.MLUtils에서 찾을 수 있어요.

단일 벡터와 행렬 인스턴스를 변환하는 유틸리티 메서드도 있어요. ml.linalg 타입으로 변환하려면 mllib.linalg.Vector / mllib.linalg.MatrixasML 메서드를 사용하고, mllib.linalg 타입으로 변환하려면 mllib.linalg.Vectors.fromML / mllib.linalg.Matrices.fromML을 사용하면 돼요.

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 문서를 참고하세요.

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 문서를 참고하세요.

제거된 폐기 메서드 (Deprecated methods removed)

spark.mllibspark.ml 패키지에서 몇 가지 폐기된 메서드가 제거됐어요:

  • ml.evaluation.BinaryClassificationEvaluatorsetScoreCol
  • spark.mlLinearRegressionLogisticRegressionweights
  • mllib.optimization.LBFGSsetMaxNumIterations (DeveloperApi로 표시)
  • mllib.rdd.RDDFunctionstreeReducetreeAggregate (이 함수들은 RDD에서 직접 사용 가능하며 DeveloperApi로 표시됐었어요)
  • mllib.tree.configuration.StrategydefaultStrategy
  • mllib.tree.Nodebuild
  • mllib.util.MLUtils의 다중 클래스용 libsvm 로더와 load/save labeledData 메서드

breaking change의 전체 목록은 SPARK-14810에서 찾을 수 있어요.

Deprecations and changes of behavior

Deprecations

spark.mllibspark.ml 패키지의 폐기 항목은 다음과 같아요:

  • SPARK-14984: spark.ml.regression.LinearRegressionSummary에서 model 필드가 폐기됐어요.
  • SPARK-13784: spark.ml.regression.RandomForestRegressionModelspark.ml.classification.RandomForestClassificationModel에서 numTrees 파라미터가 폐기되고 getNumTrees 메서드가 권장돼요.
  • SPARK-13761: spark.ml.param.Params에서 validateParams 메서드가 폐기됐어요. 오버라이드된 메서드의 모든 기능을 해당 transformSchema로 옮겼어요.
  • SPARK-14829: spark.mllib 패키지에서 LinearRegressionWithSGD, LassoWithSGD, RidgeRegressionWithSGD, LogisticRegressionWithSGD가 폐기됐어요. spark.ml.regression.LinearRegressionspark.ml.classification.LogisticRegression을 사용하는 것을 권장해요.
  • SPARK-14900: spark.mllib.evaluation.MulticlassMetrics에서 파라미터 precision, recall, fMeasure가 폐기되고 accuracy가 권장돼요.
  • SPARK-15644: spark.ml.util.MLReaderspark.ml.util.MLWriter에서 context 메서드가 폐기되고 session이 권장돼요.
  • spark.ml.feature.ChiSqSelectorModel에서 setLabelCol 메서드는 ChiSqSelectorModel이 사용하지 않으므로 폐기됐어요.

Changes of behavior

spark.mllibspark.ml 패키지의 동작 변경은 다음과 같아요:

  • SPARK-7780: spark.mllib.classification.LogisticRegressionWithLBFGS는 이제 이진 분류를 위해 spark.ml.classification.LogisticRegression을 직접 호출해요. 이로 인해 spark.mllib.classification.LogisticRegressionWithLBFGS에 다음과 같은 동작 변경이 생겨요:
    • L1/L2 Updater로 이진 분류 모델을 학습할 때 절편(intercept)은 정규화되지 않아요.
    • 사용자가 정규화 없이 설정하면, 피처 스케일링을 하든 안 하든 같은 수렴 속도로 같은 해를 반환해요.
  • SPARK-13429: spark.ml.classification.LogisticRegression과 더 좋고 일관된 결과를 제공하기 위해, spark.mllib.classification.LogisticRegressionWithLBFGS의 기본값인 convergenceTol이 1E-4에서 1E-6으로 변경됐어요.
  • SPARK-12363: PowerIterationClustering의 버그를 수정했는데 결과가 바뀔 가능성이 있어요.
  • SPARK-13048: EM 옵티마이저를 사용하는 LDA는 체크포인팅을 사용할 때 기본적으로 마지막 체크포인트를 유지해요.
  • SPARK-12153: Word2Vec은 이제 문장 경계를 존중해요. 이전에는 올바르게 처리하지 못했어요.
  • SPARK-10574: HashingTFspark.mlspark.mllib 둘 다에서 기본 해시 알고리즘으로 MurmurHash3을 사용해요.
  • SPARK-14768: PySpark ParamexpectedType 인자가 제거됐어요.
  • SPARK-14931: Scala와 Python 파이프라인 사이에서 일치하지 않았던 일부 기본 Param 값이 변경됐어요.
  • SPARK-13600: QuantileDiscretizer는 이제 분할을 찾기 위해 spark.sql.DataFrameStatFunctions.approxQuantile을 사용해요 (이전에는 사용자 정의 샘플링 로직을 사용했어요). 같은 입력 데이터와 파라미터에 대해 출력 버킷이 달라져요.

MLlib 1.5에서 1.6으로 업그레이드 (Upgrading from MLlib 1.5 to 1.6)

spark.mllibspark.ml 패키지에는 breaking API 변경이 없지만, deprecation과 동작 변경이 있어요.

Deprecations:

  • SPARK-11358: spark.mllib.clustering.KMeans에서 runs 파라미터가 폐기됐어요.
  • SPARK-10592: spark.ml.classification.LogisticRegressionModelspark.ml.regression.LinearRegressionModel에서 weights 필드가 폐기되고 새 이름 coefficients가 권장돼요. 이는 알고리즘에 주어지는 인스턴스(행) "가중치(weights)"와 구분하는 데 도움이 돼요.

Changes of behavior:

  • SPARK-7770: spark.mllib.tree.GradientBoostedTrees: validationTol이 1.6에서 의미가 바뀌었어요. 이전에는 오차의 절대 변화에 대한 임계값이었어요. 이제는 GradientDescentconvergenceTol과 비슷하게 동작해요: 큰 오차에 대해서는 상대 오차(이전 오차에 대한 상대값)를 사용하고, 작은 오차(< 0.01)에 대해서는 절대 오차를 사용해요.
  • SPARK-11069: spark.ml.feature.RegexTokenizer: 이전에는 토큰화 전에 문자열을 소문자로 변환하지 않았어요. 이제는 기본적으로 소문자로 변환하며, 그렇게 하지 않을 옵션도 있어요. 이는 더 단순한 Tokenizer 변환기와 동작을 일치시켜요.

MLlib 1.4에서 1.5로 업그레이드 (Upgrading from MLlib 1.4 to 1.5)

spark.mllib 패키지에는 breaking API 변경이 없지만 몇 가지 동작 변경이 있어요:

  • SPARK-9005: RegressionMetrics.explainedVariance가 평균 회귀 제곱합(regression sum of squares)을 반환해요.
  • SPARK-8600: NaiveBayesModel.labels가 정렬되게 됐어요.
  • SPARK-3382: GradientDescent는 기본 수렴 허용오차(convergence tolerance) 1e-3를 가지며, 따라서 반복이 1.4보다 일찍 끝날 수 있어요.

spark.ml 패키지에는 하나의 breaking API 변경과 하나의 동작 변경이 있어요:

  • SPARK-9268: Scala 컴파일러 버그로 인해 Params.setDefault에서 Java의 가변 인자(varargs) 지원이 제거됐어요.
  • SPARK-10097: 지표 순서를 나타내기 위해 Evaluator.isLargerBetter가 추가됐어요. RMSE 같은 지표는 1.4에서처럼 더 이상 부호를 뒤집지 않아요.

MLlib 1.3에서 1.4로 업그레이드 (Upgrading from MLlib 1.3 to 1.4)

spark.mllib 패키지에는 몇 가지 breaking change가 있었지만, 모두 DeveloperApi 또는 Experimental API에서 발생했어요:

  • Gradient-Boosted Trees
    • (Breaking change) Loss.gradient 메서드의 시그니처가 변경됐어요. 이는 GBT용으로 자신만의 loss를 작성한 사용자에게만 문제가 돼요.
    • (Breaking change) 케이스 클래스 필드의 수정 때문에 케이스 클래스 BoostingStrategyapplycopy 메서드가 변경됐어요. GBT 파라미터를 설정하기 위해 BoostingStrategy를 사용하는 사용자에게 문제가 될 수 있어요.
  • (Breaking change) LDA.run의 반환 값이 변경됐어요. 이제 구체 클래스 DistributedLDAModel 대신 추상 클래스 LDAModel을 반환해요. LDAModel 타입의 객체는 최적화 알고리즘에 따라 적절한 구체 타입으로 여전히 캐스팅할 수 있어요.

spark.ml 패키지에는 다음과 같은 몇 가지 주요 API 변경이 있었어요:

  • 파라미터를 지정하기 위한 Param 및 기타 API
  • Pipeline 구성 요소를 위한 uid 고유 ID
  • 특정 클래스들의 재구성

spark.ml API는 Spark 1.3에서 alpha 구성 요소였으므로 여기서 모든 변경을 나열하지는 않아요. 하지만 1.4부터 spark.ml은 더 이상 alpha 구성 요소가 아니므로, 향후 릴리스에서는 API 변경에 대한 자세한 내용을 제공할 거예요.

MLlib 1.2에서 1.3으로 업그레이드 (Upgrading from MLlib 1.2 to 1.3)

spark.mllib 패키지에는 몇 가지 breaking change가 있었어요. 첫 번째 변경(ALS)만이 Alpha 또는 Experimental로 표시되지 않은 구성 요소의 것이에요.

  • (Breaking change) ALS에서 불필요한 메서드 solveLeastSquares가 제거됐어요. DeveloperApi 메서드 analyzeBlocks도 제거됐어요.
  • (Breaking change) StandardScalerModel은 여전히 Alpha 구성 요소예요. 그 안에서 variance 메서드가 std 메서드로 대체됐어요. 원래 variance 메서드가 반환하던 컬럼 분산 값을 계산하려면 std가 반환한 표준편차 값을 제곱하면 돼요.
  • (Breaking change) StreamingLinearRegressionWithSGD는 여전히 Experimental 구성 요소예요. 그 안에는 두 가지 변경이 있었어요:
    • 인자를 받는 생성자가 제거되고, 기본 생성자와 파라미터 setter 메서드를 사용하는 빌더 패턴이 권장됐어요.
    • 변수 model이 더 이상 public이 아니에요.
  • (Breaking change) DecisionTree는 여전히 Experimental 구성 요소예요. 그 안과 관련 클래스들에서 몇 가지 변경이 있었어요:
    • DecisionTree에서 폐기된 클래스 메서드 train이 제거됐어요. (객체/정적 train 메서드는 남아 있어요.)
    • Strategy에서 checkpointDir 파라미터가 제거됐어요. 체크포인팅은 여전히 지원되지만, 트리·앙상블 학습을 호출하기 전에 체크포인트 디렉터리를 설정해야 해요.
  • PythonMLlibAPI(Scala/Java와 Python 사이의 MLlib 인터페이스)는 public API였지만 이제 private으로 private[python]으로 선언됐어요. 이는 외부 사용을 위한 것이 아니었어요.
  • 선형 회귀(Lasso, ridge 회귀 포함)에서 제곱 손실(squared loss)이 이제 2로 나눠져요. 1.2와 같은 결과를 얻으려면 정규화 파라미터는 2로 나누고 스텝 크기는 2로 곱해야 해요.

spark.ml 패키지의 주요 API 변경은 Spark SQL에서 온 것이에요. 가장 중요한 변경을 여기 정리할게요:

  • 이전 SchemaRDD는 다소 수정된 API로 DataFrame으로 대체됐어요. spark.ml에서 SchemaRDD를 사용하던 모든 알고리즘은 이제 DataFrame을 사용해요.
  • Spark 1.2에서는 import sqlContext._를 호출해 LabeledPointRDDSchemaRDD로 묵시적 변환했어요 (sqlContextSQLContext 인스턴스였어요). 이 묵시적 변환들이 이동되어 이제 import sqlContext.implicits._를 호출해요.
  • SQL의 Java API도 그에 맞게 변경됐어요. 자세한 내용은 위 예제와 Spark SQL Programming Guide를 참고하세요.

다른 변경은 LogisticRegression에 있었어요:

  • scoreCol 출력 컬럼(기본값 "score")이 probabilityCol(기본값 "probability")로 이름이 바뀌었어요. 타입은 원래 Double이었지만(클래스 1.0의 확률), 이제 Vector예요 (각 클래스의 확률로, 향후 다중 클래스 분류를 지원하기 위함).
  • Spark 1.2에서 LogisticRegressionModel은 절편(intercept)을 포함하지 않았어요. Spark 1.3에서는 절편을 포함하지만, spark.mllib.LogisticRegressionWithLBFGS의 기본 설정을 사용하므로 항상 0.0이 될 거예요. 향후 절편 사용 옵션이 추가될 예정이에요.

MLlib 1.1에서 1.2로 업그레이드 (Upgrading from MLlib 1.1 to 1.2)

MLlib v1.2의 유일한 API 변경은 DecisionTree에 있는데, MLlib 1.2에서 여전히 experimental API로 분류돼요:

  • (Breaking change) 분류용 Scala API는 클래스 수를 지정하는 이름 있는 인자(named argument)를 받아요. MLlib v1.1에서는 이 인자가 Python에서 numClasses, Scala에서 numClassesForClassification이라고 불렸어요. MLlib v1.2에서는 두 이름 모두 numClasses로 설정됐어요. 이 numClasses 파라미터는 Strategy 또는 DecisionTree 정적 trainClassifier·trainRegressor 메서드를 통해 지정돼요.
  • (Breaking change) Node의 API가 변경됐어요. 사용자가 수동으로 결정 트리를 구성하지 않는 한(그리고 trainClassifiertrainRegressor 메서드 대신), 보통 사용자 코드에는 영향을 주지 않아요. 트리 Node는 이제 예측 레이블의 확률(분류의 경우)을 포함해 더 많은 정보를 담아요.
  • 프린팅 메서드의 출력이 변경됐어요. toString(Scala/Java)과 __repr__(Python) 메서드는 전체 모델을 출력하던 것에서 요약을 출력하도록 바뀌었어요. 전체 모델은 toDebugString을 사용하세요.

Spark 배포판의 예제와 Decision Trees Guide의 예제가 그에 맞게 갱신됐어요.

MLlib 1.0에서 1.1로 업그레이드 (Upgrading from MLlib 1.0 to 1.1)

MLlib v1.1의 유일한 API 변경은 DecisionTree에 있는데, MLlib 1.1에서 여전히 experimental API로 분류돼요:

  • (Breaking change) 트리 깊이의 의미가 1만큼 바뀌었고, 이는 scikit-learnrpart의 트리 구현과 일치시키기 위함이에요. MLlib v1.0에서 깊이 1 트리는 리프 노드 1개를 가졌고, 깊이 2 트리는 루트 노드 1개와 리프 노드 2개를 가졌어요. MLlib v1.1에서 깊이 0 트리는 리프 노드 1개, 깊이 1 트리는 루트 노드 1개와 리프 노드 2개를 가져요. 이 깊이는 StrategymaxDepth 파라미터 또는 DecisionTree 정적 trainClassifier·trainRegressor 메서드를 통해 지정돼요.
  • (비-breaking change) DecisionTree를 만들 때 이전 파라미터 클래스 Strategy를 사용하는 대신, 새로 추가된 trainClassifiertrainRegressor 메서드를 사용할 것을 권장해요. 이 새 학습 메서드는 분류와 회귀를 명시적으로 분리하고, 특화된 파라미터 타입을 단순한 String 타입으로 대체해요.

새로 권장되는 trainClassifiertrainRegressor의 예는 Decision Trees Guide에 나와 있어요.

MLlib 0.9에서 1.0으로 업그레이드 (Upgrading from MLlib 0.9 to 1.0)

MLlib v1.0에서는 dense와 sparse 입력을 통합된 방식으로 지원하는데, 이로 인해 몇 가지 breaking change가 도입됐어요. 데이터가 sparse라면 저장과 계산 모두에서 희소성(sparsity)을 활용하기 위해 dense 대신 sparse 형식으로 저장하세요. 자세한 내용은 아래에서 설명할게요.

더 알아보기 (Learn more)