정리 노트

[BDA X 이지스 퍼블리싱]3주차 스터디 요약 본문

카테고리 없음

[BDA X 이지스 퍼블리싱]3주차 스터디 요약

꿈만 꾸는 학부생 2023. 12. 24. 10:57
728x90

이 포스트는 BDA와 이지스 퍼블리싱에서 같이 진행하는 Easy Study 3주 차 내용을 요약하는 포스트입니다.

아래의 도서가 스터디에 사용한 교재입니다.

 

http://www.easyspub.co.kr/20_Menu/BookView/B001/607/PUB

 

www.easyspub.co.kr


결정 트리(Decision Tree) 모델

결정 트리는 입력과 출력 사이의 관계를 트리 구조로 모델링하는 지도 학습 기법입니다.

titanic dataset 대상으로 만든 결정 트리 예시

하나의 feature의 값과 특정 값의 크기를 비교하는 binary 질문을 여러 번 반복해 마지막 단계에서 해당 feature에 대한 출력 값을 맞히는 문제 학습합니다. 결정 트리의 학습 알고리즘은 TDIDT 전략을 사용해 간략하게 구합니다. 전역적으로 최소인 결정 트리를 찾는 문제는 NP-완전 문제에 해당하기 때문입니다. TDIDT는 각 트리의 노드에서 국지적으로 가장 좋은 분기를 선택하는 것을 반복하는 전략입니다.

 

분기는 아래의 2가지를 고려해서 이루어집니다.

  • 지니 불순도(gini impurity): 클래스가 잘못 분류될 확률의 가중 평균으로 정의, 이를 최소화하는 것이 분기 기준
  • 정보 이득(information gain) 최대: (부모 노드의 엔트로피) - (자식 노드들의 엔트로피) 로 정의, 이를 최대화하는 것이 분기 기준

두 가지 모두 feature 별로 경계점을 직접 대입하고 결과 값을 비교하면서 최적의 경계점을 찾아야 합니다.

만약 분기된 노드가 하나의 클래스로만 이루어져(분류 문제일 경우) 학습이 필요 없거나 노드를 더 분할해도 예측력이 개선되지 않고, 과적합의 가능성이 커지는 경우가 생기면 분기는 중지됩니다.

 

이러한 결정 트리 모델은 화이트 박스 모델에 속하지만, 과적합에 취약하고 노이즈에 민감하다는 단점을 가지고 있습니다.

sklearn.tree.DecisionTreeClassifier

sklearn 패키지에서 결정 트리(DecisionTreeClassifier, DecisionTreeRegressor) 클래스 API를 제공하므로 이를 사용해 간단하게 결정 트리 모델을 만들어 학습시킬 수 있습니다.

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

x, y = load_iris(return_X_y=True, as_frame=False)
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.33, random_state=1234)
decision_tree = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_split=3,
					random_state=1234).fit(x, y)
prediction = decision_tree.predict(test_x)

클래스의 파라미터에 대해 설명하면 아래와 같습니다.

파라미터 주요값 기본값 의미
criterion gini/entropy gini 지니 불순도 최소화 / 정보 이득 최대화
max_depth none/int>0 none 결정 트리 깊이의 상한선 / 설정 시 과적합에 주의
min_samples_split int>0/float>0 2 노드에서 분기를 진행하는 최소 샘플의 수

이 외로 설정할 수 있는 파라미터는 많습니다. 이에 대한 자세한 설명은 아래 sklearn 사이트를 참고하시길 바랍니다.

 

sklearn.tree.DecisionTreeClassifier

Examples using sklearn.tree.DecisionTreeClassifier: Release Highlights for scikit-learn 1.3 Classifier comparison Plot the decision surface of decision trees trained on the iris dataset Post prunin...

scikit-learn.org

앙상블(Ensemble)

앙상블 기법은 여러 base 모델들의 예측 결과를 합쳐 예측의 정확성을 향상하는 방법입니다. 앙상블의 방법으로는 아래의 2가지가 존재합니다.

  • 배깅(bagging: bootstrap aggregating): 수많은 부트스트랩 데이터를 생성해 이에 각각 독립적인 학습기를 여러 개 만들어 병렬로 학습(ex. 랜덤 포레스트)
  • 부스팅(boosting): 여러 base 학습기를 만들고 순서대로 학습 진행(ex. 그레이디언트 부스팅 트리)

부트스트래핑(Bootstrapping)이란?

더보기
  • 주어진 데이터가 모집단이라 가정하고 이를 이용해 수많은 시뮬레이션 샘플을 만들어내는 기법
  • 샘플을 만들 때는 복원 추출을 사용

랜덤 포레스트(Random Forest)

