핵심 키워드
- #앙상블 학습 #랜덤 포레스트 #엑스트라 트리 #그레이디언트 부스팅
- 앙상블 학습이 무엇인지 이해하고 다양한 앙상블 학습 알고리즘을 실습을 통해 배우자
정형 데이터와 비정형 데이터
- 정형 데이트와 비정형 데이터
CSV나 데이터베이스 혹은 엑셀에 저장하기 쉬운 형태의 데이터를 정형 데이터라고 함
이와 반대되며 텍스트 데이터, 사진, 디지털 음악과 같은 형태의 데이터를 비정형 데이터라고 함
머신러닝 알고리즘은 정형 데이터에 잘 맞으며 그 중 정형 데이터를 다루는데 가장 뛰어난 성과를 내는 알고리즘이 앙상블 학습
랜덤 포레스트
- 랜덤 포레스트
랜덤 포레스트는 앙상블 학습의 대표 주자 중 하나로 안정적인 성능 덕분에 널리 사용되고 있음
랜덤 포레스트는 결정 트리를 랜덤하게 만들어 결정 트리의 숲을 만든 후 각 결정 트리의 예측을 사용해 최종 예측을 만듦
- 랜덤 포레스트 훈련 방법
먼저 랜덤 포레스트는 각 트리를 훈련하기 위한 데이터를 랜덤으로 만드는데,
우리가 입력한 훈련 데이터에서 랜덤하게 샘플을 추출하여 훈련 데이터를 만들며 이때 한 샘플이 중복되어 추출될 수 있어
중복을 허용한 샘플링을 한다고 하며 이렇게 만들어진 샘플을 부트스트랩 샘플이라고 부름
또한 각 노드를 분할할 때 최적의 분할을 찾지 못하도록 하여 과대 적합을 막기 위해
전체 특성 중에서 일부 특성을 무작위로 고른 다음 이 중에서 최선의 분할을 찾도록 함
분류 모델인 RandomForestClassifier는 기본적으로 전체 특성 개수의 제곱근만큼의 특성을 선택함
예) 4개의 특성이 있다면 노드마다 2개를 랜덤하게 선택하여 사용
다만 회귀 모델인 RandomForestRegressor는 전체 특성을 사용
이런 방식으로 결정 트리 훈련을 한 후,
분류일 때는 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 삼고
회귀일 때는 단순히 각 트리의 예측을 평균하여 구함
랜덤 포레스트는 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합되는 것을 막아주고
검증 세트와 테스트 세트에서 안정적인 성능을 얻을 수 있음
- 랜덤 포레스트 훈련
와인 데이터셋을 판다스로 불러오고 훈련 세트와 테스트 세트로 나눈 후 cross_validate() 함수를 사용해 교차 검증을 수행
RandomForestClassifier는 기본적으로 결정 트리 100개를 사용하므로 n_jobs 매개변수를 -1로 지정해 모든 CPU 코어 사용
또한 return_train_score 매개변수를 True로 지정하면 검증 점수뿐만 아니라 훈련 세트에 대한 점수도 같이 반환된
출력된 결과를 보면 훈련 세트에 다소 과대적합된 것 같음
랜덤 포레스트 모델을 훈련 세트에 훈련한 후 특성 중요도를 출력해보면 결정 트리로 만든 특성 중요도와 다르게
두 번째 특성인 당도의 중요도가 감소하고 알코돌 도수와 pH 특성의 중요도가 조금 상승한 것을 볼 수 있음
이런 이유는 랜덤 포레스트가 특성의 일부를 랜덤하게 선택하여 결정 트리를 훈련하기 때문에
그 결과 하나의 특성에 과도하게 집중하지 않고 좀 더 많은 특성이 훈련에 기여할 기회를 얻게 됨
랜덤 포레스트는 훈련 세트에서 중복을 허용하여 부트스트랩 샘플을 만들어 결정 트리를 훈련하는데
이때 부트스트랩 샘플에 포함되지 않고 남은 샘플을 OOB(out of bag)샘플이라고 하며
이 남은 샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있어 검증 세트의 역할을 할 수 있음
이 점수를 얻으려면 oob_score 매개변수를 True로 지정하면 각 결정 트리의 OOB 점수를 평균하여 출력함
OOB 점수를 사용하면 교차 검증을 대신할 수 있어서 결과적으로 훈련 세트에 더 많은 샘플을 사용할 수 있음
엑스트라 트리
- 엑스트라 트리
엑스트라 트리는 랜덤 포레스트와 매우 비슷하게 동작하며 기본적으로 100개의 결정 트리를 훈련함
랜덤 포레스트와 동일하게 결정 트리가 제공하는 대부분의 매개변수를 지원하고
전체 특성 중에 일부 특성을 랜덤하게 선택하여 노드를 분할하는데 사용
랜덤 포레스트와 엑스트라 트리의 차이점은 부트스트랩 샘플을 사용하지 않는다는 점으로
각 결정 트리를 만들 때 전체 훈련 세트를 사용하는 대신 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할함
하나의 결정 트리에서 특성을 무작위로 분할한다면 성능이 낮아지겠지만
많은 트리를 앙상블하기 때문에 과대적합을 막고 검증 세트의 점수를 높이는 효과가 있음
엑스트라 트리는 ExtraTreeClassifier를 통해 제공하므로 이를 통해 모델의 교차 검증 점수를 확인
또한 보통 엑스트라 트리가 무작위성이 좀 더 크기 때문에 랜덤 포레스트보다 더 많은 결정 트리를 훈련해야 하지만
랜덤하게 노드를 분할하기 때문에 빠른 계산 속도가 엑스트라 트리의 장점임
엑스트라 트리도 특성 중요도를 제공하는데 마찬가지로 결정 트리보다 당도에 대한 의존성이 작음
그레이디언트 부스팅
- 그레이디언트 부스팅
그레이디언트 부스팅은 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법
기본적으로 깊이가 3인 결정 트리를 100개 사용하며 깊이가 얕은 결정 트리를 사용하기 때문에 과대적합에 강하고
계속 트리를 추가하기 때문에 일반적으로 높은 일반화 성능을 기대할 수 있음
그레이디언트 부스팅은 경사 하강법을 사용하여 트리를 앙상블에 추가함
분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용함
경사 하강법은 손실 함수를 산으로 정의하고 가장 낮은 곳을 찾아 내려오는 과정으로
가장 낮은 곳을 찾아 내려오는 방법은 모델의 가중치와 절편을 조금씩 바꾸는 것이었음
그레디이언트 부스팅은 결정 트리(결정 트리 회귀 모델)를 계속 추가하면서 가장 낮은 곳을 찾아 이동하고
손실 함수의 낮은 곳으로 천천히 조금씩 이동해야 하므로 그레이디언트 부스팅이 깊이가 얕은 트리를 사용하는 것
GradientBoostringClassifier를 사용해 와인 데이터셋의 교차 검증 점수를 확인해보면
거의 과대적합이 되지 않으며, 그레이디언트 부스팅은 결정 트리의 개수를 늘려도 과대적합에 매우 강함
또한 학습률을 증가시키고 트리의 개수를 늘리면 조금 더 성능이 향상될 수 있으므로
결정 트리 개수를 500개로 5배 늘렸지만 과대적합을 잘 억제하는 것을 볼 수 있음
그레이디언트 부스팅도 특성 중요도를 제공하며 랜덤 포레스트보다 일부 특성인 당도에 더 집중함을 볼 수 있음
히스토그램 기반 그레이디언트 부스팅
- 히스토그램 기반 그레이디언트 부스팅
히스토그램 기반 그레이디언트 부스팅은 정형 데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘
먼저 입력 특성을 256개의 구간으로 나누고 그 중 하나를 떼어 놓고 누락된 값을 위해 사용하므로
입력에 누락된 특성이 있더라고 이를 따로 전처리할 필요가 없음
HistGradientBoostingClassifier는 기본 매개변수에서 안정적인 성능을 얻을 수 있으며
enable_hist_gradient_boosting 모듈을 임포트하여 사용
이는 과대적합을 잘 억제하면서 그레이디언트 부스팅보다 조금 더 높은 성능을 제공함
- Permutation Importance
히스토그램 기반 그레이디언트 부스팅의 특성 중요도를 계산하기 위해 permutation_importance() 함수를 사용
이 함수는 특성을 하나씩 랜덤하게 섞어서 모델의 성능을 변화하는지 관찰하여 어떤 특성이 중요한지를 계산함
훈련 세트뿐만 아니라 테스트 세트에도 적용할 수 있고 사이킷런에서 제공하는 추정기 모델에 모두 사용할 수 있음
히스토그램 기반 그레이디언트 부스팅 모델을 훈련한 후
훈련 세트에서 특성 중요도를 계산하기 위해 n_repeats 매개변수로 랜덤하게 섞을 횟수를 지정
permutation_importance() 함수가 반환하는 객체는 반복하여 얻은 특성 중요도, 평균, 표준 편차를 담고 있음
다음으로는 테스트 세트에서 특성 중요도를 계산하면 그레이디언트 부스팅과 비슷하게 조금 더 당도에 집중하고 있음
이런 분석을 통해 모델을 실전에 투입했을 때 어떤 특성에 관심을 둘지 예상할 수 있음
마지막으로 HistGradientBoostingClassifier를 사용해 테스트 세트에서의 성능을 최종적으로 확인하면
테스트 세트에서는 약 87% 정확도를 얻게 되고 실전에 투입하면 성능은 이보다 조금 더 낮을 것을 알 수 있음
- XGBoost vs LightGBM
사이킷런 말고도 그레이디언트 부스팅 알고리즘을 구현한 라이브러리가 여럿있음
가장 대표적인 라이브러리는 XGBoost이며 다양한 부스팅 알고리즘을 지원하며
tree_method 매개변수를 'hist'로 지정하면 히스토그램 기반 그레이디언트 부스팅을 사용할 수 있음
널리 사용하는 또 다른 히스토그램 기반 그레이디언트 부스팅 라이브러리는 마이크로소프트에서 만든 LightGBM
사이킷런의 히스토그램 기반 그레이디언트 부스팅은 LightGBM에서 영향을 많이 받았음
'ML > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼공머신] 06. 비지도 학습 - k-평균 (0) | 2022.06.29 |
---|---|
[혼공머신] 06. 비지도 학습 - 군집 알고리즘 (0) | 2022.06.28 |
[혼공머신] 05. 트리 알고리즘 - 교차 검증과 그리드 서치 (0) | 2022.06.01 |
[혼공머신] 05. 트리 알고리즘 - 결정 트리 (0) | 2022.05.30 |
[혼공머신] 04. 다양한 분류 알고리즘 - 확률적 경사 하강법 (0) | 2022.05.24 |