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