GDSC SungShin Women's University 23-24/Study

[자율스터디] 머신러닝 스터디 5월보고서

GDSC SungShin Team 2024. 8. 17. 17:35

안녕하세요! GDSC sungshin 멤버 오지윤, 김지현입니다.

저희 머신러닝 팀의 6월달 스터디 활동 보고에 대해 포스팅하도록 하겠습니다.

6월달에는 시험기간이 있어 6월 첫째주에만 스터디를 진행하였습니다.

[파이썬 머신러닝 완벽 가이드] 책의 chapter 4 분류 파트애 대해 학습하고 공유하는 시간을 가졌습니다.

스터디를 진행한 앙상블 학습, 랜덤 포레스트, GBM 에 대해 공유해보겠습니다.

앙상블 학습

: 앙상블 학습을 통한 분류는 여러 개의 분류기 (Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법

쉽게 말해서, 집단 지성을 이용해서 학습하는 것이라고 생각할 수 있다.

앙상블 학습의 유형

  • 보팅 (Voting), 배깅(Bagging), 부스팅(Boosting)의 세가지로 나뉜다.

보팅 vs. 배깅

: 보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식

보팅

: 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것

  • 대표적인 예시 : 랜던 포레스트 알고리즘
  • 선형회귀, K 최근접 이웃, 서포트 백터 머신이라는 3개의 ML 알고리즘이 하고 예측한 결과를 가지고 최종 예측 결과를 선정하는 방식
  • 같은 데이터 세트에 대해 학습

vs.

배깅

: 각각의 분류기가 모두 같은 유형의 알고리즘이지만, 데이터 샘플링을 다르게 가져가면서 학습을 수행해 보팅을 하는 것

  • 단일 ML 알고리즘으로 여러 분류기가 학습으로 개별 예측을 진행 but, 학습 데이터 세트가 보팅 방식과는 다르다.
  • 부트스트래핑(Bootstrapping) : 개별 Classifier에게 데이터를 샘플링해서 추출하는 방식
  • 배깅은 데이터 세트의 중첩을 허용

보팅과 배깅 차이점

부스팅 Boosting

: 여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에 가중치 weight를 부여하면서 학습과 예측을 진행하는 것

EX) 그래디어트 부스트, XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost)

스태킹

: 여러가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방법

보팅 유형 - 하드 보팅 Hard Voting 과 소프트 보팅 Soft Voting

하드 보팅 Hard Voting

: 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정하는 것

  • 다수결의 원칙과 비슷

EX) Classifier 1,3,4이 클래스 1로 레이블 값을 예측하고 2번이 2로 레이블 값을 예측하면 다수결의 원칙에 따라 최종 예측은 1이 된다.

소프트 보팅 Soft Voting

: 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균내서 이들 중 확률이 가장 높은 레이블값을 최종 보팅 결괏값으로 선정

  • 일반적으로 소프트 보팅을 적용 (하드 보팅보다 성능이 우세)

EX) 레이블 값 1의 평균 예측 확률은 (0.7 + 0.2 + 0.8 + 0.9) / 4 = 0.65가 되고 레이블 2의 평균 예측 확률은 같은 방법으로 구하면 0.35가 된다. 레이블 1의 값이 더 크기 때문에 레이블 1로 최종 보팅 진행

 

Hard Voting vs. Soft Voting

보팅 분류기 Voting Classifier

사이킷런에서 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스 제공

보팅 방식의 앙상블을 이용해 위스콘신 유방암 데이터 세트 예측 분석 진행

  • 로지스틱 회귀와 KNN을 기반으로 보팅 분류기 생성

위스콘신 유방암 데이터 세트

1. 데이터 불러오기 Data Load

위스콘신 데이터

2. 보팅 분류기 만들기

VotingClassifier 클래스 : 주요 생성 인자로 estimators와 voting 값을 입력 받는다.

  • estimators : 리스트 값으로 보팅에 사용될 여러 개의 Classifier 객체들을 튜플 형식으로 입력 받음
  • voting : 'hard' = 하드보팅, 'soft' = 소프트 방식을 적용 (default = hard)

 

3. 결과 해석

