코린이 성장일기

[ML] Ensemble Learning: Random Forest 본문

programming/머신러닝

[ML] Ensemble Learning: Random Forest

JJouni 2023. 3. 16. 17:50

1. 앙상블 : '전체적인 어울림이나 통일', '조화', '함께, 동시에'라는 의미를 가진 프랑스어

 

2. 머신러닝에서 앙상블 학습(Ensemble Learning)이란, 말 그대로 여러 모델을 써서 조합하여 결과를 낸다.

이렇게 하면 하나의 분류나 회귀 모델이 가진 최고 성능보다 더 좋은 성능을 얻을 수 있다. 

그래서 요즘 Kaggle의 우승사례를 보면 대부분 앙상블을 사용했다고. . . 

예를 들어보면, DecisionTree 모델 하나만 쓰는 게 아니라, KMN, 로지스틱, SVM과 같은 모델을 사용해서 결과물을 종합해서 가장 좋은 결과를 내는 것으로, 

 

3. 가장 대표적인 앙상블 모델이 Random Forest이다. Decision Tree를 기반으로 앙상블을 하는 것인데,

말 그대로 나무를 모아서 숲을 만드는 것.

K-mooc '실습으로 배우는 머신러닝' 김영훈 교수님 강좌에서 발췌함

그래서 결정 나무에서는 새로운 관측치가 1개 들어오면 개별 나무를 돌려서 결과를 냈지만,

앙상블 모델에서는 여러 나무에 새 관측치를 넣고, 그 나무들이 결과물을 낼 것이고, 그 결과물을 모아서 다수결이나 가중합을 하거나 평균을 내는 방식을 사용해서 결과를 종합한다. 

 

그러면 이 최종 결과물은 어떻게 모으는지, 모으는 과정에서 어떤 원리가 있는지 이해해야 한다.

 

1) 모으는 방법 : 투표 기반 분류기 

- 각각의 모델이 학습하여 나온 결과를 모아서 다수로 모인 것을 결과로 결정

- 이 경우에는 대부분이 하나씩 모델을 적용한 것보다 훨씬 좋은 결과가 나와서 안 쓸 이유가 없다.

- 그래서 개별 모델을 Weak Learner, 앙상블 된 것을 Strong Learner 이라고 한다. 

- 각 분류기가 weak해도 다양한 분류기를 결합하면 strong 해짐 ! 

 

Majority Voting을 해서 종합하면 비선형적 분류선으로 변형되어 더 정밀함.

 

2) 모으는 과정 : 다양한 분류기 만들기

- 각기 다른 훈련 알고리즘(모델)을 사용한다

- 훈련 데이터셋을 무작위로 subset을 구성하여 각각 다르게 학습시킨다. 

 

이 때, 랜덤포레스트는 두 번째 무직위로 subset을 구성하는 방법을 사용한다.

무작위 subset을 구성하는 방법 중 하나로 배깅(Bagging)이 있다. 

 

3) Bagging(Bootstrap aggregation)

- Bootstrap을 한 후, 최종 결과를 종합(aggregation) 하는 방식

* Bootstrap : 랜덤 샘플링할 때 복원 추출해서 얻어진 데이터로 모수를 추정하는 기법

* 복원 추출 : train 데이터에서 중복을 허용하여 샘플링하는 방식

- 그러니까 동일한 개수만큼 추출해서 데이터셋을 만들고 여러 트리에 학습시킨다.

- 랜덤포레스트는 Bagged Tree(베깅이 적용된 트리 알고리즘)이라고 불리기도 한다.

 

* Pasting : 비복원 추출(중복을 허용하지 않고 샘플링)

- 중복을 허용하는 Bagging, Bootstrap과 반대되는 개념

 

 

4. 일반 나무랑 배깅된 숲 정확도 비교

# 깔끔한 그래프 출력을 위해 라이브러리 소환
%matplotlib inline
import matplotlib.pyplot as plt

# 데이터를 무작위하게 train과 test로 나눠줄 예정
from sklearn.model_selection import train_test_split
# moons 데이터셋 사용
from sklearn.datasets import make_moons

X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

# 모델에 학습시켜봅니다
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

# 결정트리를 base_estimator로 사용했고, 총 500개를 사용할 예정,  
# X에서 추출할 샘플은 최대 100개, bootstrap 배깅(False는 페이스팅)으로 학습시킬 예정.
bag_clf = BaggingClassifier(
    DecisionTreeClassifier(), n_estimators=500,
    max_samples=100, bootstrap=True, random_state=42)
    
# 학습시키고 예측해본다.
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)

# 정확도 측정
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))

# 비교할 나무 모델도 만들어주고 정확도 계산
tree_clf = DecisionTreeClassifier(random_state=42)
tree_clf.fit(X_train, y_train)
y_pred_tree = tree_clf.predict(X_test)
print(accuracy_score(y_test, y_pred_tree))

# 이제 비교해보자
from matplotlib.colors import ListedColormap

def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.45, -1, 1.5], alpha=0.5, contour=True):
    x1s = np.linspace(axes[0], axes[1], 100)
    x2s = np.linspace(axes[2], axes[3], 100)
    x1, x2 = np.meshgrid(x1s, x2s)
    X_new = np.c_[x1.ravel(), x2.ravel()]
    y_pred = clf.predict(X_new).reshape(x1.shape)
    custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
    plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
    if contour:
        custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
        plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha)
    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha)
    plt.axis(axes)
    plt.xlabel(r"$x_1$", fontsize=18)
    plt.ylabel(r"$x_2$", fontsize=18, rotation=0)

요렇게 비교해서

fig, axes = plt.subplots(ncols=2, figsize=(10,4), sharey=True)
plt.sca(axes[0])
plot_decision_boundary(tree_clf, X, y)
plt.title("Decision Tree", fontsize=14)
plt.sca(axes[1])
plot_decision_boundary(bag_clf, X, y)
plt.title("Decision Trees with Bagging", fontsize=14)
plt.ylabel("")
plt.show()

요렇게 그려주면,

이렇게 생성되는데, 나무 1개보다 baggin한 결정 나무들이 더 정확한 것을 시각화 해볼 수 있다.

기존 결정 나무는 단일한 선들을 긋지만, 배깅된 결정 나무들에서 추출한 결과는 비선형의 형태임을 볼 수 있다.

 

 

 

* 내용은 Kmooc 강의인 '실습으로 배우는 머신러닝'과 책 '핸즈온 머신러닝' 코드를 발췌하여 사용하였습니다.

'programming > 머신러닝' 카테고리의 다른 글

[ML] 머신러닝의 학습, Learning  (1) 2023.03.23
[ML] Decision Trees  (0) 2023.03.09