본문 바로가기
코딩/Machine Learning

7. 분류(Classification)_3

by 세자책봉 2020. 12. 13.
728x90

권철민 저, '파이썬 머신러닝 완벽 가이드', 2019.02.28

내 맘대로 요약 공부 중(문제시 비공개 및 삭제)

최초 작성일 2020.12.13

7.1 LightGBM

- 기존 GBM과 XGBoost의 후속작. 동일 성능 대비 학습 시간이 매우 짧음

- 적은 데이터에 과적 합할 가능성이 있음(10,000건 이하 거의 안된다고 보는 게 맞을 듯?)

- 리프 중심 트리 분할(Leaf Wise) 방식(보통은 균형 트리 분할(Level Wise) 방식을 사용하고 있음)

- 사이킷런 LightGBM(분류 LGBMClassifer, 회귀 LGBMRegressor)

- 사용하기 위해 Visual Studio Build tool 2015 이상 필요

- visualstudio.microsoft.com/ko/downloads/

 

Windows 및 Mac용 Visual Studio 2019 다운로드

Visual Studio Community, Professional, Enterprise를 다운로드하세요. 지금 Visual Studio IDE, Code 또는 Mac을 무료로 사용해 보세요.

visualstudio.microsoft.com

다운로드 후 파일 실행, Visual C++빌드 도구만 선택하여 설치 진행

Command창 관리자 권한으로 실행, conda install -c conda-forge lightgbm

- 주요 파라미터

파라미터 설명
num_iterations
[n_estimators]
반복 수행하는 트리의 개수 지정, 너무 많으면 과적화, Default=100
learning_rate 부스팅 스텝 중 업데이트되는 학습률, 0 ~ 1 사이값, Default=0.1
max_depth 트리 기반 알고리즘 동일, Default=-1(제한없음)
min_data_in_leaf 리프 노드가 되기 위해 필요한 최소 데이터 수, Default=20
num_leaves 하나의 트리가 가질 수 있는 최대 리프 개수, Default=31
boosting 부스팅의 트리를 생성하는 알고리즘 선택, gbdt(일반 그래디언트) OR rf(랜덤 포레스트), Default=gbdt
bagging_fraction 트리가 커져서 과적합 되는 것을 방지하기 위해 데이터 샘플링 비율 지정, Default=1
feature_freation 개별 트리 학습 시 무작위로 선택하는 피처의 비율, 과적합 방지, Default=1
lambda_l2 L2 Regulation, 피처가 많을 경우 검토, 값이 클수록 과적합 감소하는 경향
lambda_l1 L1 Regulation, 피처가 많을수록 검토, 값이 클수록 과적합 감소하는 경향

- Learning Task 파라미터

Learning Task 파라미터 설명
objective 최솟값을 가져야 할 손실함수 정의, XGBoost의 objective 파라미터와 동일

- 주요 파라미터 튜닝 방안

- num_leaves 개수를 중심으로 min_data_in_leaf, max_depth를 조정

- num_leaves의 개수를 높이면 정확도가 증가하지만 과적합 발생 가능성이 높음

- min_data_in_leaf의 개수를 높이면 과적합 발생 가능성은 낮아지고, 정확도 또한 감소

- max_depth의 개수를 높이면 정확도가 증가하지만 과적합 발생 가능성이 높음

- learning_rate를 줄이면서 n_estimators를 크게 하는 방법도 있음

- 데이터의 퀄리티에 따라 파라미터 튜닝은 유연하게 대처해야 함

 

- 파이썬 LightGBM, 사이킷런 LightGBM, 사이킷런 XGBoost 파라미터 비교

유형 파이썬 LightGBM 사이킷런 LightGBM 사이킷런 XGBoost
파라미터명 num_iterations n_estimators n_estimators
learning_rate learning_rate learning_rate
max_depth max_depth max_depth
min_data_in_leaf min_child_samples N/A
baggig_fraction subsample subsample
feature_fraction colsample_bytree colsample_bytree
lambda_l2 reg_lambda reg_lambda
lambda_l1 reg_alpha reg_alpha
early_stopping_round early_stopping_rounds early_stopping_rounds
num_leaves num_leaves N/A
min_sum_hessian_in_leaf min_child_weight min_child_weight

