본문 바로가기

코딩공부/패스트캠퍼스 AI 부트캠프

Machine Learning 모델 종류 정리

고전적인 Machine Learning은 딥러닝의 화려한 발전에 묻혀버렸지만 모델의 성능이 데이터의 질에 많은 영향을 받아서 데이터 분석 관점에서는 공부하기 너무 좋은 기술들이다. 특히, tabuler 데이터 셋에서는 여전히 고전적인 Machine Learning이 많이 사용되고 있는데 
오늘은 주요 모델들을 발전순으로 정리해 보자.

 

0. 모델 종류 

1. Decision Tree
2. RandomForest
3. AdaBoost
4. Gradient Boost Machine(GBM)
5. XGBoost Machine(XGBM)
6. Light Gradient Boost(LGBM)
7. CatBoost

많은 모델들이 있지만 주요 모델들은 위 7 가지이다. 그 중에서도 현업에서는 거의 LightGBM 과 CatBoost 가 주로 사용되고 있다.
1. Decision Tree를 제외한 나머지 모델들은 모두 앙상블 기법을 사용한 모델들이다.

1. Decision Tree

많은 딥러닝 기술들이 사람이 이해하기 어려운 경지에 오른 것이 많다. 이게 잘 되는데 왜 잘되는지 모르는 모델들이 많은데 이러한 것이 설명력이 부족하다 라고 표현한다. 하지만 Decision Tree 모델은 사람의 직관과 판단하는 방식이 매우 흡사하여 설명력이 강한 모델이라 말한다. 특히 시각화 하여 왜 해당 데이터를 그러한 판단으로 내렸는지 보여 줄 수 있다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X, y)

하지만 단점으로는 데이터의 작은 변화에도 모델의 성능이 크게 흔들린다. 즉 결측치에 매우 민감한 모델이다.
또한 과적합의 위험이 엄청 크기에 일반화가 부족하다고 평가받는다.
이러한 이유때문에 현업에서는 잘 사용되지 않고 있다.

2. Random Forest

랜덤 포레스트는 디시젼 트리를 여러게 사용하여 서로다른 데이터 셋으로 학습하여 결과를 합산하는 방식으로 예측을 한다.
서로 다른 데이터 셋을 구성하기 위해서 데이터 복원 추출피쳐 랜덤 선택을 하는 과정이 있지만 여기서는 생략하도록 한다.
결과를 합산하는 방식을 '보팅(voting)' 이라고 하는데 다수결 투표를 할 수 도있고 accuracy에 기반한 voting을 하기도 한다.
이부분 또한 그러한 것이 있구나 하고 넘어가자.

이러한 방식이 추가되면서 랜덤 포레스트는 디시젼 트리에서 부족했던 과적합의 위험성을 크게 줄였으며 데이터의 변화에 디시젼 트리만큼 크게 성능이 요동치지 않게 되었다. 또한 앙상블 기법이기에 피쳐의 중요도를 계산 할 수 있어 우리의 feature selection에 많은 도움을 준다.

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)


단점으로는 디시젼 트리가 가지고 있던 설명력에 대한 부분을 잃었다. 또한 디시젼 트리보다 많은 시간과 메모리를 사용하여 학습을 시켜야 한다.

3. AdaBoost

랜덤 포레스트가 여러 디시젼트리를 학습하여 '보팅(voting)' 방식으로 결과를 도출해 낸다면 Adaboost는 여러 트리를 순차적으로 학습하는 방식을 사용한다. 여기서 등장하는 기법이 바로 'Boosting 기법' 이다.
'보팅(voting)' 방식은 똑같은 데이터를 여러번 학습하는 과정을 거치지만 Boosting 기법은 예측값이 많이 벗어난 데이터들에게 가중치를 주어서 다음 트리에는 그러한 데이터를 더 많이 학습 할 수 있도록 설계되었다. 즉, 잘 못 맞추는 데이터를 더 많이 학습하는 방식이다.

from sklearn.ensemble import AdaBoostClassifier

ada = AdaBoostClassifier(n_estimators=50, random_state=42)
ada.fit(X, y)

단점으로는 노이즈가 많은 데이터에 취약하다. 또한 순차적으로 학습하기에 많은 시간이 걸리며 병렬화에 대한 어려움이 있을 수 있다.

4. Gradient Boost

해당 모델 부터 Gradient Boost 기법을 사용하여 손실함수의 그래디언트를 사용하여 모델을 최적화 합니다.
따라서 기존 모델들과 달리 잔차를 줄이는 방향으로 약한 학습기들을 순차적으로 결합합니다.

이러한 방식은 task에 맞는 다양한 손실함수를 사용 할 수 있게 되었고 성능 또한 매우 높아졌습니다.

import xgboost as xgb

xgb_model = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=42)
xgb_model.fit(X, y)

하지만 여전히 과적합의 위험이 남아 있고, 하이퍼 파라미터 튜닝을 해야하는 단점이 생겨났습니다

5. XGBoost

잔차를 예측하는 방식으로 학습합니다. 또한 적절한 분기점을 찾는 방식에서 결측치를 자동으로 처리해 줍니다.
이러한 방식으로 빠른 학습속도예측속도를 지니게 되었음에도 불구하고 여전히 높은 예측 성능을 보여주기에 Gradient Boost의 느린 속도의 단점을 극복 했습니다,

import xgboost as xgb

xgb_model = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=42)
xgb_model.fit(X, y)

하지만 메모리 사용량이 많고 

6.  LightGBM

import xgboost as xgb

xgb_model = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=42)
xgb_model.fit(X, y)

 

7. CatBoost

from catboost import CatBoostClassifier

cat_model = CatBoostClassifier(iterations=100, learning_rate=0.1, random_state=42, verbose=0)
cat_model.fit(X, y)