2024. 5. 6. 19:36ㆍ책/머신러닝 완벽가이드
2023년 12월 4일 225~229p
분류
- 지도학습 (정답이 주어진 상태)
- 주어진 데이터의 피처와 레이블 값을 머신러닝 알고리즘으로 학습하고 모델을 생성하여 새로운 데이터(피처)가 주어졌을 때 해당 데이터의 레이블 값이 무엇인지 예측하도록 하는 것
알고리즘 종류
- 나이브 베이즈 (Naïve Bayes) : 특성들 사이의 독립을 가정하는 베이즈 정리를 기반으로 한 알고리즘
- 로지스틱 회귀 (Logistic Regression) : 회귀 알고리즘이지만 시그모이드 함수를 사용하여 분류에도 사용이 가능. 독립 변수와 선형 관계성에 기반한다.
- 결정트리 (Decision Tree) : 데이터 균일도에 따른 규칙을 기반으로 하는 알고리즘
- 서포트 벡터 머신 (Support Vector Machine, SVM) : 개별 클래스 간 최대 분류 마진을 효과적으로 잡아줌
- 최소 근접 (Nearest Neighbor) : 근접 거리를 기준으로 하는 알고리즘
- 신경망 (Neural Network)
- 앙상블 (Ensemble) : 개별 알고리즘들의 결합으로 만든 알고리즘
결정 트리(decision tree)
- like 규칙이 있는 20고개 게임(if/else)
- 나무의 가지가 뻗어 나가듯이 규칙을 학습을 통해 자동으로 찾아내 트리 기반의 분류 규칙을 만듬 (분류 규칙마다 가지가 분할됨)
- 분류의 시작점 : 루트 노드(=뿌리) / 규칙 조건에 의해 분할이 일어나는 구간 : 규칙 노드(=나뭇가지) / 분류값이 결정되어 더 이상 분할되지 않는 구간 : 리프 노드(=잎사귀)
- 직관적으로 이해하기 쉬운 알고리즘
- 어떤 기준을 바탕으로 규칙을 만드는가가 알고리즘의 성능을 크게 좌우함
- 데이터 스케일링이나 정규화 같은 전처리가 결과에 미치는 영향이 매우 적음
- 하지만 규칙이 복잡해질수록 과적합이 일어나기 쉽고 예측 성능이 저하된다는 단점 존재(=max_depth가 깊어짐) ⇒ 단점 극복을 위해 트리의 크기를 사전에 제한하는 튜닝 필요
- 가능한 한 적은 결정 노드로 높은 예측 정확도를 가지려면 데이터를 분류할 때 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록 결정 노드의 규칙이 정해져야 함.
- 이를 위해 어떻게 트리를 분할할 것인가가 중요한데 최대한 균일한 데이터 세트를 구성할 수 있도록 분할하는 것이 필요
엔트로피를 이용한 정보 이득 지수, 지니 계수 : 정보의 균일도를 측정하는 대표적 방법
- 정보이득 : 엔트로피 개념 기반
- 엔트로피는 주어진 데이터 집합의 혼잡도 의미
- 서로 다른 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피 낮음
- 정보 이득 지수는 1에서 엔트로피 지수를 뺀 값
- 엔트로피는 주어진 데이터 집합의 혼잡도 의미
- 결정 트리는 이 정보 이득 지수로 분할 기준을 정함. 즉, 정보 이득이 높은 속성을 기준으로 분할
- 지니 계수 : 원래 경제학에서 불평등 지수를 나타낼 때 사용하는 계수
- 0이 가장 평등하고 1로 갈수록 불평등
- 머신러닝 적용 시 지니 계수가 낮을수록 데이터 균일도가 높은 것으로 해석해 지니 계수가 낮은 속성을 기준으로 분할
결정 트리 파라미터
min_samples_split
- 노드를 분할하기 위한 최소한의 샘플 데이터 수. 과적합을 제어하는 데 사용
- 디폴트는 2. 작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성이 증가
min_samples_leaf
- 말단 노드가 되기 위한 최소한의 샘플 데이터 수
- min_samples_split과 유사하지만 비대칭적인 데이터의 경우 특정 클래스의 데이터가 극도로 작은 경우가 있을 수 있으므로 이런 경우에는 작게 설정할 필요가 있음
max_features
- 최적의 분할을 위해 고려할 최대 피쳐 개수. 디폴트는 None이며 데이터셋의 모든 피처를 사용해서 분할을 수행
- int로 지정할 경우 피쳐의 개수, float으로 지정할 경우 전체 피쳐 중 사용할 피쳐의 퍼센트
- ‘sqrt’는 sqrt(전체 피쳐 개수) 만큼 선정. ‘auto’로 해도 동일
- ‘log’는 log2(전체 피쳐 개수) 선정
max_depth
- 트리의 최대 깊이를 규정
- 디폴트는 None이며 모든 데이터가 완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 키우며 분할하거나 노드의 데이터 개수가 min_samples_split 보다 작아질 때까지 계속 깊이를 증가시킴
- 깊이가 깊어지면 min_samples_split 설정대로 최대 분할하여 과적합이 일어날 수 있으므로 제어 필요.
max_leaf_nodes
- 말단 노드의 최대 개수 설정
앙상블
- 여러 개의 분류기(classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법
앙상블의 종류
- 보팅 (Voting)
- 배깅 (Bagging)
- 부스팅 (Boosting)
- 스태킹 (Stacking)
앙상블의 특징
- 단일 모델의 약점을 다수의 결합을 통해 보완
- 뛰어난 성능의 모델끼리 결합하는 것보다 상호보완이 되도록 서로 다른 유형의 모델들을 섞는 것이 오히려 도움이 됨
- 랜덤 포레스트 및 다양한 부스팅 알고리즘은 의사결정 트리를 기반으로 하며, 앙상블을 통해 과적합을 보완하고 직관적인 분류 기준 강화
보팅 & 배깅
보팅과 배깅 둘 다 여러 분류기의 투표를 기반으로 예측 결과를 만들어 내는 앙상블 기법
보팅 (Voting) : 서로 다른 알고리즘의 분류기들을 결합하여 각 분류기들로부터 예측 결과를 받은 후 투표를 통해 최종 예측 값을 결정
배깅 (Bagging) : 같은 유형의 알고리즘을 가진 분류기들을 사용하되 각각 다른 데이터셋을 기반으로 학습한 뒤 예측 결과를 투표하여 결정
하드 보팅 vs. 소프트 보팅
- 하드 보팅 (Hard Voting) : 분류기 사이의 투표 결과에 따라 다수결로 최종 클래스를 결정
- 소프트 보팅 (Soft Voting) : 각 분류기가 예측한 클래스 확률을 모아 평균을 구한 뒤 가장 확률이 높은 클래스를 결정
- 일반적으로 소프트 보팅이 더 많이 사용됨
랜덤 포레스트 (Random Forest)
- 배깅을 사용하는 대표적인 알고리즘. 여러개의 의사결정 트리(나무)를 모아놓은 숲(Forest)
- 앙상블 알고리즘 중 비교적 빠른 수행 속도와 준수한 예측 성능을 보임
- 여러개의 결정 트리 분류기가 개별 학습 데이터셋을 사용하여 모델을 구축한 뒤 최종적으로 소프트 보팅을 통해 예측 결정을 진행
부트스트래핑 : 개별 학습 데이터셋 생성을 위해 전체 데이터에서 일부가 중첩되도록 샘플링을 하여 분리 (Bagging = Bootstrap Aggregating)
랜덤 포레스트 파라미터
트리 기반의 앙상블 알고리즘의 단점은 하이퍼 파라미터가 너무 많고 그로 인해 튜닝을 위한 시간이 많이 소모된다는 점이다. 게다가 튜닝에 사용하는 시간 대비 예측 성능이 크게 향상되는 경우가 많지 않다.
그나마 랜덤 포레스트는 결정 트리에서 사용되는 하이퍼 파라미터와 같은 파라미터가 대부분이라 파라미터가 적은 편에 소함
n_estimators
- 결정 트리의 개수를 지정
- 디폴트 : 10개. 많이 설정 할수록 좋은 성능을 기대할 수 있지만 학습 수행 시간이 오래 걸리며 성능이 무조건 향상되는 것은 아님
max_features
- 결정 트리의 max_features와 동일하지만 RandomForestClassifier의 디폴트는 ‘None’이 아니라 ‘auto’
부스팅
여러개의 약한 학습기(Weak Learner)를 순차적으로 학습-예측 하면서 잘못 예측한 데이터에 가중치를 부여해가며 지속적으로 오류를 개선해나가는 앙상블 기법
- 성능은 좋지만 순차적으로 학습이 진행되기 때문에 시간이 오래걸림
- 대표 부스팅 : 에이다 부스팅, GBM, XGBoost, LightGBM
- 약 한 학습기가 순차적으로 오류 값에 대해 가중치를 부여한 예측 결정 기준을 모두 결합해 예측 수행함
GBM (Gradient Boost Machine)
에이다 부스팅과 유사하나 가중치 업데이트에 경사하강법을 사용
GBM 주요 하이퍼 파라미터
- n_estimators, max_depth, max_features와 같은 트리 기반의 파라미터들이 마찬가지로 사용됨
- loss : 경사 하강법에서 사용할 비용함 수 지정. 기본값은 ‘deviance’
- learning_rate : GBM이 학습을 진행할 때마다 순차적으로 오류 값을 보정해 나가는 데 적용하는 계수.
- 0~1 사이의 값을 지정. 기본값은 0.1
- 작은 값을 적용할 경우 학습이 반복될 때마다 업데이트 되는 값이 작아져 최소 오류 값을 찾아 성능이 높아질 수 있지만 수행 시간이 오래 걸리고 또 너무 작게 설정할 경우 최소 오류 값을 찾기 전에 학습 반복이 완료될 수 있음
- 반대로 너무 큰 값을 적용할 경우 수행 시간은 짧아지지만 최소 오류 값을 찾지 못하고 그냥 지나쳐 버려 예측 성능이 떨어질 수 있음
- 위 특성 때문에 learning_rate는 n_estimator와 조합하여 상호 보완되도록 하는 것이 좋음
- n_estimator : 학습기의 개수. 많을 수록 성능이 어느정도 좋아질 수 있지만 수행시간은 늘어남. 기본값은 100
- subsample : 학습기가 학습에 사용하는 데이터의 샘플링 비율. 기본값은 1로 전체 학습 데이터를 기반으로 주로 과적합이 염려될 때 subsample을 1보다 작은 값으로 설정
XGBoost(extreme gradient boosting)
import xgboost as xgb
from xgboost import plot_importance
import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score
from sklearn.metrics import f1_score, confusion_matrix, precision_recall_curve, roc_curve
from sklearn.preprocessing import StandardScaler, Binarizer
from sklearn.linear_model import LogisticRegression
import warnings
import matplotlib.pyplot as plt
%matplotlib inline
warnings.filterwarnings('ignore')
dataset=load_breast_cancer() #기존 내장된 데이터셋 불러오기
features=dataset.data #data값
labels=dataset.target #0과 1로 이뤄진 값들
cancer_df=pd.DataFrame(data=features,columns=dataset.feature_names) #열에는 데이터셋 변수
cancer_df['target']=labels #파생변수 생성 0과 1값 넣기
cancer_df.head(3)
print(dataset.target_names)
cancer_df['target'].value_counts() #타겟변수의 빈도수를 확인
#target은 라벨형태이므로 뒤에서 2번째 까지만 인덱싱
X_features=cancer_df.iloc[:,:-1]
y_label=cancer_df.iloc[:,-1]
#학습용 테스트용 데이터 분할하기
X_train,X_test,y_train,y_test=train_test_split(X_features,y_label,test_size=0.2,
random_state=156)
#학습용 데이터를 다시 90%는 학습용 10%는 검증용 데이터로 분리
X_tr, X_val,y_tr, y_val=train_test_split(X_train,y_train,test_size=0.1,random_state=156)
print(X_train.shape,X_test.shape)
print(X_tr.shape,X_val.shape)
#데이터프레임 기반의 학습 데이터 세트와 테스트 데이터 세트를 DMatrix로 변환함
dtr=xgb.DMatrix(data=X_tr, label=y_tr)
dval=xgb.DMatrix(data=X_val,label=y_val)
dtest=xgb.DMatrix(data=X_test,label=y_test)
#학습 수행 전에 먼저 하이퍼 파라미터를 설정한다. (주로 딕셔너리 형태로 입력함)
params={'max_depth':3,
'eta':0.05,
'objectove':'binary:logistic',
'eval_metric':'logloss'}
num_rounds=400 #부스팅 반복 횟수
eval_list=[(dtr,'train'),(dval,'eval')]
#하이퍼 파라미터와 ealry stopping 파라미터를 train()함수의 파라미터로 전달
xgb_model=xgb.train(params=params, dtrain=dtr,num_boost_round=num_rounds,
early_stopping_rounds=50,evals=eval_list)
# 사이킷런의 Predict는 예측 결과 클래스 값 (0,1)을 반환하는 데 반해 xgboost의 predict는 예측 결과를 추정
#할 수 있는 확률 값을 반환함
pred_probs=xgb_model.predict(dtest)
print('predict() 수행 결괏값을 10개만 표시, 예측 확률 값으로 표시됨')
print(np.round(pred_probs[:10],3))
#예측 확률이 0.5이상은 1 or 0으로 예측값 결정하여 list객체인 pred에 저장
preds=[1 if x> 0.5 else 0 for x in pred_probs]
preds[:10]
# 저번에 작성한 것에 ROC AUC를 추가함
def get_clf_eval(y_test, pred=None, pred_proba=None):
confusion = confusion_matrix(y_test, pred)
accuracy = accuracy_score(y_test, pred)
precision = precision_score(y_test, pred)
recall = recall_score(y_test, pred)
f1 = f1_score(y_test, pred)
roc_auc = roc_auc_score(y_test, pred)
print('오차행렬')
print(confusion)
print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f}, F1: {3:.4f}, AUC:{4:.4f}'
.format(accuracy, precision, recall, f1, roc_auc))
get_clf_eval(y_test,preds,pred_probs)
fig,ax=plt.subplots(figsize=(10,12))
plot_importance(xgb_model,ax=ax)
트리 기반의 앙상블 학습에서 가장 각광받고 있는 기법
- GBM의 단점인 느린 수행시간, 과적합 규제 부재 등의 문제를 해결
xgboost의 대표적인 장점
- 분류와 회귀에서의 뛰어난 예측 성능
- GBM대비 빠른 수행 시간
- 과적합 규제
- tree pruning
- 자체 내장된 교차검증-교차검증을 통해 평가데이터셋의 평가값이 최적화되면 반복을 중간에 멈출 수 있는 early stopping 기능 존재
- 결손값 자체 처리
파이썬 래퍼 xgboost 모듈 & 사이킷런 래퍼 xgboost 모듈
파이썬 래퍼 xgboost 모듈 : 초기의 독자적인 xgboost 프레임워크 기반의 xgboost 사이킷런 래퍼 xgboost 모듈 : 사이킷런과 연동되는 모듈
파이썬 래퍼 xgboost 하이퍼 파라미터
- GBM과 유사한 하이퍼 파라미터를 가지고 있으며, 여기에 조기 중단, 과적합을 규제하기 위한 하이퍼 파라미터 등이 추가됨
일반 파라미터 : 스레드의 개수나 silent 모드 등의 선택을 위한 파라미터 부스터 파라미터 : 트리 최적화, 부스팅, regularization 등과 관련 파라미터 등을 지칭 학습 태스크 파라미터 : 학습 수행 시의 객체 함수, 평가를 위한 지표 등을 설정
2023년 12월 5일 229~231p
파이썬래퍼를 사용할 경우 train, test data를 위해 별도의 DMatrix를 생성해야 함
*DMatrix : 넘파이 입력 파라미터를 받아서 만들어지는 XGBoost만의 데이터셋
주요 부스터 파라미터 (파이썬 /사이킷런래퍼 비교)
파이썬래퍼 사이킷런래퍼 설명
eta | learning_rate | 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값 |
num_boost_around | n_estimators | 사용할 약한 학습자의 개수(GBM-estimators와 같은 파라미터) |
min_child_weight | min_child_weight | 과적합 조절 용도 |
gamma | min_split_loss | 값이 클수록 과적합 감소 |
max_depth | max_depth | 트리 깊이 |
sub_sample | subsample | 데이터 샘플링 비율 지정 |
colsample_bytree | colsample_bytree | 트리 생성에 필요한 피처(컬럼)를 임의로 샘플링하는데 사용 |
lambda | reg_lambda | L2규제(릿지) 가중치 - 클수록 과적합 감소 |
alpha | reg_alpah | L1규제(라쏘) 가중치 - 클수록 과적합 감소 |
scale_pos_weight | scale_pos_weight | 불균형 데이터셋의 균형 유지를 위해 사용 |
학습 태스크 파라미터
objective : 최솟값을 가져야 할 손실 함수 정의
binary:logistict : 이진분류에 적용
multi:softmax : 다중분류에 적용
multi:softprob : multi:softmax와 유사하나 개별 레이블 클래스의 해당되는 예측 확률 반환
eval_metric
- rmse (root mse)
- mae (mean absolute error)
- logloss (negative log-likelihood)
- error (binary classfication error rate - 0.5 threshold)
- merror (multiclass classfication error rate)
- mlogloss (multiclass logloss)
- auc (area under ther curve)
과적합 문제 해결하는 방법
- eta 낮추기 (반대로 num_boost_round/n_estimators는 높여주기)
- max_depth 낮추기
- min_child_weight 높이기
- gamma 높이기
- subs_ample, colsample_bytree 낮추기 (트리가 너무 복잡해지는 것을 막아 과적합 문제 해결)
★early stopping(조기 중단) 기능
- GBM의 경우 n_estimators에 지정된 횟수만큼 학습을 끝까지 수행하지만, XGB의 경우 오류가 더 이상 개선되지 않으면 수행을 중지함
ex)
n_estimators를 200으로 설정하고, 조기 중단 파라미터 값을 50으로 설정하면, 1부터 200회까지 부스팅을 반복하다가 50회를 반복하는 동안 학습오류가 감소하지 않으면 더 이상 부스팅을 진행하지 않고 종료함
(가령 100회에서 학습오류 값이 0.8인데 101~150회 반복하는 동안 예측 오류가 0.8보다 작은 값이 하나도 없으면 부스팅을 종료)
244~246p 2023년 12월 9일
LightGBM
LightGBM은 XGBoost와 함께 부스팅 계열 알고리즘에서 가장 각광 받고 있음
XGBoost는 GBM 보다는 빠르지만 여전히 학습 시간이 오래 걸린다는 단점이 있음
LightGBM은 이러한 학습 시간을 개선한 알고리즘이고 메모리 사용량도 적음
LightGBM 장점
- 더 빠른 학습과 예측 수행 시간
- 메모리 사용량 적음
- XGBoost와 예측 성능에서 큰 차이가 없음
- 카테고리형 피처의 자동 변환과 최적 분할(원-핫 인코딩을 사용하지 않고도 카테고리형 피처를 최적으로 변환)
LightGBM 단점
- 적은 데이터셋에 적용할 경우 과적합 발생 쉬움(공식 문서에 따르면 약 1만건 이하의 데이터셋)
일반적인 GBM 계열의 트리 분할 방법은 트리의 깊이를 효과적으로 줄이기 위해 ‘균형 트리 분할 방식(level wise)’을 사용 (오버피팅에 더 강한 구조이기 때문)
- 반대로 이러한 방식은 균형을 맞추기 위한 시간이 필요하다는 상대적인 단점이 존재
LightGBM은 ‘균형 트리 분할 방식’이 아닌 ‘리프 중심 트리 분할 방식’(leaf wise)을 사용
- 최대 손실 값을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성되는 것이 특징
- 결국 학습을 반복할수록 균형 트리 분할 방식보다 예측 오류 손실을 최소화할 수 있다는 것이 LightGBM의 구현 사상
~250p 2023년 12월 9일
주요파라미터
- num_iterations [default=100]
- 반복 수행하려는 트리의 개수를 지정
- learning_rate [default=0.1]
- 0에서 1사이의 값을 지정하며 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값
- max_depth [default=-1]
- 트리 기반 알고리즘의 max_depth와 같음
- min_data_in_leaf [default=20]
- 결정 트리의 min_samples_leaf와 같은 파라미터
- num_leaves [default=31]:
- 하나의 트리가 가질 수 있는 최대 리프 개수
- boosting [default=gbdt]
- 부스팅의 트리를 생성하는 알고리즘을 기술
- • gbdt : 일반적인 그래디언트 부스팅 결정 트리
- • rf : 랜덤 포레스트
- 부스팅의 트리를 생성하는 알고리즘을 기술
- bagging_fraction [default=1.0]
- 트리가 커져서 과적합되는 것을 제어하기 위해서 데이터를 샘플링하는 비율을 지정
- feature_fraction [default=1.0]
- 개별 트리를 학습할 때마다 무작위로 선택하는 feature의 비율
- lambda_l2 [default=0.0]
- L2 regulation 제어를 위한 값
- lambda l1 [default=0.0]
- L1 regulation 제어를 위한 값
Learning Task 파라미터
- objective
- 최솟값을 가져야 할 손실함수를 정의
하이퍼 파라미터 튜닝 방안
num_leaves의 개수를 중심으로 min_child_samples(min_data_in_leaf), max_depth를 함께 조정하면서 모델의 복잡도를 줄이는 것
- num_leaves는 개별 트리가 가질 수 있는 최대 리프의 개수이고 LightGBM 모델의 복잡도를 제어하는 주요 파라미터
- min_data_in_leaf는 과적합을 개선하기 위한 중요한 파라미터
- max_depth는 명시적으로 깊이의 크기를 제한
learning_rate를 작게 하면서 n_estimators를 크게 하는 것은 부스팅 계열 튜닝에서 가장 기본적인 튜닝 방안이므로 이를 적용하는 것도 좋지만 n_estimators를 너무 크게 하는 것은 과적합으로 오히려 성능이 저하될 수 있음
파이썬 래퍼 LightGBM과 사이킷런 래퍼 XGBoost, LightGBM 하이퍼 파라미터 비교
파이썬 래퍼 LightGBM 사이킷런 래퍼 LightGBM 사이킷런 래퍼 XGBoost
num_iterations | n_estimators | n_estimators |
learning_rate | leaning_rate | learning_rate |
max_depth | max_depth | max_depth |
min_data_in_leaf | min_child_samples | N/A |
bagging_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 |
- 빨간색은 동일한 형태
2023년 12월 15일 ~351
베이지안 최적화 기반 하이퍼 파라미터 튜닝
지금까지는 하이퍼 파라미터 튜닝을 위해서 Grid search 방식을 적용했음
Grid Search 방식의 한 가지 주요한 단점은 튜닝해야 할 하이퍼 파라미터 개수가 많을 경우 최적화 수행 시간이 오래 걸린다는 것임
물론 Xgboost나 LightGBM은 뛰어난 알고리즘이어서 정교화된 하이퍼 파라미터 튜닝 없어도 높은 모델 성능을 보장하지만, 모델의 성능을 향상시켜야 하는 경우 캐글이나 경진대회에서 grid search 기반의 최적화는 아쉬운 상황이 될 수 있음
베이지안 최적화 개요
- 목적 함수의 식을 제대로 알 수 없는 함수에서, 최대 또는 최소의 함수 반환 값을 만드는 최적 입력값을 가능한 적은 시도를 통해 빠르고 효과적으로 찾아주는 방식
- 베이지안 확률에 기반을 두고 있는 최적화 기법
- 베이지안 확률이 새로운 데이터를 기반으로 사후 확률을 개선해 나가듯이, 베이지안 최적화는 새로운 데이터를 입력받았을 때, 최적 함수를 예측하는 사후 모델을 개선해 나가며 최적 함수 모델을 만들어냄
- 베이지안 최적화의 주요 요소
- 대체 모델
- 획득 함수
대체 모델 : 획득 함수로부터 최적 함수를 예측할 수 있는 입력값을 추천받고 이를 기반으로 최적 함수 모델 개선
획득 함수 : 개선된 대체 모델을 기반으로 최적 입력값을 계산하는 프로세스. 이때, 입력값은 하이퍼 파라미터에 해당함.
즉, 대체 모델은 획득 함수로부터 하이퍼 파라미터를 추천받아 모델 개선 수행, 획득 함수는 개선된 모델을 바탕으로 더 정확한 하이퍼 파라미터를 계산
베이지안 최적화 프로세스
- 랜덤하게 하이퍼 파라미터를 샘플링하고 성능 결과 관측
- 관측된 값을 기반으로 대체 모델은 최적 함수 측정
- 추정된 최적 함수를 기반으로 획득 함수는 다음으로 관측할 하이퍼 파라미터 값을 계산 - 획득 함수는 이전의 최적 관측값보다 더 큰 최댓값을 가질 가능성이 높은 지점을 찾아서 다음에 관측할 하이퍼 파라미터를 대체 모델에 전달함
- 획득 함수로부터 전달된 하이퍼 파라미터를 수행하여 관측된 값을 기반으로 대체 모델은 갱신되어 다시 최적 함수를 예측 추정
3~4번 단계를 특정 횟수만큼 반복하게 되면 대체 모델의 불확실성이 개선되고 점차 정확한 최적 함수 추정이 가능해짐
대체 모델은 최적 함수를 추정 시 일반적으로 가우시안 프로세스를 적용
하지만 hyperopt는 가우시안 프로세스가 아닌 트리 파르젠 estimator를 사용
HyperOpt 사용하기
프로세스
- 검색 공간 설정
- 목적 함수 설정
- fmin() 함수를 통해 베이지안 최적화 기법에 기반한 최적의 입력 값 찾기
hyperopt의 hp모듈 : 입력값의 검색 공간을 다양하게 설정할 수 있도록 여러 가지 함수를 제공함
- hp.quniform(label, low, high, q) q는 간격을 의미
- hp.uniform(label, low, high) 정규 분포 형태의 검색 공간 설정
- hp.randint(label, upper)
- hp.longuniform(label, low, high)
- hp.choice(label, options)
목적 함수 설정 : 목적 함수는 반드시 변수값과 검색 공간을 가지는 딕셔너리를 인자로 받고, 특정 값을 반환하는 구조로 반들어야함
입력값의 검색 공간과 목적 함수를 설정 했으면 목적 함수의 반환값이 최소가 될 수 있는 최적의 입력값을 베이지안 최적화 기법에 기반하여 찾아 줘야 함
이런 기능을 수행하기 위함 fmin 함수
<fmin 함수 주요 인자>
space
algo : 베이지안 최적화 적용 알고리즘
max_evals : 최적 입력값을 찾기 위한 입력값 시도 횟수
trials : 최적 입력값을 찾기 위해 시도한 입력값 및 해당 입력값의 목적 함수 반환값 결과를 저장하는 데 사용
rstate : fmin()을 수행할 때마다 동일한 결괏값을 가질 수 있도록 설정한는 랜덤 시드 값
주의사항
- HyperOPt는 입력 값과 반환 값이 모두 실수형이기 때문에 정수형 하이퍼 파라미터 입력 시 정수형으로 형변환 필요
- HyperOpt는 목적 함수의 최솟값을 반환할 수 있도록 최적화하는 것이기 때문에 성능 값이 클수록 좋은 성능 지표일 경우 -1을 곱해줘야 함 ( 뒤에서 배울 회귀의 MAE, RMSE와 같은 성능 지표는 작을수록 좋기 때문에 반환 시 -1을 곱할 필요 없음
캐글 신용카드 사기 검출
언더 샘플링과 오버 샘프링의 이해
레이블이 불균형한 분포를 가진 데이터셋을 학습시킬 때 예측 성능의 문제가 발생할 수 있는데, 이는 레이블을 가지는 데이터 건수가 정상 레이블을 가진 데이터 건수에 비해 너무 적기 때문에 발생함
따라서 지도학습에서 극도로 불균형한 레이블 값 분포로 인한 문제점을 해결하기 위해 적절한 학습 데이터를 확보하는 방안이 필요한데, 대표적으로 오버 샘플링과 언더 샘플링 방법이 있으며, 오버 샘플링이 예측 성능상 더 유리한 경우가 많음
- 언더 샘플링은 많은 데이터셋을 적은 데이터셋 수준으로 감소시키는 방식
- 오버 샘플링은 이상 데이터와 같이 적은 데이터셋을 증식하여 학습을 위한 충분한 데이터셋을 확보하는 방법임
- 동일한 데이터를 단순히 증식하는 방법은 과적합이 되기 때문에 의미가 없으므로 원본 데이터의 feature 값들을 아주 약간만 변경하여 증식함
- 대표적인 방법으로 SMOTE가 있음
- synthetic minority over-sampling technique(SMOTE)방식은 적은 데이터셋에 있는 개별 데이터들의 K 최근접 이웃을 찾아서 이 데이터와 K개 이웃들의 처리를 일정 값으로 만들어서 기존 데이터와 약간 차이가 나는 새로운 데이터를 생성하는 방식
스태킹 앙상블
- 스태킹은 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출한다는 점에서 배깅 및 부스팅과 공통점을 가짐
- 하지만 가장 큰 차이점은 개별 알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행한다는 점임. 즉, 개별 알고리즘의 예측 결과 데이터셋을 최종적인 메타 데이터셋으로 만들어 별도 ML 알고리즘으로 최종 학습을 수행하고 테스트 데이터를 기반으로 다시 최종 예측을 수행하는 방식
- 개별 모델의 예측된 데이터셋을 기반으로 학습하고 예측하는 방식을 메타 모델이라고 함
- 스태킹에는 개별적인 기반 모델과 최종 메타 모델이 필요하며 핵심은 여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합해 최종 메타 모델의 학습용 feature 데이터셋과 테스트 feature 데이터셋을 만드는 것
<스태킹 앙상블 프로세스>
하나의 데이터셋 → 학습 → n개의 ml 알고리즘 모델이 예측 수행 → 하나의 데이터셋에서 n개의 레이블 결괏값 도출 → n개의 결괏값을 다시 함침 → 합친 데이터 세트에 모델을 적용 후 최종 예측 실행