[TIL Day53] Big Data: Spark MLib 소개와 머신러닝 모델 빌딩

이다혜·2021년 7월 23일
0

TIL

목록 보기
55/60
post-thumbnail

Spark MLlib 소개

  • Spark MLlib
    - 머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리
    - Classification, Regression, Clustering, Collaborative Filtering, Dimensionality Reduction 등등... 딥러닝 지원은 아직 미약
    - RDD 기반과 데이터프레임 기반의 두 버전이 존재

    • spark.mllib vs. spark.ml
    • spark.mllib가 RDD 기반이고 spark.ml은 데이터프레임 기반
    • spark.mllib은 RDD 위에서 동작하는 이전 라이브러리로 더 이상 업데이트가 안됨
    • 항상 spark.ml(import pyspark.ml)을 사용하자!
  • 장점
    - 원스톱 ML 프레임워크
    - 데이터프레임과 SparkSQL 등을 이용해 전처리
    - Spark MLlib를 이용해 모델 빌딩
    - ML Pipeline을 통해 모델 빌딩 자동화
    - MLflow로 모델 관리하고 서빙
    - 대용량 데이터도 처리 가능!

  • MLflow
    - 모델 개발과 테스트와 관리와 서빙까지 제공해주는 End-to-End 프레임웍
    - MLflow는 파이썬, 자바, R, API를 지원
    - 트래킹(Tracking), 모델(Models), 프로젝트(Projects)를 지원

머신러닝 모델링 실습

  • Spark MLlib 기반 모델 빌딩의 기본 구조
    - 트레이닝셋 전처리
    - 모델 빌딩
    - 모델 검증(confusion matrix)
    - Scikit-Learn과 비교했을 때 장점
    • Scikit-Learn은 하나의 컴퓨터에서 돌아가는 모델 빌딩
    • Spark MLlib은 여러 서버 위에서 모델 빌딩
    • 트레이닝셋의 크기가 크면 전처리와 모델 빌딩에 있어 Spark이 큰 장점을 가짐
    • Spark은 ML 파이프라인을 통해 모델 개발의 반복을 쉽게 해줌

Regression 모델

보스턴 주택가격 예측하기

  • 트레이닝셋 살펴보기
    - 총 506개의 레코드로 구성, 13개의 피쳐와 레이블 필드(주택가격)로 구성
    - 506개 동네의 주택 중간값 데이터임(개별 주택이 아님에 유의)
    - 14번째 필드가 예측해야하는 중간 주택 가격

    필드 이름설명
    1.CRIM주택이 있는 지역의 인당 범죄율
    2.ZN25000sqft(대략 700평) 이상의 땅이 주거지역으로 설정된 비율
    3.INDUS에이커당 공업 단지의 비율
    4.CHAS주택이 강가에 위치한 비율
    5.NOX산화질소 농도로 오염정도를 나타냄
    6.RM주택당 평균 방의 수
    7.AGE1940년 전에 지어진 주택의 비율
    8.DIS보스턴 지역 고용 센터까지의 평균 거리
    9.RAD고속도로 접근성에 대한 인덱스
    10.TAX재산세(주택가격 $10K 기준)
    11.PTRATO초등학교 학생-선생님의 비율
    12.B흑인 인구의 비율
    13.LSTAT저소득자의 인구 비율
    14.MEDV천불 단위의 주택 평균 가격

Classification

타이타닉 승객 생존 예측하기

  • 타이타닉 승객 생존 예측
    - Binary Classification 알고리즘 사용 예정(정확히는 Binomial Logistic Regression을 사용)
    - AUC(Area Under the Curve)의 값이 중요한 성능 지표가 됨

    • True Positive Rate: 생존한 경우를 얼마나 맞게 예측했나? 흔히 Recall이라고 부름
    • False Positive Rate: 생존하지 못한 경우를 생존한다고 얼마나 예측했나?
  • 트레이닝셋 살펴보기
    - 총 892개 레코드로 구성되며 11개의 피쳐와 레이블 필드(생존여부)로 구성
    - 2번째 필드(Survived)가 예측해야하는 승객 생존 여부

    필드 이름설명
    1.PassengerId승객에게 주어진 일련번호
    2.Survived생존여부를 나타내는 레이블 정보
    3.Pclass티켓클래스, 1=1st, 2=2nd, 3=3rd
    4.Name승객의 이름
    5.Gender승객의 성별
    6.Age승객의 나이
    7.SibSp같이 승선한 형제/자매와 배우자의 수
    8.Parch같이 승선한 부모와 자녀의 수
    9.Ticket티켓 번호
    10.Fare운임의 값
    11.Cabin숙소 번호
    12.Embarked승선한 항구

Spark MLib 피쳐변환

  • Feature Transformer가 하는 일
    - 기본적으로 머신러닝에서 모든 피쳐 값들은 숫자 필드이어야 하므로 텍스트 필드(카테고리 값들)를 숫자 필드로 변환
    - 숫자 필드라고 해도 가능한 값의 범위를 특정 범위(0부터 1)로 변환하는 표준화가 필요, 이를 피쳐 스케일링(Scaling) 혹은 정규화(Normalization)라고 함
    - 비어있는 필드들의 값 채우기: Imputer

  • Feature Extractor가 하는 일
    - 기존 피쳐에서 새로운 피쳐를 추출
    - TF-IDF, Word2Vec 등
    - 텍스트 데이터를 어떤 형태로 인코딩하는 것이 여기에 해당

  • StringIndexer: 텍스트 카테고리를 숫자로 변환
    - Scikit-Learn은 sklearn.preprocessing 모듈 아래 여러 인코더(OneHotEncoder, LabelEncoder, OrdinalEncoder 등) 존재
    - Spark MLlib의 경우 pyspark.ml.feature 모듈 밑에 두 개의 인코더 존재

    • StringIndexer, OneHotEncoder
    • 사용법은 Indexer 모델을 만들고(fit), Indexter 모델로 데이터프레임을 변환(Transform)
