민프
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 3. Random Forest 편 (마지막) 본문
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 3. Random Forest 편 (마지막)
민프야 2024. 10. 28. 21:06이전 포스팅 1. 보팅편(Voting)에서 Random Forest에 대한 내용을 알려드리긴 했는데
이번 포스팅에서는 더 자세한 내용을 말씀드리겠습니다.
Deicision Tree ,1편, 2편을 보고 오시지 않으면 이해하시기 어렵습니다.
선행 학습을 추천드립니다.
(Leo Breiman Random Forests 논문을 참고하였습니다.)
1. Random Forest의 역사
Random Forest는 Leo Breiman이 2001년에 발표한 논문에서 제안한 기법으로, 여러 가지 결정 트리(decision tree)를 결합하여 예측 정확도를 높이기 위한 앙상블 방법입니다. 이 모델은 이전의 몇 가지 앙상블 및 트리 기반 학습 방법을 개선하는 과정에서 발전했습니다.
이 기법의 개발자인 레오 브레이먼(Leo Breiman)은 1996년 Bagging(Bootstrap Aggregating)을 통해 이론적 기초를 세웠고, 이후 2001년에 Random Forest를 완성하여 발표했습니다. 랜덤 포레스트는 Bagging과 결정 트리의 결합을 기반으로, 트리의 각 노드에서 무작위 피처를 선택하는 추가 무작위성을 더하여 성능을 향상시켰습니다.
1-1. 이전 기술들의 배경 및 한계점
Random Forest가 등장하기 전, 주로 사용되던 기법에는 Bagging, Boosting, 그리고 단일 결정 트리 모델이 있었습니다. 이 기법들은 각각 장점이 있었지만, 현실적인 한계도 존재했습니다.
- 단일 결정 트리: 결정 트리는 직관적이고 해석 가능하다는 장점이 있지만, 데이터에 민감하여 작은 변화에도 불안정해지고 과적합(overfitting)될 가능성이 높습니다.
- Bagging (Bootstrap Aggregating): Breiman이 제안한 이 기법은 학습 데이터에서 여러 번 샘플링을 통해 다수의 트리를 만들고 예측을 결합하여 과적합을 줄이는 방법입니다. 그러나 Bagging을 통해 생성되는 트리들 간의 독립성은 확보되지만 상관성을 줄이기는 어렵습니다.
- Boosting: Adaboost 등의 Boosting 기법은 오차가 큰 데이터 포인트에 더 많은 가중치를 부여하면서 일련의 트리를 생성해 예측력을 높입니다. 그러나, 이 과정에서 노이즈에 매우 민감해질 수 있으며 계산 복잡도가 높습니다.
1-2. Random Forest의 등장 이유?
Breiman은 이러한 문제들을 해결하기 위해 특징(feature) 무작위 선택과 다수의 트리를 결합하는 Random Forest를 제안했습니다. Random Forest는 트리를 생성할 때마다 각 노드에서 랜덤하게 일부 특징을 선택하여 최적의 분할을 결정하고, 이처럼 생성된 다수의 트리를 모아 최종 예측을 산출합니다. 이를 통해 모델의 안정성과 정확도를 동시에 높이면서 예측 성능을 높일 수 있습니다.
2. Random Forest이란?
위키피디아에 의하면 아래와 같이 정의하고 있습니다.
랜덤 포레스트는 다수의 결정 트리들을 학습하는 앙상블 방법이다. 랜덤 포레스트는 검출, 분류, 그리고 회귀 등 다양한 문제에 활용되고 있다
여기에서 우리는 Decision Tree, 앙상블 방법이라는 걸 알기 때문에 Random Forest의 정의를 더 잘 이해할 수 있을 것이라 생각합니다.
즉, Random Forest는 여러 개의 결정 트리(Decision Tree)를 독립적으로 학습시키고, 최종 예측 시 다수결(Voting) 방식을 사용하는 알고리즘입니다. 이를 통해 개별 트리의 단점을 보완하고, 예측의 정확성과 안정성을 향상시킬 수 있습니다
쉽게 말하자면.
Decision Tree 포스팅에서 아래와 사진을 예시로 들었었는데요.
이러한 Decision Tree를 여러개로 둬서 무작위 피처가 담긴 샘플링을 기반으로 학습시킨다는 것 이고,
그래서 이름도 Random(무작위의 랜덤 피처 SET) Forest(여러개의 Deisicion Tree)가 되는 것 입니다.
여기까지 한줄 정리해보면
"Random Forest란 Decision Tree에 배깅(bootstrap aggregation, bagging)이라는 앙상블 학습을 적용한 모델" 입니다.
동작 과정을 보면서 더 자세하게 말씀드려보겠습니다.
3. Random Forest의 작동 원리
Random Forest의 동작과정이 잘 나타나있는 이미지를 기반으로 설명을 해보겠습니다.
- Training Data Instance 준비:
- 랜덤 포레스트는 전체 데이터셋을 사용하여 여러 개의 결정 트리(Decision Tree)를 학습시킵니다.
- 랜덤 포레스트의 핵심은 각 트리가 서로 다른 데이터 샘플을 학습하도록 만드는 것입니다.
- Bagging(부트스트랩 샘플링):
- 랜덤 포레스트는 Bagging 기법을 사용하여 데이터셋을 여러 개의 샘플로 나눕니다.
- 각 결정 트리는 원본 학습 데이터셋에서 중복을 허용하여 임의로 추출된 데이터 샘플로 학습됩니다.
- 이 과정을 통해 트리마다 서로 다른 데이터 샘플을 학습하여, 트리 간의 다양성을 확보할 수 있습니다.
- 랜덤 피처 선택:
- 각 트리의 노드를 분할할 때, 랜덤 포레스트는 전체 피처 중 일부만을 무작위로 선택하여 분할합니다.
- 이는 트리마다 서로 다른 피처를 기준으로 분할되게 하여, 트리 간의 상관성을 줄이고 모델의 일반화 성능을 높입니다.
- 결정 트리 생성:
- 각 샘플에 대해 결정 트리를 학습시킵니다.
- 트리는 각 노드에서 데이터를 최대한 잘 분할할 수 있는 피처와 임계값을 찾아가면서 만들어지며, 리프 노드에 도달할 때마다 예측 클래스를 할당하게 됩니다.
- 각각의 트리는 독립적으로 학습됩니다.
- 예측 (Testing Phase):
- 새로운 데이터가 들어오면, 각 결정 트리는 그 데이터에 대해 독립적으로 예측을 수행합니다.
- 이미지에서는 각 트리가 데이터에 대해 "Class A" 또는 "Class B"로 예측을 하고 있습니다.
- Voting (Bagging Majority Voting):
- 모든 트리의 예측 결과를 모아서 다수결 투표를 통해 최종 예측 결과를 결정합니다.
- 각 트리의 예측 결과 중 가장 많이 나온 클래스를 최종 예측 값으로 결정합니다. 예를 들어, 3개의 트리가 Class A를 예측하고, 1개의 트리가 Class B를 예측한 경우 최종 예측 결과는 Class A가 됩니다.
- Prediction Output:
- 최종적으로 다수결을 통해 선택된 예측 클래스가 랜덤 포레스트의 예측 결과로 출력됩니다.
확실히 기반이 Bagging 기반이다 보니 겹치는 부분이 많은 것 같습니다.
4. 코드 적용
# import 섹션
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier # Random Forest 모델 추가
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, accuracy_score # 성능 평가를 위한 모듈 추가
-----------------------------------
# 데이터 로드 섹션
# Train CSV 파일 로드
df_train = pd.read_csv(bootstrap_csvs_out_folder)
# Test CSV 파일 로드
df_test = pd.read_csv(bootstrap_csvs_out_test_folder)
-----------------------------------
# Random Forest 모델 학습 섹션
# Random Forest 모델 학습
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train_pca, y_train
-----------------------------------
# 모델 성능 평가 및 로그 출력 섹션
# 모델 성능 평가 - Precision, Recall, F1-score, Accuracy
print("Classification Report:")
print(classification_report(y_test, y_test_pred)) # Precision, Recall, F1-score 출력
# 테스트 데이터 하나하나 비교하여 로그로 출력
print("Test Data Predictions:")
for i in range(len(y_test)):
actual_class = y_test[i]
predicted_class = y_test_pred[i]
print(f"Test Sample {i+1}: Actual: {actual_class}, Predicted: {predicted_class}")
-----------------------------------
# 로그 출력 섹션
Classification Report:
precision recall f1-score support
sphinx_down 0.96 1.00 0.98 77
sphinx_up 1.00 0.96 0.98 77
accuracy 0.98 154
macro avg 0.98 0.98 0.98 154
weighted avg 0.98 0.98 0.98 154
Accuracy: 98.05%
Test Sample 100: Actual: sphinx_up, Predicted: sphinx_up
성공률이 100%가 나오지 않았는데 아무래도 하이퍼 파라미터 때문일 것 같습니다.
조절하게 되면 100%가 충분히 나오지 않을까 싶습니다.
포스팅은 여기까지 하겠습니다.
참고링크
https://www.ibm.com/kr-ko/topics/random-forest
https://link.springer.com/article/10.1023/A:1010933404324
https://ko.wikipedia.org/wiki/%EB%9E%9C%EB%8D%A4_%ED%8F%AC%EB%A0%88%EC%8A%A4%ED%8A%B8
https://www.geeksforgeeks.org/random-forest-algorithm-in-machine-learning/
'[AI | ML]' 카테고리의 다른 글
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 2. 배깅편(bagging) (2) | 2024.10.28 |
---|---|
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 1. 보팅편(Voting) (8) | 2024.10.28 |
[AI | ML] [HPE] Landmarks 정보 (2D, 3D) 선택에 대한 고찰 (8) | 2024.10.23 |
[AI | ML] [분류기] Decision Tree (결정 트리)에 대해서 알아보자 (13) | 2024.10.23 |
[AI | ML] [분류기] SVM (Support Vector Machine)에 대해서 알아보자 (4) | 2024.10.02 |