그렇다면, Boosting은 뭘까..?
알아봅시다 😎
약한(?)분류기
(=성능이 떨어지고 겁나 빠른 = DecisionTree, maxdepth=2_낮게 주는 것)가 순차적으로 학습하면서 앞에서 학습한 분류기가 예측이 틀린 데이터
에 대해 다음 분류기
가 가중치를 인가해 학습을 이어 진행
하는 방식경사하깅법(Gradient Descent)
를 사용학습하는 타이밍
이 동시
에 이뤄짐Boosting 계열의 기본적인 그림(AdaBoost)을 통해 알아봅시다~
가중치
를 줌# 1) 데이터 가져오기
import pandas as pd
wine_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/wine.csv'
wine = pd.read_csv(wine_url,index_col=0)
wine.head()
# 2) 맛 등급 설정
# (1) quality 컬럼 이진화
# wine 데이터의 ['taste'] 컬럼 생성
# wine의 quality column울 grade로 잡고, 5등급 보다 크면 1, 그게 아니라면 0으로 잡음
wine['taste'] = [1. if grade>5 else 0. for grade in wine['quality']]
# (2) 모델링
# label인 taste, quality를 drop, 나머지를 X의 특성으로 봄
X = wine.drop(['taste', 'quality'], axis=1)
# 새로만들 y데이터
y = wine['taste']
# 3) StandardScaler
from sklearn.preprocessing import StandardScaler
# StandardScaler를 installation
sc = StandardScaler()
# X 데이터를 StandardScaler로 변환
X_sc = sc.fit_transform(X)
# 4) 데이터 나누기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=13)
# 5) 히스토그램
import matplotlib.pyplot as plt
%matplotlib inline
wine.hist(bins=10, figsize=(15,15))
plt.show()
wine.columns.values
array(['fixed acidity', 'volatile acidity', 'citric acid',
'residual sugar', 'chlorides', 'free sulfur dioxide',
'total sulfur dioxide', 'density', 'pH', 'sulphates', 'alcohol',
'quality', 'color', 'taste'], dtype=object)
# 6) quality 별 어떤 특성이 있는지 확인
column_names = ['fixed acidity', 'volatile acidity', 'citric acid',
'residual sugar', 'chlorides', 'free sulfur dioxide',
'total sulfur dioxide', 'density', 'pH', 'sulphates', 'alcohol']
df_pivot_table = wine.pivot_table(column_names, ['quality'], aggfunc='median')
print(df_pivot_table)
# 7) quality 대한 나머지 특성들의 상관관계
# (주의사항) : 상관관계를 sort_values로 볼때, |절대값|으로 값을 생각해야 함, -라고 안좋은게 아님.
corr_matrix = wine.corr()
corr_matrix['quality'].sort_values(ascending=False)
⭐오늘의 keypoint
# 8) 다양한 모델을 한번에 테스트
# ensemble(앙상블 기법) 에서 3가지 분류기 사용
from sklearn.ensemble import (AdaBoostClassifier, GradientBoostingClassifier,
RandomForestClassifier)
# 각 분류기 import
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
# 빈 리스트 만들고
models = []
# 전부 append 시켜줌 (이름, 분류기 함수()) - 리스트으로 저장(리스트는 뭐든 들어가기 때문)
models.append(('RandomForestClassifier', RandomForestClassifier()))
models.append(('DecisionTreeClassifier', DecisionTreeClassifier()))
models.append(('AdaBoostClassifier', AdaBoostClassifier()))
models.append(('GradientBoostingClassifier', GradientBoostingClassifier()))
models.append(('LogisticRegression', LogisticRegression(solver='liblinear')))
models
[('RandomForestClassifier', RandomForestClassifier()),
('DecisionTreeClassifier', DecisionTreeClassifier()),
('AdaBoostClassifier', AdaBoostClassifier()),
('GradientBoostingClassifier', GradientBoostingClassifier()),
('LogisticRegression', LogisticRegression(solver='liblinear'))]
# 9) 각 분류기별 models 결과를 저장하기 위한 작업
%time
# 러닝시간 측정
# CPU times: total: 0 ns
# Wall time: 0 ns
from sklearn.model_selection import KFold, cross_val_score
results = []
names = []
# models 는 이미 리스트 안에 튜플로 되어 있음 (위에 쿼리)
# 그렇기 때문에 name 과 model로 받을 수 있음
for name, model in models:
# kfold 선언 = (5겹 폴딩, - , 5개로 나누기 전에 데이터를 썪어라)
kfold = KFold(n_splits=5, random_state=13, shuffle=True)
# 5개의 model 마다 X_train, y_train 데이터로 kfolding(cv=kfold) 시킴
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())
# 결과 : results 변수에는 5개의 알고리즘 성증들이 저장되어 있음
# cv_results.mean() : training data를 5겹으로 나눈 mean(평균값)
CPU times: total: 0 ns
Wall time: 0 ns
RandomForestClassifier 0.8235476049455839 0.014660814747173595
DecisionTreeClassifier 0.7548571111275635 0.007232581517245795
AdaBoostClassifier 0.7533103205745169 0.02644765901536818
GradientBoostingClassifier 0.7663961279336641 0.02129278386035166
LogisticRegression 0.7423482268453395 0.014274628192480914
results
# 5개 알고리즘 마다 5번 폴딩했을 때 결과값(=성능)
[array([0.82019231, 0.85 , 0.80846968, 0.8267565 , 0.81231954]),
array([0.75192308, 0.76538462, 0.74879692, 0.76130895, 0.74687199]),
array([0.74903846, 0.80384615, 0.72666025, 0.74687199, 0.74013474]),
array([0.77019231, 0.80192308, 0.73820982, 0.76900866, 0.75264678]),
array([0.73269231, 0.76826923, 0.74013474, 0.7439846 , 0.72666025])]
names
# results 항목명
['RandomForestClassifier',
'DecisionTreeClassifier',
'AdaBoostClassifier',
'GradientBoostingClassifier',
'LogisticRegression']
# 10) croocross-validation 결과를 일목요연하게 확인하기
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12, 5))
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()
# 11) 테스트 데이터에 대한 평가 결과
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.8392307692307692
DecisionTreeClassifier 0.7838461538461539
AdaBoostClassifier 0.7553846153846154
GradientBoostingClassifier 0.7884615384615384
LogisticRegression 0.7446153846153846