[부스트코스] 쇼핑데이터를 활용한 머신러닝_모델 학습

#4 머신러닝 개념

 

■ Underfitting & Overfitting

- Underfitting은 데이터를 잘 설명하지 못하는 상황

  • > Underfitting 방지
    • 1) 더 오래, 더 많은 데이터로 학습
    • 2) Feature를 더 많이 반영
    • 3) Variance 높은 모델 사용 

- Overfitting은 반대로 데이터를 과도하게 설명하는 상황

  • > our dataset != full dataset
  • > 실제 나머지 데이터와 본적이 없는 데이터에 대해서도 잘 표현하고 잘 나타낸다는 보장 없음

 

■ Regularization (Overfitting 방지_정형 데이터에 적용 가능한)

- 랜덤성을 부여하고 평균화 시키는 작업

- Early Stopping

  • >  Validation Error가 지속적으로 증가하는 지점에서 모델 학습을 중단

- Parameter Norm Penalty

- Data Augmentation

  • > 원본 이미지를 회전, 반전, 확대 및 축소 등의 방법을 통해 데이터 개수를 늘리는 방법
  • > 데이터를 의도적으로 증강시켜 모델에게 다양한 데이터로 학습할 수 있게 하는 방법
  • > SMOTE (정형식 데이터 증강 방법)
    • # Imbalanced된 데이터에서 Minority 한 data를 활용해 사이사이 데이터를 생성하는 방식

- Dropout

  • > 모든 Feature 와 Node를 사용하는 대신, 일부만 사용하여 모델을 학습하는 방법
  • > Column Sample by tree (정형식 분석 방법)
    • # 모든 Feature(column)을 사용하는 게 아닌, 컬럼을 랜덤 하게 샘플링해서 이를 구현

 

■ Validation strategy

- Test Set

  • > Test Set은 세 가지 데이터셋 중 가장 중요한 부분
  • > 프로젝트나 경진대회에서 하나의 통일된 Test dataset 기반으로 정량적인 비교 진행
  • > 프로젝트의 결과물과 직결되는 데이터셋
  • > Test Set은 최대한 전체 데이터를 대표할 수 있도록 구성하는 것이 좋음

- Validation Set

  • > Test Set에 적용하기 전에 모델의 성능을 어느정도 파악
  • > Test Set과 유사하게, 전체 데이터을 대표할 수 있는 Set으로 구성하는 것이 좋음
  • > Test Set은 보지 못한 데이터라는 점이 중요하기에 포함된 내용이 들어가서는 안됨
  • > 프로젝트나 문제의 바탕 파악, 이를 바탕으로 test set과 유사하게 만드는 게 좋음

- Train set

  • > 머신러닝이 보고 학습하는 set
  • > Test Set과 Validation Set을 정하면 자연스럽게 정해짐
  • > 데이터의 품질에 따라 Noise 데이터를 포함해야할지 이상치와 같은 맥락으로 보면 됨

 

■ Hold-out Validation

- validation set을 구성하는 방법

- Random sampling: 쉽고 간단 / 전체 dataset을 안 가리킬 수도 있음

- Stratified split: 비율로 나누기. 보통 8대2 혹은 7대 3으로, 전체 데이터의 클래스 비율은 보통 7:2:1

- Cross Validation: Train과 Validation Set을 여러 개 구성하는 방법

  • > K-Fold: 
    • 1) 각 상황 별로 Train, Validation을 다르게 구성
    • 2) 각각 모델 학습시킨 후, 
    • 3) 각각의 Train, Validation을 거친 모델들을 모두 사용하여 Test Set 예측
  • > Stratified K-Fold도 가능
    • # 분류 문제에선 클래스별로 비율을 유지시켜야 보통 모델 성능 좋기에 이것 사용
  • > Group K-Fold: 그룹들을 하나의 덩어리로 생각
    • # train과 validattion을 나눌 때 뭉쳐둠
    • # 같은 그룹이 동일한 Fold에 들어가지 않도록 split
    • # 그룹이 Fold 개수보다 커야 가능
  • > Time series split: 데이터 순차 시간을 고려해서 validation set 구성
    • # 미래 데이터로 과거 데이터를 예측하는 일이 발생하지 않도록.
    • # 그래서 앞쪽 Fold일수록 traning 데이터 작아질 수 있음
  • > Baseline Stratified K-Fold
    • # binary 방식으로 나눔

 

