본문 바로가기

인공지능/머신러닝

[머신러닝ML] 분류 앙상블 모델

~ 목차 ~

앙상블 모델

 


tree구조(결정트리)를 기반으로 만들어진 모델
- 여러개의 트리 모델을 이용해서 훈련하는 모델앙상블 모델이라고 칭합니다.

 


 

앙상블 모델 분류

 

 
회귀와 분류에서 모두 사용한 모델들 입니다.
 - sklearn 패키지 모델은 모두 가능.
 - xgb도 가능.

 


 

분류 모델

 


- 랜덤포레스트
- 엑스트라트리
- 그레디언트 부스팅
- 히스트그레디언트부스팅
- XGboost

 

 


 

 

앙상블 모델 - 배깅(Bagging)과 부스팅(Boosting) 방식

 


 - 앙상블 모델은 여러개의 트리를 사용하기 때문에 
    → 훈련 데이터를 여러 모델(여러 트리)에 적용하는 방식에 따라서
    → 배깅과 부스팅 방식으로 구분합니다.

 


 

배깅(Bagging) 방식

 


 - 사용되는 여러개의 모델(여러 트리)들은 서로 독립적으로 사용됨(연관성 없음)
 - 훈련 데이터는 여러 모델에 랜덤하게 적용되며, 중복되는 데이터가 있을 수도 있음.
 - 훈련데이터를 사용 후에는 반환하는 방식을 사용함.
    → 반환 후에 다시 랜덤하게 추출하여 여러 모델(여러 트리)에 적용합니다.
 - 대표적인 배깅 앙상블 모델은 랜덤포레스트 모델이 있음.
 - 배깅 앙상블 모델 : 랜덤포레스트엑스트라트리
 - 예측 : 회귀에서는 평균값을 이용하며, 분류에서는 과반수(확률)에 따라 결정됨.
 - 과적합을 해소하는 모델로 주로 사용됨

 


 

부스팅(Boosting) 방식

 


 - 사용되는 여러개의 모델(여러 트리)들은 서로 연관성을 가짐.
 - 이전 모델(이전 트리)의 오차를 보완하여 다음 모델(다음 트리)에서 이어서 훈련이 진행되는 방식.
 - 훈련데이터는 랜덤하게 추출되어 사용되지만, 
    → 이전 모델 훈련에서 오차가 크게 발생했던 훈련데이터에 가중치를 부여하여 사용하게 됨.
 - 대표적인 부스팅 앙상블 모델 : 그레디언트 부스팅 모델이 있음.
 - 부스팅 앙상블 모델 : 그레디언트 부스팅, 히스트그레디언트부스팅, XGboost
 - 정확도를 높이는 모델로 주로 사용됨.

 

 

 

실제 모델 적용 순서

 


 - 분류시 최초에는 주로 랜덤포레스트 모델을 이용해서 수행합니다.
    → 정확도가 높은 모델로 유명함.(예전에… 지금은 부스트 모델이 우수한 편임.)
 - 최종 모델 선정시에는 분류모델 전체 사용하여 선정.

 

 


 

랜덤포레스트(RandomForest)

 

데이터 읽어드리기


wine = pd.read_csv("./data/08_wine.csv")
wine

wine 데이터

 


데이터 전처리


wine.info()
wine.describe()

데이터 전처리

 


 

< 와인종류 분류하기 >

 - 와인종류(class): 레드와인(0), 화이트와인(1)
 - 독립변수 : alchol(알콜), sugar(설탕, 당도), pH(수소이온농도; 산성 또는 염기성)
 - 종속변수 : class(와인종류; 0 또는 1, 0은 레드와인, 1은 화이트와인)

 

독립변수와 종속변수로 데이터 분리하기

 - to_numpy() : 데이터프레임(DataFrame) 객체를 NumPy 배열로 변환  

 - 독립변수


data = wine[["alcohol","sugar","pH"]].to_numpy()
data.shape

 

  - 종속변수


target = wine["class"].to_numpy()
target.shape

 

출력 : (6497, 3) 

          (6497,)

 


 정규화할지, 분류를 할지 두개의 순서는 상관없다.
 정규화를 진행하고 테스트를 하거나, 테스트를 해보고 차이가 많이 났을때 정규화를 하거나
우리는 먼저 정규화를 후 테스트 진행.

 현업에서는 그냥 정규화를 하고 시작한다.
(나중에 문제생기면 하루종일 바꾸느라 바쁘기때문)

 

훈련과 테스트데이터로 분리하기(8:2)


from sklearn.model_selection import train_test_split

 

 - 사용변수 : train_input, train_target, test_input, test_target


train_input, test_input, train_target, test_target = train_test_split(data,
                                                                                                      target,
                                                                                                      test_size = 0.2,
                                                                                                      random_state=42)

print(f"train_input={train_input.shape} / train_target={train_target.shape}")
print(f"test_input={test_input.shape} / test_target={test_target.shape}")

 

