일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- numpy/pandas
- 파이썬라이브러리
- 데이터입출력구현
- 머신러닝
- 정수와유리수
- 데이터분석
- JSP/Servlet
- 딥러닝
- CSS
- 정보처리기사실기
- 코딩테스트
- 파이썬
- 컴퓨터비전
- SQL
- 자바 실습
- CNN
- 정보처리기사필기
- 텍스트마이닝
- 연습문제
- 데이터베이스
- pandas
- html/css
- C++
- 중학수학
- 중학1-1
- 자바
- 혼공머신
- 운영체제
- 컴퓨터구조
- 영어공부
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
트리 알고리즘 5 - 트리의 앙상블 1 : 트리 앙상블의 한 종류인 랜덤 포레스트, 엑스트라 트리, 그라이디언트 부스팅 등에 대하여 본문
트리 알고리즘 5 - 트리의 앙상블 1 : 트리 앙상블의 한 종류인 랜덤 포레스트, 엑스트라 트리, 그라이디언트 부스팅 등에 대하여
huenuri 2024. 9. 30. 07:57이제 5단원의 마지막 장인 트리 앙상블에 대해서 학습해보려고 한다. 이번 단원도 그래프는 하나도 없고 코드만 있지만 그래도 재미있게 학습을 진행하려고 한다.
트리 앙상블로 처음 공부해 보는 내용이다.
학습 목표
앙상블이 무엇인지 이해하고 다양한 앙상블 학습 알고리즘을 배운다.
시작하기 전에
혼공머신은 이제 베스트 머신러닝 알고리즘을 찾아보려고 한다. 그리고 랜덤 포레스트라는 알고리즘에 눈길이 간다.
가장 좋은 알고리즘이 있다고 해서 다른 알고리즘을 배울 필요가 없는 것은 아니다. 보편적으로 성능이 좋아 널리 사용되는 알고리즘이 있지만 문제마다 다를 수 있다. 그렇기에 어떤 알고리즘이 더 뛰어나다고 미리 판단해서는 안된다.
정형 데이터와 비정형 데이터
지난 학습을 되돌아보자. 4장까지 생선의 길이, 높이, 무게 등을 데이터로 사용했다. 이 데이터는 CSV 파일에 가지런히 정리되어 있었다. 이런 형태의 데이터를 정형 데이터라고 한다. 쉽게 말해 어떤 구조로 되어 있다는 뜻이다.
사실 프로그래머가 다루는 대부분의 데이터는 정형 데이터이다. 비정형 데이터는 이와 반대되는 데이터로, 데이터베이스나 엑셀로 표현하기 어려운 것들이다. 우리 주위에서 찾아보면 텍스트 데이터, 디지털카메라로 찍은 사진, 핸드폰으로 듣는 디지털 음악 등이 있다.
지금까지 배운 머신러닝 알고리즘은 정형 데이터에 잘 맞는다. 그중에 앙상블 학습은 정형 데이터를 다루는 데 가장 뛰어난 성과를 내는 알고리즘이다. 이 알고리즘은 대부분 결정 트리를 기반으로 만들어져 있다.
그럼 비정형 데이터에는 어떤 알고리즘을 사용해야 할까? 그것은 신경망 알고리즘이다. 비정형 데이터는 규칙성을 찾기 어려워 전통적인 머신러닝 방법으로는 모델을 만들기 까다롭다. 하지만 신경망 알고리즘의 놀라운 발전 덕분에 사진을 인식하고 텍스트를 이해하는 모델을 만들 수 있다. 이제 앙상블 학습 알고리즘을 알아보겠다.
랜덤 포레스트
랜덤 포레스트는 앙상블 학습의 대표 주자 중 하나로 안정적인 성능 덕분에 널리 사용되고 있다. 이름 자체로 유추할 수 있듯이 랜덤 포레스트는 결정 트리를 랜덤하게 만들어 결정 트리(나무)의 숲을 만든다. 그리고 각 결정 트리의 예측을 사용해 최종 예측을 만든다.
먼저 랜덤 포레스트는 각 트리를 훈련하기 위한 데이터를 랜덤하게 만드는데, 이 데이터를 만드는 방법이 독특하다. 우리가 입력한 훈련 데이터에서 랜덤하게 샘플을 추출하여 훈련 데이터를 만든다. 이때 한 샘플이 중복되어 추출될 수도 있다.
예를 들어, 1000개의 샘플이 들어있는 가방에서 100개의 샘플을 뽑는다면 먼저 1개를 뽑고, 뽑았던 1개를 다시 가방에 넣는다. 이런 식으로 계속해서 100개를 가방에서 뽑으면 중복된 샘플을 뽑을 수 있다. 이렇게 만들어진 샘플을 부트스트랩 샘플이라고 부른다. 기본적으로 부트스트랩 샘플은 훈련 세트의 크기와 같게 만든다.
또한 각 노드를 분류할 때 전체 특성 중에서 일부 특성을 무작위로 고른 다음 이중에서 최선의 분할을 찾는다. 분류 모델인 RandomForestClassifier는 기본적으로 특성 개수의 제곱근만큼의 특성을 선택한다. 즉 4개의 특성이 있다면 노드마다 2개를 랜덤하게 선택하여 사용한다. 다만 회귀 모델은 RandomForestClassifier는 전체 특성을 사용한다.
사이킷런의 랜덤 포레스트는 기본적으로 100개의 결정 트리를 이런 방식으로 훈련한다. 그다음 분류일 때는 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 삼는다. 회귀일 때는 단순히 각 트리의 예측을 평균한다.
랜덤 포레스트는 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합되는 것을 막아주고 검증 세트와 테스트 세트에서 안정적인 성능을 얻을 수 있다.
이제 RandomForestClassifier 클래스를 화이트 와인을 분류하는 문제에 적용해 보자.
이전에 했던 거처럼 와인 데이터셋을 판다스로 불러오고 훈련 세트와 테스트 세트로 나눈다. 그런 다음 cross_validate() 함수를 사용해 교차 검증을 수행한다. 매개변수를 -1로 지정하여 최대한 병렬로 교차 검증을 수행한다. 또 return_train_score 매개변수를 True로 지정하면 검증 점수뿐만 아니라 훈련 세트에 대한 점수도 같이 반환한다.
출력된 결과를 보면 훈련 세트에 다소 과대적합된 것 같다. 랜덤 포레스트는 결정 트리의 앙상블이기 때문에 DecisionTreeClassifier가 제공하는 중요한 매개변수를 모두 제공한다. 결정 트리의 큰 장점 중 하나인 특성 중요도를 계산한다.
각각 [알코올, 도수, 당도, pH]였는데, 두 번째 특성인 당도의 중요도가 감소하고 알코올 도수와 pH 특성의 중요도가 조금 상승했다. 이런 이유는 랜덤 포레스트가 특성의 일부를 램덤하게 선택하여 결정 트리를 훈련하기 때문이다. 그 결과 하나의 특성에 과도하게 집중하지 않고 좀더 많은 특성이 훈련에 기여할 기회를 얻는다. 이는 과대적합을 줄이고 일반화 성능을 높이는데 도움이 된다.
RandomForestClassifier에는 재미있는 기능이 하나 더 있는데, 자체적으로 모델을 평가하는 점수를 얻을 수 있다. 램덤 포레스트는 훈련 세트에서 중복을 허용하여 부트스트랩 샘플에 포함되지 않고 남는 샘플이 있다. 이런 샘플을 OOB 샘플이라고 한다. 이 남는 샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있다.
교자 검증에서 얻은 점수와 매우 비슷한 결과를 얻었다. OOB 점수를 사용하면 교차 검증을 대신할 수 있어서 결과적으로 훈련 세트에 더 많은 샘플을 사용할 수 있다.
엑스트라 트리
엑스트라 트리는 랜덤 포레스트와 매우 비슷하게 동작한다. 기본적으로 100개의 결정 트리를 훈련한다. 랜덤 포레스트와 동일하게 결정 트리가 제공하는 대부분의 매개변수를 지원한다. 또한 전체 특성 중에 일부 특성을 랜덤헤게 선택하여 노드를 분할하는 데 사용한다.
랜덤 포레스트와 엑스트라 트리의 차이점은 부트스트랩 샘플을 사용하지 않는다는 점이다. 즉 각 결정 트리를 만들 때 전체 훈련 세트를 사용한다. 대신 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할한다.
하나의 결정 트리에서 특성을 무작위로 분할한다면 성능이 낮아지겠지만 많은 트리를 앙상블 하기 때문에 과대적합을 목고 검증 세트의 점수를 높이는 효과가 있다.
이 모델의 교차 검증 점수를 확인해보면 랜덤 포레스트와 비슷한 결과가 나온다. 보통 엑스트라 트리가 무작위성이 좀 더 크기 때문에 랜덤 포레스트보다 더 많은 결정 트리를 훈련해야 한다. 하지만 랜덤하게 노드를 분할하기 때문에 빠른 계산 속도는 엑스트라 트리의 장점이다.
그레이디언트 부스팅
그레이디언트 부스팅은 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법이다. 사이킷런의 GradientBoostingClassifier는 기본적으로 깊이가 3인 결정 트리를 100개 사용한다. 깊이가 얕은 결정 트리를 사용하기 때문에 과대적합에 강하고 일반적으로 높고 일반화 성능을 기대할 수 있다.
이것은 경사 하강법을 사용하여 트리를 앙상블에 추가한다. 분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용한다.
거의 과대적합되지 않았다. 그레이디언트 부스팅은 결정 트리의 개수를 늘려도 과대적합에 매우 강하다. 학습률을 증가시키고 트리의 개수를 늘리면 조금 더 성능이 향상될 수 있다.
결정 트리의 개수를 500개로 5배나 늘렸지만 과대적합을 잘 억제하고 있다. 학습률 learning rate의 기본값은 0.1이다.
일반적으로 그레이디언트 부스팅이 랜덤 포레스트보다 조금 더 높은 성능을 얻을 수 있다. 하지만 순서대로 트리를 추가하기 때문에 훈련 속도가 느리다. 그레이디언트 부스팅의 속도와 성능을 더욱 개선한 것이 히스토그램 기반 그레이디언트 부스팅이다.
히스토그램 기반 그레이디언트 부스팅
히스토그램 기반 그레이디언트 부스팅은 정형 데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘이다. 먼저 입력 특성을 256개의 구간으로 나누기에 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있다. 이 부스팅은 256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해 사용한다. 따라서 입력에 누락된 특성이 있더라도 따로 전처리할 필요가 없다.
사이킷런의 히스토그램 기반 그레이디언트 부스팅 클래스는 HistGradientBoostingClassifier이다.
이것은 과대적합을 잘 억제하면서 그레이디언트 부스팅보다 조금 더 높은 성능을 제공한다. 히스토그램 기반 그레이디언트 부스팅의 특성 중요도를 계산하기 위해 permutation_importance() 함수를 사용한다. 이 함수는 특성을 하나씩 랜덤하게 섞어서 모델의 성능이 변화하는지 관찰하고 어떤 특성이 중요한지 계산한다.
테스트 결과를 보면 그레이디언트 부스팅과 비슷하게 조금 더 당도에 집중하고 있다는 것을 알 수 있다. 이런 분석을 통해 모델을 실전에 투입했을 때 어떤 특성에 관심을 둘지 예상할 수 있다.
사이킷런 말고도 그레이디언트 부스팅 알고리즘을 구현한 라이브러리가 여럿 있다. 가장 대표적인 라이브러리는 XGBoost이다. 이 라이브러리도 코랩에서 사용할 수 있고 사이킷런의 cross_validate() 함수와 함께 사용할 수 있다. XGBoost는 다양한 부스팅 알고리즘을 지원한다.
또 다른 히스토그램 기반 그레이디언트 부스팅 라이브러리는 마이크로소프트에서만 든 LightGBM이다. LightGBM은 빠르고 최신 기술을 많이 적용하고 있어 인기가 점점 높아지고 있다.
사실 사이킷런의 히스토그램 기반 그레이디언트 부스팅이 LightGBM에서 영향을 많이 받았다.
학습을 마치고
이번 장은 정말 지루하고 공부가 너무 하기 싫고 건너뛰고 싶은 마음이 많았지만 그래도 끝까지 남은 학습을 진행했다. 강의는 솔직히 들어도 무슨 말인지 잘 모르겠고 이해도 되지 않아서 대부분 책을 위주로 학습하며 정리해 보았다.
이제 실습을 진행하며 이 단원에서 배운 내용을 깊이 있게 학습해 볼 것이다.
'인공지능 > 머신러닝' 카테고리의 다른 글
비지도 학습 1 - 군집 알고리즘 1 : 군집 알고리즘으로 사진을 분류해보기 (0) | 2024.09.30 |
---|---|
트리 알고리즘 6 - 트리의 앙상블 2 : 스스로 실습하고 문제를 풀어보는 시간 (0) | 2024.09.30 |
트리 알고리즘 4 - 교차 검증과 그리드 서치 2 : 스스로 실습하고 문제를 풀어보는 시간 (0) | 2024.09.30 |
트리 알고리즘 3 - 교차 검증과 그리드 서치 1 : 교차 검증 및 그리스 서치와 랜덤 서치의 차이를 알고 최적의 성능을 내는 방법 (2) | 2024.09.30 |
트리 알고리즘 2 - 결정 트리 2 : 스스로 실습하고 문제 풀어보는 시간 (0) | 2024.09.29 |