■ Reproducibility (재현성)

- 랜덤을 기반으로 실행되는 작업들을 고정시켜 줌으로써 모델의 성능을 똑같이 복원

  • 1) 이를 위해 Seed를 고정해서 사용
  • 2) Feature Engineering, model parameter handling 등등
  • 3) 의미 있는 행동인지 아닌지 validatoin의 성능으로 판단하여 머신러닝 모델 강화

-  Machine Learning Workflow

  • 1) 데이터에서 필요한 데이터를 추출하고,
  • 2) 추출한 데이터에 대해 전처리를 진행하고, 
  • 3) Feature Scaling 및 Feature Selection을 한 후,
  • 4) 머신러닝 알고리즘 구현하여 모델링 및 학습을 진행, 
  • 5) 후에 Test Set에 대해 성능 평가를 진행
  • ※ 데이터 추출 및 전처리 과정이 모델 성능에 있어 가장 중요한 부분
    • > 신뢰도 있고 정확한 데이터 기반되지 않으면 프로젝트 실패 가능성 높아짐
    • > 모델의 비정상적인 작동 원인 찾느라 시간 소모 가능성

 

#5 트리 모델

 

■ 트리 모델?

- 트리 구조를 활용해 Feature 값을 특정 기준으로 분류해 목적에 맞는 의사결정을 만드는 모델

- 트리 기반 모델

> Decision Tree, Random Forest, AdaBoost, GBM, XGBoost, LightGBM, CatBoost

 

■ Bagging&Boosting

- Bagging: 

  • > 데이터셋을 랜덤 샘플링하여 트리를 만들어 나감
  • > 생성한 트리의 의사 결정들을 취합해서 하나의 의사결정으로 만드는 방식
  • > Bootstrap = Data를 여러 번 Sampling
  • > Aggregation = 종합 (Ensemble)
  • > Bagging = Bootstrap + Aggregation

- Boosting:

  • > 초기 랜덤 데이터셋 이용하여 틀을 만들고 잘 맞추지 못한 데이터들에 Weight 부여
  • > 다음 트리를 만들 때 영향을 줘서 잘 맞출 수 있게 하는 방법

- 정리

  • > Tree 생성 방법
    • # Bagging: 병렬 모델 (각 모델 서로 연관 X)
    • # Boosting: 순차적 모델 (이전 Tree의 오류기반으로)
  • > 특징
    • # Bagging: 다양한 Tree 생성
    • # Boosting: 정밀한 Tree 생성

 

■ LightGBM, XGBoost, CatBoost

- XGBoost와 CatBoost는 Tree를 생성할 때 균형적인 (Balanced) 구조로 생성

- LightGBM은 한 쪽에 가지를 지속적으로 생성한 다음 다른 가지가 생성하는 구조로 성장

- 만약 Tree가 성장하는 방식을 제한하지 않는다면 두 방법 모두 Tree 모델이 비슷

 

■ Hyper-parameter

- Learning Rate

  • > Learning Rate를 너무 적게 설정하면 수렴 속도가 너무 느려짐
  • > 너무 크게 설정하면 수렴이 아닌 발산을 할 수 있음

- Tree Depth & Leaves

  • > 트리의 깊이(Depth)와 잎사귀(Number of Leaves)를 설정
  • > 제한없이 사용 시 overfitting 위험

- Column & Row Sampling Ratio

  • > 전체 Feature 중 랜덤 하게 일부만 사용
  • > Overfitting 발생 확률↓, 다양한 Feature의 조합으로 여러 가지 트리를 만드는 효과

- 실제로는 모델 별로 사용하는 변수명이 다를 수 있음

  • > LightGBM과 CatBoost는 pandas의 category 데이터 타입 가능
  • > XGBoost는 오직 numeric 데이터 타입만 가능 → 전처리 필요

 

#5-1 피처엔지니어링

 

■ 학습 목표

- 집계를 활용한 피처 엔지니어링에 대해 배우고, 어떤 피처가 좋은 피처인지 구분 능력 키움

 

■ 피처 엔지니어링

