핵심개념
투표기반 앙상블은 여러 분류기를 학습시킨 후 각각의 분류기가 예측하는 레이블 범주가 가장 많이 나오는 범주를 예측하는 방법입니다. 다수결 원리와 유사하죠. 사용방법은 우선 개별 분류기의 최적 하이퍼파라미터를 찾은 후, 투표기반 앙상블로 모델을 만들어 좀 더 좋은 분류와 회귀 예측을 찾는 것입니다. 로지스틱모델, 서포트벡터머신, 랜덤포레스트 등 여러 머신러닝 분류기를 수행한 후 예측 범주가 많이 나온 것을 최종 범주로 분류합니다. 다만, 각 분류 알고리즘의 결과는 범주를 기반으로 할 수도 있고, 확률을 제시할 수도 있습니다. 범주를 기반으로 둔다는 것은 1, 2와 같이 결과가 범주로 많이 나타난 것을 선택하는 방법이고, 확률에 기반한다는 것은 예측 확률을 제시할 수도 있습니다. 범주를 기반으로 둔다는 것은 1, 2와 같이 결과가 범주로 많이 나타난 것을 선택하는 방법이고, 확률에 기반한다는 것은 예측 확률의 평균으로 0.5이상인지 아닌지에 따라 범주를 선택하는 것입니다. 투표기반 앙상블의 옵션에는 범주 기반일 경우 'Hard Learner', 확률을 기반으로 결정할 경우 'Soft Learner'를 선택합니다.
종합정리
분류
분석에 사용된 데이터에서는 개별 분류 알고리즘과 거의 유사한 결과를 보였습니다. 그러나 앙상블은 일반적으로 좋은 개별 알고리즘을 조합하면 그보다 좀 더 나은 결과를 보입니다. 또한 범주보다는 확률 방식이 다소 정확도가 높은 것으로 알려져 있습니다. 실전적으로 활용되는 방식이므로 반드시 익혀두어야 합니다.
회귀
회귀문제에서 투표기반 앙상블로 2개 알고리즘만을 조합하였음에도 정확도가 개별 알고리즘을 적용할 때보다 테스트데이터에서 2~3% 높게 나타났습니다. 이 정도의 향상은 절대 낮은 수치가 아닙니다. 개별 알고리즘에서 가장 좋은 하이퍼파라미터를 찾아 설정한다면 더 좋은 결과를 얻을 수 있습니다.
실습
# Part1. 분류(Classification)
# 1. 분석 데이터 준비
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
data1=pd.read_csv('breast-cancer-wisconsin.csv', encoding='utf-8')
X=data1[data1.columns[1:10]]
y=data1[["Class"]]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test=train_test_split(X, y, stratify=y, random_state=42)
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()
scaler.fit(X_train)
X_scaled_train=scaler.transform(X_train)
X_scaled_test=scaler.transform(X_test)
# 2. 강한 학습기: hard learner
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
logit_model= LogisticRegression(random_state=42)
rnf_model = RandomForestClassifier(random_state=42)
svm_model = SVC(random_state=42)
voting_hard = VotingClassifier(
estimators=[('lr', logit_model), ('rf', rnf_model), ('svc', svm_model)], voting='hard')
voting_hard.fit(X_scaled_train, y_train)
from sklearn.metrics import accuracy_score
for clf in (logit_model, rnf_model, svm_model, voting_hard):
clf.fit(X_scaled_train, y_train)
y_pred = clf.predict(X_scaled_test)
print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
from sklearn.metrics import confusion_matrix
log_pred_train=logit_model.predict(X_scaled_train)
log_confusion_train=confusion_matrix(y_train, log_pred_train)
print("로지스틱 분류기 훈련데이터 오차행렬:\n", log_confusion_train)
log_pred_test=logit_model.predict(X_scaled_test)
log_confusion_test=confusion_matrix(y_test, log_pred_test)
print("로지스틱 분류기 테스트데이터 오차행렬:\n", log_confusion_test)
svm_pred_train=svm_model.predict(X_scaled_train)
svm_confusion_train=confusion_matrix(y_train, svm_pred_train)
print("서포트벡터머신 분류기 훈련데이터 오차행렬:\n", svm_confusion_train)
svm_pred_test=svm_model.predict(X_scaled_test)
svm_confusion_test=confusion_matrix(y_test, svm_pred_test)
print("서포트벡터머신 분류기 훈련데이터 오차행렬:\n", svm_confusion_test)
rnd_pred_train=rnf_model.predict(X_scaled_train)
rnd_confusion_train=confusion_matrix(y_train, rnd_pred_train)
print("랜덤포레스트 분류기 훈련데이터 오차행렬:\n", rnd_confusion_train)
rnd_pred_test=rnf_model.predict(X_scaled_test)
rnd_confusion_test=confusion_matrix(y_test, rnd_pred_test)
print("랜덤포레스트 분류기 테스트데이터 오차행렬:\n", rnd_confusion_test)
voting_pred_train=voting_hard.predict(X_scaled_train)
voting_confusion_train=confusion_matrix(y_train, voting_pred_train)
print("투표분류기 분류기 훈련데이터 오차행렬:\n", voting_confusion_train)
voting_pred_test=voting_hard.predict(X_scaled_test)
voting_confusion_test=confusion_matrix(y_test, voting_pred_test)
print("투표분류기 분류기 훈련데이터 오차행렬:\n", voting_confusion_test)
# 3. 약한 학습기: soft learner
logit_model = LogisticRegression(random_state=42)
rnf_model = RandomForestClassifier(random_state=42)
svm_model = SVC(probability=True, random_state=42)
voting_soft = VotingClassifier(
estimators=[('lr', logit_model), ('rf', rnf_model), ('svc', svm_model)], voting='soft')
voting_soft.fit(X_scaled_train, y_train)
from sklearn.metrics import accuracy_score
for clf in (logit_model, rnf_model, svm_model, voting_soft):
clf.fit(X_scaled_train, y_train)
y_pred = clf.predict(X_scaled_test)
print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
voting_pred_train=voting_soft.predict(X_scaled_train)
voting_confusion_train=confusion_matrix(y_train, voting_pred_train)
print("투표분류기 분류기 훈련데이터 오차행렬:\n", voting_confusion_train)
voting_pred_test=voting_soft.predict(X_scaled_test)
voting_confusion_test=confusion_matrix(y_test, voting_pred_test)
print("투표분류기 분류기 훈련데이터 오차행렬:\n", voting_confusion_test)
# Part2. 회귀(Regression)
# 1. 분석 데이터 준비
data2=pd.read_csv('house_price.csv', encoding='utf-8')
X=data2[data2.columns[1:5]]
y=data2[["house_value"]]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=42)
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()
scaler.fit(X_train)
X_scaled_train=scaler.transform(X_train)
X_scaled_test=scaler.transform(X_test)
# 2. 모델적용
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import VotingRegressor
linear_model= LinearRegression()
rnf_model = RandomForestRegressor(random_state=42)
voting_regressor = VotingRegressor(estimators=[('lr', linear_model), ('rf', rnf_model)])
voting_regressor.fit(X_scaled_train, y_train)
pred_train=voting_regressor.predict(X_scaled_train)
voting_regressor.score(X_scaled_train, y_train)
pred_test=voting_regressor.predict(X_scaled_test)
voting_regressor.score(X_scaled_test, y_test)
# RMSE (Root Mean Squared Error)
import numpy as np
from sklearn.metrics import mean_squared_error
MSE_train = mean_squared_error(y_train, pred_train)
MSE_test = mean_squared_error(y_test, pred_test)
print("훈련 데이터 RMSE:", np.sqrt(MSE_train))
print("테스트 데이터 RMSE:", np.sqrt(MSE_test))
'빅데이터 관련 자료 > Machine Learning' 카테고리의 다른 글
Chat GPT의 친절한 설명 : 지도학습이란? (1) | 2023.11.23 |
---|---|
Chat GPT의 친절한 설명 : 머신러닝이란? (2) | 2023.11.22 |
빅데이터 분석기사 실기 (실전 연습) - 의사결정나무 (0) | 2021.11.17 |
빅데이터 분석기사 실기 (실전 연습) - 랜덤 포레스트 (0) | 2021.11.16 |
빅데이터 분석기사 실기 (실전 연습) - 나이브 베이즈 (0) | 2021.11.15 |