#오늘의 파이썬 #1일1오파 #파이썬 # python

매일 오전10시 업로드, Dacon Daily Python Camp. 1일1오파 격파하기!

  • moneyIcon Prize : 교육
  • 30Team D-101398

 

Lv4 모델링 복습 - (2)

2021.08.30 15:36 1,120 Views

안녕하세요.🤠 이번시간에는 Stratified K-FoldVoting Classifier 에 대해 복습 해보도록 하겠습니다. 🤗🤗


1️⃣stratified k-fold


k-fold 의 문제점


k-fold의 경우 데이터 셋을 일정한 간격으로 잘라서 사용합니다.

그러다 보니 target의 비율이 일정하지 않게 테스트 셋에 들어 갈 수 있습니다.

만약 target이 0, 1, 2 세가지로 이뤄져 있는데, 이 상황에서 데이터를 잘라서 학습 할 때 0, 1만 답으로 가지고 있는 학습데이터를 가지고 학습을 했을때는 당연하게도 모델은 2라는 답을 도출 할 수 없을 것입니다 .

마찬가지로 1, 2만 가지고 학습을 진행한다면 0이라는 답을 도출 할 수 없을 것입니다. 이러한 점이 k-fold의 치명적인 문제점입니다.


k-fold의 문제점인 target 데이터의 비율을 일정하게 유지 하지 못하는 것을 일정 하게 유지하며, 교차 검증을 진행 하는 것을

stratified k-fold 라고 합니다.👴


2️⃣Voting Classifier


Voting Classifier란 여러개의 모델을 결합하여 더 좋은 예측 결과를 도출 하는 앙상블 기법 중 하나 입니다.

Voting Classifier에는 hard voting 방법과 soft voting 방법이 있습니다 .


Hard Voting

Hard Voting은 Majority Voting이라고도 하며, 각각의 모델들이 결과를 예측하면 각 모델의 예측을 모아 다수결 투표로 최종 예측 결과를 선정하는 방식입니다.

그림을 살펴보시면, 첫 번째 분류기는 0.9의 확률로 생존을 선택, 두 번째 분류기는 0.6의 확률로 사망을 선택, 세 번째 분류기는 0.7의 확률로 사망을 선택 하였습니다. 생존을 선택 한 모델이 1개, 사망을 선택한 모델이 2개 이기 때문에 Voting Classifier은 최종적으로 사망을 선택하게 됩니다.


Soft Voting

Soft Voting은 Probability Voting이라고 하며, 각 모델들이 예측한 결과값의 확률을 합산해 최종 예측 결과를 선정합니다.

단순히 개별 분류기의 예측 결과만을 고려하지 않고 높은 확률값을 반환하는 모델의 비중을 고려할 수 있기 때문에 Hard Voting 보다 성능이 더 좋은 편입니다.

그림을 살펴보시면, 3개의 모델이 생존을 선택 할 확률의 평균은 0.533 이고, 사망을 선택 할 확률의 평균은 0.466 입니다. 최종적으로 Voting Classifier는 Hard Voting과 다르게 생존을 선택하게 됩니다.


-----------------------------------------------------------------------------------------------------------------------------------------

import pandas as pd

from sklearn.model_selection import StratifiedKFold

from sklearn.metrics import accuracy_score


from lightgbm import LGBMClassifier

from xgboost import XGBClassifier


from sklearn.ensemble import VotingClassifier

from sklearn.ensemble import RandomForestClassifier


# StratifiedKFold라이브러리를 이용해 5개의 fold로 나눔.


skf = StratifiedKFold(n_splits = 5)


X = train_one.drop('quality',axis = 1)

y = train_one['quality']

cnt = 1

acc = 0

for train_idx, valid_idx in skf.split(X,y):

  

  train_data = train_one.iloc[train_idx]

  valid_data = train_one.iloc[valid_idx]


  # 모델 정의


  LGBM = LGBMClassifier() # LGBM

  XGB = XGBClassifier() # XGBoost

  RF = RandomForestClassifier() #Random forest



  VC = VotingClassifier(estimators=[('rf',RF),('xgb',XGB),('lgbm',LGBM)],voting = 'soft'# VotingClassifier



  # train_X 는 train_data에서 quality 를 제외한 모든 변수

  # train_y 는 train_data의 qulity 변수


  train_X = train_data.drop('quality',axis= 1)

  train_y = train_data['quality']


  # fit 메소드를 이용해 모델 학습

  VC.fit(train_X,train_y)



  valid_X = valid_data.drop('quality',axis = 1)

  valid_y = valid_data['quality']


  # predict 메소드와 valid_X 데이터를 이용해 품질 예측

  pred = VC.predict(valid_X)


  # 모델 정확도 출력

  print(cnt," 번째 모델 정확도 : " ,accuracy_score(pred,valid_y))

  acc += accuracy_score(pred,valid_y)

  cnt+=1


print('모델 정확도 평균 : ',acc/5)

-----------------------------------------------------------------------------------------------------------------------------------------

[Colab 실습 링크]


↩️ 오늘의 파이썬 리스트

#데이콘_101 #AI #머신러닝 #딥러닝 #파이썬 #파이선  #데이터분석 #데이터사이언티스트 #코랩 #Python  #colab #kaggle #pandas #numpy #sckit-learn # read_csv #LGBM #XGBoost

changhyeon
2022.01.03 18:09

done

dbnoid
2022.01.19 09:34

hijihyo
2022.01.27 14:34

acebed
2022.03.10 21:08

done

Kdata
2022.05.03 18:10

krooner
2022.05.19 23:48

로그인이 필요합니다
0 / 1000