- 피처 엔지니어링(Featuer Engineering)?

  • 1) 원본 데이터로부터 도메인 지식 바탕으로 문제 해결하는 데 도움이 되는 피처 생성, 변환
  • 2) 이를 머신러닝 모델에 적합한 형식으로 변환하는 작업

- 피처 엔지니어링의 중요도

  • > 피처 셀프추출이 가능한 딥러닝과 달리 일반 머신러닝은 필요함
  • > 사람이 직접 데이터를 이해해서 피처를 만드는 피처 엔지니어링 과정
  • > 만약 양질의 데이터 주어질 경우, 머신러닝 성능의 80~90% 차지
  • * 나머지 10~20%: 하이퍼 파라미터 등 부수적인 것

- 레이블의 분포 차이가 명확할수록 좋은 피처

  • > 모델이 레이블 예측할 때 분류하기가 더 쉽기 때문
  • > label=0의 의미: 그렇지 않은 것 / label=1의 의미: 그러한 것
  • * skew값이 크다 = 데이터 분포가 좌우 대칭이 아니라 한쪽으로 치우쳐짐
  • ** Postive skew = 왼쪽 쏠림 / Nagative skew = 오른쪽 쏠림

 

■ Cross Validation Out Of Fold

- 케글에서 주로 사용하는 머신러닝기법 

- Cross Validation

  • > 데이터를 여러 개의 폴드로 나눠서 검증 성능을 측정하는 방법 (4강 설명)

- Out Of Fold

  • > Fold마다 학습한 모델로 테스트 데이터 예측, 이를 평균 앙상블 하여 최종 예측값으로 사용

 

■ LightGBM Early Stopping

- Early Stopping

  • > 반복 학습 머신러닝 모델에서 검증 성능이 가장 최적인 판단 지점에서 학습 조기 종료
  • > (예1: 특정 스텝에서 전체 데이터 학습 시 이전 스텝대비 성능 저하가 반복될 시 조기 종료)
  • > (예2: Boostiong 트리 모델 트리 개수, 딥러닝의 Epoch 수)

- LightGBM Early Stopping

  • > 정형 데이터에 LightGBM 주로 사용
  • 1) 몇 개의 트리 만들지 n_estimators 하이퍼파라미터 설정,
  • 2) 개수만큼 트리 생성
  • 3) ❗그 이상에서 더 좋은 모델 존재 가능성 있음

> LightGBM Early Stopping

  • 1) n_estimators 값 충분히 크게 설정
  • 2) early_stopping_rounds를 적절한 값으로 설정
  • 3) early_stopping_rounds값 이상 연속으로 성능 부진 시 트리 생성 X
  • 4) 가장 validation 성능이 좋은 트리 개수를 최종 트리 개수로 사용

 

#5-2 다양한 피처엔지니어링&중요도&선택

 

■ 누적합 피처엔지니어링

- 시간 또는 순서에 따라 증가하는 데이터의 !총합계를 표시! 하는 데 사용하는 함수

- Pandas Group By 누적합 함수를 적용해서 새로운 Feature 생성

 

■ Time Series 피처엔지니어링

- 시계열 데이터

 

■ 피처 중요도

- 타겟 변수 예측 유용도에 따라 피처에 점수 할당하여 중요도 측정

 

■ Model-specific vs Model-agnostic

- Model-specific:  머신러닝 모델 자체에서 피처 중요도 계산이 가능

  • > LightGBM 피처 중요도 함수
    • 1) Training된 LightGBM 모델 클래스에 
    • 2) feature_importance(importance_type) 함수로 
    • 3) 피처 중요도 계산 기능 제공
      • # 인자: split, gain
      • # 피처가 트리 생성에 몇 번 사용됐는지 계산하여 피처 중요도 측정
  • > XGBoost 피처 중요도 함수
    • # get_score(importance_type) 함수로 중요도 계산 기능 제공
      • @ 인자: weight, gain, cover, total_gain, total_cover
      • @ 측정 방식 LightGBM과 비슷
  • > CatBoost 피처 중요도 함수
    • # get_feature_importance(type) 함수로 중요도 계산 기능 제공
      • @ 인자: FeatureImportance, ShapValues, Interaction, PredictionDiff

