본문 바로가기
Study/혼자 공부하는 머신러닝 + 딥러닝

[혼자 공부하는 머신러닝 + 딥러닝] 트리의 앙상블

by kimdaepadata 2024. 11. 11.

 

지금까지 다루었던 데이터를 돌아보면 전부 다 정형 데이터(Structured data)였습니다.

그리고 지금까지 배운 머신러닝 알고리즘은 정형 데이터에 잘 맞는 알고리즘이였습니다.

그 중에 사이킷런에서 제공하는 정형 데이터의 끝판왕인 앙상블 학습 알고리즘을 알아보겠습니다.

 

 

랜덤 포레스트(Random Forest)


 

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

앙상블 학습을 적용할 땐 가장 먼저 랜덤 포레스트를 시도해 보길 권합니다.

 

 

이름처럼 랜덤 포레스트는 결정 트리를 랜덤하게 만들어 결정 트리(나무)의 숲을 만드는 것입니다.

그리고 각 결정 트리의 예측을 사용해 최종 예측을 만듭니다.

 

 

그럼 어떻게 숲을 구성하는지 관찰해보겠습니다.

예를 들어 1,000개 가방에서 100개씩 샘플을 뽑는다면 먼저 1개를 뽑고, 뽑았던 1개를 다시 가방에 넣습니다.

이런 식으로 계속해서 100개를 가방에서 뽑으면 중복된 샘플을 뽑을 수 있습니다.

이렇게 만들어진 샘플을 부트스트랩 샘플(Bootstrap Sample)이라고 합니다.

 

 

기본적으 부트스트랩 샘플은 훈련 세트의 크기와 같게 만듭니다.

1,000개 가방에서 중복하여 1,000개의 샘플을 뽑기 때문에 부트스트랩 샘플은 훈련 세트와 크기가 같습니다.

 

 

또한 각 노드를 분할할 때 전체 특성 중에서 일부 특성을 무작위로 고른 다음 이 중에서 최선의 분할을 찾습니다.

분류 모델인 RandomForestClassifier는 기본적으로 특성 개수의 제곱근만큼의 특성을 선택하고,

회귀 모델인 RandomForestRegressor는 전체 특성을 사용합니다.

 

 

사이킷런의 랜덤 포레스트는 기본적으로 100개의 결정 트리를 이 방식으로 훈련합니다.

그 다음 분류일 때는 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 삼습니다.

반면, 회귀일 때는 단순히 각 트리의 예측을 평균합니다.

 

 

랜덤 포레스트의 장점은 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합되는 것을 막아줍니다.

또한, 검증 세트와 테스트 세트에서 안정적인 성능을 얻을 수 있습니다.

 

 

그럼 이제 실습을 해보겠습니다.

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

 

 

데이터는 준비되었으니 이제 교차검증을 수행해 보겠습니다.

RF n_jobs = -1 : 모든 CPU 코어 사용 ❘ cross_validate n_jobs = -1 : 최대한 병렬로 교차검증

 

출력 결과를 본다면 과대적합되있다고 판단할 수 있습니다.

여기에서는 알고리즘 실습을 해본 것이므로 매개변수는 조정하지 않도록 하겠습니다.

 

 

랜덤 포레스트는 결정 트리의 앙상블이기 때문에 DecisionTreeClassifier가 제공하는 중요한 매개변수를 모두 제공합니다.

그리고 결정 트리처럼 특성 중요도도 계산을 하는데, 랜덤 포레스트의 특성 중요도각 결정 트리의 특성 중요도를 취합한 것입니다.

한번 출력해보겠습니다.

 

잘 나오는 것을 확인할 수 있습니다.

 

 

그리고 RandomForestClassifier에는 자체적으로 모델을 평가하는 점수를 얻을 수 있습니다.

랜덤 포레스트는 훈련 세트에서 중복을 허용하여 부트스트랩 샘플을 만들어 결정 트리를 훈련한다고 했습니다.

이 때 부트스트랩 샘플에 포함되지 않고 남은 샘플이 있는데 이를 OOB(Out Of Bag)샘플이라고 합니다.

이 OOB 샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있습니다.

 

 

이를 평가하기 위해서는 RandomForestClassifier 클래스의 oob_score 매개변수를 True로 지정해야 합니다.

이렇게 하면 랜덤 포레스트는 각 결정 트리의 OOB 점수를 평균하여 출력합니다.

 

 

이렇게 OOB 점수를 사용하면 교차 검증을 대신할 수 있기 때문에 결과적으로 훈련 세트에 더 많은 샘플을 사용할 수 있습니다.

 

 

 

