머신러닝

[혼자 공부하는 머신러닝+딥러닝] - 트리 알고리즘

주니빙 2023. 11. 11. 23:40

트리의 앙상블

 

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

정형 데이터란?

정형 데이터는 구조화되고 일관된 형식을 갖춘 데이터를 의미한다. 이러한 데이터는 행과 열의 테이블 형태로 표현되며, 각 열은 고정된 데이터 유형을 갖고 있다. 이런 데이터는 CSV나 데이터베이스, 혹은 엑셀에 저장하기 쉽다.

비정형 데이터란?

비정형 데이터는 구조화되지 않은 형식을 갖춘 데이터를 의미한다. 이러한 데이터는 테이블 형태가 아니며, 다양한 형태로 존재한다. 예를 들면 텍스트, 이미지, 오디오, 비디오 등이 있다.

앙상블 학습이란?

앙상블 학습은 정형 데이터를 다루는데 가장 뛰어난 성과를 내는 알고리즘이다. 이 알고리즘은 대부분 결정 트리를 기반으로 만들어져 있다.

정형 데이터는 앙상블 학습 알고리즘을, 비정형 데이터는 신경망 알고리즘을 사용한다.

 

랜덤 포레스트

랜덤 포레스트란?

랜덤 포레스트는 앙상블 학습의 대표 주자 중 하나로 안정적인 성능을 가진다. 각각의 결정 트리는 랜덤한 부분집합 데이터로 학습되며, 예측을 할 때에는 이 모든 결정 트리의 예측 결과를 평균하여 최종 예측을 내놓는다.

부트스트랩 샘플이란?

부트스트랩 샘플은 랜덤 포레스트에서 사용되는 개별 결정 트리를 학습시키기 위해 사용되는 데이터의 일부분이다. 이는 전체 데이터셋에서 무작위로 선택된 샘플이며, 중복이 허용된다. 부트스트랩 샘플을 사용하여 결정 트리를 학습시키면, 각 결정 트리는 조금씩 다른 데이터로 학습되어 다양성을 가지게 된다.

예를 들어 1,000개의 샘플이 들어있는 가방에서 100개씩 샘플을 뽑는다면 먼저 1개를 뽑고, 뽑았던 1개를 가방에 넣어 중복된 샘플을 뽑는 것이 가능하게 하는 것이다.

RandomForestClassifier란?

RandomForestClassifier는 랜덤 포레스트 앙상블 학습 알고리즘을 구현한 scikit-learn 라이브러리의 클래스이다. 이 알고리즘은 다수의 결정 트리를 사용하여 분류 작업을 수행한다. 각 결정 트리는 랜덤하게 선택된 부트스트랩 샘플로 학습된다.

 

분류는 샘플을 몇 개의 클레스 중 하나로 분류하는 문제이고, 회귀는 임의의 어떤 숫자를 예측하는 문제이다.

분류 모델인 RandomForestClassifier는 기본적으로 전체 특성 개수의 제곱근만큼의 특성을 선택하고, 회귀 모델인 RandomForestClassifier는 전체 특성을 사용한다. 또한 분류일 때는 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 삼고, 회귀일 때는 단순히 각 트리의 예측을 평균한다.

 

이제 사이킷런의 RandomForestClassifier 클래스를 이용하여 화이트 와인을 분류하는 문제에 적용해본다.

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

wine = pd.read_csv('<https://bit.ly/wine_csv_data>')

data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()

train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)

와인 데이터셋을 판다스로 불러온 후 훈련 세트와 테스트 세트로 나누어준다.

from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(rf, train_input, train_target, return_train_score=True, n_jobs=-1)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))

 

cross_validate() 함수란?

cross_validate() 함수는 사이킷런의 모델 평가 함수 중 하나로, 교차 검증을 수행하여 모델의 성능을 평가하는 데 사용된다. 이 함수는 주어진 모델과 데이터에 대해 지정된 평가 지표를 계산하고, 교차 검증의 결과를 반환한다.

 

cross_validate() 함수를 사용해 교차 검증을 수행하고 return_train_score 매개변수를 True로 지정하면 검증 점수뿐만 아니라 훈련 세트에 대한 점수도 같이 반환된다. 훈련 세트와 검증 세트의 점수를 비교하면 과대적합을 파악하는 데 용이하다.

