5장


01. 결정트리

정의

결정트리(Decision Tree)란 분류와 회귀의 문제를 모두 다룰 수있는 지도 학습 모델이다. 말 그대로 아래 그림과 같은 트리 구조를 이용하여 데이터를 학습하고 최적화 한다. 학습 데이터의 샘플들이 최상위의 루트 노드(root node)부터 스무고개 하듯 각 노드에서 선택되어진 하나의 특성의 True/False 조건을 통과하며 최말단의 리프 노드(leaf node) 까지 도달하며 분할되어 진다. 이때 어떤 특성이 선택되어질지, 어떤 기준이 이용될지는 양성, 음성클래스의 구분에 얼마나 효과적인지 모델이 몇가지 기준을 이용하여 선택하여 분할을 수행한다. 최종적으로 분할된 리프노드에서 양성클래스의 샘플이 많다면 그 리프노드의 도달한 샘플들은 모두 양성으로, 그반대라면 모두 음성으로 예측되어진다. 회귀의 경우 예측값은 샘플 타깃들의 평균값이다.

[출처]

결정트리는 이처럼 시각화하기 쉽고, 전처리의 중요도가 다른 모델에 비해 높지 않기 때문에 모델이 어떻게 데이터를 해석하고 예측하는지 사람이 직관적으로 이해하기가 쉽다.

불순도

불순도(impurity)는 한노드에서 서로 다른 클래스들이 얼마나 혼재되어 있는지를 나타내는 척도이다. 결정트리 모델에서는 criterion 매개변수를 이용하여 모델이 어떤 기준으로 노드를 분할할지 결정한다. 불순도가 높은 노드라는 것은 서로 다른 클래스들을 많이 가지고 있다는 의미이며, 불순도가 낮은 노드는 보통 하나의 클래스를 가지고 있다. 결정트리 모델에서는 최종적으로 리프노드의 불순도를 최소화 하는 방향으로 데이터를 분할하게 된다. 하지만 불순도가 완벽히 순수해진다는 것은 과적합의 위험이 증가한다는 이야기와 같다.

지니 불순도

[출처]

  • 정의 : 지니 불순도(Gini impurity)는 0에서 1사이의 값으로, 한 노드에 서로 다른 클래스가 얼마나 섞여있는지를 나타낸다. 하나의 클래스만 가진 노드는 0의 값을 가지며 순수노드라고 부른다.
  • 계산 방식 : Gini(D)=1j=1m(pj2)Gini(D) = 1 - \sum_{j=1}^m({p_j}^2)
  • 설명 : pp는 0~1사이의 확률로, pjp_j는 각 노드에서 jj번째 클래스의 비율을 의미한다. 위 그림을 예로 들어 설명하면 어떤 노드에서 전체 10개중 파란 구슬이 3개 들어있는 비율을 p1p_1, 빨간 구슬이 7개 들어있는 비율은 p2p_2라고 정의한다면, 각 비율을 제곱하여 뺴주면 된다. 결국 지니 계수 Gini(D)Gini(D)1((310)2+(710)2)=0.421 - \big((\frac{3}{10})^2+(\frac{7}{10})^2\big)=0.42 으로 42%의 불순도를 가지게 된다.

엔트로피

  • 정의 : 엔트로피(Enthropy)는 노드의 불확실성이나 무질서도를 측정하는 척도로써, 계산 방식에서 제곱이아닌 밑이 2인로그를 이용하여 곱하는 점에서 차이가 있다. (이 전장의 로지스틱손실함수와 비슷하지만 로지스틱 손실함수는 두 확률의 차이를 나타낸다.)
  • 계산 방식 : 1j=1J(pjlog2(pj))1 - \sum_{j=1}^J\big(p_j*log_2(p_j)\big)
  • 설명 : 엔트로피 값이 높을수록 데이터가 더 무질서하고 혼합되어 있음을 나타낸다.

정보 이득

