반응형
랜덤 포레스트(Random Forest)
- 기본 결정트리는 해당 데이터에 대해 맞춰서 분류를 진행한 것이기 때문에 과적합 현상이 자주 나타났다.
- 그에 따라 이를 개선하기 위해 2001년 앙상블 기법으로 고안된 것이 랜덤 포레스트이다.
- 훈련 과정에서 구성한 다수의 결정 트리들을 랜덤하게 학습시켜 분류 또는 회귀의 결과도출에 사용된다.
- 즉, 특정 특성을 선택하는 트리를 여러개 생성하여 이들을 기반으로 작업을 수행하는 것이다.
- 각각의 트리가 독립적으로 학습하기 때문에 학습과정을 병렬화할 수 있다.
- 일반적인 의사결정트리는 Tree Correlation이라고 하는 특정 feature 하나가 정답에 많은 영향을 주게되면 대부분의 결과치가 유사하게 나타나는 문제점이 있었다.
- 하지만 랜덤 포레스트에서는 그러한 문제를 해결했고, 파라미터의 개수가 적어 튜닝도 쉽다.
- 타깃 예측을 잘하며 각각이 구별되는 여러개의 트리를 만들기 위해 무작위성이 부여된다.
- 대표적인 '배깅' 모델이다. (cf. 배깅(Bagging)은 bootstrap aggregating의 줄임말이다.)
- 결정트리의 단점을 보완하고 장점은 그대로 가지고 있는 모델이어서 별다른 조정 없이도 괜찮을 결과를 만들어낸다.
- 랜덤하게 만들어지기 때문에 random_state를 고정해야 같은 결과를 볼 수 있다.
- 트리 개수가 많아질 수록 시간이 더 오래 걸린다.
랜덤 포레스트 과정
- 모델 내부에 트리를 만들기 위해 데이터에 대한 부트스트랩 샘플들을 생성한다. 부트스트랩 샘플이란 중복을 허용한 샘플로서, 데이터에서 부트스트랩 샘플이 생성된다. (ex. [‘a’, ‘b’, ‘c’, ‘d’]에서 부트스트랩 샘플을 만든다고 하면 [‘b’, ‘d’, ‘d’, ‘c’] , [‘d’, ‘a’, ‘d’, ‘a’], [‘a’, ‘a’, ‘c’, ‘b’] 등이 생성된다.)
- 생성 데이터 샘플을 기반으로 트리들을 생성한다. 몇 의 특성을 고를지(max_features), 몇 의 트리를 만들지(n_estimators) 등을 파라미터로 받아 이를 기반으로 생성된다.
- 이렇게 생성된 모든 트리를 기반으로 예측이 수행된다. 회귀의 경우 모든 예측을 평균하여 결과를 도출하고, 분류는 soft voting 방식을 응용해 사용한다.
RandomForestClassifier()
RandomForestClassifier(n_estimators, criterion, max_depth, min_samples_split, min_samples_leaf, min_weight_fraction_leaf, max_features, max_leaf_nodes, min_impurity_decrease, min_impurity_split, bootstrap, oob_score, n_jobs, random_state, verbose, warm_start, class_weight)
- n_estimators : 모델에서 사용할 트리 갯수(학습시 생성할 트리 갯수)
- criterion : 분할 품질을 측정하는 기능 (default : gini)
- max_depth : 트리의 최대 깊이
- min_samples_split : 내부 노드를 분할하는데 필요한 최소 샘플 수 (default : 2)
- min_samples_leaf : 리프 노드에 있어야 할 최소 샘플 수 (default : 1)
- min_weight_fraction_leaf : min_sample_leaf와 같지만 가중치가 부여된 샘플 수에서의 비율
- max_features : 각 노드에서 분할에 사용할 특징의 최대 수
- max_leaf_nodes : 리프 노드의 최대수
- min_impurity_decrease : 최소 불순도
- min_impurity_split : 나무 성장을 멈추기 위한 임계치
- bootstrap : 부트스트랩(중복허용 샘플링) 사용 여부
- oob_score : 일반화 정확도를 줄이기 위해 밖의 샘플 사용 여부
- n_jobs :적합성과 예측성을 위해 병렬로 실행할 작업 수
- random_state : 난수 seed 설정
- verbose : 실행 과정 출력 여부
- warm_start : 이전 호출의 솔루션을 재사용하여 합계에 더 많은 견적가를 추가
- class_weight : 클래스 가중치
사용예제
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons
# 데이터 로드
X, y = make_moons(n_samples=100, noise=0.25, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X,y,stratify=y,random_state=42)
# 모델 학습
model = RandomForestClassifier(n_estimators=5, random_state=0)
model.fit(X_train, y_train)
- make_moons 데이터로부터 데이터를 받고 이를 학습데이터와 테스트데이터로 분류한다.
- 모델을 생성하고 위의 학습데이터를 학습(fit)시킨다.
- 이렇게 학습 후 생성된 랜덤포레스트 내부 트리는 estimator_ 속성에 저장되어 있다.
import matplotlib.pyplot as plt
import mglearn
# 결정 경계 시각화
# 다섯 개의 결정트리 결정 경계
fig, axes = plt.subplots(2, 3, figsize=(20,10) )
for i, (ax, tree) in enumerate( zip( axes.ravel(), model.estimators_ ) ):
ax.set_title("tree {}".format(i) )
mglearn.plots.plot_tree_partition(X, y, tree, ax=ax)
# 랜덤포레스트로 만들어진 결정경계
axes[-1, -1].set_title("Random forest")
mglearn.plots.plot_2d_separator(model, X, fill=True, alpha=0.5, ax=axes[-1,-1] )
mglearn.discrete_scatter(X[:,0], X[:,1], y)
- 그렇게 만들어진 랜덤포레스트의 결정경계와 내부에 존재하는 트리들의 결정경계를 시각화하여 확인해보았다.
- 각 트리들의 특성을 기반으로 랜덤 포레스트는 덜 과적합된 좋은 결정경계를 그리고 있음을 알 수 있다.
- 실제의 경우 더 많은 트리(수백~수천)를 사용하기 때문에 훨씬 부드럽고 합리적인 결정경계를 그려낸다.
oob_score
- oob_score의 oob는 out-of-bag의 약자로, 부트스트랩 샘플링 시 선택되지 않은 샘플을 뜻한다. oob_score를 true로 하면 훈련 종료 후 oob 샘플을 기반으로 평가를 수행한다.
# 모델 학습
model = RandomForestClassifier(n_estimators=10, random_state=0,
max_features=4, oob_score=True)
model.fit(X_train, y_train)
# 평가
print("훈련 세트 정확도: {:.3f}".format(model.score(X_train, y_train)) )
print("테스트 세트 정확도: {:.3f}".format(model.score(X_test, y_test)) )
print("OOB 샘플의 정확도: {:.3f}".format(model.oob_score_) )
==결과==
훈련 세트 정확도: 0.992
테스트 세트 정확도: 0.933
OOB 샘플의 정확도: 0.958
cf. 엑스트라 트리(Extra-Trees)
- 랜덤 포레스트보다 특성선택과 샘플링에 있어 무작위성을 많이 갖는 앙상블 모델이다.
- 랜덤 포레스트에서 최적의 임계값을 찾아 그를 특성으로 선택했던 것과 달리, 엑스트라 트리는 후보 특성을 기반으로 무작위로 분할을 하고 그 중 최적치를 선택하게 된다. 즉, 무작위성이 더 크다.
- 또한 부트스트랩 샘플링을 적용하지 않고 전체 원본 샘플을 사용한다. 부트스트랩 샘플링에 따른 다양성으로 발생할 분산을 조금 줄이는 것이다.
- ExtraTreesClassifier() 함수를 사용하고 파라미터는 랜덤포레스트와 유사하다. (https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html)
- 계산 비용 및 실행 시간 측면 에서 Extra Trees 알고리즘이 더 빠르다.
반응형
'🛠 기타 > Data & AI' 카테고리의 다른 글
합성곱 신경망(CNN) - 기본구조 구현 (0) | 2020.08.14 |
---|---|
[scikit-learn 라이브러리] BaggingClassifier (배깅분류기) (0) | 2020.08.13 |
[scikit-learn 라이브러리] VotingClassifier (보팅 분류기) (0) | 2020.08.12 |
앙상블 학습 (0) | 2020.08.12 |
Pandas 데이터프레임 apply, replace (0) | 2020.08.09 |