220922

AIVILLAIN·2022년 9월 22일
0

오공완

목록 보기
12/25

결정 트리 실습

실습 코드

UCI 머신러닝 레포지토리에서 제공하는 사용자 행동 인식 데이터 세트에 대한 분류 수행
사람의 동작과 관련된 여러 가지 피처를 수집한 데이터

앙상블 학습

여러 개의 분류기를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법
다양한 분류기의 예측 결과를 결합함으로써 단일 분류기보다 신뢰성이 높은 예측값을 얻는 것

이미지, 영상, 음성 등의 비정형 데이터의 분류는 딥러닝이 뛰어난 성능을 보이고 있으나 대부분의 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 나타내고 있음
랜덤 포레스트와 그래디언트 부스팅 알고리즘은 뛰어난 성능과 쉬운 사용, 다양한 활용도로 인해 그간 분석가 및 데이터 과학자들 사이에서 많이 애용됨
부스팅 계열의 앙상블 알고리즘의 인가와 강세가 계속 이어져 기존 그래디언트 부스팅을 뛰어넘는 새로운 알고리즘 개발이 가속화됨
캐글에서 매력적인 솔루션으로 불리는 XGBoost, XGboost와 유사한 예측 성능을 가지면서도 훨씬 빠른 수행 속도를 가진 LightGBM, 여러 가지 모델 결과를 기반으로 메타 모델을 수립하는 스태킹을 포함한 다양한 유형의 앙상블 알고리즘이 머신러닝 선도 알고리즘으로 인기를 모으고 있음

앙상블 학습의 유형은 전통적으로 보팅, 배깅, 부스팅의 세 가지로 나눌 수 있으며 스태킹을 포함한 다양한 앙상블 방법이 있음
보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식
보팅과 배깅의 다른 점은 보팅의 경우 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것이고 배깅의 경우 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것
랜덤 포레스트 알고리즘은 대표적인 배깅 방식

배깅 분류기의 경우 단일 ML 알고리즘으로 여러 분류기가 학습으로 개별 예측을 하는데 개별 분류기에 할당된 학습 데이터는 원본 학습 데이터를 샘플링하여 추출, 이렇게 개별 Classifier에게 데이터를 샘플링해서 추출하는 방식을 부트스트래핑 분할 방식이라고 부름
개별 분류기가 부트스트래핑 방식으로 샘플링된 데이터 세트에 대해서 학습을 통해 개별적인 예측을 수행한 결과를 보팅을 통해 최종 예측 결과를 선정하는 방식이 바로 배깅 앙상블 방식
교차 검증이 데이터세트간에 중첩을 허용하지 않는 것과 다르게 배깅 방식은 중첩을 허용

부스팅은 여러 개의 분류기가 순차적으로 학습을 수행하되 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에는 가중치를 부여하면서 학습과 예측을 진행
계속해서 분류기에게 가중치를 부스팅하면서 학습을 진행하기에 부스팅 방식으로 불림
예측 성능이 뛰어나 앙상블 학습을 주도하고 있으며 대표적인 모듈로 그래디언트 부스트, XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost)이 있음

스태킹은 여러 다른 모델의 예측 결괏값을 학습 데이터로 만들어서 다른 모델로 재학습시켜 결과를 예측하는 방법

보팅 유형 - 하드 보팅과 소프트 보팅

보팅 방법에는 하드 보팅과 소프트 보팅이 있음

하드 보팅

다수결 원칙과 비슷
예측한 결괏값들중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정

소프트 보팅

분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정
일반적으로 하드 보팅보다 소프트 보팅이 예측 성능이 좋아서 더 많이 사용됨

보팅 분류기(Voting Classifier)

사이킷런은 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스 제공
로지스틱 회귀와 KNN 기반 보팅 분류기 제작
VotingClassifier 클래스는 주요 생성 인자로 estimators와 voting 값을 입력 받음
estimators는 리스트 값으로 보팅에 사용될 Classifier 객체들을 튜플 형식으로 입력, voting은 hard, soft (default = hard)