정보 이득(Information Gain)이란 부모노드와 자식노드사이의 불순도의 차이를 이야기한다. 결정트리 모델에서는 이 정보이득을 가능한 최대화 시킬수 있도록 트리를 성장시키는데, 이때 분할하기 전 데이터셋의 불순도에서 분할 한 후의 불순도의 합을 빼는 식으로 계산하며 아래와 같은 식으로 계산될 수 있다.

Formula

IG(D,A)=Gini(D)j=1k(DjDGini(D))IG(D,A) = Gini(D) - \sum_{j=1}^k\big(\frac{|D_j|}{|D|}\cdot Gini(D)\big)

  • IG(D,A)IG(D,A) : 데이터셋 DD에 대해 특성 AA로 분할 할경우의 정보이득
  • kk : 특성 AA로 분할한 후 생성되는 하위 데이터 셋의 수
  • DjD_j : 분할 후 생성된 하위 데이터 셋
  • DjD\frac{|D_j|}{|D|} : 전체 데이터셋에 대한 하위 데이터셋의 크기(가중치)

가지치기

훈련데이터에 대해 최소한의 불순도를 가지도록 결정트리가 성장한다면, 훈련데이터에만 알맞는 과적합의 위험성이 매우 커진다. 이를 위해서 조기종료처럼, 결정트리가 너무 복잡해지기 전에 트리의 성장을 제한하거나 생성된 트리의 일부를 제거하는 가지치기가 필요하다. 가장 간단한 방법으로는 최대 깊이의 레벨을 지정하는 방식이있다.


02. 교차검증과 그리드 서치

교차검증

교차검증(Cross-validation)은 모델의 능력을 평가하기 위해 데이터를 여러 서브세트로 나누고 이 서브세트를 사용하여 반복적으로 훈련하고 검증하는 방법이다. 이 방법을 사용하여 모델이 특정한 훈련세트에 의존하는 것을 방지하고 실제 적용에서의 성능을 좀더 정확히 측정할 수 있다. sklearn.model_selection의의 cross_validate기능을 함수를 이용하여 쉽게 사용가능하다.

기본적인 교차검증 방식들

K-겹 교차검증 (K-Fold)

데이터를 K개의 서브세트로 나누고, K번에 걸쳐 각기 다른 폴드를 검증 세트로 사용하고 나머지를 훈련 세트로 사용한다.
업로드중..

Stratified K-Fold

전체 데이터를 섞은 후 클래스의 비율들을 유지하며 K-Fold를 수행한다.

그리드 서치

그리드 서치(Grid search)란 하이퍼파라미터 듀닝을 위한 방법으로 모델의 성능을 최대화 할수있는 최적의 하이퍼파라미터 조합을 시스템이 반복하여 탐색한 후, 최적의 조합을 찾아내는 방법이다. sklearn.modelselection의 GridSearchCV를 이용하여 탐색할 매개변수와 간격을 지정하고 자동화 하여 매번 모델의 하이퍼파라미터의 조합을 찾아내는 수고를 덜어 낼 수있다. 그리드 서치를 이용해 최적의 하이퍼파라미터를 찾고(이 값이 적용된 모델은 .best_estimator에 저장된다.), 이를 교차검증을 이용해 평가하는 방식으로 모델의 일반화 능력을 더 정확하게 평가할 수 있다.

  • 랜덤 서치 : 그리드 서치를 진행할때, 시스템 자원과 시간을 줄이기 위해 무작위 샘플링을 사용하여 빠르게 탐색하는 것. sklearn.model_selection의 RandomizeSearchCV를 이용한다.

03. 트리의 앙상블

트리의 상상블(Tree ensemble)은 여러 개의 결정 트리를 결합하여 개별 트리모델의 한계를 보완하고, 예측의 정확도를 향상시키는 머신러닝 기법이다. 이처럼 여러 모델을 결합하여 성능을 향상시키는 방법을 앙상블학습(Ensemble Learning)이라고 한다.

