ML Pipeline과 Tuning 소개와 실습
Spark ML 모델 튜닝
Spark ML 모델 튜닝 (ML Tuning)
- 최적의 하이퍼 파라미터 선택
- 최적의 모델 혹은 모델의 파라미터를 찾는 것이 중요
- 하나씩 테스트 vs 다수를 동시에 테스트
- 모델 선택의 중요한 부분은 테스트 방법 (교차 검증, 홀드 아웃)
- 보통 ML Pipeline과 같이 사용
- 다음과 같은 입력을 바탕으로 가장 좋은 파라미터를 찾아줌
- Estimator : 머신러닝 모델 혹은 ML Pipeline
- Evaluator : 머신러닝 모델의 성능을 나타내는 지표
- Parameter : 훈련 반복 횟수 등의 하이퍼 파라미터 (ParamGridBuilder)
- 최종적으로 결과가 가장 좋은 모델을 반환
Spark ML 머신러닝 모델 성능 측정 : Evaluator
- evaluate 함수 제공 : 인자로 테스트 셋의 결과가 들어있는 DataFrame과 Parameter 제공
- 머신러닝 알고리즘에 따라 다양한 Evaluator 제공
- RegressionEvaluator
- BinaryClassificationEvaluator (AUC)
- MulticlassClassificationEvaluator
- MultilabelClassificationEvaluator
- RankingEvaluator
Spark ML 모델 테스트
- 모델 테스트 방법
- 교차 검증 (Cross Validation) : CrossValidator
- 훈련/테스트 셋 분리 (Train-validation split) : TrainValidationSplit
- 훈련/테스트 셋 분리 (Train-validation split) : 홀드 아웃 테스트라고도 함
- 트레이닝 셋을 훈련용 데이터와 테스트용 데이터로 분리
- 훈련용 데이터로 모델 빌딩
- 테스트용 데이터로 예측값 수집
- 예측값과 테스트용 레이블 비교
- 교차 검증 (Cross Validation) : K-Fold 테스트라고도 함
- 트레이닝 셋을 K개의 서브셋으로 나눠 총 K번의 훈련을 반복 -> 홀드 아웃보다 안정적
- i번째 서브셋을 빼고 훈련 및 모델 빌딩
- 만들어진 모델의 테스트는 i번째 서브셋으로 수행
Spark ML 머신러닝 모델 빌딩 프로세스
실습 : ML Pipeline 기반 머신러닝 모델 빌딩
예측 분류기 개발 방향
- ML Pipeline을 사용하여 모델 빌딩
- 다양한 Transformer 사용
- Imputer, StringIndexer, VectorAssembler
- MinMaxScaler를 사용해 피쳐 값을 0과 1 사이로 스케일
- GBTClassifier와 LogisticRegression을 머신러닝 알고리즘으로 사용
- CrossValidation을 사용해 모델 파라미터 선택
- BinaryClassificationEvaluator을 사용해 모델 파라미터 사용
- ParamGridBuilder를 사용해 ParamGrid 생성
- ML Pipeline을 인자로 지정
MinMaxScaler
- 피쳐 값을 0과 1 사이로 스케일
- 기본적으로 VectorAssembler로 벡터로 변환된 피쳐 컬럼에 적용
from pyspark.ml.feature import MinMaxScaler
age_scaler = MinMaxScaler(inputCol="features", outputCol="features_scaled")
age_scaler_model = age_scaler.fit(data_vec)
data_vec = age_scaler_model.transform(data_vec)
ML Pipeline 사용 절차
- 트레이닝 셋에 수행해야 하는 Feature Transformer 생성
- 사용하고자 하는 머신러닝 모델 알고리즘 (Estimator) 생성
- 순서대로 파이썬 리스트에 추가하고, 해당 리스트를 인자로 Pipeline 개체 생성
- Pipeline 개체를 이용해 모델 빌딩
- 방법 1 : Pipeline의 fit 함수를 호출하면서 트레이닝 셋 DataFrame을 지정
- 방법 2 : ML Tuning 개체로 지정해 여러 하이퍼 파라미터를 테스트 후 모델 선택
ML Pipeline 사용 예시
- 필요한 Transformer와 Estimator를 만들고 순서대로 리스트에 추가
from pyspark.ml.feature import Imputer, StringIndexer, VectorAssembler, MinMaxScaler
from pyspark.ml.classification import LogisticRegression
stringIndexer = StringIndexer(inputCol = "Gender", outputCol = 'GenderIndexed')
imputer = Imputer(strategy='mean', inputCols=['Age'], outputCols=['AgeImputed'])
assembler = VectorAssembler(inputCols=['Pclass', 'SibSp', 'Parch', 'Fare', 'AgeImputed', 'GenderIndexed'], outputCol="features")
minmax_scaler = MinMaxScaler(inputCol="features", outputCol="features_scaled")
algo = LogisticRegression(featuresCol="features_scaled", labelCol="Survived")
stages = [stringIndexer, imputer, assembler, minmax_scaler, algo]
- 앞서 만든 리스트를 Pipeline의 인자로 지정
from pyspark.ml import Pipeline
pipeline = Pipeline(stages = stages)
# 이를 사용해 바로 모델 빌드
df = data.select(['Survived', 'Pclass', 'Gender', 'Age', 'SibSp', 'Parch', 'Fare'])
train, test = data.randomSplit([0.7, 0.3])
lr_model = pipeline.fit(train)
lr_cv_predictions = lr_model.transform(test)
evaluator.evaluate(lr_cv_predictions)
ML Tuning 사용 절차
- 테스트하고 싶은 머신러닝 알고리즘 개체 생성 (혹은 ML Pipeline)
- ParamGrid를 만들어 테스트하고 싶은 하이퍼 파라미터 지정
- CrossValidator 혹은 TrainValidationSplit 생성
- fit 함수를 호출해 최선의 모델 선택
ML Tuning 사용 예시
- ParamGrid와 CrossValidator 생성
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
paramGrid = (ParamGridBuilder()
.addGrid(algo.maxIter, [1, 5, 10])
.build())
# evaluator = BinaryClassificationEvaluator(labelCol='Survived', metricName='areaUnderROC')
cv = CrossValidator(
estimator=pipeline,
estimatorParamMaps=paramGrid,
evaluator=evaluator, # 앞서 ML Pipeline에서 생성한 것
numFolds=5
)
- CrossValidator를 실행하여 최선의 모델 선택 및 테스트 셋으로 검증
# Feature transform 전의 트레이닝셋을 7 대 3으로 나눔
train, test = data.randomSplit([0.7, 0.3])
# 교차 분석 수행! 가장 좋은 모델이 리턴됨
cvModel = cv.fit(train)
# 이 모델에 테스트셋을 입력으로 주고 결과를 받아 결과 분석!
lr_cv_predictions = cvModel.transform(test)
evaluator.evaluate(lr_cv_predictions)
- 어느 하이퍼 파라미터 조합이 최선의 결과가 나왔는지 알고 싶다면?
- ML Tuning의 getEstimatorParamMaps/getEvaluator의 조합으로 파악
범용 머신러닝 모델 파일 포맷 : PMML
다양한 머신러닝 개발 플랫폼
- Scikit-learn, PyTorch, Tensorflow + Spark ML
- 다양한 환경에서 통용되는 머신러닝 파일 포맷
- PMML과 MLeap이 대표적
- 이게 가능해지면 머신러닝 모델 서빙 환경의 통일이 가능
- 실제는 공통 파일 포맷이 지원하는 기능이 미약해서 복잡한 모델의 경우 지원 불가
PMML (Predictive Model Markup Language)
- 머신러닝 모델을 마크업 언어로 표현해 주는 XML 언어
- 간단한 입력 데이터 전처리와 후처리도 지원하지만, 제약 사항이 많음
- PySpark에서는 pyspark2pmml 사용, 내부적으로 jpmml-sparkml이라는 자바 jar 파일 사용
전반적인 과정
- ML Pipeline을 PMML 파일로 저장
- pyspark2pmml 모듈 설치 : jpmml-sparkml-executable-1.6.3.jar 파일의 설치가 필요
- pyspark2pmml.PMMLBuilder를 이용하여 ML Pipeline을 PMML 파일로 저장
- PMML 파일을 기반으로 모델 예측 API 론치
- Openscoring 프레임워크
- AWS SageMaker
- Flask + PyPMML
- 해당 API로 승객 정보를 보내고 예측 결과를 받는 클라이언트 코드 작성
사용 예제
- cvModel은 머신러닝 모델이나 ML Pipeline
- train_fr은 트레이닝 셋 DataFrame
from pyspark2pmml import PMMLBuilder
pmmlBuilder = PMMLBuilder(spark.sparkContext, train_fr, cvModel)
pmmlBuilder.buildFile("Titanic.pmml")
- 로딩 예제 (Model.load)
from pypmml import Model
model = Model.load('single_iris_dectree.pmml')
- 예측 예제 (predict)
model.predict({'sepal_length': 5.1, 'sepal_width': 3.5, 'petal_length': 1.4, 'petal_width': 0.2})
'[프로그래머스] 데이터 엔지니어링 데브코스 3기 > TIL(Today I Learn)' 카테고리의 다른 글
[TIL - 2주차] 데브코스 최종 프로젝트 (0) | 2024.07.21 |
---|---|
[TIL - 1주차] 데브코스 최종 프로젝트 (0) | 2024.07.13 |
[TIL - 78일 차] Spark, SparkML 실습 (3) (0) | 2024.07.10 |
[TIL - 77일 차] Spark, SparkML 실습 (2) (0) | 2024.07.09 |
[TIL - 76일 차] Spark, SparkML 실습 (1) (0) | 2024.07.08 |