에다 부스트 (Adaboost)

yiseonline·2023년 9월 2일
1

datascience

목록 보기
25/28
post-thumbnail

3.1 Boosting

Bagging (Bootstrap aggregating)

  • 임의로 bootstrap 데이터 셋들을 만든다
  • bootstrap 데이터 셋을 사용해서 수많은 모델들을 만든다
  • 이 모델들의 예측을 종합(aggregating)한다

Boosting

  • 일부러 성능이 안 좋은 모델들을 사용한다
  • 더 먼저 만든 모델들의 성능이, 뒤에 있는 모델이 사용할 데이터 셋을 바꾼다
  • 모델들의 예측을 종합할 때, 성능이 좋은 모델의 예측을 더 반영한다

핵심! 성능이 안 좋은 약한 학습자들을 합쳐서 성능을 극대화한다


3.2 에다 부스트 개요

에다 부스트도 랜덤 포레스트와 같이 수많은 결정 트리들을 만든다

근데 랜덤 포레스트에서 만든 트리 모델들은 깊이가 조금 있는데 에다부스트는 얕은
결정트리를 만든다 !

ex)

ㄴ 이렇게 생김, 이걸 스텀프(stump) 라고 함
스텀프는 주로 50%보다 조금 좋은 성능을 낸다

에다 부스트는 일부러 weak learner을 쓴다 했기 때문에 stump를 쓰는 것임


이 데이터 셋을 이용해서 결정 스텀프 하나를 만듦

이 결정 스텀프가 맞게 분류하는 애들이 있고 틀리게 분류하는 애들이 있는데, 그 다음 스텀프에 데이터 셋을 만들 때는 앞에 있는 스텀프가 틀리게 예측한 데이터 중요도를 올려주고, 맞게 예측한 데이터 중요도를 낮춰준다

그리고 또 스텀프를 또 만듦

반복해서 뒤 스텀프들은 앞 스텀프들의 실수를 더 잘 맞추게 된다

엄청 많은 스텀프들을 만들어줌 !! ex) 100, 150, 200 개 등등

에다부스트는 다수결의 법칙이 아닌 성능 주의적으로 간다

이렇게 중요도가 다른 스텀프들이 있고

이렇게 스텀프들이 예측했다면

독감을 예측한 스텀프들의 성능 합은 6이고 일반 감기를 예측한 스텀프들의 성능 합은 5이기 때문에 다수결의 법칙에 위배되도 독감을 예측하도록 설계 된다

**정리 !!

에다부스트

  • 성능이 좋지 않은 결정 스텀프들을 많이 만든다
  • 각 스텀프는 전에 왔던 스텀프들이 틀린 데이터들을 더 중요하게 맞춘다
  • 예측을 종합할 때, 성능이 좋은 스텀프의 의견 비중을 더 높게 반영한다

3.3 스텀프 성능 계산하기


중요도를 추가했당 (중요도의 합은 항상 1로 유지)

각 분류/질문들의 불순도를 비교해서 스텀프를 만든다

스텀프를 만들 때마다 미리 성능을 계산해야한다

공식은 이렇다 !
여기서 total은 틀리게 예측한 데이터 중요도의 합이다

이 식을 왜 사용할까 ?

total error가 1이면 스텀프가 모든 데이터를 다 틀리게 예측했을 때이다 = 성능이 엄청 안 좋다는 뜻

total error가 0이면 스텀프가 모든 데이터를 다 맞게 예측했을 때이다 = 성능이 엄청 좋다

total error가 0.5이면 모든 데이터를 딱 절반만 맞췄을 때이다

스텀프 생성과 성능

  • 첫 번째 스텀프는 결정 트리를 만들 때 처럼 지니 불순도를 써서 만든다
  • 모든 데이터는 중요도가 있다. 중요도는 total_error를 계산하는데 사용된다
  • total_error를 이용하면 스텀프의 성능을 계산할 수 있다

3.4 데이터 중요도 바꾸기

중요도 바꾸는 공식

틀리게 예측한 데이터 중요도 바꾸는 공식
(weight new는 새로운 중요도, weight old는 예전 중요도, e는 2.71에 트리 성능 제곱)

맞게 예측한 데이터 중요도 바꾸는 공식


그래프는 이렇게 생겼다

새로운 중요도는 e에 1보다 큰 숫자가 곱해져서 중요도가 커지고 맞은 데이터들은 e에 1보다 작은 숫자가 곱해지기 때문에 중요도가 줄어든다

ex)

공식을 각 중요도에 넣어주면

이렇게 된다

주의! 중요도는 항상 합이 1이다

중요도의 합이 1이 되게 하기 위해선 각 중요도마다 중요도 / 모든 중요도 합을 해준다


3.5 스텀프 추가하기


데이터를 준비해주고

여기에서 중요도에 각 범위를 부여한다

  • 0~1 사이 임의 숫자를 고른다
  • 그 범위를 갖는 데이터를 고른다
  • 원래 데이터셋의 크기만큼 반복한다

ex) 0.4012를 고르면 새 데이터셋에 추가하는 것

