일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 배열 회전시키기
- AI SCHOOL
- matplotlib.pyplot
- 미드프로젝트
- pandas로 그래프
- 지하철적자원인
- 통계그래픽
- AISCHOO8기
- axes-level
- 핸즈온머신러닝
- figure-level
- 배열의 유사도
- 멋쟁이사자처럼
- RandomForest
- 상관계수분석
- 노인무임승차
- AISCHOOL8기
- 머신러닝
- 구글colab
- ML
- 시각화
- fromkeys
- 중복된 문자제거
- 멋사AI스쿨
- read_html
- Seaborn 튜토리얼
- ML기초
- seaborn
- 파이썬데이터타입
- 파이썬 그래프
- Today
- Total
코린이 성장일기
[ML] Ensemble Learning: Random Forest 본문
1. 앙상블 : '전체적인 어울림이나 통일', '조화', '함께, 동시에'라는 의미를 가진 프랑스어
2. 머신러닝에서 앙상블 학습(Ensemble Learning)이란, 말 그대로 여러 모델을 써서 조합하여 결과를 낸다.
이렇게 하면 하나의 분류나 회귀 모델이 가진 최고 성능보다 더 좋은 성능을 얻을 수 있다.
그래서 요즘 Kaggle의 우승사례를 보면 대부분 앙상블을 사용했다고. . .
예를 들어보면, DecisionTree 모델 하나만 쓰는 게 아니라, KMN, 로지스틱, SVM과 같은 모델을 사용해서 결과물을 종합해서 가장 좋은 결과를 내는 것으로,
3. 가장 대표적인 앙상블 모델이 Random Forest이다. Decision Tree를 기반으로 앙상블을 하는 것인데,
말 그대로 나무를 모아서 숲을 만드는 것.
그래서 결정 나무에서는 새로운 관측치가 1개 들어오면 개별 나무를 돌려서 결과를 냈지만,
앙상블 모델에서는 여러 나무에 새 관측치를 넣고, 그 나무들이 결과물을 낼 것이고, 그 결과물을 모아서 다수결이나 가중합을 하거나 평균을 내는 방식을 사용해서 결과를 종합한다.
그러면 이 최종 결과물은 어떻게 모으는지, 모으는 과정에서 어떤 원리가 있는지 이해해야 한다.
1) 모으는 방법 : 투표 기반 분류기
- 각각의 모델이 학습하여 나온 결과를 모아서 다수로 모인 것을 결과로 결정
- 이 경우에는 대부분이 하나씩 모델을 적용한 것보다 훨씬 좋은 결과가 나와서 안 쓸 이유가 없다.
- 그래서 개별 모델을 Weak Learner, 앙상블 된 것을 Strong Learner 이라고 한다.
- 각 분류기가 weak해도 다양한 분류기를 결합하면 strong 해짐 !
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 |