출력된 값인 훈련 세트와 검증 세트의 점수를 비교하면 이는 훈련 세트에 다소 과대적합 되었다.

 

랜덤 포레스트 모델을 훈련 세트에 훈련한 후 특성 중요도를 출력해본다.

‘결정 트리’에서 만든 특성 중요도(교재 234쪽)는 각각 [알코올 도수, 당도, pH]가 [0.12345626, 0.86862934, 0.0079144]이였다. 이와 비교해보면 두 번째 특성인 당도의 중요도가 감소하고 알코올 도수와 pH 특성의 중요도가 조금 상승했다.

이런 이유는 랜덤 포레스트가 특성의 일부를 랜덤하게 선택하여 결정 트리를 훈련하기 때문에 그 결과 하나의 특성에 과도하게 집중하지 않고 좀 더 많은 특성이 훈련에 기여할 기회를 얻는다. 이는 과대적합을 줄이고 일반화 성능을 높이는 데 도움이 된다.

 

RandomForestClassifier에는 자체적으로 모델을 평가하는 점수를 얻을 수 있는 기능이 있다.

랜덤 포레스트는 훈련 세트에서 중복을 허용하여 부트스트랩 샘플을 만들어 결정 트리를 훈련하는데, 이때 부트스트랩 샘플에 포함되지 않고 남는 샘플을 OOB 샘플이라고한다. 이 남는 샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있다.

ooh_score 매개변수를 True로 지정하면 각 결정 트리의 OOB 점수를 평균하여 출력한다.

OOB 점수를 출력해보니 교차 검증에서 얻은 점수와 매우 비슷한 결과를 얻음을 알 수 있다.

OOB 점수를 사용하면 교차 검증을 대신할 수 있어서 결과적으로 훈련 세트에 더 많은 샘플을 사용할 수 있다.

 

엑스트라 트리

엑스트라 트리란?

엑스트라 트리(Extra Trees)는 랜덤 포레스트와 비슷한 앙상블 학습 알고리즘이다. 엑스트라 트리는 결정 트리를 사용하여 예측을 수행하는데, 랜덤하게 분할된 후보 특성들 중에서 가장 좋은 분할을 선택한다.

 

랜덤 포레스트와 엑스트라 트리의 차이점은 부트스트랩 샘플을 사용하지 않는다는 점이다. 즉 각 결정 트리를 만들 때 전체 훈련 세트를 사용한다. 대신 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할한다.

하나의 결정 트리에서 특성을 무작위로 분할한다면 성능이 낮아지겠지만 많은 트리를 앙상블 하기 때문에 과대적합을 막고 검증 세트의 점수를 높이는 효과가 있다.

ExtraTreesClassifier 모델의 교차 검증 점수를 확인해보니 랜덤 포레스트와 비슷한 결과가 나온다.

보통 엑스트라 트리가 무작위성이 좀 더 크기 때문에 랜덤 포레스트보다 더 많은 결정 트리를 훈련해야한다.

하지만 랜덤하게 노드를 분할하기 때문에 빠른 계산 속도가 엑스트라 트리의 장점이다.

 

엑스트라 트리 또한 특성 중요도를 보면 랜덤 포레스트와 마찬가지로 결정 트리보다 당도에 대한 의존성이 작다.

 

그레이디언트 부스팅

그레이디언트 부스팅이란?

앙상블 학습 알고리즘 중 하나로, 여러 개의 결정 트리를 이어 붙여 강력한 모델을 만드는 방법이다. 그레디언트 부스팅은 이전 결정 트리의 오차를 보완하는 방식으로 순차적으로 트리를 추가하여 학습한다.

 

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

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

그레이디언트 부스팅 앙상블 학습 알고리즘의 한 종류로, 결정 트리를 사용하여 강력한 모델을 만들기 위해 여러 개의 트리를 순차적으로 학습하고 이전 결정 트리의 오차를 보완하는 방식으로 작동한다. 이는 데이터를 히스토그램으로 변환하여 학습하는 점이 특징이다. 이를 통해 데이터의 분포를 빠르게 계산하고, 높은 성능을 제공한다.