본문 바로가기
IT 도서/파이썬 머신러닝

4. 분류

by 이민우 2021. 2. 8.
728x90
반응형

book.naver.com/bookdb/book_detail.nhn?bid=16238302

 

파이썬 머신러닝 완벽 가이드

자세한 이론 설명과 파이썬 실습을 통해 머신러닝을 완벽하게 배울 수 있습니다!《파이썬 머신러닝 완벽 가이드》는 이론 위주의 머신러닝 책에서 탈피해 다양한 실전 예제를 직접 구현해 보면

book.naver.com

*해당 글은 학습을 목적으로 위의 도서 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.

 

 

 

분류

  • 데이터의 특징과 레이블값을 학습시켜 모델을 생성하고, 새로운 데이터에 대해 레이블 값을 예측하는 것

 

 

결정 트리 (Decision Tree)

  • 학습을 통해 자동으로 규칙을 찾아내 트리 기반의 분류 규칙을 만드는 것.
  • if/else 기반으로 스무고개를 하는 것과 비슷하다.
  • 데이터의 어떤 기준을 바탕으로 규칙을 만들어야 효율적인지 파악하는 것이 중요하다.

 

 

결정 트리 구조

  • 규칙 노드 : 규칙 조건
  • 리프 노드 : 결정된 클래스 값
  • 서브 트리 : 매 규칙 조건마다 생성되는 데이터 세트

*규칙이 많으면 분류를 결정하는 방식이 복잡해지고, 과적합으로 이어진다.

*그래서 트리의 깊이가 깊어질수록 결정 트리의 예측 성능이 저하될 수 있다.

*최대한 균일한 데이터 세트를 구성할 수 있도록 트리를 분할하는 것이 중요하다.

 

 

정보의 균일도

  • 결정 노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만든다.
  • 즉, 정보 균일도가 데이터 세트로 쪼개질 수 있도록 조건을 찾아 서브 데이터 셋을 만들고, 다시 이 서브 데이터 셋에서 균일도가 높은 자식 데이터 셋을 쪼개는 방식을 반복한다.
  • 이러한 정보의 균일도를 측정하는 방법엔트로피를 이용한 정보 이득 지수지니 계수가 있다.
  • 정보 이득 : (1-엔트로피 지수)로, 정보 이득이 높은 속성을 기준으로 분할
  • 지니 계수 : 낮을수록 데이터 균일도가 높은 것으로 해석된다.

*엔트로피는 주어진 데이터의 혼잡도로, 서로 다른 값일수록 엔트로피가 높다.

*사이킷런의 DecisionTreeClassifier은 기본으로 지니 계수를 이용해 데이터 셋을 분할한다.

 

 

결정 트리 모델의 특징

  • 정보의 균일도를 기반으로 하기에 알고리즘이 쉽고 직관적이다.
  • 또한 룰이 매우 명확하고, 정보의 균일도만 신경쓰면 되기에 별도의 스케일링과 정규화 같은 전처리 작업이 없다.
  • 다만 과적합으로 정확도가 떨어질 수 있다.
  • 이를 극복하기 위해 트리의 크기를 사전에 제한하는 튜닝이 필요하다.

 

 

결정 트리 파라미터

  • sklearn.tree.DecisionTreeClassifier    
  • 사이킷런의 결정 트리는 CART 기반이라 분류 뿐 아니라 회귀도 가능하다. (DecisionTreeRegression)
min_sample_split = 2 -노드를 분할하기 위한 최소한의 샘플 데이터 수
-과적합을 제어하는데, 작을수록 분할되는 노드가 많아져
 과적합 가능성이 증가.
min_samples_leaf -말단 노드가 되기 위한 최소한의 샘플 수
-과적합을 제어한다. 
-비대칭적 데이터는 작게 설정한다.
max_features = None -최적의 분할을 위해 고려할 최대 피처 개수
-int형으로 지정시 피처의 개수, float형으로 지정시 퍼센트
-sqrt, auto(=sqrt), log, None 가능
max_depth = None -트리의 최대 깊이를 규정
-None일 경우 깊이를 계속 키우며 분할하거나 노드의 데이터 개수가
 min_sample_split보다 작아질 때까지 계속 깊이 증가
-과적합을 막기 위해 적절한 값으로 제어가 필요
max_leaf_nodes -말단 노드의 최대 개수

*결정트리는 Gfaphviz 패키지를 사용해 시각화가 가능하다.

*sklearn.tree.export_graphviz를 사용해 트리의 모습을 확인할 수 있다.

 