엑스트라 트리(Extra Tree)


 

엑스트라 트리는 랜덤 포레스트와 매우 비슷하게 동작합니다.

기본적으로 100개의 결정 트리를 훈련하고, 결정 트리가 제공하는 대부분의 매개변수를 지원합니다.

또한 전체 특성 중에 일부 특성을 랜덤하게 선택하여 노드를 분할하는데 사용합니다.

 

 

엑스트라 트리와 랜덤 포레스트의 차이점은 부트스트랩 샘플을 사용하지 않는다는 점입니다.

즉, 각 결정 트리를 만들 때 전체 훈련 세트를 사용합니다.

대신 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할합니다.

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

 

 

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

한번 실습해보겠습니다.

 

 

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

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

 

 

그래디언트 부스팅(Gradient boosting)


 

그래디언트 부스팅은 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 앙상블 방식입니다.

사이킷런의 GradientBoostingClassifier는 기본적으로 깊이가 3인 결정 트리를 100개 사용합니다.

깊이가 얕은 결정 트리를 사용하기 때문에 과대적합에 강하고 일반적으로 높은 일반화 성능을 기대할 수 있습니다.

 

 

그래디언트 부스팅은 경사 하강법을 사용하여 트리를 앙상블에 추가합니다.

분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용합니다.

 

 

그래디언트 부스팅은 경사 하강법처럼 결정 트리를 계속 추가하면서 가장 낮은 곳을 찾아 이동합니다.

물론 천천히 나아가야 하기 때문에 깊이가 얕은 결정트리를 사용하는 것입니다.

한번 실습해보겠습니다. 

 

 

다른 방식들과 다르게 과대적합이 되지 않은 모습을 보입니다.

그래디언트 부스팅은 결정 트리의 개수를 늘려도 과대적합에 매우 강하고,
학습률을 증가시키고 트리의 개수를 늘리면 성능이 향상될 수 있습니다.

 

 

일반적으로 그래디언트 부스팅이 랜덤 포레스트보다 조금 더 높은 성능을 얻을 수 있습니다.

하지만 순서대로 트리를 추가하기 때문에 훈련 속도가 느려집니다.

즉, GradientBoostingClassifier에는 n_jobs 매개변수가 없습니다.

 

 

 

히스토그램 기반 그래디언트 부스팅(Histogram-based Gradient Boosting)


 

히스토그램 기반 그래디언트 부스팅은 정형 데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘입니다.

히스토그램 기반 그래디언트 부스팅은 먼저 입력 특성을 256개의 구간으로 나눕니다.

따라서 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있습니다.

 

 

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

그렇기 때문에 입력에 누락된 특성이 있어도 따로 전처리할 필요가 없습니다.

 

 

사이킷런의 히스토그램 기반 그래디언트 부스팅 클래스는 HistGradientBoostingClassifier입니다.
일반적으로 기본 매개변수에서 안정적인 성능을 얻을 수 있습니다.

만약 트리의 개수를 지정하려면 n_estimators 대신 부스팅 반복 횟수를 지정하는 max_iter를 사용하면 됩니다.

 

 

히스토그램 기반 그래디언트 부스팅의 특성 중요도는 다른 알고리즘의 방식과 다르게
permutation_importance() 함수를 사용해서 계산합니다.

이 함수는 특성을 하나씩 랜덤하게 섞어서 모델의 성능이 변화하는지를 관찰하여 어떤 특성이 중요한지 계산합니다.

그럼 한번 계산해보겠습니다.

n_repeats : 랜덤하게 섞을 횟수 지정, 기본값은 5

 

값이 3가지가 나오는데 각 값은 특성 중요도(importances), 평균(importances_mean), 표준 편차(importances_std)입니다.

 

 

이제 최종적인 성능을 확인해보겠습니다.

 

테스트 세트에서 약 87% 정확도를 얻은 것을 확인할 수 있습니다.

 

 

사이킷런 말고도 히스토그램 기반 그래디언트 부스팅 알고리즘을 구현한 라이브러리가 여럿 있습니다.

바로 XGBoost LightGBM입니다.

이는 책에 자세히 나와있지 않아 다음에 따로 블로그에 작성해보겠습니다.

 

 

출처 : 혼자 공부하는 머신러닝 + 딥러닝

https://product.kyobobook.co.kr/detail/S000001810330

 

다음은 타깃이 없는 비지도 학습 중 군집 알고리즘에 대해 포스팅 하겠습니다.