보팅 분류기의 정확도가 조금 높게 나타났지만 무조건 기반 분류기보다 예측 성능이 향상되지는 X

  • 데이터의 특성과 분포 등 다양한 요건에 따라 오히려 기반 분류기가 더 좋은 정확도를 보여줄 수 있다.

랜덤 포레스트의 개요 및 실습

배깅 Bagging

랜덤 포레스트

랜덤 포레스트

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

랜덤 포레스트

  • 개별적인 분류기의 기반 알고리즘 : 결정트리
  • 개별 트리가 학습하는 데이터 세트는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 세트
  • 랜덤 포레스트의 서브세트 Subset 데이터는 이러한 부트 스트래핑으로 데이터가 만들어진다.

부트 스트래핑 (bootstrapping) 분할 방식

EX) 원본 데이터의 건수 10개인 학습 데이터 세트에 랜던 포레스트를 3개의 결정 트리 기반으로 학습

  • n_estimators = 3으로 하이퍼 파라미터 부여 시 아래의 그림과 같이 생성

  • 랜덤 포레스트는 사용자 행동 인식 데이터 세트에 대해 약 92.37%의 정확도를 보여준다. 

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

트리 기반의 앙상블 알고리즘의 단점

  • 하이퍼 파라미터가 너무 많으며, 튜닝을 위한 시간 소모가 크다. + 많은 시간 대비 예측 성능이 뛰어나지 X

n_estimators

GridSearchCV를 이용해 랜덤 포레스트의 하이퍼 파라미터를 튜닝

이런 오류가 발생.... 아마 튜닝 시간 때문이지 않을까.. 일단 진행해봅시다..

책의 결과에 따르면,

최적 하이퍼 파라미터:
{'max_depth': 16, 'min_sampels_leaf': 6, 'min_samples_split': 2, 'n_estimators':100}
최고 예측 정확도 : 0.9165

이런 식의 결과가 나온다고 합니다.....;;;;

위에서 추출된 최적 하이퍼 파라미터로 다시 RandomForestClassifier를 학습시키면,

이런 결과가 나옵니다.

feature_importances_ 속성 이용하여 해당 피처의 중요도 확인

위의 결과에 따르면, angle(X,gravityMean), tGravity(Acc-mean()-Y, tGravityAcc-min()-X 등이 높은 피처 중요도를 갖는다는 것을 알 수 있습니다!!

GBM(Gradient Boosting Machine)

부스팅 알고리즘은 여러 개의 약한 학습(weak learner)를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식

  • AdaBoost
  • GradientBoost (그래디언트 부스트)

⇒ 여러 분류 기준에 따라 부분부분 학습하여 결과를 바탕으로 잘못 예측한 곳에 가중치를 부여한다.

AdaBoost (에이다 부스트)

오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 대표적인 알고리즘

다음은 AdaBoost의 과정을 설명한 그림이다. 과정에 대해서 알아보도록 하자.

  1. 첫번째 약한 학습기(weak learner) 는 -와 +를 분류한 것이다. 위의 + 와 아래 - 2개의 데이터는 잘못 분류된 오류 데이터가 된다.
  2. 1에서의 오류 데이터에 대해서 가중치 값을 부여한다. 다음 학습기에서 더 잘 분류할 수 있도록 크기를 키워준다.
  3. 두번째 약한 학습기에 따르면, 오른쪽의 - 3개의 데이터가 잘못 분류된 오류 데이터가 된다. 2에서 크기가 커진 - 2개의 데이터는 해당 학습기에서 올바르게 분류가 된다.
  4. 3에서의 오류 데이터에 대해서 가중치 값을 부여하한다. 다음 학습기에서 더 잘 분류할 수 있도록 크기를 키워준다.
  5. 세번째 약한 학습기에 따르면, 기준에 따라 -와 +를 분류하고 오류 데이터를 찾는다.
  6. 에이다 부스트는 개별 약한 학습기는 각각 가중치를 부여해 결합하여 예측을 수행한다.

⇒ 약한 학습기가 순차적으로 오류 값에 대해 가중치를 부여한 예측 결정 기준을 모두 결합하여 예측을 수행한다.

GradientBoost (그래디언드 부스트)

에이다 부스트와 유사하지만, 가중치 업데이트 과정에서 경사 하강법을 사용한다는 차이점이 있다.

경사하강법)

