1. 랜덤 포레스트 (Random Forest)
랜덤 포레스트는 의사결정나무를 기반으로 배깅 앙상블 모형으로, 간단히 설명하자면, 여러 개의 의사결정나무의 평균을 낸 모형이라고 할 수 있다. 구체적으로는 2가지 방법을 사용해서 다양한 의사결정나무를 만든다. 첫 번째는 의사결정나무를 만들 때, 데이터의 일부를 복원추출로 꺼내고 해당 데이터에 대해서만 의사결정나무를 만드는 방법이다. 다른 하나는 노드 내 데이터를 자식 노드로 나누는 기준을 정할 때, 일부 변수만 대상으로 해서 가지를 나눌 기준을 찾는다. 만약 새로운 데이터에 대한 예측을 수행할 때는 여러 개의 의사결정나무가 내놓은 예측결과를 투표방식으로 합한다.
각 나무별로 분산이 높다는 단점이 있지만, 앙상블 기법을 이용함으로써 견고한 모델을 만들고, 일반화 성능을 높이며, 의사결정나무 하나가 아니라 여러 개를 사용하기 때문에 과대적합의 위험을 줄여준다.
1.1 학습 과정
학습 과정은 크게 4단계로 나뉘어지며, 아래와 같다.
① N개의 랜덤한 부트스트랩 샘플을 추출한다.
② 추출된 샘플을 이용해 의사결정나무를 학습한다. 이 때, 중복을 허용하지 않고, 랜덤하게 d 개의 특성을 선택하고, 정보 이득 등의 목적 함수를 기준으로 최선의 분할을 만드는 특성을 사용하여 노드를 분할한다.
③ ①과 ② 의 과정을 반복한다.
④ 각 트리별 예측을 모아 다수결 투표로 클래스 레이블을 선정한다.
랜덤 포레스트는 의사결정나무만큼 해석이 쉽지 않지만, 하이퍼파라미터 튜닝에 크게 노력하지 않아도 된다. 신경 써야되는 파라미터는 랜덤 포레스트가 생성하는 나무 개수이며, 나무의 수가 많을 수록 계산 비용이 증가하게되고 결과적으로 분류기의 성능이 좋아진다. 그 외에도 편향-분산 트래이드 오프를 조절할 수 있는 부트스트랩 크기와 각 분할에서 무작위로 선택할 특성 개수가 주요 변수라고 할 수 있다.
만약 부트스트랩 샘플 크기가 작아지면 개별 트리의 다양성이 증가하게 된다. 이는 무작위성이 증가하는 것과 연관이 있고 결과적으로 과대적합의 영향이 줄어드는 효과를 부른다. 하지만 샘플의 크기가 작을 수록 모델의 전체적인 성능도 줄어든다. 훈련 성능과 테스트 성능의 격차를 줄일 수 있는 만큼, 전체적인 테스트 성능 또한 감소하기 때문이다. 반대로 부트스트랩 샘플 크기가 증가하면, 개별 의사결정나무와 부트 스트랩 샘플이 서로 비슷해지기 때문에, 과대적합 가능성이 증가한다.
1.2 OOB (Out Of Bag)
랜덤포레스트 기법을 포함해, 배깅을 사용해 학습하는 경우에 활용할 수 있는 모델 성능 평가 지표이다. 별도의 검증 데이터 셋이 없이도 모델의 성능 평가가 가능하다는 점이 특징이며, 학습에 사용하지 않은 데이터를 각 모델에 적용해 오류를 계산한 후, 전체 모델들에 대한 평균을 계산해 최종 OOB 오류 수치를 계산한다.
2. 실습
2.1 실습: Iris 분류
앞서 살펴본 랜덤포레스트 모델을 실제로 어떻게 사용하는 지 확인하기 위해 아래 Iris 데이터를 사용해 랜덤포레스트 모델로 분류하는 예시를 살펴보도록 하자. 코드는 다음과 같다.
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
x = iris.data[:, [2, 3]]
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)
model_forest = RandomForestClassifier( \
criterion="gini", \
n_estimators=25, \
random_state=1, \
n_jobs=2, \
oob_score=True
)
model_forest.fit(x_train, y_train)
y_pred = model_forest.predict(x_test)
print(accuracy_score(y_test, y_pred))
# 필요한 패키지 로드
library(randomForest)
library(datasets)
library(caret)
# 데이터셋 로드
data(iris)
# 특성 선택
x <- iris[, 3:4] # 3, 4번째 열 선택 (Petal.Length, Petal.Width)
y <- iris$Species # 타겟 변수 (Species)
# 데이터셋 분리
set.seed(42)
train_index <- createDataPartition(y, p = 0.75, list = FALSE)
x_train <- x[train_index, ]
x_test <- x[-train_index, ]
y_train <- y[train_index]
y_test <- y[-train_index]
# Random Forest 모델 학습
set.seed(1)
model_forest <- randomForest(x_train, y_train, ntree = 25, criterion = "gini")
# 예측
y_pred <- predict(model_forest, x_test)
# 정확도 계산
accuracy <- sum(y_pred == y_test) / length(y_test)
print(accuracy)
2.2 모델 평가: OOB 확인
앞선 예제에서 만든 모델이 잘 만들어졌는지 확인해보도록 하자. 먼저 생성한 랜덤포레스트 모델의 OOB 오류 수치를 확인해보도록 하자. 먼저 파이썬의 경우에는 생성한 배깅모델에 oob_score_ 필드에 값이 저장되어 있다.
print(1 - model_forest.oob_score_)
[실행 결과]
0.0535714285714286
R의 경우도 비슷하게 생성한 모델의 개요를 출력하면, 아래와 같이 "OOB estimate of error rate" 라는 항목으로 OOB 값을 출력해서 보여준다.
model_forest
[실행 결과]
...
OOB estimate of error rate: 3.51%
...
[참고자료]
'Data Science > 데이터 분석 📊' 카테고리의 다른 글
[데이터 분석] 19. 차원 축소 (Dimensional Reduction) Ⅰ : PCA (0) | 2024.09.29 |
---|---|
[데이터 분석] 18. 분류모델 성능 평가 (0) | 2024.09.07 |
[데이터 분석] 16. 앙상블 (Ensemble) (0) | 2024.08.17 |
[데이터 분석] 15. 의사결정나무 (1) | 2024.08.14 |
[데이터 분석] 14. 서포트 벡터 머신 (SVM) (0) | 2024.08.08 |