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을 사용하세요. 참고로 기본regParam은RidgeRegressionWithSGD에서 0.01이지만,LinearRegression에서는 0.0이에요. - 2.0에서 폐기된
org.apache.spark.mllib.regression.LassoWithSGD는 3.0에서 제거됐어요. 대신elasticNetParam= 1.0인org.apache.spark.ml.regression.LinearRegression을 사용하세요. 참고로 기본regParam은LassoWithSGD에서 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.getRuns와setRuns는 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를 상속해요. 그 결과MultilayerPerceptronClassificationModel의layers는Array[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:
StringIndexerModel의labels는 폐기됐으며 3.1.0에서 제거될 예정이에요.labelsArray를 사용하세요. - SPARK-25758:
BisectingKMeansModel의computeCost는 폐기됐으며 향후 버전에서 제거될 예정이에요.ClusteringEvaluator를 사용하세요.
Changes of behavior
- SPARK-11215: Spark 2.4 이전 버전에서는
StringIndexer에서stringOrderType파라미터로frequencyDesc나frequencyAsc를 지정할 때, 빈도가 같은 경우 문자열의 순서가 정의되지 않았어요. Spark 3.0부터는 빈도가 같은 문자열이 알파벳 순으로 추가 정렬돼요. 그리고 Spark 3.0부터StringIndexer는 여러 컬럼 인코딩을 지원해요. - SPARK-20604: 3.0 이전 릴리스에서는
Imputer가 입력 컬럼이 Double 또는 Float일 것을 요구했어요. 3.0에서는 이 제한이 완화되어Imputer가 모든 숫자 타입을 처리할 수 있어요. - SPARK-23469: Spark 3.0에서
HashingTFTransformer는 요소를 벡터로 해싱할 때 수정된 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
- 로지스틱 회귀 모델 요약의 클래스·트레이트 계층 구조가 더 깔끔하게, 그리고 다중 클래스 요약의 추가를 더 잘 수용하도록 변경됐어요.
LogisticRegressionTrainingSummary를BinaryLogisticRegressionTrainingSummary로 캐스팅하는 사용자 코드에는 breaking change예요. 사용자는 대신model.binarySummary메서드를 사용해야 해요. 자세한 내용은 SPARK-17139를 참고하세요 (이것은ExperimentalAPI라는 점 주의). 이는 Pythonsummary메서드에는 영향을 주지 않는데, 이 메서드는 다항(multinomial)·이진(binary) 두 경우 모두에서 여전히 올바르게 동작해요.
Deprecations and changes of behavior
Deprecations
OneHotEncoder는 폐기됐으며3.0에서 제거될 예정이에요. 새OneHotEncoderEstimator로 대체됐어요 (SPARK-13030 참고).3.0에서OneHotEncoderEstimator는OneHotEncoder로 이름이 바뀔 예정이에요 (하지만OneHotEncoderEstimator는 별칭으로 유지돼요).
Changes of behavior
- SPARK-21027:
OneVsRest에 사용되는 기본 병렬도가 이제 1(즉, 직렬)로 설정돼요.2.2이전 버전에서는 병렬도가 Scala의 기본 스레드풀 크기로 설정됐어요. - SPARK-22156:
Word2Vec의 학습률 갱신이numIterations를1보다 크게 설정했을 때 잘못됐어요. 이로 인해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로 변경됐어요. 이는ALSEstimator나 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.ChiSqSelectorModel의setLabelColclassification.RandomForestClassificationModel의numTrees(이제numTrees라는 Param을 가리켜요)regression.RandomForestRegressionModel의numTrees(이제numTrees라는 Param을 가리켜요)regression.LinearRegressionSummary의modelPipelineStage의validateParamsEvaluator의validateParams
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.Matrix의 asML 메서드를 사용하고, 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.mllib와 spark.ml 패키지에서 몇 가지 폐기된 메서드가 제거됐어요:
ml.evaluation.BinaryClassificationEvaluator의setScoreColspark.ml의LinearRegression과LogisticRegression의weightsmllib.optimization.LBFGS의setMaxNumIterations(DeveloperApi로 표시)mllib.rdd.RDDFunctions의treeReduce와treeAggregate(이 함수들은RDD에서 직접 사용 가능하며DeveloperApi로 표시됐었어요)mllib.tree.configuration.Strategy의defaultStrategymllib.tree.Node의buildmllib.util.MLUtils의 다중 클래스용 libsvm 로더와 load/save labeledData 메서드
breaking change의 전체 목록은 SPARK-14810에서 찾을 수 있어요.
Deprecations and changes of behavior
Deprecations
spark.mllib와 spark.ml 패키지의 폐기 항목은 다음과 같아요:
- SPARK-14984:
spark.ml.regression.LinearRegressionSummary에서model필드가 폐기됐어요. - SPARK-13784:
spark.ml.regression.RandomForestRegressionModel과spark.ml.classification.RandomForestClassificationModel에서numTrees파라미터가 폐기되고getNumTrees메서드가 권장돼요. - SPARK-13761:
spark.ml.param.Params에서validateParams메서드가 폐기됐어요. 오버라이드된 메서드의 모든 기능을 해당transformSchema로 옮겼어요. - SPARK-14829:
spark.mllib패키지에서LinearRegressionWithSGD,LassoWithSGD,RidgeRegressionWithSGD,LogisticRegressionWithSGD가 폐기됐어요.spark.ml.regression.LinearRegression과spark.ml.classification.LogisticRegression을 사용하는 것을 권장해요. - SPARK-14900:
spark.mllib.evaluation.MulticlassMetrics에서 파라미터precision,recall,fMeasure가 폐기되고accuracy가 권장돼요. - SPARK-15644:
spark.ml.util.MLReader와spark.ml.util.MLWriter에서context메서드가 폐기되고session이 권장돼요. spark.ml.feature.ChiSqSelectorModel에서setLabelCol메서드는ChiSqSelectorModel이 사용하지 않으므로 폐기됐어요.
Changes of behavior
spark.mllib와 spark.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:
HashingTF는spark.ml과spark.mllib둘 다에서 기본 해시 알고리즘으로MurmurHash3을 사용해요. - SPARK-14768: PySpark
Param의expectedType인자가 제거됐어요. - 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.mllib나 spark.ml 패키지에는 breaking API 변경이 없지만, deprecation과 동작 변경이 있어요.
Deprecations:
- SPARK-11358:
spark.mllib.clustering.KMeans에서runs파라미터가 폐기됐어요. - SPARK-10592:
spark.ml.classification.LogisticRegressionModel과spark.ml.regression.LinearRegressionModel에서weights필드가 폐기되고 새 이름coefficients가 권장돼요. 이는 알고리즘에 주어지는 인스턴스(행) "가중치(weights)"와 구분하는 데 도움이 돼요.
Changes of behavior:
- SPARK-7770:
spark.mllib.tree.GradientBoostedTrees:validationTol이 1.6에서 의미가 바뀌었어요. 이전에는 오차의 절대 변화에 대한 임계값이었어요. 이제는GradientDescent의convergenceTol과 비슷하게 동작해요: 큰 오차에 대해서는 상대 오차(이전 오차에 대한 상대값)를 사용하고, 작은 오차(< 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) 케이스 클래스 필드의 수정 때문에 케이스 클래스
BoostingStrategy의apply와copy메서드가 변경됐어요. GBT 파라미터를 설정하기 위해BoostingStrategy를 사용하는 사용자에게 문제가 될 수 있어요.
- (Breaking change)
- (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._를 호출해LabeledPoint의RDD를SchemaRDD로 묵시적 변환했어요 (sqlContext는SQLContext인스턴스였어요). 이 묵시적 변환들이 이동되어 이제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가 변경됐어요. 사용자가 수동으로 결정 트리를 구성하지 않는 한(그리고trainClassifier나trainRegressor메서드 대신), 보통 사용자 코드에는 영향을 주지 않아요. 트리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-learn과 rpart의 트리 구현과 일치시키기 위함이에요. MLlib v1.0에서 깊이 1 트리는 리프 노드 1개를 가졌고, 깊이 2 트리는 루트 노드 1개와 리프 노드 2개를 가졌어요. MLlib v1.1에서 깊이 0 트리는 리프 노드 1개, 깊이 1 트리는 루트 노드 1개와 리프 노드 2개를 가져요. 이 깊이는
Strategy의maxDepth파라미터 또는DecisionTree정적trainClassifier·trainRegressor메서드를 통해 지정돼요. - (비-breaking change)
DecisionTree를 만들 때 이전 파라미터 클래스Strategy를 사용하는 대신, 새로 추가된trainClassifier와trainRegressor메서드를 사용할 것을 권장해요. 이 새 학습 메서드는 분류와 회귀를 명시적으로 분리하고, 특화된 파라미터 타입을 단순한String타입으로 대체해요.
새로 권장되는 trainClassifier와 trainRegressor의 예는 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)
- 아파치 스파크 MLlib 마이그레이션 가이드 (원문)
- Migration Guide: SQL, Datasets and DataFrame — SQL 마이그레이션 가이드
- MLlib 가이드 (원문) — MLlib 전체 가이드