#4 머신러닝 개념
■ Underfitting & Overfitting
- Underfitting은 데이터를 잘 설명하지 못하는 상황
- > Underfitting 방지
- 1) 더 오래, 더 많은 데이터로 학습
- 2) Feature를 더 많이 반영
- 3) Variance 높은 모델 사용
- Overfitting은 반대로 데이터를 과도하게 설명하는 상황
- > our dataset != full dataset
- > 실제 나머지 데이터와 본적이 없는 데이터에 대해서도 잘 표현하고 잘 나타낸다는 보장 없음
■ Regularization (Overfitting 방지_정형 데이터에 적용 가능한)
- 랜덤성을 부여하고 평균화 시키는 작업
- Early Stopping
- > Validation Error가 지속적으로 증가하는 지점에서 모델 학습을 중단
- Parameter Norm Penalty
- > L1 과 L2에 대해서 Penalty를 부여
- > https://towardsdatascience.com/l1-and-l2-regularization-methods-ce25e7fc831c
- 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과 비슷
- # get_score(importance_type) 함수로 중요도 계산 기능 제공
- > CatBoost 피처 중요도 함수
- # get_feature_importance(type) 함수로 중요도 계산 기능 제공
- @ 인자: FeatureImportance, ShapValues, Interaction, PredictionDiff
- # get_feature_importance(type) 함수로 중요도 계산 기능 제공
- 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)
- > 데이터의 피처를 모델이 스스로 추출
- > 피처 선택과 모델 학습의 과정이 한 번에 이루어지므로 어떤 피처가 중요한지 설명 가능
'AI 배우기 > 정형데이터' 카테고리의 다른 글
[부스트코스] 쇼핑데이터를 활용한 머신러닝_EDA 및 전처리 (0) | 2023.07.26 |
---|