티스토리 뷰

반응형

앙상블 학습

제품 구매할 때 후기를 하나만 보지 않고, 다양한 후기를 보며 구매 의사를 정한다.

 

문제를 풀 때도 다양한 모델이 내린 예측 결과를 결합하는 기법을 아상블 핟습이라고 한다.

앙상블 학습을 활용하면 대체로 예측 성능이 좋아진다.

캐글러들은 앙상블 기법을 많이 사용한다.

 

보팅, 배깅, 부스팅 등

 

보팅 

서로 다른 모델로 예측한 결과가 있다면, 개별 결과를 종합해 최종 결과를 결정하는 방식

 

하드 보팅 : 다수결 투표로 최종 예측값 결정 (모델들의 민주적인 투표)

 

소프트 보팅 : 모델 개별 예측 확률들의 평균

 

일반적으로 소프트 보팅이 하드 보팅보다 서능이 좋아서, 대체로 소트프 보팅 사용

 

 

배깅

 

개별 모델로 예측한 결과를 결합해 최종 예측을 정한다.

 

1. 전체 훈련 데이터셋에서 무작위 샘플링한 데이터로 개별 모델 훈련(나눈다)

2. 훈련된 개별 모델로 결과를 예측

3. 개별 모델의 수만큼 1~2번 작업을 반복

4. 각 모델이 예측한 값들을 보팅하여 최종 예측값을 구함

 

보팅하고 다른 점은 전체 데이터를 나눈다는 것.

 

부스팅

가중치를 활용해 분류 성능이 약한 모델을 강하게 만드는 기법

 

배깅은 각 모델이 독립적인 결과 예측

그러나 부스팅은 모델간 협력이 이루어짐.

이전 모델이 잘못 예측한 데이터에 가중치를 부여한다.

그만큼 더 중요하다고 판단해 더 잘 분류하려고 한다.

 

부스팅을 활용한 대표적인 모델로는 XGBoost와 LightGBM등이 있다.

 

랜덤 포레스트

랜덤 포레스트를 이해하려면 결정 트리와 앙상블 학습을 알아야 한다.

랜덤 포테스트는 기본적으로 배깅 방식이긴 하나, 설명 변수도 무작위로 선택한다는 점이 틀리다.

배깅은 전체 데이터를 나누었다면, 랜덤 포레스트는 전체에서 부분을 뽑아 훈련시키는 것.

 

그래서 각 모델이 상관관계가 없는 트리가 된다.

그 트리들의 확률의 평균을 내서 구한다.

 

랜덤 포레스트 구현

분류 모델은 RandomForestClassifier, 회귀 모델은 RandomForestRegressor입니다.

 

  • n_estimators : 랜덤 포레스트를 구성할 결정 트리 개수
    • 기본값 = 100
  • criterion : 분할 시 사용할 불순도 측정 지표
    • 세부 내용은 DecisionTreeClassifier와 동일
  • max_depth : 트리의 최대 깊이
    • 세부 내용은 DecisionTreeClassifier와 동일
  • min_samples_split : 노드 분할을 위한 최소 데이터 개수
    • 세부 내용은 DecisionTreeClassifier와 동일
  • min_samples_leaf : 말단 노드가 되기 위한 최소 데이터 개수
    • 세부 내용은 DecisionTreeClassifier와 동일
  • max_features : 분할에 사용할 피처 개수
    • 세부 내용은 DecisionTreeClassifier와 동일
    • 기본값 = ‘auto’
https://www.kaggle.com/werooring/ch5-randomforest

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer

# 유방암 데이터셋 불러오기
cancer_data = load_breast_cancer()
# 훈련, 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(cancer_data['data'], 
                                                    cancer_data['target'],
                                                    stratify=cancer_data['target'], 
                                                    test_size=0.4, 
                                                    random_state=42)

randomforest = RandomForestClassifier(random_state=42) # 랜덤 포레스트 정의
randomforest.fit(X_train, y_train) # 모델 훈련

accuracy = randomforest.score(X_test, y_test) # 정확도 측정

# 테스트 데이터를 활용하여 랜덤 포레스트 모델 정확도 출력
print(f'랜덤 포레스트 정확도: {accuracy:.3f}')

랜덤 포레스트 정확도: 0.939

 

 

XGBoost

XGBoost는 성능이 우수한 트리 기반 부스팅 알고리즘

많은 캐글 우승자가 XGBoost를 사용할 정도로 성능이 좋은 모델.

 

