인공지능&머신러닝

[머신러닝]랜덤 포레스트(Random Forest) 원리 및 코드 예시

zzheng 2024. 6. 24. 23:45

랜덤 포레스트(Random Forest)는 앙상블 학습 방법 중 하나로, 여러 개의 결정 트리(Classification Trees)를 구성하여 강력한 분류 모델을 만드는 방법입니다. 각 결정 트리는 데이터의 부분 집합을 기반으로 독립적으로 학습하며, 그 결과를 결합하여 최종 예측을 수행합니다.

 

주요 개념

  1. 앙상블 학습(Ensemble Learning): Random Forest는 여러 개의 모델을 결합하여 더 강력하고 안정적인 예측을 하려는 앙상블 학습의 한 방법입니다. 각 결정 트리는 서로 다른 데이터 부분 집합에서 학습하고, 그들의 예측을 종합하여 최종 예측을 수행합니다.
  2. 결정 트리(Decision Tree): Random Forest는 기본적으로 결정 트리를 사용합니다. 결정 트리는 데이터를 분할하여 여러 노드로 구성된 트리 형태의 모델을 생성하며, 각 노드는 데이터를 특정 기준에 따라 분할합니다.
  3. 랜덤화(Randomization):
    • 부트스트랩 샘플링(Bootstrap Sampling): 각 트리는 원본 데이터에서 랜덤하게 선택된 부분 집합으로 학습합니다. 이는 데이터의 다양성을 유지하고, 과적합을 줄이는 데 도움을 줍니다.
    • 특성 랜덤화(Feature Randomization): 각 노드에서 분할할 때, 랜덤하게 선택된 특성들 중에서 최적의 분할을 찾습니다. 이는 다양한 특성의 중요성을 반영하고, 모델의 다양성을 증가시킵니다.
  4. 결합 방법(Combination): 각 결정 트리의 예측을 종합하여 최종 예측을 수행합니다. 분류 문제에서는 각 트리의 클래스 예측 중 가장 많이 선택된 클래스를 선택하거나, 확률을 평균하여 확률 예측을 제공합니다.

 

작동 원리

Random Forest는 다음과 같은 절차로 작동합니다.

  • 트리 구성: 주어진 데이터에서 랜덤하게 부트스트랩 샘플을 선택하여 여러 개의 결정 트리를 독립적으로 학습시킵니다.
  • 트리 학습: 각 트리는 랜덤하게 선택된 특성들을 기반으로 노드를 분할하며, 정보 이득이 최대화되는 방향으로 분할 기준을 결정합니다.
  • 예측: 새로운 데이터가 주어졌을 때, 각 트리의 예측을 종합하여 최종 예측을 수행합니다.

 

특징

  • 기반이 되는 의사 결정 트리가 단순해서 훈련과 예측이 매우 빠르다.
  • 트리들이 완전히 독립적이기 때문에 학습과 예측 모두 병렬처리가 가능하다. 

 

예제 코드

rf_scores = []
estimators = range(1,11)
for i in estimators:
    rf_classifier = RandomForestClassifier(n_estimators=i, random_state=0   )
    rf_classifier.fit(x_train, y_train  )
    rf_scores.append(rf_classifier.score(x_test, y_test))
  • 시각화
colors = rainbow(np.linspace(0, 1, len(estimators)))
plt.bar(range(len(estimators)), rf_scores, color = colors, width = 0.8)
for i in range(len(estimators)):
    plt.text(i, rf_scores[i], rf_scores[i])
plt.xticks(ticks =  range(len(estimators)),
           labels =  estimators)
plt.xlabel('Number of estimators')
plt.ylabel('Scores')
plt.title('Random Forest Classifier scores for different number of estimators')
plt.show()

  • 성능평가
max_idx = np.argmax(rf_scores)
print("The score for Random Forest Classifier is {}% with {} estimators.".format(rf_scores[max_idx]*100,
                                                                                 estimators[max_idx]))