- Model-agnostic: 모델에 종속적이지 않고 모델을 학습한 후에 피처 중요도를 계산

  • > Permutation 피처 중요도 (많이 유용함)
    • # 기존과 섞은 데이터의 에러 차이를 측정해 피처 중요도 파악
    • # 랜덤 샘플링으로 일부러 오류 내고 오류가 크면 피처 중요도↑
  • > Permutation 방법
    • 1) 오리지널 모델로 loss func.으로 에러 계산
    • 2) 피처 하나씩 loop 돌며 matrix X에 대해 피처 하나씩 데이터 셔플링
    • 3) 셔플링 후 에러를 구하여 기존 에러와 차이를 구함
    • 4) 순차적으로 loop 돌며 모든 피처에 대해 셔플링 하여 에러 구함
    • 5) 에러의 차가 큰 순으로 sorting (=위에서부터 피처 중요)

 

■ 피처 선택

- 타켓 변수 예측에 유용하지 않은 노이즈 피처를 제거하고 유용한 피처를 선택

- 모델 복잡도를 낮추어 overfitting 방지 및 모델 속도 향상 가능

- 피처 선택 방법

  • > Filter Method
    • # 통계적인 측정 사용하여 피처 간의 상관관계 파악하는 방법
    • # 상관관계가 반드시 모델에 적합하진 않음
    • # 간단하고 계산 속도가 빠르며 유사 피처, 작은 피처 분산값을 제거 가능
  • > Wrapper Method
    • # 예측 모델을 사용하여 피처의 서브 셋을 계속 테스트하여 유용 X 피처 제거
  • > Embedded Method
    • # Filter, Wrapper 장점을 합친 방법. 학습 알고리즘 자체에 피처 선택 내포

 

#6 하이퍼 파라미터 튜닝과 앙상블

 

■ 하이퍼 파라미터

- 학습과정에서 컨트롤하는 value이며, 모델이 학습과정에서 배워나가는 parameter

- 하이퍼 파라미터 튜닝: 최적화

  • 1) Manual Search:
    • > 자동화 툴 사용 않고 메뉴얼하게 실험할 Hyper parameter Set을 정해 하나씩 바꿔가는 테스트 방식
  • 2) Grid Search
    • > 테스트할 수 있는 모든 경우를 다 테스트하는 방식 (무식한 방법)
  • 3) Random Search
    • > 랜덤하게 하이퍼 파라미터값을 가져와서 테스트하는 방식
    • > Grid Search보다 일반적으로 성능이 더 좋음
  • 4) Bayesian optimization
    • > 이전에 나온 결과를 기반으로 다음 하이퍼 파라미터의 값을 설정
    • > 랜덤하게 탐색하다가 성능이 잘 나온 영역이 존재한다면 그 영역을 집중적으로 탐색

 

■ Boosting Tree 하이퍼 파라미터

- 2 Boosting Tree 하이퍼 파라미터

  • > Learning Rate: 모델의 학습률
  • > Tree depth: 트리 모델의 최대 깊이
  • > Number of leaves: 한 트리의 최대 리브 수
  • > Early stop: 검증 성능이 향상하지 않으면 조기 종료
  • > Row sampling ratio: 데이터 일부를 무작위로 선택하는 비율
  • > Column sampling ratio: 피처의 하위 집합을 무작위로 선택하는 비율
  • > L1 / L2 norm penalty: L1/L2 정규화

 

■ Optuna

- 오픈소스 하이퍼 파라미터 튜닝 프레임워크

  • 1) Eager search spaces
  • 2) State-of-th-art algorithms
  • 3) Easy parallelization

- Storage API 사용하여 Hyper Parameter 검색 결과 저장 가능

  • > RDB, Redis 같은 Persistent 저장소에 하이퍼 파라미터 탐색 결과 저장 후 탐색, 다음 다시 이어서 탐색 가능

- Visualization 가능

  • > 중요도, 히스토리, Slice, Contour, Parallel Coordinate

 

■ 앙상블 러닝 (Ensemble learning)

- 성능 좋은 단일 알고리즘보다 적당한 성능의 알고리즘을 여러 개 조합해서 사용하는 기법

  • > 어느 특정한 알고리즘이 모든 데이터 세트에 대해서 우세하지는 않다는 것
  • > 여러 개의 약 분류기(Weak Classifier)를 결합하여 강 분류기(String Classifier)를 만드는 것
  • > 즉, 집단지성