XGBoost의 주요 모듈은 C와 C++로 작성되었지만, 파이썬으로도 사용 가능.

파이썬 래퍼 XGBoost

 

사이킷런과 호환되는 XGBoost = 사이킷런 래퍼 XGBoost

fit(), predict() 등의 메서드 사용가능

 

둘 중 무엇을 사용하든 크게 상관 없다.

다만 파이썬 래퍼를 사용하려면 별도 데이터셋을 생성해야 한다. 모델 훈련 및 예측 부분이 더 명시적이게 된다.

 

파이썬 래퍼 XGBoost를 사용하려면 DMatrix 객체를 활용해 XGBoost 전용 데이터셋을 만들어야 한다.

 

XGBoost.DMatrix() 파라미터

 

  • data : xgboost.DMatrix용 데이터셋
    • 넘파이 배열, 판다스 DataFrame, scipy.sparse, os.PathLike, 문자열 타입을 전달할 수 있음(os.PathLike나 문자열이면 데이터 파일 경로를 의미)
  • label : 타깃값
    • 배열 타입을 전달할 수 있음

XGBoost 모델은 하이퍼 파라미터가 많다.

딕셔너리 형태로 train() 메서드의 params 파라미터에 전달하면 된다.

 

  • booster : 부스팅 알고리즘
    • 트리 기반 모델일 때는 ‘gbtree’, ‘dart’를 선택하고, 선형 모델일 때는 ‘gblinear’를 선택 (‘gblinear’는 성능이 나빠 잘 쓰지 않음. ‘dart’는 드롭아웃을 적용한 ‘gbtree’라고 보면 됨. 때에 따라 ‘dart’가 성능이 좋은 경우가 있음)
    • 기본값 = ‘gbtree’
  • objective : 훈련 목적
    • 회귀 문제에서는 주로 ‘reg:squarederror’를 사용
    • 확률값을 구하는 이진분류에선 ‘binary:logistic’을 사용
    • 소프트맥스 함수를 사용하는 다중분류에서는 ‘multi:softmax’를 사용
    • 확률값을 구하는 다중분류에서는 ‘multi:softprob’를 사용
    • 기본값 = ‘reg:squarederror’
  • eta (learning_rate) : 학습률(부스팅 스텝을 반복하면서 모델을 업데이트하는 데 사용되는 비율)
    • 0~1 사이 값으로 설정할 수 있으며, 일반적으로 0.0001~0.1 사이 값을 사용
    • 기본값 = 0.3
  • max_depth : 개별 트리의 최대 깊이
    • 과대적합을 제어하는 파라미터
    • 트리 깊이가 깊을수록 모델이 복잡해지고 과대적합될 우려가 있음
    • 일반적으로 3~10 사이의 값을 주로 사용
    • 값이 클수록 깊이가 한 단계만 늘어나도 메모리 사용량이 급격히 많아짐(값이 클수록 모델 훈련 속도가 느려진다는 뜻)
    • 기본값 = 6
  • subsample : 개별 트리를 훈련할 때 사용할 데이터 샘플링 비율
    • 0~1 사이 값으로 설정할 수 있음
    • 0.5로 설정하면 전체 데이터의 50%를 사용해 트리를 생성
    • 일반적으로 0.6~1 사이 값을 사용. 더 작으면 샘플링할 데이터가 너무 적기 때문
    • 기본값 = 1
  • colsample_bytree : 개별 트리를 훈련할 때 사용하는 피처 샘플링 비율
    • 0~1 사이 값으로 설정할 수 있음
    • subsample과 유사한 개념. subsample은 전체 데이터에서 얼마나 샘플링할지 나타내는 비율이고, colsample_bytree는 전체 피처에서 얼마나 샘플링할지 나타내는 비율
    • 예를 들어, colsample_bytree 값이 0.7이면, 개별 트리를 훈련할 때 총 피처의 70%만 사용해 훈련
    • 값이 작을수록 과대적합 방지 효과가 있음
    • subsample과 마찬가지로 0.6~1 사이 값을 주로 사용
    • 기본값 = 1
  • alpha (reg_alpha) : L1 규제 조정 값
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 0
  • lambda (reg_lambda) : L2 규제 조정 값
    • 파이썬 lambda 함수와 용어가 같아 혼동을 피하기 위해 별칭인 reg_lambda를 주로 사용
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 1
  • gamma (min_split_loss) : 말단 노드가 분할하기 위한 최소 손실 감소 값
    • 0 이상 값으로 설정할 수 있음
    • 손실 감소가 gamma보다 크면 말단 노드를 분할
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 0
  • min_child_weight : 과대적합 방지를 위한 값
    • 0 이상 값으로 설정할 수 있음
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 1
  • scale_pos_weight : 불균형 데이터 가중치 조정 값
    • 타깃값이 불균형할 때 양성positive 값에 scale_pos_weight만큼 가중치를 줘서 균형을 맞춤(타깃값 1을 양성 값으로 간주)
    • 일반적으로 scale_pos_weight 값을(음성 타깃값 개수 / 양성 타깃값 개수)로 설정
    • 기본값 = 1
  • random_state : 랜덤 시드값(코드를 반복 실행해도 같은 결과가 나오게 지정하는 값)
    • 기본값 = None

 

