본문 바로가기
국비 교육/머신러닝, 딥러닝

[머신러닝] 분류분석 : 앙상블 러닝 - Voting, Boosting 실습문제

by 육츠 2023. 11. 23.
Contents 접기

[실습] 보스톤 집값 Voting - Regression

from sklearn.linear_model import Lasso, Ridge, LinearRegression
from sklearn.ensemble import VotingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

import numpy as np
import pandas as pd

 

데이터 로드 및 분할

boston.fillna(method='ffill') 을 사용하여 근처에 있는 값으로 결측치를 채워 분석하였다.

boston = pd.read_csv('./dataset/HousingData.csv')
boston.head()
boston.fillna(method='ffill', inplace= True) # 근처에 있는 값으로 채우기

x = boston.drop('MEDV',axis= 1)
y = boston['MEDV']

 

모델 생성 및 분할

회귀분석에서의 예시를 사용하므로 평가지표로는 Lasso, Ridge, LinearRegression 을 사용한다.
Voting은 estimator를 지정할때 튜플의 형태로 (이름, 평가지표) 지정해준다.

lasso = Lasso(alpha=0.05)  # 상대적으로 알파의 값을 약하게 줘야한다
ridge = Ridge(alpha= 1)
linear = LinearRegression()

vo_r = VotingRegressor(estimators= [('LASSO',lasso),('RIDGE',ridge),('LINEAR',linear)]) # 평균

x_train, x_test, y_train,y_test = train_test_split(x, y, test_size= 0.2,
                                                  random_state= 10)
RMSE: 5.970
결정계수: 0.659

 

스케일링 하기 전 결과

vo_r.fit(x_train,y_train)

y_hat = vo_r.predict(x_test)

print(f'RMSE: {np.sqrt(mean_squared_error(y_test,y_hat)):.3f}')
print(f'결정계수: {r2_score(y_test,y_hat):.3f}')

# 같은 데이터여도 모형에 따라 RMSE와 결정계수 차이가 있다.

 

스케일링 (표준화) 진행

from sklearn.preprocessing import StandardScaler

scaled_x = StandardScaler().fit_transform(x)
x_train, x_test, y_train,y_test = train_test_split(scaled_x, y, test_size= 0.2,
                                                  random_state= 10)

vo_r.fit(x_train,y_train)

y_hat = vo_r.predict(x_test)

print(f'RMSE: {np.sqrt(mean_squared_error(y_test,y_hat)):.3f}')
print(f'결정계수: {r2_score(y_test,y_hat):.3f}')
RMSE: 5.895
결정계수: 0.668

큰 차이가 없다.

 

[실습] 암환자지표 Voting - Classifier

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score,precision_score,recall_score,roc_auc_score
from sklearn.model_selection import train_test_split

import numpy as np
import pandas as pd

 

데이터 로드 및 분할

breast = load_breast_cancer()
# print(breast.DESCR) # 데이터셋 설명 _ class : 종속변수 (두 가지 카테고리 : 이진분류)

df = pd.DataFrame(breast.data, columns= breast.feature_names) # 독립변수 값만 데이터 프레임

data_x = breast.data 
data_y = breast.target

 

모델 생성 및 분할

VotingClassifier 는 분류분석일 때 투표를 통해 최종 결과를 예측하므로,
투표 방식을 voting 옵션을 통해 지정해주어야 한다.

logistic = LogisticRegression(max_iter= 4000)
knn = KNeighborsClassifier()

vo_c = VotingClassifier(estimators=[('LOGISTIC',logistic),('KNN',knn)], voting='soft') 
# 투표방법: Hard Voting = default 

x_train,x_test,y_train,y_test = train_test_split(data_x,data_y, 
                                                 train_size= 0.8, random_state= 10, stratify= data_y)

 

모델 학습 및 평가

vo_c.fit(x_train,y_train)
y_hat = vo_c.predict(x_test)

print(f'정확도: {accuracy_score(y_test,y_hat):.3f}')
print(f'AUC: {roc_auc_score(y_test,vo_c.predict_proba(x_test)[:,1]):.3f}') # 하드 보팅은 안됨


#  (이진분류) 결과와 비교 .. 정확도: 0.96 / AUC: 0.996
정확도: 0.921
AUC: 0.990

logisticClassifier 보다 모델의 정확도가 떨어지는 것을 알 수 있다.

 

[실습] 당뇨병 환자 Boosting - Regressor

from sklearn.datasets import load_diabetes
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

import numpy as np
import pandas as pd

 

데이터 로드, 스케일링, 분할

from sklearn.preprocessing import MinMaxScaler

x , y = load_diabetes(return_X_y= True)
x = MinMaxScaler().fit_transform(x)
x_train, x_test, y_train,y_test = train_test_split(x, y, test_size= 0.2,
                                                  random_state= 10)

 

모델 생성 및 학습

GradientBoostingRegressor 방식은 가중치 값을 지정해주어야 한다.

gb_r = GradientBoostingRegressor(random_state= 10, alpha= 0.9, n_estimators= 40, max_depth= 3) # 회귀모형 40개 , max_depth : 분류기 단계
gb_r.fit(x_train, y_train)

 

예측 및 평가

스케일링 전

y_hat = gb_r.predict(x_test)
print(f'결정계수 : {r2_score(y_test,y_hat):.3f}')
결정계수 : 0.486

 

스케일링 후

y_hat = gb_r.predict(x_test)
print(f'결정계수 : {r2_score(y_test,y_hat):.3f}')
결정계수 : 0.486

결과가 동일하다. 즉 스케일링의 큰 차이가 없다. (= 숫자의 스케일이 크게 달라지지 않는다.)

 

[실습] 암환자 Boosting - Classifier

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score,precision_score,recall_score,roc_auc_score
from sklearn.model_selection import train_test_split

import numpy as np
import pandas as pd

 

데이터 로드 및 분할

stratify = target의 class 비율을 유지 한 채로 데이터 셋을 분할한다.
분류분석에서는 성능의 차이가 많이 날수도 있으니 넣는 것이 좋다.

breast = load_breast_cancer()
df = pd.DataFrame(breast.data, columns= breast.feature_names) # 독립변수 값만 데이터 프레임
df['target'] = breast.target # 0,1 로 이루어진 데이터 

data_x = breast.data 
data_y = breast.target

x_train,x_test,y_train,y_test = train_test_split(data_x,data_y, 
                                                 train_size= 0.8, random_state= 10, stratify= data_y)

 

모델 생성 및 학습

gb_c = GradientBoostingClassifier(random_state= 10)
gb_c.fit(x_train,y_train)

 

모델 평가

y_hat = gb_c.predict(x_test)

print(f'정확도: {accuracy_score(y_test,y_hat):.3f}')
print(f'AUC: {roc_auc_score(y_test,gb_c.predict_proba(x_test)[:,1]):.3f}')
정확도: 0.956
AUC: 0.996