앙상블 (Ensemble Learning)

  • 한 명의 천재보다 여러 명의 일반인이 머리를 모은 것이 낫다.
  • 여러 개의 분류기를 생성하여 그 예측을 결합해 보다 정확한 최종 예측을 도출하는 기법
  • 다양한 분류기의 예측 결과를 결합함으로써 단일 분류기보다 신뢰성이 높은 예측값을 얻는 기법
  • 대부분의 정형 데이터 분류에서 뛰어난 성능을 나타내고 있다.
  • 성능이 뛰어나며, 사용이 쉽고, 활용도가 다양하다.

 

 

앙상블의 유형

1) Voting

  •  여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정
  •  서로 다른 알고리즘을 가진 분류기를 결합한다.

 

2) Bagging

  •  여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정
  •  학습 데이터를 다르게 한 같은 알고리즘을 가진 분류기를 결합한다.
  •  랜덤 포레스트가 대표적이다.

 

3) Boosting

  •  여러 개의 분류기가 순차적으로 학습을 수행한다.
  •  앞에서 학습한 분류기가 예측이 틀린 데이터에 대해 올바르게 예측할 수 있도록 다음 분류기에서는 가중치를 부여하며 학습과 예측을 진행한다.
  •  그래디언트 부스트, XGBoost, LightGBM 등이 있다.

4) Stacking

  •  여러 가지 다른 모델의 예측 결과값을 다시 학습 데이터로 만들어 다른 모델(메타 모델)로 재학습시켜 결과를 예측

 


보팅의 유형

  1. 하드 보팅 : 다수결 원칙으로 결과값 선정
  2. 소프트 보팅 : 레이블 값 결정 확률을 모두 더하고 평균해서 가장 높은 레이블 값을 최종 보팅 결과값으로 선정

 

*일반적으로 소프트 보팅이 적용된다.

 

 

보팅 분류기

  • 사이킷런은 보팅 방식의 앙상블을 구현한 sklearn.ensemble.VotingClassifier 클래스를 제공한다.
  • 파라미터로 estimators와 voting 값을 받는다.
  • estimators는 보팅에 사용될 여러 개의 Classifier 객체들의 튜플 형식
  • voting은 hard, soft (기본은 hard)

 

 

비고

  • 보팅으로 여러 개의 기반 분류기를 결합하는 것이 무조건 좋은 성능을 보이지는 않는다.
  • 때로는 하나의 분류기가 더 좋은 결과를 보여줄 때도 있다.
  • 하지만 현실 세계의 데이터는 다양한 변수와 예측이 어려운 규칙으로 구성되어 있다.
  • 그래서 다양한 관점을 가진 알고리즘을 서로 결합해 더 나은 성능을 실제 환경에서 끌어낼 수 있다.

 


배깅

  • 보팅과 달리 같은 알고리즘으로 여러 개의 분류기를 만들어 보팅으로 최종 결정하는 알고리즘
  • 대표적인 알고리즘으로 랜덤 포레스트가 있다.

 

 

랜덤 포레스트

  • 데이터를 배깅 방식으로 분할여러 개의 결정 트리 분류기를 생성한 후 보팅을 통해 예측 결정
  • 비교적 빠른 수행 속도를 가지고 있으며 다양한 영역에서 높은 예측 성능을 보인다.
  • 결정 트리 기반으로, 결정 트리의 장점인 쉬운 난이도와 직관적인 장점을 가지고 있다.
  • 랜덤 포레스트의 개별 트리가 학습하는 데이터 세트는 일부가 중첩되어 있다.
  • 이렇게 여러 개의 데이터 세트를 중첩되게 분리하는 것을 부트스트래핑이라 한다.
  • 랜덤 포레스트의 서브셋 데이터는 이러한 부트스트래핑으로 데이터가 임의로 만들어진다.

 

 

랜덤 포레스트의 하이퍼 파라미터 및 튜닝

  • sklearn.ensemble.RandomForestClassifier
  • 사이킷런의 랜덤 포레스트는 CPU 병렬 처리도 효과적으로 수행되어 빠른 학습이 가능하다.
n_estimators = 10 -결정 트리의 개수
-많이 설정할수록 좋은 성능을 가지지만, 무작정 증가시키면 안된다.
max_features = 'auto' -최적의 분할을 위해 고려할 최대 피처 개수
-결정트리와 사용법이 같다.
max_depth -트리의 최대 깊이를 제어해 과적합 개선
-결정트리와 같다.
max_samples_leaf -말단 노드가 되기 위한 최소한의 샘플 수
-과적합을 개선한다.
-결정트리와 같다.

 

 


부스팅

  • 여러 개의 약한 학습기를 순차적으로 학습-예측하며 잘못된 예측 데이터에 가중치를 부여해 오류를 개선하는 방식
  • 부스팅의 대표적인 구현은 AdaBoost와 그래디언트 부스트가 있다.
  • 에이다 부스트는 오류 데이터에 가중치를 부여하며 부스팅을 수행하는 대표적인 알고리즘이다.
  • GBM은 에이다부스트와 유사하나, 가중치 업데이트에 경사 하강법을 이용한다.

 