앙상블 학습의 대표적인 종류

랜덤 포레스트

랜덤포레스트(Random Forest)는 결정트리를 랜덤하게 만들어 각 결정 트리의 예측을 사용해 최종 예측을 만든다. 여러개의 트리를 결합함으로써 단일 트리보다 더 높은 정확도를 가질 수 있고, 각 트리의 과적합 평균화하여 전체 모델에서의 과적합 위험성을 줄인다.

동작 방식

1. 부트스트랩 샘플링 : 원본 훈련데이터 세트에서 원본 세트와 크기는 같지만, 중복되거나 누락될 수 있는 부트스트랩 샘플들을 생성한다.
2. 결정 트리 구축 : 각 부트스트램 샘플에 대해 결정 트리를 구축한다. 이때, 각 트리는 무작위로 선택된 소수의 특성만을 고려하여 분할 기준을 결정한다.
3. 예측 결합 및 최종 모델 형성 : 회귀의 경우 개별트리 예측값의 평균을 취한다. 분류의 경우 각 트리의 클래스별 확률을 평균하여 가장 높은 확율을 가진 클래스를 예측결과로 결정한다.

엑스트라 트리

랜덤포레스트와 비슷하지만, 부트스트램 샘플을 사용하지 않고 전체 데이터를 사용하여 훈련한다. 대신 노드를 분할 할때 가장 좋은 분할(정보이득의 최대화)이 아닌 무작위 분할을 진행함으로써 트리의 다양성을 증가 시키고 빠른 훈련 속도를 갖는다.

그레디언트 부스팅

그레디언트 부스팅(Gradient Boosting)은 깊이가 얕은 결정트리를 순차적으로 학습시키면서, 이전 학습기의 오차를 보완하는 방식으로 앙상블하는 방법이다. 경사하강법을 사용하여 트리의 손실값을 줄여가며 깊이가 얕은 트리를 추가하는 방식으로 작동한다. 랜덤포레스트보다 조금 더 높은 성능을 얻을 수 있지만, 순서대로 트리를 추가하며 업데이트 하기 때문에 훈련속도가 느리고 자원을 많이 사용한다.

동작 방식

1. 초기모델 생성 : 전체 훈련 데이터에 대해 깊이가 낮은 트리를 훈련한다.
2. 그레디언트 계산 및 새 모델 훈련 : 각 데이터 샘플에서 손실함수를 계산하여 이전의 트리보다 더 낮은 손실값을 갖는 얕은 트리를 훈련한다.
3. 모델 결합 및 가중치 업데이트 : 새 모델의 예측을 이전 모델에 추가하여 모델을 업데이트 한다. 이때 학습률(Learning Rate)가중치를 이용해 이전 트리를 얼마나 업데이트를 할지 결정한다.
4. 반복 학습 및 최종 모델 형성: 지정된 수의 트리가 추가되거나, 오류가 일정 기준 이하가 될때까지 이 과정을 계속해서 반복한다. 최종 모델은 모든 트리의 예측의 합으로 구성된다.

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

히스토램 기반 그레디언트 부스팅(Histogram-based Gradient Boosting)은 기존 그레디언트 부스팅 방법을 개선한 알고리즘으로 입력 특성의 각 연속 변수를 고정된 수의 여러 구간으로 나누고, 히스토그램을 생성하여 각 구간의 요약된 정보만을 이용하여 최적의 분할을 찾는다. 이렇게 하여 모든 샘플을 고려하는 것보다 계산의 효율성이 극대화되고, 메모리를 적게 사용할 수 있어 대규머 데이터 세트에 사용하기 적합하다. 또 분할 구간중 한 개의 구간을 누락된 값을 위해 남겨두고 할당하여 누락값에 대한 전처리가 없어도 전체 데이터에 대해 효율적으로 훈련이 가능하다.

동작 방식