출력 : train_input=(5197, 3) / train_target=(5197,)
           test_input=(1300, 3) / test_target=(1300,)

 


 

정규화, 표준화

 

<데이터 스케일링>

 - 서로 다른 변수(특성)의 값을 범위(단위)를 일정한 수준으로 맞추는 작업
 - 수치형 변수(특성, 퓨터, 항목, 컬럼 같은 용어)에만 적용됩니다.
 - 스케일링 방법 3가지 : 아래 3가지는 구분만 될 뿐 의미는 모두 스케일링임.
    → 정규화 : StandardScaler  → 분류 또는 회귀에서 사용가능하며, 주로 분류에서 사용 됨.
                       RobustScaler → 분류 및 회귀 모두 사용 가능.(거의사용안함, 강사님도 쓰는거 본적 없음.)
    → 표준화 : MinMaxScaler → 분류 또는 회귀에서 사용 가능, 회귀에서 주로 사용 됨.
                                                   (최대 및 최소 범위 내에서 처리되는 방식)

 

 

 <라이브러리>


from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import RobustScaler
from sklearn.preprocessing import MinMaxScaler


StandardScaler - 정규화

 - 훈련데이터 정규화 변수 : train_std_scaler
 - 테스트데이터 정규화 변수 : test_std_scaler


ss = StandardScaler()
# fit은 무조건 훈련데이터만 해야한다. test데이터는 하지 말 것.
ss.fit(train_input)
train_std_scaler = ss.transform(train_input)
test_std_scaler = ss.transform(test_input)

print(f"{train_std_scaler.shape}/{test_std_scaler.shape}")

출력 : (5197, 3)/(1300, 3)

 

RobustScaler - 정규화

 - 훈련데이터 정규화 변수 : train_rs_scaler
 - 테스트데이터 정규화 변수 : test_rs_scaler


rs = RobustScaler()

rs.fit(train_input)

train_rs_scaler = rs.transform(train_input)
test_rs_scaler = rs.transform(test_input)
train_rs_scaler, test_rs_scaler

출력 :

RobustScaler 정규화

 

 

MinMaxScaler - 표준화

 - 훈련데이터 표준화 변수 : train_mm_scaler
 - 테스트데이터 표준화 변수 : test_mm_scaler


mm = MinMaxScaler()

mm.fit(train_input)

train_mm_scaler = mm.transform(train_input)
test_mm_scaler = mm.transform(test_input)
train_mm_scaler,test_mm_scaler

출력 :

MinMaxScaler - 표준화

 

 


훈련하기 - StandardScaler정규화한 데이터로

 [모델(클래스) 생성하기]
 - cpu의 코어는 모두 사용, 랜덤값은 42 사용하여 생성하기.
 - 모델 변수 이름은 rf 사용
 - n_jobs=-1 사용하는 이유 빨리 쓰기위해서(연산을 빨리 해줌)


from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_jobs=-1random_state=42)
rf

출력 :

랜덤포레스트 모델 생성

 

 [모델 훈련 시키기]


rf.fit(train_std_scaler, train_target)

출력 :

랜덤포레스트 모델 훈련

 [훈련 및 검증(테스트) 정확도(score) 확인하기]


train_score = rf.score(train_std_scaler, train_target)

test_score = rf.score(test_std_scaler, test_target)
train_score, test_score

출력 : (0.996921300750433, 0.8892307692307693)

 

 

⭐ 해석⭐
- 가장 일반화된 모델을 나타내는 스케일링 방법으로는 StandardScaled 정규화 방법을 사용했을 때로,
- 3개 모두 0.1 이상의 과대적합의 양상을 보임
- 따라서, 하이퍼파라메터 튜닝 및 다른 분류모델에 의한 훈련이 필요할 것으로 보임

 

 

예측하기

 - 예측하기는 테스트 데이터로!!!


y_pred = rf.predict(test_std_scaler)
y_pred

출력 : array([1., 0., 1., ..., 1., 1., 1.])


print(y_pred[:10])
print(test_target[:10])

출력 : [1. 0. 1. 1. 1. 1. 1. 1. 0. 1.]
          [1. 0. 1. 1. 1. 0. 1. 1. 0. 1.]

 


 

성능 평가하기

<분류 모델 평가 방법>

정확도정밀도재현율F1-score 값을 이용해서 평가함
- 예측에 오류가 있는지 확인 : 오차행렬도(혼동행렬도)를 통해 확인

 

<평가 기준>

- 정확도를 이용하여 과적합 여부 확인.
재현율이 높고, F1-Score 값이 높은 값을 가지는 모델을 선정하게됨 (모델 선정하는 단계에서)
- 정확도, 정밀도, 재현율, F1-Score의 모든 값은 0~1 사이의 값을 가지며, 값이 높을 수록 좋다.

 

시각화

<오차행렬(혼동행렬)>