from pyspark.ml.feature import StringIndexer

gender_indexer = StringIndexer(inputCol='Gender', outputCol='GenderIndexed')
gender_indexer_model = gender_indexer.fit(final_data)
final_data = gender_indexer_model.transform(final_data)
  • Scaler: 숫자 필드 값의 범위를 0과 1사이로 표준화
    - pyspark.ml.feature 모듈 밑에 두 개의 스케일러 존재
    - StandardScaler: 각 값에서 평균을 빼고 이를 표준편차로 나눔. 값의 분포가 정규분포를 따르는 경우 사용
    - MinMaxScaler: 모든 값을 0과 1사이로 스케일링. 각 값에서 최솟값을 빼고 (최댓값-최솟값)으로 나눔

  • Imputer: 값이 없는 필드 채우기
    - 값이 존재하지 않는 레코드들이 존재하는 필드들의 경우 기본값(평균값, 중앙값 등)을 정해 채움

from pyspark.ml.feature import Imputer

imputer = Imputer(strategy='mean', inputCols=['Age'], outputCols=['AgeImputed'])
imputer_model = imputer.fit(final_data)
final_data = imputer_model.transform(final_data)

Spark ML Pipeline 소개

모델 빌딩과 테스트 과정을 자동화하자!

  • 모델 빌딩과 관련된 흔한 문제들
    a. 트레이닝 셋의 관리가 안됨
    b. 모델 훈련 방법이 기록이 안됨: 어떤 트레이닝셋을 사용했는지? 어떤 피쳐들을 사용했는지? 하이퍼 파라미터는 무엇을 사용했는지?
    c. 모델 훈련에 많은 시간 소요: 모델 훈련이 자동화가 안된 경우 매번 각 스템들을 노트북 등에서 일일히 수행해야 하므로 에러가 발생할 여지가 많음

  • Spark ML Pipeline이란?
    - 데이터 과학자가 머신러닝 개발과 테스트를 쉽게 해주는 기능(데이터프레임 기반)
    - 머신러닝 알고리즘에 관계없이 일관된 형태의 API를 사용하여 모델링이 가능
    - ML 모델 개발과 테스트를 반복 가능하게 해줌
    - 4개의 요소로 구성

    • 데이터프레임
    • Transformer
    • Estimator
    • Parameter

ML 파이프라인의 구성요소

데이터프레임

ML 파이프라인에서는 데이터프레임이 기본 데이터 포맷이며, 테스트셋을 로딩하기 위해 기본적으로 csv, JSON, Parquet, JDBC를 지원한다. ML 파이프라인에서 다음 2가지의 새로운 데이터소스를 추가 지원한다.

  • 이미지 데이터소스
    - jpeg, png 등의 이미지들을 지정된 디렉토리에서 로드
  • LIBSVM 데이터소스
    - label과 features 두 개의 컬럼으로 구성되는 머신러닝 트레이닝 포맷
    - features 컬럼은 벡터 형태의 구조

Transformer

입력 데이터프레임을 다른 데이터프레임으로 변환하기 위한 것으로, 그 결과 하나 이상의 새로운 컬럼이 추가된다. 2종류의 Transformer(Feature Transformer와 Learning Model)가 존재하며 transform을 메인 함수로 갖는다.

  • Feature Transformer
    - 입력 데이터프레임의 컬럼으로부터 새로운 컬럼을 만들어내 이를 추가한 새로운 데이터프레임을 출력으로 내줌, 보통 피쳐 엔지니어링을 하는데 사용
    - 예) Imputer, StringIndexer, VectorAssembler(주어진 컬럼들을 통합하여 하나의 벡터 컬럼으로 변환)
  • Learning Model
    - 머신러닝 모델에 해당
    - 피쳐 데이터프레임을 입력으로 받아 예측값이 새로운 컬럼으로 포함된 데이터프레임을 출력(prediction, probability)으로 내줌

Estimator

머신러닝 알고리즘에 해당하며, fit을 메인 함수로 가진다. 트레이닝셋 데이터프레임을 입력으로 받아서 머신러닝 모델(Transformer)을 만들어낸다. 즉 입력이 데이터프레임이고 출력이 머신러닝 모델이 된다. 예를 들어 LogisticRegression을 Estimator이고, LogisticRegression.fit()을 호출하면 머신러닝 모델(Transformer)를 만들어내는 것이다.
Estimator는 저장(save)과 읽기(load) 함수를 제공하여 모델과 ML Pipeline을 저장했다가 나중에 다시 읽을 수 있다.

Parameter

Transformer와 Estimator의 공통 API로 다양한 인자를 적용해준다. Param(하나의 이름과 값)과 ParamMap(Param 리스트) 두 종류의 파라미터가 존재한다. 파라미터는 fit (Estimator) 혹은 transform (Transformer)에 인자로 지정 가능하다.

개념 정리

ML Pipeline은 결국 하나 이상의 Transformer와 Estimator가 연결된 모델링 워크플로우로, 입력은 데이터프레임이고 출력은 머신러닝 모델인 것이다. ML Pipeline 그 자체도 Estimator이므로 실행은 fit함수의 호출로 시작할 수 있으며, 저장했다가 다시 로딩하는 것이 가능해 한번 파이프라인을 만들어두면 반복적인 모델 빌딩이 쉬워진다.

profile
하루하루 성장중

0개의 댓글