WIDA/DACON 분류-회귀

[DACON/조아영] 분류 모델 알아보기

려우 2023. 3. 24. 00:49

파이썬 머신러닝 완벽 가이드 1판 (권철민)을 참고하여 작성한 글입니다.


Classification

  • 정답이 주어진 데이터를 이용해 모델을 학습시키고 스스로 분류할 수 있도록 함

출처: https://velog.io/@uvictoli/Codeit-머신-러닝-결정-트리와-앙상블-기법-01.-결정-트리

  • Decision Tree
    • 데이터의 규칙을 스스로 찾아내고 학습하여 트리 기반의 분류 규칙을 만들어냄
    • 규칙을 가장 쉽게 표현하는 방법은 if/else 기반으로 나타내는 것
    • → 데이터를 분류할 기준을 세울 때 가장 효율적인 분류가 될 수 있도록 해야 알고리즘의 성능이 올라감
    • 내부 노드들은 규칙 노드가 되며, 단말노드(=리프노드)는 결정된 클래스(label)값이 됨
    • 규칙노드가 많아질수록 클래스 값을 결정하는데 복잡한 과정을 거치게 됨→ 트리의 깊이가 깊어질 수록 예측 성능이 떨어질 수 있음
    • → overfitting의 위험성이 커짐
    • overfitting을 막기 위해서는 최대한 균일한 데이터셋을 구성할 수 있도록 해야 함
      • 균일한 데이터란?
        • 많은 정보 없이 데이터를 뚜렷하게 구분 할 수 있는 데이터
    • decision tree는 가장 균일한 데이터셋을 찾아낼 수 있도록 규칙을 만들어줌
    • 정보의 균일도를 측정하는 대표적인 방법은 엔트로피를 이용한 정보이득 지수와 지니계수가 존재함
      • 정보이득 지수
        • 정보이득은 엔트로피의 개념을 기반으로 함
          • 엔트로피는 주어진 데이터 집합의 혼잡도를 이야기함
          • 엔트로피 값이 클수록 데이터 균일도가 떨어지고, 엔트로피 값이 작을수록 데이터 균일도가 높아짐
        • 정보이득지수 = 1 - 엔트로피지수
        • 정보이득 지수를 통해 분할 기준을 잡으며, 정보이득이 높은 경우 이를 기준으로 데이터를 분할함
      • 지니계수
        • 경제학에서 사용되는 지수로 0으로 갈수록 평등하고 1로 갈수록 불평등함
        • 지니계수가 낮을수록 데이터 균일도가 높고, 지니계수가 높을수록 데이터 균일도가 낮아짐
        • 지니계수가 낮은 것을 기준으로 데이터를 분할함
    • 사이킷런에서 제공하는 DecisionTreeClassifier는 지니계수를 이용해 데이터셋을 분할함
      • 지니계수가 낮은 조건들을 찾고, 이 조건들에 맞춰서 데이터를 분할하고 분류함
    • 장점
      • 균일도라는 기준을 통해 데이터셋을 분류 → 알고리즘이 쉽고 직관적임
      • 데이터의 균일도를 제외하고 feature scaling, 전처리 등의 작업은 크게 신경쓸 필요가 없음
    • 단점
      • overfitting의 가능성이 큼
        • 모든 상황을 만족할 수 없다는 것을 인정하고 트리의 depth 등을 튜닝해주는 것이 더 나은 성능을 보여줄 수 있음
    • Code
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings

warnings.filterwarnings('ignore')

# Decision Tree 모델 생성하기
dt_clf = DecisionTreeClassifier()

# training dataset 불러오기
train_data = pd.read_csv("C:/Users/1ayou/PycharmProjects/dacon_astronomy/dataset/train.csv")

X = train_data.iloc[:, 2:]
y = train_data.iloc[:, 1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=11)

dt_clf.fit(X_train, y_train)

pred = dt_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)

print('정확도 {0:.4f}'.format(accuracy))
    •  
  • 앙상블
    • 단일 분류기를 사용하는 것이 아닌 여러개의 분류기를 이용해 예측값을 결합하여 최종 결과물을 도출함
    • 정형데이터 분류 시 앙상블 모델이 단일 모델보다 더 뛰어난 성능을 보임
    • 학습 유형
      • 보팅
        • 여러개의 분류기가 투표를 통해 최종 예측 결과를 결정함
        • 여러개의 분류기는 모두 서로 다른 알고리즘
        • 보팅 유형
          • 하드 보팅
            • 다수결의 원칙
            • 다수의 분류기가 예측한 결과값을 최종 결과값으로 이용함
          • 소프트 보팅
            • 분류기들이 label 값으로 결정할 확률을 더하고 평균을 내어 확률이 가장 높은 label을 최종 결과값으로 이용
      • 배깅
        • 여러개의 분류기가 투표를 통해 최종 예측 결과를 결정함
        • 여러개의 분류기는 모두 같은 알고리즘
        • 데이터 샘플링을 다르게 하여 학습
      • 부스팅
        • 여러개의 분류기가 순차적으로 학습을 수행
        • 앞에서 학습한 분류기가 예측 실패한 경우 올바르게 예측할 수 있도록 다음 분류기에게 가중치를 줌
  • 랜덤포레스트
    • bagging
      • 같은 알고리즘으로 여러개의 분류기를 만들고, 보팅을 통해 최종 결정을 함
    • code
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings

warnings.filterwarnings('ignore')

# Decision Tree 모델 생성하기
dt_clf = DecisionTreeClassifier()
bag_clf = BaggingClassifier(dt_clf)

# training dataset 불러오기
train_data = pd.read_csv("./dataset/train.csv")

X = train_data.iloc[:, 2:]
y = train_data.iloc[:, 1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=11)

dt_clf.fit(X_train, y_train)
bag_clf.fit(X_train, y_train)

pred_dt = dt_clf.predict(X_test)
pred_bg = bag_clf.predict(X_test)

accuracy_dt = accuracy_score(y_test, pred_dt)
accuracy_bg = accuracy_score(y_test, pred_bg)

print('정확도 {0:.4f}'.format(accuracy_dt))
print('정확도 {0:.4f}'.format(accuracy_bg))
  • RandomForestClassifier
    • 데이터를 임의화 한 decision tree의 앙상블 모델을 random forest classifier
      • 임의화 : Randomization
      • Random Forest : 임의화 한 Tree 모델들을 결합함 → Tree 모델이 여러개 있어서 Forest라고 한 듯 함..
    • 여러개의 decision tree를 이용해 배깅 방식으로 데이터를 학습, 최종적으로 보팅을 통해 예측 결괏값을 내놓음
    • 학습할 데이터셋은 일부 중첩되도록 랜덤 샘플링한 데이터를 이용함 → bootstrapping 분할 방식을 이용함