1. 히스토그램 생성 : 연속적인 특성 값을 고정된 수의 구간으로 나눈다. 예를 들어 '주택의 가격' 이라는 특성이 있고 여러 가격의 주택이 있다면 각 가격 (ex: 3억 2500만원, 4억 2천만원, 5억 6천만원, 7억 3천만원...)으로 모델을 훈련하는 것이 아니라 , 일정한 구간을 설정하여 속하게 한다.(ex: 5억 6천만원짜리 주택은 5억-6억 구간에 속한다.)
2. 순차적 트리 구축 : 그레디언트 부스팅처럼 구간화된 데이터를 기반으로 간단한 트리를 생성하고, 손실값을 줄이고 이전 트리의 업데이트를 진행하는 일을 반복하며 새로운 트리를 추가한다.
3. 누락 값 처리 : 누락값을 위해 할당된 구간에 누락된 값이 있는 샘플들을 모아 별도로 관리한다.
4. 최종 모델 형성: 지정된 수의 트리가 추가되거나, 오류가 일정 기준 이하가 될때까지 이 과정을 계속해서 반복한다. 최종 모델은 모든 트리의 예측의 합으로 구성된다.

XGBoost(eXtream Gradient Boosting)

XGBoost는 그레디언트 부스팅 알고리즘을 효율적으로 구현한 라이브러리로, 높은 성능과 빠른 속도로 널리 사용된다.

특징

  • 정규화된 학습 : 손실함수에 정규화 항을 포합하여 과적합을 방지한다.
  • 트리 가지치기 : 최대깊이까지 트리가 성장한 후, 가지치기를 통해 과적합을 방지한다.
  • 빠른 속도 : 병렬 처리, 캐시 최적화 등의 기법으로 빠른 학습 속도를 제공한다.
  • 유연성 : 다양한 종류의 손실함수와 사용자 정의 함수를 지원한다.
  • 결손값 처리 : 누락된 데이터를 자체적으로 처리할 수 있다.

LightGBM (Light Gradient Boosting Machine)

LightGBM는 마이크로소프트에서 개발한 그레디언트 부스팅 프레임워크로 적은 메모리 사용량과 빠른 학습속도, 높은 정확도가 특징이다. 하지만 리프중심의 트리 성장방식으로 과적합에 민감하기 때문에 10,000개이상의 데이터에서 사용하는 것이 더욱 좋다.

특징

  • 히스토그램 기반 학습 : 특성값을 구간으로 나누어 빠르게 학습한다.
  • 리프중심의 트리 성장 : 최대 손실값을 가지는 리프노드를 계속해서 분할하면서, 비대칭적인 트리를 생성한다. 즉 손실값이 가장 큰 부분을 계속 분할하여 손실값을 최대한으로 줄이고 다른노드의 분할이 없어 메모리를 절약하고 속도를 증가시킬 수 있다.
  • 효율적인 메모리사용 : 병렬 처리, 네트워크 통신 최적화를 통해 빠른 학습 속도를 제공한다.
  • 결손값 처리 : 누락된 데이터를 자체적으로 처리할 수 있다.

앙상블 학습은 그리드 서치, 랜덤 서치를 사용한 하이퍼파라미터 튜닝과 함께 사용하여 머신러닝 지도학습 모델의 성능을 극대화 할 수 있다. 수작업으로 일일히 모든 조건에 대해 최적의 값을 찾지 않아도, 반드시 복잡한 수학적인 사고를 통해 가중치를 조절하지 않아도 된다는 점은 머신러닝 분야에 대해 오해하고 있던 부분이 풀리고 마음이 좀 편해지는 느낌이었다. 물론 실제 문제를 해결하기 위해 모델을 구축한다면 컴퓨팅 자원, 데이터가 가진 특성들에 대하여 여러 시각으로 고려해야할 점이 많고... 다양한 경험을 통해 직관을 길러야할 필요성이 있을 것 같다.

profile
이제 진짜 개발하려구요!

0개의 댓글