[AI | ML]

[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, 그리고 단일 결정 트리 모델이 있었습니다. 이 기법들은 각각 장점이 있었지만, 현실적인 한계도 존재했습니다.

  1. 단일 결정 트리: 결정 트리는 직관적이고 해석 가능하다는 장점이 있지만, 데이터에 민감하여 작은 변화에도 불안정해지고 과적합(overfitting)될 가능성이 높습니다.
  2. Bagging (Bootstrap Aggregating): Breiman이 제안한 이 기법은 학습 데이터에서 여러 번 샘플링을 통해 다수의 트리를 만들고 예측을 결합하여 과적합을 줄이는 방법입니다. 그러나 Bagging을 통해 생성되는 트리들 간의 독립성은 확보되지만 상관성을 줄이기는 어렵습니다.
  3. 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의 작동 원리

https://www.geeksforgeeks.org/random-forest-algorithm-in-machine-learning/

Random Forest의 동작과정이 잘 나타나있는 이미지를 기반으로 설명을 예시와 함께 해보겠습니다. 

예시는 "10명의 친구(분류기)들이 여행지 정하는 것" 입니다.  

 

        • Training Data Instance 준비 및 초기 결정 트리 학습
          • 랜덤 포레스트는 전체 데이터셋을 사용하여 여러 개의 결정 트리(Decision Tree)를 학습시킵니다.
          • 각 데이터 샘플에는 클래스 레이블 (ex. Class A, Class B)가 포함되어 있습니다. 
          • 랜덤 포레스트의 핵심은 각 트리가 서로 다른 데이터 샘플을 학습하도록 만드는 것입니다.
          • 예시
            • 여행지를 고르기 위한 데이터가 있습니다. 이제 친구(분류기)들이 다양한 기준을 바탕으로 여행지를 고르는 게 랜덤 포레스트에서 데이터를 준비하는 단계 입니다.
              • 특성(Feature): 맛집, 교통, 숙박비, 날씨 등.
              • 결과(Label): 추천 여행지 (예: 제주도, 부산 등)
            • Bagging(부트스트랩 샘플링) - 데이터를 나누기
              • 랜덤 포레스트는 Bagging 기법을 사용하여 데이터셋을 여러 개의 샘플로 나눕니다.
              • 여기에서 포인트는 각각의 트리가 서로 다른 데이터를 학습할 수 있도록 데이터를 나누는 것 입니다. 
                랜덤으로 데이터를 나누는게 핵심입니다!
              • 랜덤 샘플링 생성: 트리를 학습시키기 위해 데이터의 랜덤 샘플링을 생성합니다.
                • 중복 허용: 랜덤하게 샘플을 뽑되, 샘플이 중복될 수 있습니다. 
              • 랜덤 피처 선택 : 각 트리는 학습 시 모든 피처를 사용하지 않고, 일부 랜덤 피처만 선택합니다.
                • 이 과정은 트리 간의 다양성을 높여 모델의 일반화 성능을 향상시킵니다.
              • 예시
                • 랜덤 샘플링 생성 : 각 친구에게 전체 데이터를 다 주는 게 아니라, 랜덤으로 뽑은 데이터의 일부만 줍니다.
                  • 예를 들어, 친구 A는 10명 중 7명의 여행 선호 데이터를 받고, 친구 B는 또 다른 7명의 데이터를 받습니다.
                  • Bagging 방법 특성 상 데이터는 중복이 가능하다는 점 기억해주세요.
                • 랜덤 피처 선택: 친구마다 다르게 판단하도록, 특정 기준(특성)만 선택해서 제공합니다.
                  • 친구 A: 맛집과 날씨만 봄.
                  • 친구 B: 교통과 숙박비만 봄.
                  • 친구 C: 날씨와 숙박비만 봄.
                  • 이렇게 하면 친구들(트리들)이 서로 다른 기준과 데이터를 가지고 여행지를 추천하게 됩니다.
            •  
            •  
      • 개별 트리 학습
        •  트리는 데이터의 패턴을 학습하고, 이를 기반으로 예측합니다.
          • 트리마다 학습에 사용된 데이터와 피처가 다르므로, 서로 다른 결과를 도출할 가능성이 높아집니다.
          • 각 랜덤 서브셋을 사용해 결정 트리를 생성합니다.
        • 예시 (친구들이 각자 학습하기)
          • 각 친구는 자신만의 데이터를 보고 학습한 후, 최적의 여행지를 추천합니다.
            • 친구 A: "날씨가 좋고 맛집이 많은 제주도가 최고야!"
            • 친구 B: "교통이 편리하고 숙박비가 저렴한 부산으로 가야 해."
            • 친구 C: "날씨와 숙박비를 보면 강릉이 괜찮아 보여."
            • 이처럼 각 친구는 다른 데이터를 기반으로 학습하기 때문에 서로 다른 추천 결과를 내놓을 가능성이 높아요.
      • 예측 단계
        • 새로운 데이터(테스트 데이터)가 주어지면, 각각의 트리는 독립적으로 예측을 수행합니다.
          • 분류(Classification): 각 트리가 해당 샘플의 클래스를 예측합니다.
          • 회귀(Regression): 각 트리가 연속적인 값을 예측합니다.
        • 예시 (친구들이 독립적으로 예측하기)
          • 새로운 상황(예: 특정 계절에 여행)을 놓고 친구들에게 다시 물어봅니다.
          • 각 친구는 자신이 학습한 데이터를 바탕으로 여행지를 예측합니다.
            • 친구 A: "이번에도 제주도가 좋아!"
            • 친구 B: "나는 여전히 부산이 최고야."
            • 친구 C: "강릉이 딱 맞아."
            • 각 친구는 독립적으로 판단하며, 이 결과가 결정 트리의 예측과 같습니다.
    • 결합 단계
      • 모든 트리의 예측 결과를 결합하여 최종 결과를 도출합니다.
        • 분류(Classification): 다수결 투표(Majority Voting)로 가장 많이 예측된 클래스를 선택.
        • 회귀(Regression): 모든 트리의 예측값을 평균 내어 최종 값을 결정.
      • 예시 (다수결로 여행지를 결정)
        • 모든 친구의 추천 결과를 모아 다수결(Majority Voting)로 최종 여행지를 결정합니다.
          • 친구들의 추천 결과
            • A: 제주도
            • B: 부산
            • C: 강릉
            • D: 제주도
            • E: 제주도
            • 최종 결과: 제주도가 3표로 다수결에서 선택되어, 최종 여행지는 제주도로 결정됩니다.
  • 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

 

랜덤 포레스트란 무엇인가요? | IBM

랜덤 포레스트는 일반적으로 사용되는 머신 러닝 알고리즘으로, 여러 의사결정 트리의 아웃풋을 결합하여 단일 결과에 도달합니다.

www.ibm.com

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

 

랜덤 포레스트 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 기계 학습에서의 랜덤 포레스트(영어: random forest)는 분류, 회귀 분석 등에 사용되는 앙상블 학습 방법의 일종으로, 훈련 과정에서 구성한 다수의 결정 트리로부

ko.wikipedia.org

 

https://www.geeksforgeeks.org/random-forest-algorithm-in-machine-learning/

 

Random Forest Algorithm in Machine Learning - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org