주니어 데이터 엔지니어 우솨's 개발일지

데이터 엔지니어링 74일차 TIL 본문

데브코스

데이터 엔지니어링 74일차 TIL

우솨 2024. 7. 11. 12:34

학습 내용

SparkML 제공 알고리즘
- Classification :
        - Logistic regression
        - Decision tree
        - Random forest
        - Gradient-boosted tree
- Regression :
        - Linear regression
        - Decision tree
        - Random forest
        - Gradien-boosted tree
- Clustering :
        - K-means
        - LDA(Latent Dirichlet Allocation)
        - GMM(Gaussian Mixture Model)
- Collaborative Filtering :
        - 명시적인 피드백 : 리뷰 평점
        - 암묵적인 피드백 : 클릭, 구매 등
- Dimensionality Reduction 등
- spark.ml 사용할 것!

Spark ML 기반 모델 빌딩의 기본 구조
: 여느 라이브러리를 사용한 모델 빌딩과 크게 다르지 않다.
- 트레이닝셋 전처리, 모델 빌딩, 모델 검증(confusion matrix)
- Scikit-Learn과 비교의 비교
        - 가장 큰 차이점은 결국 데이터의 크기
        - Scikit-Learn은 하나의 컴퓨터에서 돌아가는 반면 Spark MLlib는 여러 서버 위에서 모델 빌딩
- 트레이닝셋의 크기가 크면 전처리와 모델 빌딩에 있어 Spark이 큰 장점을 가진다.
- Spark는 ML 파이프라인을 통해 모델 개발의 반복을 쉽게 해준다.

Spark ML 피쳐 변환
: 피쳐 값들을 모델 훈련에 적합한 형태로 바꾸는 것
- 크게 두가지 존재 : Feature Extractor와 Feature Transformer
- Feature Transformer (숫자 필드 값의 범위 표준화)
        - 텍스트 필드를 숫자 필드로 변환 해야함 (피쳐값들은 숫자 필드여야 한다!)
        - 숫자 값들의 범위를 특정범위(0부터 1)로 변환 -- 정규화(Normalization)
        - 비어있는 필드 값을 채워야한다.(Imputer사용)
- Feature Extractor (기존 피쳐에서 새로운 피쳐를 추출)
        - TF-IDF, Word2Vec,... 등으로 변경
                - 많은 경우 텍스트 데이터를 어떤 형태로 인코딩하는 것이 여기에 해당

StringIndexer
: 텍스트 카테고리를 숫자로 변환
        - ex) ["Red", "Blue", "Yellow"] => [0,1,2]
- Scikit-Learn은 sklearn.preprocessing 모듈 아래 여러 인코더 존재
        - OneHotEncoder, LabelEncoder, OrdianlEncoder 등
- Spark MLlib의 경우 pyspark.ml.feature 모듈 밑에 두 개의 인코더 존재
        - StringIndexer, OneHotEncdoer
        - Indexer 모델을 만들고 fit한 후, Indexer 모델로 데이터프레임을 transform

Scaler
: 숫자 필드 값의 범위 표준화
- 숫자 필드 값의 범위를 특정 범위(ex : 0~1)로 변환
- 피쳐 스케일링(Feature Scaling) 혹은 정규화(Normalization)이라 부름
        - ex) [-20, 100, 40, 25, 15] => [0, 1, 0.5, 0.375, 0.125]
- Scikit-Learn은 sklearn.preprocessing 모듈 아래 두 개 인코더 존재
        - StandardScaler, MinMaxScaler
- Spark MLlib의 경우 pyspark.ml.feature 모듈 밑에 두 개의 인코더 존재
        - StandardScaler, MinMaxScaler
        - Scaler 모델을 만들고 fit한 후, Indexer 모델로 데이터프레임을 transform
- StandardScaler : 각 값에서 평균을 빼고 이를 표준편차로 나눔
        - 값의 분포가 정규분포를 따르는 경우 사용
- MinMaxScaler : 모든값을 0과 1사이로 스케일
        - 각 값에서 최소값을 빼고 (최대값-최소값)으로 나눈다.