- 어떠한 유형의 오류가 발생하고 있는지를 나타내는 값.
- 이를 시각화한 것을 오차행렬도 또는 혼동행렬도라고 칭함.
- 정확도(score)의 값과 오차행렬도의 시각화 결과로 최종 모델을 선정한다.

 

<해석 방법>

- 긍정(Positive)적 오류인지, 부정(Negative)적 오류 인지로 해석함
                                              (→ 위험한 오류)

 

FP(False Positive)

  : 예측 결과가 맞지는 않음(False)
  : 긍정적(Positive)로 해석함
  : 위험하지 않은 오류

 

FN(False Negative)

  : 예측 결과가 맞지는 않음 (False)
  : 부정적(Negative) 오류로 해석함
  : 위험한 오류로 해석
  : FN의 값이 크다면, 정확도(score)의 값이 높더라도 예측모델로 사용하는데 고려해야함

 

TP(True Positive)

  : 예측결과가 맞는 경우(True)
  : 1을 1로 잘 예측한 경우

 

 

TN(True Negative)

  : 예측결과가 맞는 경우(True)
  : 0을 0으로 잘 예측한 경우

 


<평가에 사용되는 값 : 정확도, 정밀도, 재현율, F1-score>

 

* 정확도(Accuracy)
 - 예측결과가 실제값과 얼마나 정확한가를 나타내는 값
 - Accuracy = (TP + TN) / (TP + TN + FP + FN)

정밀도(Precision)
 - 모델이 1로 예측한 데이터 중에 실제로 1로 잘 예측한 값
 - Precision = TP / (TP + FP)

재현율(Recall)
 - 실제로 1인 데이터를 1로 잘 예측한 값
 - Recall = TP / (TP + FN)
 - 위험한 오류가 포함되어 있음 (부정적인 오류가 많다는 뜻)

F1-Score
 - 정밀도와 재현율을 조합하여 하나의 통계치로 반환한 값
 - 정밀도와 재현율의 평균이라고 생각해도 됨
 - F1-Score = (정밀도 * 재현율) / (정밀도 + 재현율)


 <최종 모델 선정 방법>

 - 과소 및 과대 적합이 일어나지 않아야 함
 - 재현율과 F1-Score가 모두 높으면 우수한 모델로 평가할 수 있음
 - 재현율이 현저히 낮은 경우에는 모델 선정에서 고려, 또는 제외⭐

 

시각화 - 오차행렬도

 - 라이브러리


import matplotlib.pyplot as plt
import seaborn as sns

"""한글처리"""
plt.rc("font", family = "Malgun Gothic")
"""마이너스 기호 처리"""
plt.rcParams["axes.unicode_minus"] = True

import numpy as np
"""오차행렬 계산 라이브러리"""
from sklearn.metrics import confusion_matrix
"""오차행렬도 시각화 라이브러리"""
from sklearn.metrics import ConfusionMatrixDisplay

 

 - 오차행렬의 기준 특성은 종속변수 기준 : 훈련에서 사용한 종속변수의 범주 확인하기


rf.classes_

출력 : array([0., 1.])

 

 - 오차행렬 평가 매트릭스 추출하기


cm = confusion_matrix(test_target, y_pred, labels=rf.classes_)
cm

출력 : array([[266,  75],
                    [ 69, 890]], dtype=int64)

 

※ len(test_target) = 1300 → (4등분) →  [266,  75],[ 69, 890]

 

 - 오차행렬도 시각화 하기


disp = ConfusionMatrixDisplay(confusion_matrix=cm, 
                                                     display_labels=rf.classes_)
disp.plot()
### 내부적인 오류가 없는지 확인하는 것 
### 오차행렬의 긍정 부정 이미지 확인하기

출력 : 

오차행렬도

 


분류모델 평가하기

 - 라이브러리


"""정확도 : 훈련 및 검증 정확도에서 사용한 score()함수와 동일함"""
from sklearn.metrics import accuracy_score
"""정밀도"""
from sklearn.metrics import precision_score
"""재현율"""
from sklearn.metrics import recall_score
"""f1-score"""
from sklearn.metrics import f1_score

 

 - 정확도


acc = accuracy_score(test_target, y_pred)
acc

출력 : 0.8892307692307693

 

 - 정밀도


pre = precision_score(test_target, y_pred)
pre

출력 : 0.9222797927461139

 

 - 재현율


rec = recall_score(test_target, y_pred)
rec

출력 : 0.9280500521376434

 

 - f1-score


f1 = f1_score(test_target, y_pred)
f1

출력 : 0.9251559251559252

 

⭐ 해석⭐
- 정확도는 0.89로 높은 편이며,
- 정밀도, 재현율, f1-score의 값이 0.92 이상으로 매우 높은 값을 나타내고 있음
- 따라서, 랜덤포레스트 모델을 이용해서 해당 데이터에 대한 예측을 하는데 사용가능
- 즉, 예측모델로 사용가능

 

728x90