본문 바로가기
개발/Python

결정 트리 (부스팅)

by 피로물든딸기 2025. 8. 15.
반응형

전체 링크

부스팅

- 여러 개의 약한 학습기를 순차적으로 학습시켜 강한 학습기로 만드는 앙상블 방법

- 오류 데이터에 더 큰 가중치를 부여하여 다시 샘플링

- 약한 학습기 : weak learner, 조금만 잘 맞는 모델 (예: 깊이가 낮은 결정트리)

- 강한 학습기 : strong learner, 여러 약한 학습기를 합쳐 높은 정확도를 내는 모델


다음 데이터에 대해 부스팅을 4번 적용하라. (결정 트리, 최대 깊이 5 모형)

import pandas as pd
import numpy as np

np.random.seed(1234)

X = np.random.randn(500, 5)  # 500개 샘플, 5개 변수
y = np.random.choice([0, 1], size=500)

df = pd.DataFrame(X, columns=[f'X{i+1}' for i in range(5)])
df['y'] = y

df

 

훈련 세트와 테스트 세트는 다음과 같이 나누어서 실행하라.

from sklearn.model_selection import train_test_split

TRAIN, TEST = train_test_split(df, test_size=0.2, random_state=1234)

최초의 train 데이터로 시작해 모델을 만들고, y_true와 y_pred가 다른 데이터(=error_data)를 train에 추가하면 된다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import f1_score

models = []
train = TRAIN.copy()
cols = ['X1', 'X2', 'X3', 'X4', 'X5']

for _ in range(5):
    model = DecisionTreeClassifier(random_state=1234, max_depth=5)
    model.fit(train[cols], train['y'])
    
    models.append(model)
    
    y_true = train['y']
    y_pred = model.predict(train[cols])
    
    print(f1_score(y_true, y_pred))
    
    error_data = train[y_true != y_pred]
    train = pd.concat([train, error_data], axis=0)

 

각 모델의 결과를 결합한 앙상블 모델도 만들 수 있다.

랜덤으로 만든 데이터이기 때문에 반드시 f1_score가 높아지는 것은 아니다.

pred0 = models[0].predict(TEST[cols])
pred1 = models[1].predict(TEST[cols])
pred2 = models[2].predict(TEST[cols])
pred3 = models[3].predict(TEST[cols])
pred4 = models[4].predict(TEST[cols])

pred = ((pred0 + pred1 + pred2 + pred3 + pred4) >= 3) * 1

f1_score(TEST['y'], pred)

반응형

댓글