머신러닝 모델 소개 (4) - 랜덤 포레스트 (Random Forest)
Mozen
·2023. 7. 10. 17:42
머신러닝 모델 소개 시리즈의 네 번째 글입니다. 랜덤 포레스트(Random Forest)는 앙상블(Ensemble) 학습 방법 중 하나로, 여러 개의 결정 트리(Decision Tree)를 조합하여 더 강력한 분류 모델을 구축하는 방법입니다. 랜덤 포레스트는 과적합(Overfitting)을 줄이고 예측 성능을 향상시키는 데 효과적입니다. 이번 글에서는 랜덤 포레스트의 기본 개념을 소개하고, 파이썬의 Scikit-learn 라이브러리를 활용하여 실제 데이터에 적용하는 방법을 알아보겠습니다.
1. 모델 설명
랜덤 포레스트(Random Forest)는 분류와 회귀에 사용되는 지도학습 알고리즘으로 여러 개의 의사결정나무(Decision Tree)를 조합한 모델입니다. 의사결정나무는 일련의 if-else로 이루어진 나무모형으로 중간마디(internal node)와 끝마디(leaf node)로 구성됩니다. 각 데이터는 다차원 특징공간(feature space)을 나타내는 벡터 X와 출력변수(label)로 이루어져 다음과 같이 표현됩니다. $$ X=(x_1, x_2, ..., x_n) $$ $$ label=(X, y) $$
의사결정나무의 중간마디는 하나의 특징을 골라 특정 기준 값에 따라 데이터집합을 2개의 자식마디로 분할합니다. 끝마디는 출력변수 y를 가리킵니다. 분류 나무(classification tree)는 분류 목적의 의사결정나무로 출력변수가 범주형 변수(dummy variable)입니다. 반면, 회귀에 사용되는 회귀 나무(regression tree)는 추론하는 변수가 연속형 실수입니다.
의사결정나무는 탐욕 재귀 분할 알고리즘(greedy recursive partitioning algorithm)에 기반하여 형성됩니다. 탐욕 알고리즘은 각 단계에서 국소적인 최적해(local minimum)를 선택합니다. 시간적 및 메모리 공간적으로 효율이 높으나 최종해가 전역 최적점(global optimum)인지는 보장되지 않습니다. 나무의 성장은 다차원 특징공간을 축에 평행한 선들로 분할하는 것과 같습니다. 각 나무는 불순도에 따라 재귀적으로 분할됩니다. 분류 문제에서는 불순도에 대한 지표로써 지니 지수(Gini index) 또는 엔트로피(entropy)가 사용됩니다. 반면, 회귀 문제에서는 평균제곱오차(Mean Square Error, MSE)가 보통 불순도 지표로 사용됩니다.
랜덤 포레스트는 의사결정나무에 배깅(bootstrap aggregation, bagging)이라는 앙상블 학습(ensemble learning)을 적용한 모델입니다. 앙상블 학습이란 다수의 기초 알고리즘(base algorithm)을 결합하여 더 나은 성능의 예측 모델을 형성하는 것을 말합니다. 앙상블 학습은 사용 목적에 따라 배깅(Bagging), 부스팅(Boosting), 스택킹(Stacking)으로 분류됩니다. 랜덤 포레스트에 사용된 배깅은 분산(variance)을 줄이기 위해 사용됩니다. 앙상블 학습, 배깅, 부스팅, 스택킹에 대해서는 다른 글에서 자세히 다루겠습니다. 랜덤 포레스트는 과적합을 해소하고 분산을 감소시켜 정확도가 높다는 장점이 있지만, 계산 비용이 높고 규칙이 많아 추론 로직을 설명하기 어렵다는 단점도 있습니다.
2. Scikit-learn 라이브러리를 활용한 랜덤 포레스트 사용 방법
랜덤 포레스트는 여러 개의 의사결정나무를 구성하고, 각 의사결정나무의 예측 결과를 다수결 방식으로 조합하여 최종 예측 결과를 결정합니다. 각 의사결정나무는 랜덤하게 선택된 데이터 샘플과 랜덤하게 선택된 독립 변수들을 사용하여 학습합니다. 이를 통해 의사결정나무 간의 상호 보완적인 예측을 수행하고, 앙상블의 결과로 더욱 강력한 예측 모델을 구축합니다. Scikit-learn은 랜덤 포레스트를 구현한 다양한 클래스와 함수를 제공합니다. 랜덤 포레스트를 사용하기 위해 필요한 라이브러리를 임포트합니다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
Scikit-learn에는 다양한 내장 데이터세트가 제공되며, 그 중에서 분류 작업에 자주 사용되는 'load_iris' 함수를 사용하여 붓꽃(iris) 데이터세트를 불러올 수 있습니다.
from sklearn import datasets
# 붓꽃 데이터셋 로드
iris = datasets.load_iris()
# 독립 변수와 종속 변수 분리
X = iris.data
y = iris.target
데이터를 학습용과 테스트용으로 나누는 것이 중요합니다. Scikit-learn의 train_test_split 함수를 사용하여 데이터를 나눌 수 있습니다. 아래 코드에서 'test_size=0.2'란 테스트 데이터세트를 전체 데이터세트의 20%로 설정한다는 뜻입니다. 또한, 'random_state=42'는 코드의 재현성을 확보하기 위한 설정입니다. 만약 'random_state'가 특정 숫자로 정의되어 있지 않으면, 코드를 실행할 때마다 학습 데이터세트와 테스트 데이터세트의 데이터가 달라집니다. 'random_state'의 숫자는 0 이상의 정수로 아무 숫자를 사용해도 괜찮습니다.
# 학습용 데이터와 테스트용 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
랜덤 포레스트 모델을 만들고 학습시키는 작업을 수행합니다. Scikit-learn의 'RandomForestClassifier' 클래스를 사용하여 모델을 초기화하고 'fit' 메서드를 사용하여 모델을 학습시킵니다.
# 랜덤 포레스트 모델 초기화
model = RandomForestClassifier()
# 모델 학습
model.fit(X_train, y_train)
모델 학습이 완료되면, 테스트 데이터를 사용하여 예측을 수행하고 모델의 성능을 평가할 수 있습니다.
# 테스트 데이터 예측
y_pred = model.predict(X_test)
# 정확도 계산
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
위 코드에서는 'RandomForestClassifier' 클래스를 사용하여 랜덤 포레스트 모델을 초기화하고, 'fit' 메서드를 사용하여 모델을 학습시킵니다. 학습이 완료된 모델을 사용하여 테스트 데이터를 예측하고, 'accuracy_score' 함수를 사용하여 예측 결과의 정확도를 계산합니다.
이 예시에서는 Scikit-learn에 내장된 붓꽃 데이터세트를 사용하여 랜덤 포레스트 모델을 학습하고 예측하는 방법을 보여주었습니다. Scikit-learn의 랜덤 포레스트 클래스와 관련 함수를 사용하면 간편하게 랜덤 포레스트 모델을 구축하고 데이터를 분석할 수 있습니다. 이를 통해 데이터 분류 작업에 랜덤 포레스트를 적용하여 다양한 문제를 해결할 수 있습니다.
머신러닝 모델 소개 시리즈
2023.07.04 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (1) - 선형 회귀 모델 (Linear Regression)
2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (2) - 서포트벡터머신 (Support Vector Machine, SVM)
2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (3) - KNN (K-Nearest Neighbor)
2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (4) - 랜덤 포레스트 (Random Forest)
2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (5) - 에이다부스트 (AdaBoost)
2023.07.11 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (6) - 다층 퍼셉트론 (Multilayer Perceptron)
'인공지능, 머신러닝, 딥러닝' 카테고리의 다른 글
머신러닝 모델 소개 (6) - 다층 퍼셉트론 (Multilayer Perceptron) (0) | 2023.07.11 |
---|---|
머신러닝 모델 소개 (5) - 에이다부스트 (AdaBoost) (0) | 2023.07.10 |
머신러닝 모델 소개 (3) - KNN (K-Nearest Neighbor) (0) | 2023.07.10 |
머신러닝 모델 소개 (2) - 서포트벡터머신 (Support Vector Machine, SVM) (0) | 2023.07.10 |
머신러닝 모델 소개 (1) - 선형 회귀 모델 (Linear Regression) (4) | 2023.07.04 |