본문 바로가기

Personal/AI, Big Data

혼공머신 13강 - 트리의 앙상블

* 혼자공부하는 머신러닝 + 딥러닝 책의 Youtube 강의를 보며 실습 및 공부한 내용입니다.

 

Chapter 05 트리 알고리즘

05 -3 트리의 앙상블

목적: 앙상블 학습이 무엇인지 이해하고 다양한 앙상블 학습 알고리즘을 실습을 통해 배운다.

 

정형 데이터와 비정형 데이터

정형 데이터: CSV 파일의 데이터처럼 어떤 구조로 되어 있는 데이터, CSV나 데이터베이스, 엑셀에 저장하기 쉽다.

비정형 데이터: 데이터베이스나 엑셀로 표현하기 어려운 것들, 텍스트 데이터, 디지털카메라로 찍은 사진, 핸드폰으로 듣는 디지털 음악 등.

 

앙상블 학습: 정형 데이터를 다루는 데 가장 뛰어난 성과를 내는 알고리즘, 더 좋은 예측 결과를 만들기 위해 여러 개의 모델을 훈련하는 머신러닝 알고리즘.

 

랜덤 포레스트

랜덤 포레스트는 앙상블 학습의 대표 주자 중 하나로 안정적인 성능 덕분에 널리 사용된다.

결정 트리를 랜덤하게 만들어 결정 트리의 숲을 만든다. 그리고 각 결정 트리의 예측을 사용해 최종 예측을 만든다.

 

먼저, 각 트리를 훈련하기 위한 데이터 랜덤 생성 -> 입력한 훈련 데이터에서 랜덤하게 샘플 추출 후 훈련 데이터 제작

* 부트 스트랩 샘플: 뽑았던 샘플을 다시 넣고 뽑는 것을 반복하여 중복된 샘플을 뽑을 수 있게 만들어진 샘플

 

분류 모델 vs 회귀 모델

분류 모델은 전체 특성 개수의 제곱근만큼의 특성 선택, 회귀 모델은 전체 특성을 사용

 

랜덤 포레스트는 훈련 세트에 과대적합되는 것을 막아준다. 왜? 랜덤하게 선택한 샘플과 특성을 사용하기 때문이다.

 

대표적인 결정 트리 기반의 앙상블 학습 방법으로 부트스트랩 샘플을 사용하고 랜덤하게 일부 특성을 선택하여 트리를 만드는 것이 특징이다.

 

<실습>

와인 데이터셋을 판다스로 불러오고 훈련 세트와 데이터 세트로 나눴다.

 

cross_validate() 함수로 교차 검증을 수행했다. 마지막에는 훈련 세트와 검증 세트의 점수를 비교해 과대적합을 파악한다. 출력된 결과를 보면 훈련 세트에 다소 과대적합된 것을 알 수 있었다.

 

결정 트리의 가장 큰 장점 중 하나인 특성 중요도 계산이 가능하다. 출력 결과 두 번째 특성인 당도가 중요하다는 것을 알 수 있었다.

부트스트랩 샘플을 만들어 결정 트리를 훈련하는 랜덤 포레스트에서는 부트스트랩 샘플에 포함되지 않고 남는 샘플이 있다. 이것이 OOB 샘플이다. oob_score이라는 매개변수를 True로 지정하면 자체적으로 모델을 평가하는 점수를 얻을 수 있다.

 

엑스트라 트리

랜덤 포레스트와 매우 비슷하게 동작한다. 기본적으로 100개의 결정 트리를 훈련한다. 결정 트리가 제공하는 대부부분의 매개변수를 지원한다. 또한 전체 특성 중에 일부 특성을 랜덤하게 선택하여 노드를 분할하는데 사용한다.

엑스트라 트리는 부트스트랩 샘플을 사용하지 않는다. 

 

사이킷런에서 제공하는 엑스트라 트리는 ExtraTreesClassifier 이다.

 