Imputer
: 값이 없는 필드 채우기
- 값이 존재하지 않는 레코드들이 존재하는 들드들의 경우 기본값을 정해서 채우는 것. Impute한다고 부름.
- Scikit-Learn은 sklearn.preprocessing 모듈 아래 존재
        - Imputer
- Spark MLlib의 경우 pyspark.ml.feature 모듈 밑에 존재
        - Imputer
        - Imputer 모델을 만들고 fit한 후, Indexer 모델로 데이터프레임을 transform

ML 파이프라인
: 머신러닝 개발과 테스트를 쉽게 해주는 기능 (데이터 프레임 기반)
- 머신러닝 알고리즘에 관계없이 일관된 형태의 API를 사용하여 모델링이 가능
- ML 모델개발과 테스트를 반복가능하게 해줌
- 데이터프레임, Transformer, Estimator, Parameter 4가지 요소로 구성됨



ML 파이프라인의 구성요소 : 데이터 프레임
- ML 파이프라인에서는 데이터프레임이 기본 데이터 포맷이다.
- 기본적으로 CSV, JSON, Parquet, JDBC(관계형 데이터베이스)를 지원
- ML 파이프라인에서는 다음 2가지의 새로운 데이터소스를 지원
        - 이미지 데이터소스
                - jpeg, png 등의 이미지들을 지정된 디렉토리에서 로드
        - LIBSVM 데이터소스
                - label과 features 두 개의 컬럼으로 구성되는 머신러닝 트레이닝셋 포맷
                - features 컬럼은 벡터 형태의 구조를 가진다.

ML 파이프라인의 구성요소 : Transformer
: 입력 데이터프레임을 다른 데이터프레임으로 변환한다.
- 하나 이상의 새로운 칼럼을 추가
- 2 종류의 Transformer가 존재하며 transform이 메인 함수
        - Feature Transformer와 Learning Model
- Feature Transformer
        - 입력 데이터프레임의 컬럼으로부터 새로운 컬럼을 만들어내 이를 추가한 새로운 데이터프레임을 출력으로 내줌. - 보통 피쳐 엔지니어링에 사용
        - Imputer : 기본값 지정에 사용
        - StringIndexer : categorical 정보를 숫자 정보로 변환
        - VectorAssembler : 주어진 컬럼들을 통합하여 하나의 벡터 컬럼으로 변환
- Learning Model
        - 머신러닝 모델에 해당
        - 피쳐 데이터프레임을 입력으로 받아 예측값이 새로운 컬럼으로 포함된 데이터프레임을 출력으로 내줌 : prediction, probability


ML 파이프라인의 구성요소 : Learning Model
- 머신러닝 모델에 해당하여 transform 함수로 동작

 


ML 파이프라인의 구성요소 : Estimator
- 머신러닝 알고리즘에 해당하며 fit이 메인 함수이다.
- 트레이닝셋 데이터프레임을 입력으로 받아서 머신러닝 모델(Transformer)를 만들어낸다.
        - 입력 : 데이터프레임(트레이닝 셋)
        - 출력 : 머신러닝 모델
- ML Pipeline도 Estimator이다.
- Estimator는 저장과 읽기 함수를 제공한다.
        - save와 load를 통해 저장 및 로드가 가능하다.



ML 파이프라인의 구성요소 : Parameter
- Transformer와 Estimator의 공통 API로 다양한 인자를 적용해준다.
        - Param : 하나의 이름과 값
        - ParamMap : Param 리스트
- 파라미터의 예
        - 훈련 반복수(iteration) 지정을 위해 setMaxIter()를 사용
        - ParamMap(Ir.maxIter -> 10)
- 파라미터는 fit (Estimator) 혹은 transform(Transformer)에 인자로 지정이 가능하다.

ML Pipeline
: 하나 이상의 Transformer와 Estimator가 연결된 모델링 웍플로우
        - 입력은 데이터프레임, 출력은 머신러닝 모델
- ML Pipeline 그자체도 Estimator이다.
        - 따라서 ML Pipeline의 실행은 fit 함수의 호출로 시작한다.
        - 저장후 나중에 다시 로딩하는 것이 가능(Persistence)
- 한번 파이프라인을 만들면 반복 모델빌딩이 쉬워진다.