관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

트리 알고리즘 9 - 트리의 앙상블 심화 학습 본문

인공지능/머신러닝

트리 알고리즘 9 - 트리의 앙상블 심화 학습

huenuri 2024. 10. 2. 16:32

5단원의 마지막 장 트리 앙상블 학습을 시작해 본다. 이 단원만 마치고 오늘은 머신러닝 공부를 그만하려고 한다.


 

 

 

트리의 앙상블 실습해보기

 

 

랜덤 포레스트는 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합되는 것을 막아주고 검증 세트와 테스트 세트에서 안정적인 성능을 얻을 수 있다.

 

이전에 했던 거처럼 와인 데이터셋을 판다스로 불러오고 훈련 세트와 테스트 세트로 나눈다. 그런 다음 cross_validate() 함수를 사용해 교차 검증을 수행한다. 매개변수를 -1로 지정하여 최대한 병렬로 교차 검증을 수행한다. 또 return_train_score 매개변수를 True로 지정하면 검증 점수뿐만 아니라 훈련 세트에 대한 점수도 같이 반환한다.

출력된 결과를 보면 훈련 세트에 다소 과대적합된 것 같다. 랜덤 포레스트는 결정 트리의 앙상블이기 때문에 DecisionTreeClassifier가 제공하는 중요한 매개변수를 모두 제공한다. 

 

 

 

결정 트리의 큰 장점 중 하나인 특성 중요도를 계산한다.  각각 [알코올, 도수, 당도, pH]였는데, 두 번째 특성인 당도의 중요도가 감소하고 알코올 도수와 pH 특성의 중요도가 조금 상승했다. 

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


 

 

 

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

 

 

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


 

 

 

 

 

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

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

 

이 모델의 교차 검증 점수를 확인해 보면 랜덤 포레스트와 비슷한 결과이다. 보통 엑스트라 트리가 무작위성이 좀 더 크기 때문에 랜덤 포레스트보다 더 많은 결정 트리를 훈련해야 한다. 하지만 랜덤하게 노드를 분할하기 때문에 빠른 계산 속도는 엑스트라 트리의 장점이다.


 

 

 

그레이디언트 부스팅은 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법이다. 사이킷런의 GradientBoostingClassifier는 기본적으로 깊이가 3인 결정 트리를 100개 사용한다. 깊이가 얕은 결정 트리를 사용하기 때문에 과대적합에 강하고 일반적으로 높고 일반화 성능을 기대할 수 있다.

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

 

거의 과대적합되지 않았다. 그레이디언트 부스팅은 결정 트리의 개수를 늘려도 과대적합에 매우 강하다. 학습률을 증가시키고 트리의 개수를 늘리면 조금 더 성능이 향상될 수 있다.


 

 

결정 트리의 개수를 500개로 5배나 늘렸지만 과대적합을 잘 억제하고 있다. 학습률 learning rate의 기본값은 0.1이다.

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

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


 

 

 

 

히스토그램 기반 그레이디언트 부스팅은 정형 데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘이다. 먼저 입력 특성을 256개의 구간으로 나누기에 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있다. 이 부스팅은 256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해 사용한다. 따라서 입력에 누락된 특성이 있더라도 따로 전처리할 필요가 없다.

사이킷런의 히스토그램 기반 그레이디언트 부스팅 클래스는 HistGradientBoostingClassifier이다. 일반적으로 HistGradientBoostingClassifier에는 트리의 개수를 지정하는데 n_estimators 대신에 부스팅 반복 횟수를 지정하는 max_iter를 사용한다. 

 

이것은 과대적합을 잘 억제하면서 그레이디언트 부스팅보다 조금 더 높은 성능을 제공한다. 히스토그램 기반 그레이디언트 부스팅의 특성 중요도를 계산하기 위해 permutation_importance() 함수를 사용한다. 이 함수는 특성을 하나씩 랜덤하게 섞어서 모델의 성능이 변화하는지 관찰하고 어떤 특성이 중요한지 계산한다.

 

 

 

 

테스트 결과를 보면 그레이디언트 부스팅과 비슷하게 조금 더 당도에 집중하고 있다는 것을 알 수 있다. 이런 분석을 통해 모델을 실전에 투입했을 때 어떤 특성에 관심을 둘지 예상할 수 있다.

그럼 HistGradientBoostingClassifier를 사 용해 테스트 세트에서의 성능을 최종적으로 확인해 보겠다.


 

 

 

 

사이킷런 말고도 그레이디언트 부스팅 알고리즘을 구현한 라이브러리가 여럿 있다. 가장 대표적인 라이브러리는 XGBoost이다. 이 라이브러리도 코랩에서 사용할 수 있고 사이킷런의 cross_validate() 함수와 함께 사용할 수 있다. XGBoost는 다양한 부스팅 알고리즘을 지원한다.


 

 

 

 

 

경고 메시지가 떠서 앞의 이 코드를 실행시키고 설치해 주니 이제 잘 되었다. 이 오류는 Dask 라이브러리에서 발생하는 경고이며, 직접적으로 LightGBM 또는 LGBMClassifier와는 관련이 없다. Dask는 큰 데이터셋을 처리하거나 분산 처리를 위한 라이브러리이다. 이 경고는 Dask에서 query planning 기능이 사용되지 않으며, 해당 기능을 사용하려면 dask[dataframe] 패키지를 추가로 설치해야 한다는 것이다.

 

또 다른 히스토그램 기반 그레이디언트 부스팅 라이브러리는 마이크로소프트에서만 든 LightGBM이다. LightGBM은 빠르고 최신 기술을 많이 적용하고 있어 인기가 점점 높아지고 있다.

사실 사이킷런의 히스토그램 기반 그레이디언트 부스팅이 LightGBM에서 영향을 많이 받았다.

 


 

 

 

학습을 마치고

30분 만에 공부를 마치고 수학 공부를 하고 싶었는데 1시간 정도 걸렸다. 그래도 오후 일정 전에 다 마칠 수 있어 다행이었다. 이 단원에서는 앙상블 학습을 배웠다. 사이킷런에서 제공하는 앙상블 학습 알고리즘 중 랜덤 포레스트, 엑스트라 트리, 그레이디언트 부스팅, 히스토리그램 기반 그레이디언트 부스팅을 공부해 보았다.

이름도 너무 길어서 스펠링 하나 쓰는 것도 정말 힘들었다. 랜덤 포레스트는 가장 대표적인 앙상블 학습 알고리즘이다. 성능이 좋고 안정적이기 때문에 첫 번째로 시도해 볼 수 있는 앙상블 학습 중 하나라고 한다. 

 

엑스트라 트리는 랜덤 포레스트와 매우 비슷하지만 부트스트랩 샘플을 사용하지 않고 노드를 분할할 때 최선이 아니라 랜덤하게 분할한다. 이런 특징 때문에 랜덤 포레스트보다 훈련 속도가 빠르지만 보통 더 많은 트리가 필요하다.

그레이디언트 부스팅은 깊이가 얕은 트리를 연속적으로 추가하여 손실 함수를 최소화하는 앙상블 방법이다. 성능이 뛰어나지만 병렬로 훈련할 수 없기 때문에 랜덤 포레스트나 엑스트라 트리보다 훈련 속도가 조금 느리다. 

아무튼 정말 많은 것들을 배웠다. 이렇게 한번 정리해 보니 더 잘 기억되고 좋은 것 같다. 이제 외출 마치고 집에 와서 나머지 공부를 진행해 볼 것이다.