- 파이썬 LightGBM의 lightgbm에서 LGBMClassifier 사용, 위스콘신 유방암 데이터 세트 활용

코드 자체는 크게 다르지 않다
검증

- XGBoost와 동일하게 plot_importance() API로 시각화

Column_21 즉, 22번째 피처가 가장 중요한 인자로 나옴

- 실습 예제는 추후 진행 예정

 

7.2 분류 실습(캐글 산탄데르 고객 만족 예측)

- 370개의 피처가 주어진 데이터 세트에서 고객 만족 여부를 예측

- 클래스 레이블 명: TARGET, =1 불만을 가진 고객, =0 만족한 고객

- kaggle.com/c/santander-customer-satisfaction/data

 

Santander Customer Satisfaction

Which customers are happy customers?

www.kaggle.com

- Kaggle 경연 규칙에 동의 후 Download All

- 데이터 확인

클래스 칼럼을 포함하여 총 371개의 피처 수 확인
NULL 값 확인
TARGET 데이터 비율 확인
데이터 분포 확인 중 발견된 비정상 값
비정상 데이터 및 의미 없는 데이터 수정 후, 피처 데이터와 레이블 데이터 분리
학습 데이터와 테스트 데이터 분리 및 데이터 분포 재확인

- XGBoost 모델 학습, ROC AUC 평가

- n_estimators = 500, early_stopping_rounds=100, eval_metric = 'auc'

 테스트 데이터로 예측 시 ROC AUC 0.8419

- XGBoost 파라미터 튜닝(n_estimators, early_stopping_rounds, max_depth, min_chind_weight, colsample_bytree)

- 교차검증 추가(GridSearchCV)

시간이 오래걸린다는 단점

- colsample_bytree:0.75, max_depth:5, min_child_weight:1, n_estimators=1000, learning_rate=0.02, reg_alpha=0.03,

  early_stopping_rounds=200

교차검증 제외!

- 시각화(xgboost 모듈의 plot_importance() 활용)

var38, var15의 순으로 중요하다

- LightGBM 모델 학습, ROC-AUC 평가

- n_estimators = 500, early_stopping_rounds=100, eval_metric = 'auc'

상당히 빠르다

- LightGBM 파라미터 튜닝(num_leaves, max_depth, min_child_samples, subsample)

- 교차검증 추가

XGBoost 보다는 LightGBM을 사용하는게 성능대비 생산성이 아주 좋음

7.3 분류 실습(캐글 신용카드 사기 검출)

- www.kaggle.com/mlg-ulb/creditcardfraud

 

Credit Card Fraud Detection

Anonymized credit card transactions labeled as fraudulent or genuine

www.kaggle.com

- 데이터 확인

클래스 데이터의 분포량이 매우 불균형 하다

- 오버 샘플링언더 샘플링(데이터 분포량 불균형 해결)

1. 오버 샘플링
  - 적은 데이터를 증식하여 학습을 위한 충분한 데이터를 확보하는 방법
  - SMOTE(Synthetic Minority Over-Sampling Technique): 적은 데이터에 있는 개별 데이터들의 K 최근접 이웃(K Nearest Neighbor)를 찾아 원 데이터와 K개 이웃의 차이를 일정값으로 만들어 원 데이터와 약간 차이가 있는 새로운 데이터를 생성

2. 언더 샘플링
  - 많은 데이터를 적은 데이터로 감소시키는 방법
  - 정상적인 데이터를 너무 많이 감소시키기 때문에 오히려 제대로된 학습을 수행할 수 없음(잘 안쓰임)

- SMOTE 파이썬 패키지 imbalanced-learn 활용

conda install -c conda-forge imbalanced-learn

데이터 확인
NULL 확인
앞서 사용했던 코드를 함수화 하여 사용함