xgboost.train()의 파라미터

 

  • params : XGBoost 모델의 하이퍼파라미터 목록
    • 딕셔너리 타입으로 전달
  • dtrain : 훈련 데이터셋
    • xgboost.DMatrix 타입으로 전달
  • num_boost_round : 부스팅 반복 횟수
    • 정수형 타입으로 전달
    • num_boost_round 값이 클수록 성능이 좋아질 수 있으나 과대적합 우려가 있음
    • num_boost_round 값이 작으면 반복 횟수가 줄어들어 훈련 시간이 짧아짐
    • 일반적으로 num_boost_round를 늘리면 learning_rate를 줄여야 함
    • 기본값 = 10
  • evals : 모델 성능 평가용 검증 데이터셋
    • (DMatrix, 문자열) 쌍들을 원소로 갖는 리스트 타입으로 전달. 검증 데이터셋 이름을 원 하는 대로 문자열로 정하면 됨
    • 훈련을 반복하면서 훈련이 잘 되고 있는지 평가할 때 사용
    • 기본값 = 빈 배열
  • feval : 검증용 평가지표
    • 사용자 정의 함수 형태로 전달
    • evals를 활용해 모델 성능을 검증할 때 사용할 사용자 정의 평가지표 함수
    • 예측값과 실젯값을 파라미터로 전달받아, 평가지표명과 평가점수를 반환하는 함수여야 함
    • 기본값 = None
  • maximize : feval 평가점수가 높으면 좋은지 여부
    • True 또는 False 형태로 전달
  • early_stopping_rounds : 조기종료 조건
    • 정수형 타입으로 전달
    • 모델은 기본적으로 num_boost_round만큼 훈련을 반복하며, 매 이터레이션마다 evals로 모델 성능을 평가하여 성능이 연속으로 좋아지지 않는다면 훈련을 중단하는데, 훈련 중단에 필요한 최소 횟수가 early_stopping_rounds임. 즉, early_stopping_rounds동안 모델 성능이 좋아지지 않는다면 훈련을 중단
    • 과대적합을 방지하는 효과가 있음
    • 조기종료를 적용하려면 evals에 검증 데이터가 하나 이상 있어야 함. 또한, evals에 검증 데이터가 여러 개라면 마지막 검증 데이터를 기준으로 조기종료 조건을 적용
    • 대체로 eta가 작으면 early_stopping_rounds를 크게 설정하고, eta가 크면 작게 설정. 학습률이 작으면 그만큼 가중치가 천천히 갱신되므로 조기종료 조건이 커야 함
    • 기본값 = None
  • verbose_eval : 성능 점수 로그 설정 값
    • True/False 또는 정수형 타입으로 전달
    • True로 설정하면 매 부스팅 스텝마다 평가점수를 출력(False면 출력하지 않음)
    • 정수면 평가점수를 매 verbose_eval 스텝마다 출력. 예컨대, verbose_eval을 100으로 설정하면 100번, 200번, 300번과 같이 띄엄띄엄 출력
    • 출력값이 너무 많아지는 걸 방지하려고 verbose_eval을 설정
    • 기본값 = True

 

기본적인 파라미터에 익숙해지면 점차 늘려가는 방식으로 학습. 그래도 너무 많긴 하다

 

LightGBM

 

XGBoost와 성능은 비슷하지만 훈련 속도가 더 빠르다.

 

대부분의 트리 기반 모델은 트리를 균형 있게 분할하며 훈련.

그래야 트리 깊이가 최소 화 및 과대적합 방지.