<실습>

교차 검증 점수

랜덤 포레스트와 결과가 비슷하다. 특성이 많지 않아 두 모델의 차이가 크지 않다.

특성 중요도 출력

당도가 특성 중요도가 가장 높은 것을 알 수 있었다.

 

그레이디언트 부스팅

깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법이다.

사이킷런의 GradientBoostingClassifire는 기본적으로 깊이가 3인 결정 트리를 100개 사용한다. 깊이가 얕은 결정 트리를 사용하기 때문에 과대적합에 강하고 일반적으로 높은 일반화 성능을 기대 가능하다.

 

경사 하강법을 사용하여 트리를 앙상블에 추가한다. 분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용한다.

 

교차 검증 점수 확인

두 값이 비슷한 걸로 보아 거의 과대적합이 되지 않았다. 결정 트리 개수를 늘리면 조금 더 성능이 향상될 수 있다.

 

결정 트리 개수를 500개로 5배나 늘렸지만 과대적합을 잘 억제하고 있다. 학습률 learning_rate의 기본값은 0.1이다. 그레이디언트 부스팅도 특성 중요도를 제공한다. 출력해보자.

특성 중요도 출력

랜덤 포레스트보다 그레이디언트 부스팅이 일부 특성 당도에 더 집중하는 걸 알 수 있다.

 

일반적으로 그레이디언트 부스팅이 랜덤 포레스트보다 조금 더 높은 성능을 얻을 수 있다. 하지만 순서대로 트리를 추가하기 때문에 훈련 속도가 느리다.

 

히스토그램 기반 그레이디언트 부스팅은 그레이디언트 부스팅의 속도와 성능을 더욱 개선한 것이다.

 

히스토그램 기반 그레이디언트 부스팅

정형 데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘이다. 먼저 입력 특성을 256개의 구간으로 나눈다. 따라서 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있다.

 

히스토그램 기반 그레이디언트 부스팅은 256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해서 사용한다.

 

사이킷런의 히스토그램 기반 그레이디언트 부스팅 클래스는 HistGradientBoostingClassifier이다.

이 클래스를 사용하려면 sklearn.experimental 패키지 아래에 있는 enable_hist_gradient_boosting 모듈을 임포트해야 한다.

 

<실습>

교차 검증 결과를 출력해보니 과대적합을 잘 억제하면서 그레이디언트 부스팅보다 조금 더 높은 성능을 제공한다는 것을 알 수 있다. 특성 중요도를 계산해보자. permutation_importance() 함수로 가능하다.

 

permutation_importance ( ) 함수가 반환하는 객체는 반복하여 얻은 특성 중요도 (impo1tances), 평균(importances_mean), 표준 편차(importances_std) 를 담고 있다.

 

테스트 세트에서 특성 중요도를 계산하자.

그레이디언트 부스팅과 비슷하게 조금 더 당도에 집중하고 있다는 것을 알 수 있다.

테스트 세트에서의 성능을 최종적으로 확인

약 87% 정확도를 얻었다. 실전에 투입하면 성능은 이것보다 조금 더 낮을 것이다. 앙상블 모델은 확실히 단일 결정 트리보다 좋은 결과를 얻을 수 잇다.

 

 사이킷런 말고도 히스토그램 기반 그레이디언트 부스팅 알고리즘을 구현한 라이브러리

-  XGBoost

tree_method='hist'로 지정하면 히스토그램 기반 그레이디언트 부스팅을 사용할 수 있다.

 

-  LightGBM

마이크로소프트에서 만든 라이브러리로 빠르고 최신 기술을 많이 적용하고 있어 인기가 점점 높아지고 있다.

 

앙상블 학습을 통한 성능 향상

사이킷런에서 제공하는 앙상블 학습 알고리즘 중 랜덤 포레스트, 엑스트라 트리, 그레이디언트 부스팅, 히스토그램 기반 그레이디언트 부스팅을 다루었다.