위 글들을 먼저 읽어야 이해할 수 있는 내용이다.
랜덤 포레스트(random forest)
분류, 회귀 분석 등에 사용되는 앙상블 학습 방법의 일종
분류 - 분류는 미리 정의된, 가능성이 있는 여러 클래스 레이블 중 하나를 예측하는 것
회귀 - 연속적인 숫자(실수)를 예측하는 것
앙상블이란?
여러 Base 모델들의 예측을 다수결 법칙 또는 평균을 이용해 통합하여 예측의 정확성을 향상시키는 방법
랜덤 포레스트는 의사결정 트리(Decision Tree)를 Base 모델로 사용한다.
결정 트리의 단점인 훈련 데이터에 오버 피팅이 된다는 점을 여러 개의 결정 트리를 통해 랜덤 포레스트를 만들어 해결한다
핵심 아이디어
1. 여러개의 트레이닝 데이터를 생성하여 각 데이터마다 개별 의사결정 트리를 구축한다. (Bagging)
2. 의사결정트리를 구축할 때 변수를 무작위로 선택한다. (Random subspace)
Bagging(Bootstrap Aggregating)
각각의 Bootstrap 샘플을 여러 번 뽑아 각 모델을 학습시켜 결과를 집계(Aggregating)하는 방법
# Bootstrap = Sample(샘플)
# Aggregating = 합산
Bootstrap
복원추출을 통해 원래 데이터의 수만큼 크기를 같도록 하는 샘플링 방법
하나의 모델에 대하여 데이터를 추출할 경우 중복된 데이터가 있을 수 있다.
# 복원추출 - 추출한 데이터를 다시 모집단에 복원해 추출하는 것
# 이론적으로 한 계체가 하나의 부스트랩에 한 번도 선택되지 않을 확률은 약 0.368이다.
Random subspace
의사결정트리의 분할점을 탐색할 때 원래 변수의 수보다 적은 수의 변수를 임의로 선택하여 해방 변수들만 고려 대상으로 하는 것
1. 원래 변수들 중에서 모델 구축에 쓰일 입력 변수를 무작위로 선택한다.
2, 선택된 입력 변수 중에 분할될 하나의 변수를 선택 -> 이때 선택할 때는 엔트로피나 지니계수를 통해 정보 획득량이 최대인 변수를 선택한다.
3. 위 과정을 full-grown tree가 될 때까지 반복한다.
하이퍼 파라미터(사용자가 선택해야 하는 변수)
- 의사결정 트리의 수
- 의사결정 트리에서 노드 분할 시 무작위로 선택되는 변수의 수(위의 예제에서는 4)
- 분류 문제일 때는 sqrt(변수의 수)
- 회귀 문제일 때는 변수의 수 / 3
특징
알고리즘이 굉장히 간단하다.
결정 트리들로 이루어지기 때문에 각각의 결정 트리들을 학습하는 과정이 필요하다.
단일 트리의 단점을 보완하고 장점은 가지고 있기 때문에 성능이 매우 뛰어나다.
메모리 사용량이 굉장히 많다.
(트리를 만드는 것 자체가 메모리를 많이 사용하는데 랜덤 포레스트는 여러 개를 만들어 종합해야 하기 때문에 메모리 사용량이 굉장히 많다)
구현
랜덤 포레스트를 구현하기 전에 랜덤 포레스트의 Base 모델이 되는 의사결정 트리를 구현해본다.
의사결정트리 구현
1. sklearn에서 데이터셋과 트리 모델을 가져온다.
from sklearn import datasets #데이터 셋
from sklearn.tree import DecisionTreeClassifier #트리 구현
from sklearn.model_selection import train_test_split
2. 데이터를 로드한 후에 features에 학습 데이터를 target에 정답 데이터를 넣은 뒤에 트레이닝 셋과 테스트 셋으로 나눈다.
iris = datasets.load_iris() # 붓꽃 데이터
features = iris.data # 학습 데이터
target = iris.target # 정답 데이터
X_train,X_test, y_train,y_test = train_test_split(features,target)
3. 트리를 만든 후에 fit을 이용하여 모델을 훈련시킨다.
decisiontree = DecisionTreeClassifier()
model = decisiontree.fit(X_train, y_train) # 모델을 훈련합니다
4. 테스트 셋을 이용하여 얼마나 정확한지 확인해본다.
print("train : {:.2f}".format(model.score(X_train,y_train)))
print("test : {:.2f}".format(model.score(X_test,y_test)))
--출력--
train : 1.00
test : 0.95
train데이터에 대해서는 100퍼센트, test데이터에 대해서는 95퍼센트의 정확도를 가지고 있는 것을 볼 수 있다.
랜덤 포레스트 구현
1. sklearn에서 데이터셋과, 랜덤 포레스트 모델, 트리 모델을 가져온다. 그 외에도 그래프를 그리는 모듈도 가져온다.
from sklearn.datasets import make_moons #달모양 데이터 셋 만듬
from sklearn.ensemble import RandomForestClassifier #랜덤 포레스트
from sklearn.model_selection import train_test_split #데이터셋 나누기
from sklearn.tree import DecisionTreeClassifier #의사결정트리
import matplotlib.pyplot as plt #그래프 그리기
import mglearn #간단한 그림을 그리거나 데이터를 바로 불러들이기 위해 사용
2. make_moons 모듈을 이용해서 가상의 달 모양 데이터를 만든다.
#n_samples : 표본 데이터의 수, 디폴트 100
#noise: 잡음의 크기. 0이면 정확한 반원을 이룸
#random_state : 난수 발생 시드
X, y = make_moons(n_samples=100, noise=0.25, random_state=10)
이걸 시각화하면
3. 만든 데이터를 트레이닝 셋과 테스트 셋으로 나눈다.
#stratify =y 지정한 Data의 비율을 유지
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
4. 의사결정 트리와 랜덤 포레스트의 정확성을 비교해보기 위해서 의사결정 트리를 구현한다.
#의사결정 트리로 구현
tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
print('DecisionTree train : {}'.format(tree.score(X_train,y_train)))
print('DecisionTree test : {}'.format(tree.score(X_test,y_test)))
--출력--
DecisionTree train : 1.0
DecisionTree test : 0.92
5. 랜덤 포레스트를 구현한다.
#랜덤 포레스트로 구현
#n_estimators : 생성할 tree의 개수
forest = RandomForestClassifier(n_estimators=5, random_state=2) #5개의 트리를 생성
forest.fit(X_train, y_train)
print('RandomForest train : {}'.format(forest.score(X_train,y_train)))
print('RandomForest test : {}'.format(forest.score(X_test,y_test)))
--출력--
RandomForest train : 1.0
RandomForest test : 0.96
랜덤 포레스트가 테스트 셋 정확도가 더 높은 것을 확인할 수 있다.
시각화
fig, axes = plt.subplots(2, 3, figsize=(20, 10))
for i, (ax, tree) in enumerate(zip(axes.ravel(), forest.estimators_)):
print(i + 1)
print(ax)
ax.set_title("tree {}".format(i + 1))
mglearn.plots.plot_tree_partition(X, y, tree, ax=ax)
mglearn.plots.plot_2d_separator(forest, X, fill=True, ax=axes[-1, -1], alpha=.4)
axes[-1, -1].set_title("random forest")
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
앞서 만든 5개의 트리와 마지막의 랜덤 포레스트의 그래프까지 시각화된다.
##예제 코드##
Random Forest_1은 의사결정 트리만 구현
Random Forest_2는 의사결정 트리, 랜덤 포레스트, 시각화
'Emotion > 인공지능 기초' 카테고리의 다른 글
선형회귀(linear regression) (0) | 2020.09.24 |
---|---|
나이브 베이즈 (0) | 2020.09.24 |
의사결정 트리 CART (0) | 2020.09.16 |
의사결정 트리 캐글 (0) | 2020.09.15 |
의사결정 트리 ID3 (1) | 2020.09.15 |