오류값은 실제 값 - 예측값을 의미하며, 분류의 실제 결과값을 y, 피처를 x_1, x_2, …, x_n , 피처에 기반한 예측 함수를 F(x) 함수라고 한다. 이 때의 오류식은 h(x) = y - F(x) 이 되며, 이를 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트 하는 것이 경사하강법이다.

GBM은 분류와 회귀에서 모두 사용이 가능하다.

GBM기반의 분류를 위해서 사이킷런에서는 GradientBoostingClassifier 클래스를 제공한다.

from sklearn.ensemble import GradientBoostingClassifier
import time
import warnings
warnings.filterwarnings('ignore')

X_train, X_test, y_train, y_test = get_human_dataset()

# GBM 수행 시간 측정을 위해서 time 사용한다. 
start_time = time.time() # 시작 시간 설정
gb_clf = GradientBoostingClassifier(random_state=0)
gb_clf.fit(X_train, y_train)
gb_pred = gb_clf.predict(X_test)
gb_accuracy = accuarcy_score(y_test, gb_pred)

장점)

GBM은 랜덤 포레스트보다 예측 성능이 좋다.

GBM은 과적합에도 강한 뛰어난 예측 성능을 보여준다.

단점)

수행 시간이 오래 걸리고, 하이퍼 파라미터 튜닝 뉴력이 더 필요하다는 특징을 가진다.

수행 시간에 있어서는 GBM은 약한 예측기의 순차적인 예측 오류 보정을 통해서 학습함으로 멀티 CPU 코어 시스템을 사용하더라도 병렬 처리가 지원되지 않아서 대용량 데이터의 경우 학습이 매우 오래 걸린다.

GBM의 하이퍼 파라미터

  • loss: 경사 하강법에서 사용할 비용 함수를 지정한다. 기본값인 'deviance'이다.
  • learning rate: GBM이 학습을 진행할 때마다 적용하는 학습률
    • Weak learner가 순차적으로 오류 값을 보정해 나 가는 데 적용하는 계수이다.
    • 0~1 사이의 값을 지정할 수 있으며 기본 값은 0.1이다.
    • 너무 작은 값을 적용하면 업데이트 되는 값이 작아져서 최소 오류 값을 찾아 예측 성능이 높아질 가능성이 높아진다.
    • 많은 weak learner는 순차적인 반복이 필요해서 수행 시간이 오래 걸리고, 또 너무 작게 설정하면 모든 weak learner의 반복이 완료돼도 최소 오류 값을 찾지 못할 수 있다.
    • 학습률을 큰 값을 적용하면 최소 오류 값을 찾지 못하고 그냥 지나쳐 버려 예측 성능이 떨어질 가능 성이 높아지지만, 빠른 수행이 가능하다.
  • n_estimators: weak learner의 개수
    • weak learner가 순차적으로 오류를 보정하므로 개수가 많을수록 예측 성능 이 일정 수준까지는 좋아질 수 있다.
    • 하지만 개수가 많을수록 수행 시간이 오래 걸린다.
    • 기본값은 100
  • subsample: weak learner가 학습에 사용하는 데이터의 샘플링 비율
    • 기본값은 1이|며, 이는 전체 학습 데이터를 기반으로 학습한다는 의미이다.
      • (0.501면 학습 데이터의 50%)
    • 과적합이 염려되는 경우 subsamole을 1보다 작은 값으로 설정한다.

leaming_rate는 n estimators와 상호 보완적으로 조합해 사용해야 한다.

learning_rate를 작게 하고 n_estimators를 크게 하면 더 이상 성능이 좋아지지 않는 한계점까지는 예측 성능이 조금씩 좋아질 수 있지만 수행 시간이 너무 오래 걸리는 단점이 있으며, 예측 성능 역시 현격히 좋아지지는 않는다.

 

6월을 끝으로 머신러닝 스터디를 완료하였습니다~! 팀원 모두 성실히 스터디에 참여하여 공부한 것을 공유하고 배워갈 수 있어서 좋았던 것 같습니다!!