보팅으로 여러 개의 기반 분류기를 결합한다고 해서 무조건 기반 분류기보다 예측 성능이 향상되지는 않음
데이터의 특성, 분포 등 다양한 요건에 따라 오히려 기반 분류기 중 가장 좋은 분류기의 성능이 보팅했을 때보다 나을 수 있음

그럼에도 불구하고 앙상블 방법은 전반적으로 다른 단일 ML 알고리즘보다 뛰어난 예측 성능을 가지는 경우가 많음
고정된 데이터 세트에서 단일 ML 알고리즘이 뛰어난 성능을 발휘하더라도 현실 세계는 다양한 변수와 예측이 어려운 규칙으로 구성되어 있음
다양한 관점을 가진 알고리즘이 서로 결합해 더 나은 성능을 실제 환경에서 끌어낼 수 있음
높은 유연성은 그동한 경험해 보지 못한 새로운 문제에 대한 해결책을 좀 더 쉽게 제시할 수 있음

ML 모델의 성능은 다양한 테스트 데이터에 의해 검증되므로 어떻게 높은 유연성을 가지고 현실에 대처할 수 있는가가 중요한 ML 모델의 평가요소가 됨
이런 관점에서 편향-분산 트레이드오프는 ML 모델이 극복해야 하는 중요한 과제
보팅과 스태킹 등은 서로 다른 알고리즘을 기반으로 하지만, 배깅과 부스팅은 대부분 결정 트리 알고리즘을 기반으로 함
결정 트리 알고리즘은 쉽고 직관적인 분류 기준을 가지고 있지만 정확한 예측을 위해 학습 데이터의 예외 상황에 집착한 나머지 과적합이 발생하여 실제 테스트 데이터에서 예측 성능이 떨어지는 현상이 발생하기 쉬움
앙상블 학습에서는 이 같은 결정 트리 알고리즘의 단점을 수십~수천 개의 매우 많은 분류기를 결합하여 다양한 상황을 학습하게 함으로써 극복
결정 트리 알고리즘의 장점은 그대로 취하고 단점은 보완하면서 편향-분산 트레이드오프의 효과를 극대화할 수 있음

랜덤 포레스트

배깅은 앞에서 소개한 보팅과 다르게 같은 알고리즘으로 여러 개의 분류기를 만들어서 보팅으로 최종 결정하는 알고리즘
대표적인 알고리즘으로 랜덤 포레스트가 있음
앙상블 알고리즘 중 비교적 빠른 수행 속도를 가지고 있으며 다양한 영역에서 높은 예측 성능을 보임
랜덤 포레스트의 기반 알고리즘은 결정 트리, 결정 트리의 쉽고 직관적인 장점을 그대로 갖고 있음

랜덤 포레스트는 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링하여 개별적으로 학습을 수행, 최종적으로 모든 분류기가 보팅을 통해 예측을 결정하는 방식

랜덤 포레스트는 개별적인 분류기의 기반 알고리즘은 결정 트리이나 개별 트리가 학습하는 데이터세트는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 셑트
여러 개의 데이트 세트를 중첩되게 분리하는 것을 부트스트래핑 분할 방식이라고 함
배깅이라는 단어 자체가 bootstrap aggregating의 줄임말
통계학에서는 여러 개의 작은 데이터 세트를 임의로 만들어 개별 평균의 분포도를 측정하는 등의 목적을 위한 샘플링 방식을 지칭
서브 세트의 데이터 건수는 전체 데이터 건수와 동일하지만 개별 데이터가 중첩되어 만들어짐
데이터가 중첩된 개별 데이터 세트에 결정 트리 분류기를 각각 적용하는 것이 랜덤포레스트

사이킷런은 RandomForestClassifier 클래스를 통해 랜덤 포레스트 기반 분류 지원

랜덤 포레스트 하이퍼파라미터 및 튜닝