- 앙상블 러닝 장점

  • 1) 성능을 분산시키기 때문에 Overfitting 감소 효과
  • 2) 개별 모델 성능이 잘 안나올 때 앙상블 학습을 이용하면 성능이 향상될 수 있음

- 앙상블 러닝 기법

  • > Bagging: Boostrap Aggregation (샘플 다양하게 생성)
    • # 각 모델이 데이터를 다르게 가져감으로써 앙상블 효과를 기대해 볼 수 있는 방식
    • # Bagging: Training Set에서 중복을 허용하여 샘플링
      • @ (예: Random Forest Algorithm)
    • # Pasting: Training Set에서 중복을 허용하지 않고 샘플링 (많이 사용 X)
  • > Voting: 투표를 통해 결과 도출
    • # 샘플이 아닌 알고리즘을 선택하는 과정
    • # hard vote: 모델이 예측하는 값을 사용해서 투표를 진행
    • # soft vote: 모델이 예측하는 확률분포를 사용해서 투표를 진행 (더 많이 씀)
      • @ 평균값을 사용해서 확률이 가장 높은 레이블 값을 최종 voting 결과값으로 선정
  • > Boosting: 이전 오차를 보완 하며 가중치 부여
    • # 여러개의 분류기가 순차적으로 학습
    • # 이전 분류기에서 틀렸던 데이터를 바르게 예측하기 위해 가중치 부여하며 계속 학습, 예측 진행
    • # Bagging(Parallel) ↔ Boosting(Sequential)
  • > Stacking: 여러 모델을 기반으로 meta 모델
    • # 여러 모델 각각의 예측 결과를 도출한 뒤 그 예측 결과를 결합해 최종 예측 결과를 냄
    • # 학습 데이터 한해서 우수한 성능 (kaggle 대회에서 마지막에 잘 쓰기도 함)
    • # Cross Validation 활용
      • 1) ovefitting 방지
      • 2) 특정 형태의 sample에서 어떤 모델이 어떤 결과를 가지는지 학습
    • # 단점: 과정, 학습하는 시간↑하기에 Productin 레벨에서 사용 X

 

■ Tree 계열 알고리즘 (앙상블+)

- Decision Tree: Impurity(복잡성)

  • > Decision Tree: Impurity를 기준으로 데이터를 분할하여 예측 모델을 생성
  • > Impurity를 측정하는 지표들
    • # Entropy: 불순도를 측정하는 지표. 정보량의 기댓값 (정보 양: 어떤 사건이 가지는 정보의 양)
    • # Gini Index: 값이 높을수록 데이터가 분산 돼있음을 의미

- Tree 알고리즘 시각화: Graphviz

- Gradient Boosting

  • > 오차를 최소화하기 위해 경사하강법을 적용, Impurity를 줄이는 방향으로 모델 업데이트
  • > 이전 모델의 오차를 보정하며 다음 모델을 학습. 앙상블에 추가함으로써 모델 성능 향상

- XGboost

  • > Regularization term: 트리의 복잡도가 증가할수록 loss에 패널티를 줌으로써 Overfitting 방지
  • > Loss func. 지원하여 task에 따른 유연한 튜닝 가능함
  • > 좋지만 학습시간이 느림, 하이퍼 파라미터가 많아서 튜닝이 어려움

- LightGBM: XGboost 보완

  • > 다른 boosting tree 모델보다 대용량 데이터 쉽게 처리
  • > GOSS: Gradient-based One-Side Sampling
    • # 기울기값이 큰 중요한 샘플 모두 사용, 기울기값이 작은(노이즈, 이상치) 샘플은 일부만 선택
    • # 이렇게 얻은 샘플링을 통해 LightGBM 학습
  • > EFB: EXclusive Feature Bunding
    • # 변수 개수를 줄이기 위해 상호배타적인 변수들을 묶는 기법

- Catboost

  • > 범주형 데이터에서 높은 성능 제공

 

■ TabNet

- Tabular Data(정형 데이터)를 위한 딥러닝 모델(전처리 과정 필요X)

  • > 데이터의 피처를 모델이 스스로 추출
  • >  피처 선택과 모델 학습의 과정이 한 번에 이루어지므로 어떤 피처가 중요한지 설명 가능