파이썬 머신러닝 완벽 가이드 1판 (권철민)을 참고하여 작성한 글입니다.
Classification
- 정답이 주어진 데이터를 이용해 모델을 학습시키고 스스로 분류할 수 있도록 함
- Decision Tree
- 데이터의 규칙을 스스로 찾아내고 학습하여 트리 기반의 분류 규칙을 만들어냄
- 규칙을 가장 쉽게 표현하는 방법은 if/else 기반으로 나타내는 것
- → 데이터를 분류할 기준을 세울 때 가장 효율적인 분류가 될 수 있도록 해야 알고리즘의 성능이 올라감
- 내부 노드들은 규칙 노드가 되며, 단말노드(=리프노드)는 결정된 클래스(label)값이 됨
- 규칙노드가 많아질수록 클래스 값을 결정하는데 복잡한 과정을 거치게 됨→ 트리의 깊이가 깊어질 수록 예측 성능이 떨어질 수 있음
- → overfitting의 위험성이 커짐
- overfitting을 막기 위해서는 최대한 균일한 데이터셋을 구성할 수 있도록 해야 함
- 균일한 데이터란?
- 많은 정보 없이 데이터를 뚜렷하게 구분 할 수 있는 데이터
- 균일한 데이터란?
- decision tree는 가장 균일한 데이터셋을 찾아낼 수 있도록 규칙을 만들어줌
- 정보의 균일도를 측정하는 대표적인 방법은 엔트로피를 이용한 정보이득 지수와 지니계수가 존재함
- 정보이득 지수
- 정보이득은 엔트로피의 개념을 기반으로 함
- 엔트로피는 주어진 데이터 집합의 혼잡도를 이야기함
- 엔트로피 값이 클수록 데이터 균일도가 떨어지고, 엔트로피 값이 작을수록 데이터 균일도가 높아짐
- 정보이득지수 = 1 - 엔트로피지수
- 정보이득 지수를 통해 분할 기준을 잡으며, 정보이득이 높은 경우 이를 기준으로 데이터를 분할함
- 정보이득은 엔트로피의 개념을 기반으로 함
- 지니계수
- 경제학에서 사용되는 지수로 0으로 갈수록 평등하고 1로 갈수록 불평등함
- 지니계수가 낮을수록 데이터 균일도가 높고, 지니계수가 높을수록 데이터 균일도가 낮아짐
- 지니계수가 낮은 것을 기준으로 데이터를 분할함
- 정보이득 지수
- 사이킷런에서 제공하는 DecisionTreeClassifier는 지니계수를 이용해 데이터셋을 분할함
- 지니계수가 낮은 조건들을 찾고, 이 조건들에 맞춰서 데이터를 분할하고 분류함
- 장점
- 균일도라는 기준을 통해 데이터셋을 분류 → 알고리즘이 쉽고 직관적임
- 데이터의 균일도를 제외하고 feature scaling, 전처리 등의 작업은 크게 신경쓸 필요가 없음
- 단점
- overfitting의 가능성이 큼
- 모든 상황을 만족할 수 없다는 것을 인정하고 트리의 depth 등을 튜닝해주는 것이 더 나은 성능을 보여줄 수 있음
- overfitting의 가능성이 큼
- 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
- bagging
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 분할 방식을 이용함
- 데이터를 임의화 한 decision tree의 앙상블 모델을 random forest classifier
'WIDA > DACON 분류-회귀' 카테고리의 다른 글
[DACON/김민혜] 분류 모델 뜯어보기, 분류모델 평가방식 (0) | 2023.03.30 |
---|---|
[DACON/김규리] 분류 모델 알아보기 (1) | 2023.03.24 |
[DACON/최다예] 분류 모델 알아보기 (0) | 2023.03.23 |
[DACON/김세연] 분류 모델 알아보기 (0) | 2023.03.23 |
[DACON/김경은] 분류 모델 알아보기 (0) | 2023.03.23 |