하지만 균형을 유지하려면 추가 연산이 필요하다. 시간이 더 걸린다.

 

LightGBM은 말단 노드 중심으로 예측 오류를 최소화하게끔 분할한다.

가능성이 없는 노드는 쳐내고 마지막에서 가능성이 높은 노드만 분할해서 간다.

백트래킹과 비슷한 예시.

 

말단 노드 중심으로 분할하면 균형을 유지할 필요가 없다. 그러나 데이터 개수가 적을 때는 과대적합되기 쉽다는 단점이 생겨서 과대적합 방지용 하이퍼파라미터를 조정해줘야 한다.

 

XGBoost와 LightGBM의 특장점

 

1.피처 스케일링이 따로 필요 없다. 데이터의 절대적인 크기보다는 대소 관계에 영향을 받는다.

2. 레이블 인코딩을 적용해도 된다. 트리 기반 모델의 특성상 분기를 거듭하면서 레이블 인코딩 되어도 정보를 잘 추출

3. 결측값을 알아서 처리해준다.(그래도 더 명확하게 하려면 결측값을 별도로 처리하는 습관을 들여야 한다)

 

반면 선형 모델은 피처 스케일링, 결측값 처리, 원-핫 인코딩을 해줘야 일반적으로 성능이 좋아진다.

 

파이썬 래퍼 LightGBM을 사용하려면 lightgbm.Dataset(  )으로 전용 데이터셋을 만들어야 한다.

lightgbm.Dataset(  )의 파라미터는 다음과 같습니다.

 

  • data : lightgbm.Dataset용 데이터셋
    • 넘파이 배열, 판다스 DataFrame, scipy.sparse, 문자열 등의 타입을 전달할 수 있음(문자열이면 파일 경로를 의미)
  • label : 타깃값
    • 리스트, 넘파이 1차원 배열, 판다스 Series, 열이 하나인 DataFrame 타입 또는 None을 전달할 수 있음
    • 기본값 = None

파이썬 래퍼 LightGBM 모델에서 주로 사용하는 하이퍼파라미터들을 알아보겠습니다 (LightGBM 3.2.1 버전 기준).

  • boosting_type : 부스팅 알고리즘
    • 알고리즘 종류는 ‘gbdt’, ‘dart’, ‘goss’, ‘rf’가 있음
    • 기본값 = ‘gbdt’
  • objective : 훈련 목적
    • 회귀에선 ‘regression’, 이진분류에선 ‘binary’, 다중분류에선 ‘multiclass’ 사용
    • 기본값 = ‘regression’
  • learning_rate (eta) : 학습률(부스팅 이터레이션을 반복하면서 모델을 업데이트하는 데 사용되는 비율)
    • xgboost의 eta와 같은 의미
  • num_leaves : 개별 트리가 가질 수 있는 최대 말단 노드 개수
    • 트리 복잡도를 결정하는 주요 파라미터
    • 값이 클수록 성능이 좋아질 수 있으나 과대적합 우려가 있음
    • 기본값 = 31
  • max_depth : 개별 트리의 최대 깊이
    • LightGBM은 말단 노드 중심으로 분할하므로 max_depth를 균형 중심 분할 모델(XGBoost)보다 크게 잡는 게 좋음
    • 과대적합 제어 파라미터
    • 트리 깊이가 깊을수록 모델이 복잡해지고 과대적합될 우려가 있음
    • 기본값 = -1 (0보다 작으면 깊이에 제한이 없음)
  • bagging_fraction (subsample) : 개별 트리를 훈련할 때 사용할 데이터 샘플링 비율
    • xgboost의 subsample 파라미터와 같은 의미
    • 배깅을 활성화하려면 bagging_freq 파라미터를 0이 아닌 값으로 설정해야 함
  • feature_fraction (colsample_bytree) : 개별 트리를 훈련할 때 사용하는 피처 샘플링 비율
    • xgboost의 colsample_bytree 파라미터와 같은 의미
  • lambda_l1 (reg_alpha) : L1 규제 조정 값
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 0
  • lambda_l2 (reg_lambda) : L2 규제 조정 값
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 0
  • min_child_samples : 말단 노드가 되기 위해 필요한 최소 데이터 개수
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 20
  • min_child_weight : 과대적합 방지를 위한 값
    • 0 이상 값으로 설정할 수 있음
    • 값이 클수록 과대적합 방지 효과가 있음
    • 기본값 = 1e-3
  • bagging_freq (subsample_freq) : 배깅 수행 빈도
    • 몇 번의 이터레이션마다 배깅을 수행할지 결정
    • 0 전달 시 배깅을 수행하지 않음
    • 1 전달 시 매 이터레이션마다 트리가 새로운 샘플링 데이터로 학습
    • 기본값 = 0
  • force_row_wise : 메모리 용량이 충분하지 않을 때 메모리 효율을 높이는 파라미터
    • 메모리 용량이 충분하지 않을 때 True를 전달하면 메모리 효율이 좋아짐
    • 기본값 = False
  • random_state : 랜덤 시드값(코드를 반복 실행해도 같은 결과가 나오게 지정하는 값)
    • 기본값 = None

 

