Study_note(zb_data)/Machine Learning

스터디노트 (Boosting Algorithm)

KloudHyun 2023. 10. 2. 16:52

📌 앙상블 기법의 종류

- Voting, Bagging -> 여러개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식

- Bagging과 Boosting의 차이 →  한번에 병렬적으로 결과를 얻음 / 순차적으로 진행 

🔻Voting

- 전체 Data를 다 쓰면서 각각 다른 Algorithm 적용 (각각 다른 분류기를 적용)

🔻Bagging

- Bootstrap Aggregating

- 하나의 Algorithm 사용, 전체 Data를 나눠서 적용 (중복 허가)  (#부트스트랩핑) (하나의 분류기를 적용)

- 대표적인 방식이 Random Forest (Tree 기반) 이다. 

🔻Boosting

- 여러개의 분류기가 순차적 학습 (성능 ↓, 속도 ↑), 분류기가 예측이 틀린 데이터에 대해 다음 분류기가 가중치를 인가해서 학습을 이어 하는 방식 

출처 : 제로베이스 데이터 스쿨

📋 그 외 스태깅 등의 방법이 있다.

🔻AdaBoost

출처 : 제로베이스 데이터 스쿨

📌 Boosting 기법의 종류

🔻GBM 

→ AdaBoost 기법과 비슷하지만 가중치를 업데이트 할 때, 경사 하강법 (Gradient Descent) 을 사용한다.

🔻XGBoost

→ GBM에서 PC의 파워를 효율적으로 사용하기 위해 다양한 기법에 채택, 빠른 속도와 효율을 가진다.

🔻Light GBM

→ XGBoost보다 빠른 속도를 가진다.

📌 실습

🔻wine['taste'] 데이터 만들기

import pandas as pd

wine = pd.read_csv('../data/wine.csv', index_col=0)

wine['taste'] = [1. if grade > 5 else 0. for grade in wine['quality']]

X=wine.drop(['taste', 'quality'], axis=1)
y=wine['taste']

🔻StandardScaler를 적용 시켜보기

# pipeline 대신 StandardScaler 를 적용 해보자
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_sc = sc.fit_transform(X)
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X_sc, y, random_state=13, test_size=0.2)

🔻histogram 그려보기

import matplotlib.pyplot as plt
%matplotlib inline

wine.hist(bins=10, figsize=(16, 10))
plt.show()

🔻각 컬럼의 특성 확인

- 상관관계 파악시 (corr), - 값으로 볼게 아니라 절대값으로 확인해야 함 ! 

corr_matrix = wine.corr()
corr_matrix

corr_matrix['quality'].sort_values(ascending=False)
>>>>
quality                 1.000000
taste                   0.814484
alcohol                 0.444319
citric acid             0.085532
free sulfur dioxide     0.055463
sulphates               0.038485
pH                      0.019506
residual sugar         -0.036980
total sulfur dioxide   -0.041385
fixed acidity          -0.076743
color                  -0.119323
chlorides              -0.200666
volatile acidity       -0.265699
density                -0.305858
Name: quality, dtype: float64

🔻다양한 모델을 한 번에 TEST 시도!

from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier, RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression

# 모델의 이름과 인스턴스 형태를 model 이라는 list에 append
models = []
models.append(('RandomForestClassifier', RandomForestClassifier()))
models.append(('DecisionTreeClassifier', DecisionTreeClassifier()))
models.append(('AdaBoostClassifier', AdaBoostClassifier()))
models.append(('GradientBoostingClassifier', GradientBoostingClassifier()))
models.append(('LogisticRegression', LogisticRegression()))
from sklearn.model_selection import KFold, cross_val_score

results = []
names = []

for name, model in models:
    kfold = KFold(n_splits=5, random_state=13, shuffle=True)
    cv_results = cross_val_score(model, X_train, y_train, cv=kfold, scoring='accuracy')
    results.append(cv_results)
    names.append(name)

    print(name, cv_results.mean(), cv_results.std())
>>>>
RandomForestClassifier 0.8206600281335603 0.015040632086072148
DecisionTreeClassifier 0.7587036351521432 0.013104484930143144
AdaBoostClassifier 0.7533103205745169 0.02644765901536818
GradientBoostingClassifier 0.7663959428444511 0.021596556352125432
LogisticRegression 0.74273191678389 0.015548839626296565

🔻Boxplot으로 보기

fig = plt.figure(figsize=(12, 6))
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()

🔻accuracy_score 확인하기

from sklearn.metrics import accuracy_score

for name, model in models:
    model.fit(X_train, y_train)
    pred = model.predict(X_test)
    print(name, accuracy_score(y_test, pred))
>>>>
RandomForestClassifier 0.8423076923076923
DecisionTreeClassifier 0.7746153846153846
AdaBoostClassifier 0.7553846153846154
GradientBoostingClassifier 0.7884615384615384
LogisticRegression 0.7469230769230769