트리 기반의 앙상블 알고리즘의 단점은 하이퍼파라미터가 너무 많고 그로 인해 튜닝을 위한 시간이 많이 소모됨
많은 시간을 소모하여도 예측 성능이 크게 향상되는 경우가 많지 않음

  • n_estimators
    랜덤 포레스트에서 결정 트리의 개수
    디폴트는 10개
    많이 설정할수록 좋은 성능을 기대할 수 있으나 계속 증가시킨다고 성능이 무조건 향상되는 것은 아니며 학습 수행이 오래 걸림
  • max_features
    결정 트리의 max_features와 같으나 default가 None이 아닌 auto(sqrt)와 같음
    랜덤 포레스트의 트리를 분할하는 피처를 참조할 때 전체 피처가 아니라 루트 전체 피처 개수만큼 참조
  • max_depth, min_samples_leaf와 같이 결정 트리에서 과적합 개선을 위해 사용되는 파라미터가 랜덤 포레스트에도 똑같이 적용될 수 있음

GBM(Gradient Boost Machine)

부스팅 알고리즘은 여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식
대표적인 구현은 AdaBoost와 그래디언트 부스트가 있음
AdaBoost는 오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 대표적인 알고리즘

GBM도 AdaBoost와 유사하나 가중치 업데이트를 경사 하강법을 이용
오류 값은 실제값 - 예측값
분류의 실제 결과를 y, 피처를 x1, x2, … 그리고 이 피처에 기반한 예측 함수를 F(x) 함수라고 하면 오류식 h(x) = y - F(x)가 됨
이 h(x)를 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트하는 것이 경사 하강법(Gradient Descent)

GBM은 CART 기반의 다른 알고리즘과 마찬가지로 분류, 회귀 모두 가능
사이킷런은 GBM 기반 분류를 위해 GradientBoostingClassifier 클래스 제공

일반적으로 GBM이 랜덤 포레스트보다는 예측 성능이 뛰어난 경우가 많음
그러나 수행 시간이 오래 걸리고 하이퍼파라미터 튜닝 노력도 더 필요함
수행 시간 문제는 GBM이 극복해야 할 중요한 과제
약한 학습기의 순차적인 예측 오류 보정을 통해 학습을 수행하므로 멀티 CPU 코어 시스템을 사용하더라도 병렬 처리가 지원되지 않아 대용량 데이터의 경우 학습에 매우 많은 시간 필요함
반면 랜덤 포레스트의 경우 상대적으로 빠른 수행 시간을 보장해주기 때문에 더 쉽게 예측 결과를 도출할 수 있음

GBM 하이퍼파라미터 및 튜닝

  • loss
    경사 하강법에서 사용할 비용 함수
    특별한 이유가 없으면 기본값인 deviance 사용
  • learning_rate
    GBM 학습 진행 시마다 적용하는 학습률
    0~1사이 값을 지정할 수 있으며 기본값은 0.1
    너무 작은 값을 적용하며 업데이트되는 값이 작아져 최소 오류 값을 찾아 예측 성능이 높아질 가능성이 있으나 순차적인 반복이 더 많이 수행되어 수행 시간이 오래 걸리게 됨
    큰 값을 적용하면 최소 오류 값을 찾지 못하고 그냥 지나쳐버려 예측 성능이 떨어질 가능성이 높음
    learning_rate를 작게 하고 n_estimators를 크게 하면 더이상 성능이 좋아지지 않는 한계점까지는 예측 성능이 조금씩 좋아질 수 있음
    수행 시간이 너무 오래걸리며 예측 성능 역시 현격히 좋아지지는 않음
  • n_estimators
    weak learner의 개수
    weak learner가 순차적으로 오류를 보정하므로 개수가 많을수록 예측 성능이 일정 수준까지는 좋아질 수 있음
    개수가 많을수록 수행 시간이 오래 걸림
  • subsample
    weak learner가 학습에 사용하는 데이터의 샘플링 비율, 기본값은 1
    과적합이 염려되는 경우 subsample을 1보다 작은 값으로 설정 가능

GBM은 과적합에도 강한 뛰어난 예측 성능을 가지지만 수행 시간이 오래 걸린다는 단점이 있음
GBM 기반의 머신러닝 알고리즘 중 XGBoost와 LightGBM은 가장 각광받고 있음

profile
소신있는 오픈마인드

0개의 댓글