여러 결정 트리에 의한 예측을 종합하는 모델입니다. 보통 하나의 결정 트리일 때보다 높은 정확성을 보입니다.

랜덤 포레스트 설명 글미

랜덤 포레스트에서는 각 분기 규칙을 계산할 때, 전제 feature 집합에서 무작위의 부분 집합을 사용하는데 이를 feature bagging이라 부릅니다. 이는 결정 트리들 간의 상관관계를 줄이기 위해 사용합니다.

 

랜덤 포레스트에서는 배깅을 사용하기 때문에 샘플에 포함되지 않는 데이터가 있을 수도 있습니다. 이러한 데이터를 OOB(Out Of Bag) 데이터라 합니다. 이 데이터를 검증 집합으로 사용해 랜덤 포레스트의 모델의 성능을 판단할 수 있습니다.

sklearn.ensemble.RandomForestClassifier

sklearn 패키지에서 랜덤 포레스트(RandomForestClassifier, RandomForestRegressor) 클래스 API를 제공하므로 이를 사용해 간단하게 랜덤 포레스트 모델을 만들어 학습시킬 수 있습니다.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

x, y = load_iris(return_X_y=True, as_frame=False)
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.33, random_state=1234)
forest = RandomForestClassifier(n_estimators=100, bootstrap=True,
                                       oob_score=True, criterion='entropy',
                                       max_depth=3, min_samples_split=3)
forest.fit(train_x, train_y)
prediction = forest.predict(test_x)
print(forest.oob_score_)

클래스의 파라미터에 대해 설명하면 아래와 같습니다.

파라미터 주요값 기본값 의미
n_estimators int 100 랜덤 포레스트 모델에 쓰일 트리의 수
bootstrap bool True 각 결정 트리를 만들 때 부트스트랩 데이터셋 사용 여부
oob_score bool/callable False OOB 데이터셋으로 평가한 일반화 점수 사용 여부 / bootstrap == True일 때만 유효
criterion gini/entropy/log_loss gini 지니 불순도 최소화 / 정보 이득 최대화

여기서도 이 외로 설정할 수 있는 파라미터는 많습니다. 이에 대한 자세한 설명은 아래 sklearn 사이트를 참고하시길 바랍니다.

 

sklearn.ensemble.RandomForestClassifier

Examples using sklearn.ensemble.RandomForestClassifier: Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.22 Comparison of Calibration of Classifiers Probability Calibr...

scikit-learn.org

그레이디언트 부스팅 트리(Gradient Boosting Tree)

부스팅 기법 중 하나인 GBM(Gradient Boost Machine)을 결정 트리에 적용한 앙상블 모델입니다. GBT 모델 또한 랜덤 포레스트와 똑같이 회귀와 분류 문제에 모두 사용할 수 있고, 높은 성능을 보입니다.

GBT 모델은 이전 단계에서 학습하지 못 한 잔차를 새로운 목표 변수로 설정하고 학습을 진행하는 모델입니다.

출처: https://www.researchgate.net/figure/The-architecture-of-Gradient-Boosting-Decision-Tree_fig2_356698772

sklearn.ensemble.GradientBoostingRegressor

sklearn 패키지에서 GBT(GradientBoostingClassifier, GradientBoostingRegressor) 클래스 API를 제공하므로 이를 사용해 간단하게 GBT 모델을 만들어 학습시킬 수 있습니다.

from sklearn.datasets import load_diabetes
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split

diabetes_df = load_diabetes(as_frame=True)['frame']
x, y = diabetes_df.iloc[:, :-1], diabetes_df.iloc[:, -1]
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.33, random_state=1234)

gbregressor = GradientBoostingRegressor(n_estimators=100, max_depth=4, random_state=1234)
gb_predict = gbregressor.fit(train_x, train_y).predict(test_x)
print(f"GradientBoostingRegressor 테스트 데이터셋 기준 MAE: {np.abs(gb_predict - test_y).mean(): .2f}")

클래스의 파라미터는 위에서 사용했던 파라미터들과 동일하기에 여기서 설명은 생략합니다. 추가적인 설명은 아래의 사이트를 참고하시길 바랍니다.

 

sklearn.ensemble.GradientBoostingClassifier

Examples using sklearn.ensemble.GradientBoostingClassifier: Early stopping of Gradient Boosting Feature transformations with ensembles of trees Gradient Boosting Out-of-Bag estimates Gradient Boost...

scikit-learn.org

GBT 이후의 boosting 기법들

  • XGBoost: GBT 모델 + (병렬 처리 / 하드웨어 최적화 / 과적합 규제 페널티 등) -> 최적화
  • LightGBM: XGBoost 모델보다 적은 학습 시간과 메모리 사용량, 범주형 feature 자동 처리 등의 기능들이 추가된 가벼운 GBT 모델

 

728x90