GBM (Gradient Boosting Classifier)

  • 에이다 부스트와 같이 오류 데이터에 가중치를 부여하며 부스팅을 수행한다.
  • 가중치 업데이트에 경사 하강법을 이용한다.
  • 분류와 회귀 둘 다 가능하다.

 

 

GBM 하이퍼 파라미터 및 튜닝

  • sklearn.ensemble.GradientBoostingClassifier
  • 약한 학습기의 순차적인 예측 오류 보정을 통해 학습을 수행하므로 병렬 처리가 지원되지 않아 학습 시간이 길다.
n_estimators = 100 -weak_learner의의 개수
-많이 설정할수록 좋은 성능을 가지지만, 무작정 증가시키면 안된다.
max_features = 'auto' -최적의 분할을 위해 고려할 최대 피처 개수
-결정트리와 사용법이 같다.
max_depth -트리의 최대 깊이를 제어해 과적합 개선
-결정트리와 같다.
loss = 'deviance' -경사하강법에서 사용할 비용 함수
learning_rate = 0.1 -학습률로 0~1 사이의 값을 지정할 수 있다.
-너무 작은 값 입력시 너무 오래 걸림
-너무 큰 값 입력시 최소 오류 값을 찾지 못할 수 있음.
subsample = 1 -weak learner가 학습에 사용하는 데이터 샘플링 비율
-1은 전체 데이터, 0.5는 절반의 데이터
-과적합이 염려되는 경우 1 미만으로 설정한다.

 

 


 

XGBoost

  • 트리 기반의 앙상블 학습 중 가장 각광받는 알고리즘 중 하나
  • GBM의 단점인 느린 수행 시간 및 과적합 규제 부재 등의 문제를 해결
  • 병렬 CPU 환경에서 병렬 학습이 가능해 빠르게 학습을 완료할 수 있다.
  • 예층 성능이 뛰어나며, 가지치기가 가능하고, 교차 검증과 결손값 처리를 자체적으로 수행한다.

 

 

XGBoost 하이퍼 파라미터

  • GBM과 유사하나, 조기 중단, 과적합 규제 등이 추가되었다.
  • xgboost.XGBClassifier, xgboost.XGBRegressor

https://xgboost.readthedocs.io/en/latest/python/python_api.html

*matplot.pyplot.plot_importance() 를 입력하면 시각화 결과 도출 가능

*위의 함수는 특징값의 중요도를 시각화하는 모듈

 

 


 

LightGBM

  • XGBoost와 함께 부스팅 계열 알고리즘에서 각광받는 알고리즘
  • XGBoost에서 GridSearchCV로 하이퍼 파라미터 튜닝을 수행하면 수행 시간이 너무 오래 걸려 많은 파라미터 튜닝이 어렵다는 문제가 있었다.
  • LightGBM은 XGBoost보다 학습에 걸리는 시간이 적고, 메모리 사용량도 상대적으로 적다.
  • 그럼에도 불구하고 예측 성능은 별다른 차이가 없다.
  • 또한 카테고리형 특징의 자동 변환과 최적 분할이 가능하다.
  • LightGBM은 다른 GBM계열과 달리 리프 중심 트리 분할 (Leaf Wise) 방식을 사용한다.
  • 다른 GBM 계열은 균형 트리 분할 (Level Wise) 방식을 사용한다.
  • 이는 최대한 균형 잡힌 트리를 유지하며 분할하기에 트리의 깊이가 최소가 될 수 있고, 오버피팅에 강하다.
  • 하지만 균형을 잡기 위해 오랜 시간이 소요된다.
  • LightGBM의 리프 중심 트리 분할은 트리의 균형을 맞추지 않고, 최대 손실 값을 가지는 리프 노드를 지속적으로 분할하며 트리를 깊게 만들며 비대칭적인 규칙 트리를 생성한다.
  • 최대 손실값을 가지는 리프 노드를 지속적으로 분할한 트리는 학습을 반복할수록 균형 트리 분할 방식보다 예측 오류 손실을 최소화할 수 있다.

 

LightGBM의 하이퍼 파라미터

lightgbm.LGBMClassifier

  • XGBoost와 많은 부분이 유사하나, 리프 노드가 분할되기에 이에 따른 하이퍼 파라미터 설정이 필요하다.
  • 예를 들어 max_depth를 매우 크게 가진다.
