Bagging (Bootstrap aggregating)
Boosting
핵심! 성능이 안 좋은 약한 학습자들을 합쳐서 성능을 극대화한다
에다 부스트도 랜덤 포레스트와 같이 수많은 결정 트리들을 만든다
근데 랜덤 포레스트에서 만든 트리 모델들은 깊이가 조금 있는데 에다부스트는 얕은
결정트리를 만든다 !
ex)
ㄴ 이렇게 생김, 이걸 스텀프(stump) 라고 함
스텀프는 주로 50%보다 조금 좋은 성능을 낸다
에다 부스트는 일부러 weak learner을 쓴다 했기 때문에 stump를 쓰는 것임
이 데이터 셋을 이용해서 결정 스텀프 하나를 만듦
이 결정 스텀프가 맞게 분류하는 애들이 있고 틀리게 분류하는 애들이 있는데, 그 다음 스텀프에 데이터 셋을 만들 때는 앞에 있는 스텀프가 틀리게 예측한 데이터 중요도를 올려주고, 맞게 예측한 데이터 중요도를 낮춰준다
그리고 또 스텀프를 또 만듦
반복해서 뒤 스텀프들은 앞 스텀프들의 실수를 더 잘 맞추게 된다
엄청 많은 스텀프들을 만들어줌 !! ex) 100, 150, 200 개 등등
에다부스트는 다수결의 법칙이 아닌 성능 주의적으로 간다
이렇게 중요도가 다른 스텀프들이 있고
이렇게 스텀프들이 예측했다면
독감을 예측한 스텀프들의 성능 합은 6
이고 일반 감기를 예측한 스텀프들의 성능 합은 5
이기 때문에 다수결의 법칙에 위배되도 독감
을 예측하도록 설계 된다
**정리 !!
에다부스트
중요도를 추가했당 (중요도의 합은 항상 1로 유지)
각 분류/질문들의 불순도를 비교해서 스텀프를 만든다
스텀프를 만들 때마다 미리 성능을 계산해야한다
공식은 이렇다 !
여기서 total
은 틀리게 예측한 데이터 중요도의 합이다
이 식을 왜 사용할까 ?
total error가 1이면 스텀프가 모든 데이터를 다 틀리게 예측했을 때이다 = 성능이 엄청 안 좋다는 뜻
total error가 0이면 스텀프가 모든 데이터를 다 맞게 예측했을 때이다 = 성능이 엄청 좋다
total error가 0.5이면 모든 데이터를 딱 절반만 맞췄을 때이다
스텀프 생성과 성능
total_error
를 계산하는데 사용된다중요도 바꾸는 공식
틀리게 예측한 데이터 중요도 바꾸는 공식
(weight new는 새로운 중요도, weight old는 예전 중요도, e는 2.71에 트리 성능 제곱)
맞게 예측한 데이터 중요도 바꾸는 공식
그래프는 이렇게 생겼다
새로운 중요도는 e에 1보다 큰 숫자가 곱해져서 중요도가 커지고 맞은 데이터들은 e에 1보다 작은 숫자가 곱해지기 때문에 중요도가 줄어든다
ex)
공식을 각 중요도에 넣어주면
이렇게 된다
주의! 중요도는 항상 합이 1이다
중요도의 합이 1이 되게 하기 위해선 각 중요도마다 중요도 / 모든 중요도 합
을 해준다
데이터를 준비해주고
여기에서 중요도에 각 범위를 부여한다
ex) 0.4012를 고르면 새 데이터셋에 추가하는 것
중요도가 높은 데이터는 범위가 크기 때문에 고를 확률이 높음 !
중요도가 높은 데이터들은 여러번 들어갔고 중요도가 낮은 데이터들은 아예 추가가 안된 데이터들도 있다
ㄴ 전 스텀프들이 틀린, 중요도가 높은 데이터들이 확률적으로 더 많이 들어있기 때문에 새로 만들 스텀프가 얘네를 더 잘 맞출 수 있는 것이다
이제 이 데이터 셋을 써서 똑같이 스텀프를 만든다 (지니 불순도를 비교해서 가장 성능이 좋은 노드를 고르는 것임)
-> 이 스텀프의 성능을 계산
-> 원래 데이터 셋에서 분류의 틀린 데이터들의 중요도를 높여주고 맞은 데이터들의 중요도를 낮춰준다
스텀프 생성과 성능
= 뒤 스텀프들은 앞 스텀프들의 실수를 더 잘 맞출 수 있게 된다
ex)
이렇게 됐을 때 이 환자를 독감으로 분류한다 ( 독감 성능 합이 더 높기 때문 )
ㄴ 수많은 스텀프들이 있어도 똑같이 하면 된다
필요한 도구들 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
이번 과제에서는 sklearn 에다 부스트 모델을 직접 사용해 볼게요. 데이터는 챕터 1 과제에서 본 유방암 데이터를 사용하겠습니다. 준비 코드는 챕터 1 유방암 데이터 준비 과제에서 그대로 가지고 오셔도 되고, 이번에 직접 다시 작성하셔도 됩니다.
해야 하는 일
AdaBoostClassifier
)을 만든다. (옵셔널 파라미터: n_estimators=50, random_state=5
)predictions
변수에 저장)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