중요도가 높은 데이터는 범위가 크기 때문에 고를 확률이 높음 !


중요도가 높은 데이터들은 여러번 들어갔고 중요도가 낮은 데이터들은 아예 추가가 안된 데이터들도 있다
ㄴ 전 스텀프들이 틀린, 중요도가 높은 데이터들이 확률적으로 더 많이 들어있기 때문에 새로 만들 스텀프가 얘네를 더 잘 맞출 수 있는 것이다

이제 이 데이터 셋을 써서 똑같이 스텀프를 만든다 (지니 불순도를 비교해서 가장 성능이 좋은 노드를 고르는 것임)
-> 이 스텀프의 성능을 계산
-> 원래 데이터 셋에서 분류의 틀린 데이터들의 중요도를 높여주고 맞은 데이터들의 중요도를 낮춰준다

스텀프 생성과 성능

  • 전 모델의 틀린 데이터의 중요도는 올렸고, 맞은 데이터의 중요도는 낮췄다
  • 중요도를 이용해서 새로운 스텀프가 사용할 데이터 셋을 만들었다
  • 새로운 데이터 셋으로 스터프를 학습시켜서 추가했다


= 뒤 스텀프들은 앞 스텀프들의 실수를 더 잘 맞출 수 있게 된다


3.6 예측하기

ex)

이렇게 됐을 때 이 환자를 독감으로 분류한다 ( 독감 성능 합이 더 높기 때문 )
ㄴ 수많은 스텀프들이 있어도 똑같이 하면 된다


3.7 scikit-learn으로 에다 부스트 쉽게 사용하기

필요한 도구들 import !!

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
import matplotlib.pyplot as plt
import numpy as np

import pandas as pd

데이터 불러오고 데이터프레임에 저장

iris_data = load_iris()

X = pd.DataFrame(iris_data.data, columns = iris_data.feature_names)
y = pd.DataFrame(iris_data.target, columns = ['class'])

training 과 test 분류

X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 5)
y_train = y_train.values.ravel()

에다부스트 모델 가져오기

model = AdaBoostClassifier(n_estimators = 100)

모델 학습시키기

model.fit(X_train, y_train)

output

예측하기 !

model.predict(X_test)

output

array([1, 1, 2, 0, 2, 2, 0, 2, 0, 1, 1, 1, 2, 2, 0, 0, 2, 2, 0, 0, 1, 2,
       0, 1, 1, 2, 1, 1, 1, 2])

모델 성능 평가하기

model.score(X_test, y_test)

output

0.8666666666666667

속성 중요도 배열에 저장하기 !

importances = model.feature_importances_

저장한 중요도를 시각화 해서
학습 시킨 에다 부스트 모델에서 각 속성이 얼마나 중요하게 사용됐는지 나타내자 !!

indices_sorted = np.argsort(importances)

plt.figure()
plt.title('Feature importances')
plt.bar(range(len(importances)), importances[indices_sorted])
plt.xticks(range(len(importances)), X.columns[indices_sorted], rotation = 90)
plt.show() # 학습 시킨 에다 부스트 모델에서 각 속성이 얼마나 중요하게 사용됐는지 나타내줌

output
업로드중..


3.8 (실습) 에다 부스트로 악성/양성 유방암 분류하기

이번 과제에서는 sklearn 에다 부스트 모델을 직접 사용해 볼게요. 데이터는 챕터 1 과제에서 본 유방암 데이터를 사용하겠습니다. 준비 코드는 챕터 1 유방암 데이터 준비 과제에서 그대로 가지고 오셔도 되고, 이번에 직접 다시 작성하셔도 됩니다.

해야 하는 일

  • 챕터 1 과제에서 준비했던 유방암 데이터 셋을 사용한다.
  • 에다 부스트 모델(AdaBoostClassifier)을 만든다. (옵셔널 파라미터: n_estimators=50, random_state=5)
  • training set 데이터를 써서 모델을 학습시킨다.
  • 학습시킨 모델에 testing set 데이터를 넣어서 예측한다. (결과는 predictions 변수에 저장)
  • testing set 데이터를 사용해서 학습시킨 모델의 성능을 평가한다. (결과는 score 변수에 저장)

조건

  • predictions, score 변수를 출력하여 채점한다.

code

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier

import pandas as pd

# 데이터 셋 불러 오기
cancer_data = load_breast_cancer()

# 입력 변수를 사용하기 편하게 pandas dataframe에 저장
X = pd.DataFrame(cancer_data.data, columns = cancer_data.feature_names)
# 목표 변수를 사용하기 편하게 pandas dataframe에 저장
y = pd.DataFrame(cancer_data.target, columns = ['class'])

# training-test 셋 나누기
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=5)
# 후에 모델 학습시킬 때 경고 안나게 하기
y_train = y_train.values.ravel()

# 에다부스트 모델 정의
model = AdaBoostClassifier(n_estimators=50, random_state=5)
# 모델 학습
model.fit(X_train, y_train)
# 예측하기
predictions = model.predict(X_test)
# 모델의 성능 파악
score = model.score(X_test, y_test)

predictions, score

0개의 댓글