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')