1. 원본 데이터 성능

로지스틱 회귀 모델
LightGBM 모델
Amount 데이터의 대부분은 1000 미만에 집중되어 있음.

2. 데이터 분포도 변환 후 성능

Amount 데이터를 정규 분포화 하여 성능 검증
Amount 데이터를 로그화 하여 성능 검증

3. 이상치 데이터 제거 후 성능

  - 이상치 데이터(Outlier) 선정 방법, IQR(Inter Quantile Range) 방식

  - IQR은 사분위(Quantile)값의 편차를 이용하는 기법

IQR로 범위를 잡을 때 일반적으로 위와 같이 함

  - 어떤 피처의 이상치 데이터를 검출할 것인지 선택부터!

  - 레이블과 가장 상관성이 높은 피처를 위주로 이상치를 검출하는 것이 유리

  - Dataframe의 corr()을 활용하여 피처별 상관도를 구하여 시각화

Class와 가장 큰 음의 상관관계를 갖는 V14, V17(매우빨강)

- IQR을 이용해 이상치를 검출하는 함수 생성(get_outlier()함수는 인자로 DataFrame과 이상치를 검출한 칼럼을 받음)

- Numpy의 percentile()을 이용해 1/4분위수, 3/4분위수를 구함

이상치 데이터의 인덱스를 구함
많다 많아
이상치 데이터를 제거한 후 성능

4. SMOTE 오버 샘플링 적용 후 성능

  - imbalanced_learn 패키지 활용

오류 발생하시는 분들은 반드시 pip install -U imbalanced-learn 해주시기 바랍니다
재현율이 급증하지만 정밀도가 매우 감소..
임계값 0.99 이상에서 재현율이 급격하게 떨어지면서 정밀도가 급증  즉, 민감도가 심함
LightGBM 성능

- 가장 좋은 성능을 보여주는 것은 SMOTE 오버 샘플링 LightGBM

7.4 스태킹 앙상블(Stacking Ensemble)

- 여러 개의 모델에 대한 예측값을 합한 후(스태킹 형태로 쌓은 뒤), 이에 대한 예측을 다시 수행

간단한 도식

- 위스콘신 유방암 데이터 활용

- 초기 모델: KNN, 랜덤 포레스트, 결정트리, 에이다 부스트 / 최종모델: 로지스틱 회귀

모델 생성
개별 모델 학습
개별 모델 예측 데이터셋 생성 및 정확도 측정
개별 모델의 예측값을 칼럼으로, 즉 피처로 만들어서 학습데이터로 재사용, transpose 사용
개별 모델보다 정확도가 상승했으나, 무조건 상승하는 것은 아님!

- 스태킹 기법을 사용한다고 무조건 성능이 좋아지지는 않음

- CV 세트 기반의 스태킹(교차검증 학습 데이터, 교차검증 테스트 데이터로 최종 모델 학습 및 평가)

Step1. 각 모델별로 학습/테스트 데이터를 예측한 결과 값을 기반으로 최종 모델용 학습/테스트 데이터 생성
  - 최종 모델에서 사용될 학습/테스트용 데이터를 교차 검증을 통해서 생성
Step2. 교차검증으로 생성된 학습/테스트용 데이터를 스태킹 형태로 합친 뒤, 스태킹된 학습데이터로 학습하고 스탱킹된 테스트 데이터를 예측하여, 원본 테스트 데이터의 레이블을 기반으로 평가

코드를 보면서 이해하는게 더 빠르다
Step1 실행
Step1을 거친 데이터들을 스태킹 한다
Step2 실행

 

 

 

 

반응형

'코딩 > Machine Learning' 카테고리의 다른 글

9. 회귀(Regression)_2  (0) 2021.01.01
8. 회귀(Regression)_1  (0) 2020.12.27
6. 분류(Classification)_2  (0) 2020.12.13
5. 분류(Classification)_1  (0) 2020.12.10
4. 평가(분류 평가)  (1) 2020.11.29

댓글