num_iterations = 100 -반복 수행하려는 트리의 개수 지정
learning_rate = 0.1 -학습률 지정
max_depth = -1 -최대 깊이 지정.
-0보다 작은 값 지정시 깊이 제한 없음
min_child_samples = 20 -최종 결정 클래스인 리프 노드가 되기 위해 최소한으로 필요한 레코드 수
-과적합을 방지한다.
num_levels = 31 하나의 트리가 가질 수 있는 최대 리프 수
boosting = 'gdbt' -부스팅 트리를 생성하는 알고리즘
-gdbt : 그래디언트 부스팅 결정 트리
-rf : 랜덤 포레스트
bagging_faction = 1.0 -데이터를 샘풀링하는 비율 지정
feature_fraction = 1.0 -개별 트리를 학습할 때마다 무작위로 선택하는 피처의 비율
-과적합을 막기 위해 사용
lambda_l2 = 0.0 -L2 규제.
lambda_l1 = 0.0 -L1 규제
objective -최소값을 가져야 할 손실함수 정의

*num_leaves의 개수를 중심으로 min_child_samples, max_depth를 함께 조정하며 모델의 복잡도를 줄여야 한다.

*num_leaves의 개수를 높이면 정확도가 높아지지만 반대로 트리의 깊이가 깊어져 과적합이 될 수 있다.

*min_child_samples는 큰 값으로 설정 시 트리가 깊어지는 것을 방지해 과적합을 개선한다.

*max_depth는 명시적으로 깊이의 크기를 제한해 과적합을 개선한다.

 

*learning_rate을 작게하며 n_estimators를 크게하는 것은 부스팅 계열 튜닝에서 가장 기본적인다.

*당연히 n_estimators를 너무 크게 하면 과적합이 일어난다.

 


스태킹 (Stacking)

  • 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출한다.
  • 배깅과 부스팅과 달리, 개별 알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행한다.
  • 즉, 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 알고리즘으로 최종 수행하고 테스트 데이터를 기반으로 다시 최종 예측을 수행한다.
  • 이러한 구조로 인해 개별적인 기반 모델과, 개별 기반 모델의 예측 데이터를 학습 데이터로 만들어 학습하는 최종 메타 모델이 필요하다.
  • 스태킹 모델의 핵심은 여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합해 최종 메타 모델의 학습용 특징 데이터 세트와 테스트용 특징 데이터 세트를 만드는 것.

 

*메타 모델 : 개별 모델의 예측된 데이터 세트를 다시 기반으로 하여 학습하고 예측하는 방식

 

 

CV 세트 기반의 스태킹

  • CV 세트 기반의 스태킹 모델은 과적합 개선을 위해 최종 메타 모델을 위한 데이터 세트 생성시 교차 검증 기반으로 예측된 결과 데이터 셋을 사용.
  • 2단계의 스텝으로 구분될 수 있다.
  1. 각 모델별로 테스트 데이터를 예측한 결과 값을 기반으로 메타 모델을 위한 데이터를 만든다.
  2. 1단계에서 개별 모델들이 생성한 학습용 데이터를 스태킹 형태로 합쳐 최종 학습용 데이터 세트 생성. 메타 모델은 최종적으로 생성된 학습 데이터 세트와 원본 학습 데이터의 레이블 데이터를 기반으로 학습한 뒤, 최종적으로 생성된 테스트 데이터 세트를 예측하고, 원본 테스트 데이터의 레이블 데이터를 기반으로 평가.
  • 이를 상세하게 풀어 설명하면 아래와 같다.

  1. 학습용 데이터를 N개의 폴드로 나누어 N번의 학습을 실행한다.
  2. 각 학습이 끝날 때마다 검증 폴드를 통해 예측한 결과값과 테스트 셋을 통한 예측 결과값을 별도로 저장한다.
  3. 검증 폴드를 통해 예측한 결과값은 최종 메타 모델의 학습 데이터로 사용한다.
  4. 예측 결과값들의 평균은 최종 메타 모델의 테스트 데이터로 사용한다.

 


언더 샘플링과 오버 샘플링

  • 레이블 값 분포가 불균형하여 예측 성능의 문제가 발생하는 것을 방지하는 기술
  • 언더 샘플링 : 많은 레이블을 가진 데이터 세트를 적은 레이블을 가진 데이터 세트 수준으로 감소
  • 오버 샘플링 : 적은 레이블을 가진 데이터 세트를 많은 레이블을 가진 데이터 세트 수준으로 증식

실습코드 : https://github.com/123okk2/MachineLearning_practice/tree/main/4.%20%EB%B6%84%EB%A5%98

728x90
반응형

'IT 도서 > 파이썬 머신러닝' 카테고리의 다른 글

7. 군집화  (0) 2021.02.10
6. 차원 축소  (0) 2021.02.09
5. 회귀  (0) 2021.02.08
3. 평가  (0) 2021.02.01
2. Sklearn (사이킷 런) 사용법  (0) 2021.02.01