아따 여기도 많다.

 

 lightgbm.train(  )의 파라미터

 

  • params : LightGBM 모델의 하이퍼파라미터 목록
    • 딕셔너리 타입으로 전달
  • train_set : 훈련 데이터셋
    • lightgbm.Dataset 타입으로 전달
  • num_boost_round : 부스팅 반복 횟수
    • xgboost.train(  )의 num_boost_round와 같은 의미
    • 기본값 = 100
  • valid_sets : 모델 성능 평가용 검증 데이터셋
    • lightgbm.Dataset 타입으로 전달
    • 훈련을 반복하면서 훈련이 잘 되고 있는지 평가할 때 사용
    • 기본값 = None
  • feval : 검증용 평가지표
    • 사용자 정의 함수 형태로 전달
    • valid_sets를 활용해 모델 성능을 검증할 때 사용할 사용자 정의 평가지표
    • 예측값과 실젯값을 파라미터로 전달받아, 평가지표명, 평가점수, 평가점수가 크면 좋은지 여부를 반환하는 함수여야 함
    • 기본값 = None
  • categorical_feature : 범주형 데이터 파라미터
    • 이 파라미터에 전달된 데이터를 범주형 데이터로 인식함
    • 아무 값도 전달하지 않으면 category 타입인 데이터를 범주형 데이터로 인식함
  • early_stopping_rounds : 조기종료 조건
    • 정수형 타입으로 전달
    • 모델은 기본적으로 num_boost_round만큼 훈련을 반복함
    • 매 이터레이션마다 valid_sets로 모델 성능을 평가하는데, 모델 성능이 연속으로 좋아지지 않는다면 훈련을 중단함. 훈련을 중단하는 데 필요한 최소 횟수가 early_stopping_rounds임. 즉, early_stopping_rounds 동안 모델 성능이 좋아지지 않는다면 훈련을 중단함
    • 과대적합을 방지하는 효과가 있음
    • 대체로 learning_rate가 작으면 early_stopping_rounds를 크게 설정하고, learning_rate가 크면 early_stopping_rounds를 작게 설정함
    • 기본값 = None
  • verbose_eval : 성능 점수 로그 설정 값
    • xgboost.train(  )의 verbose_eval과 같은 의미

 

사이킷런 래퍼 모듈 vs 파이썬 래퍼 모듈

 

사이킷런 래퍼 - 모델이 많이서 클래스를 활용해 생성

데이터셋 - 별도로 데이터셋을 생성하지 않고 원본 데이터(배열, DataFrame 등의 타입)을 그대로 사용

모델 훈련 - 생성한 모델 객체의 fit() 메서드를 호출

예측 - 생성한 모델 객체의 predict() 혹은 predict_proba() 메서드로 예측

하이퍼파라미터 입력 방식 - 모델 하이퍼파라미터는 모델 생성 시 입력하고, 훈련 하이퍼파라미터는 fit() 메서드에 입력

 

파이썬 래퍼 모듈 - 별도로 모델을 생성하지 않고, 임포트한 xgboost 혹은 lightgbm을 그대로 사용

데이터셋 - 별도 데이터셋을 생성 (XGBoost는 DMatrix 객체, LightGBM은 Dataset 객체)

모델 훈련 - 임포트한 xgboost 혹은 lightGBM 모듈을 바로 사용해서 train() 메서드 호출

예측 - predict() 메서드로 예측

하이퍼 파라미터 입력 방식 - 모두 train() 메서드에 입력

모델 하이퍼파라미터는 train()의 params 파라미터에 일괄 입력

 

 

출처 : 머신러닝 딥러닝 문제해결 전략

https://wikidocs.net/book/13313

반응형