본문 바로가기

STUDY

파이썬 스터디 4주차(머신러닝)(1)

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

 

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

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

book.naver.com

 

4. 분류

 

01. 분류의 개요

지도학습 : 레이블(Label), 즉 '정답'이 있는 데이터가 주어진 상태에서 학습하는 것. 대표 유형은 분류(Classification)

분류 : 학습 데이터로 주어진 데이터의 피처와 레이블값을 ML알고리즘에 학습시켜 모델을 생성한 뒤 새로운 데이터 값이 가질 (미지의)레이블 값을 예측하는 것. 즉 기존 데이터의 레이블 패턴을 인지한 뒤 새로운 데이터에 대한 분류를 수행하는 것.

- 나이브 베이즈, 로지스틱 회귀, 결정 트리, 서포트 벡터 머신, 최소 근접, 신경망, 앙상블 등이 있음

- 앙상블 : 서로 다른/같은 알고리즘을 결합하는 방식. 일반적으로 배깅Bagging과 부스팅Boosting으로 나뉨. 배깅에는 랜덤 포레스트, 부스팅에는 그라디언트 부스팅 방식이 대표적.

- 앙상블의 기본 알고리즘으로는 주로 결정트리가 사용됨.  

- 앙상블은 많은 약한 학습기(예측 성능이 상대적으로 떨어지는 알고리즘)를 결합해 확률과 오류에 대한 가중치를 업데이트하며 예측 성능을 향상시킴. 결정트리가 좋은 약한 학습기임.

 

 

02. 결정 트리

결정트리 : 학습으로 데이터에 있는 규칙을 찾아 트리기반의 분류규칙을 만드는 것.

 

- 규칙 노드(Decision Node) : 규칙 조건이 되는 것.

- 리프 노드(Leaf Node) : 더이상 자식 노드가 없는 노드. 최종 클래스(레이블)값 결정. 하나의 클래스 값으로만 구성되어 있거나 하이퍼 파라미터 조건을 충족해야.

- 트리의 깊이(depth)가 깊어질수록 결정 트리의 예측 성능이 저하될 가능성이 높음

- 가능 한 적은 결정노드로 높은 예측 정확도를 가지려면 최대한 균일한 데이터 세트를 구성할 수 있도록 분할하는 것이 중요

- 여기서 '균일하다'는 것은 데이터 세트 내의 데이터가 같은 종류여야 한다는 것(가령 흰공과 까만 공이 반반으로 섞여있는 주머니와 흰공으로만 이루어진 주머니가 있다면 전자는 혼잡하고 후자는 균일하다 할 수 있음)

- 데이터 세트의 균일도는 데이터 구분에 필요한 정보의 양에 영향을 미침

- 결정 노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만듦

- 정보의 균일도를 측정하는 대표적인 방법은 엔트로피를 이용한 정보이득Information Gain지수와 지니계수가 있음

  • 정보이득 : 1에서 엔트로피(데이터 집합의 혼잡도) 지수를 뺀 값. 결정트리의 분할 기준이 됨(높은 속성 기준 분할).
  • 지니계수 : 낮을수록 데이터 균일도가 높다 해석함(낮은 속성 기준 분할).

- DecisionTreeClassifier는 기본적으로 지니 계수를 이용해 데이터 세트 분할

- 결정트리는 정보의 '균일도'를 기반으로 해 쉽고 직관적이지만 과적합으로 정확도가 떨어질 수 있음. 이에 트리 크기를 제한해두면 도움이 됨.

- DecisionTreeClassifier/DecisionTreeRegressor 모두 사용하는 파라미터는 동일. min_samples_split(노드 분할 최소 데이터 수), min_samples_leaf(말단 노드(leaf) 최소 데이터 수), max_features(최대 피처 개수/비율), max_depth(최대 깊이), max_leaf_nodes(말단 노드(leaf) 최대 개수)가 있음.

- Graphviz패키지로 결정트리 알고리즘의 특징을 시각적으로 이해 할 수 있음.

sklearn의 load_iris에 결정트리를 적용한 결과 시각화

- 결정 트리 알고리즘의 하이퍼 파라미터는 대부분 모델 과적합(복잡한 트리 생성)을 막기 위한 것

- 결정 트리는 균일도 기반이기 때문에 어떤 속성을 규칙 조건으로 선택하느냐가 중요. 이때 DecisionTreeClassifier의 feature_importances_로 피처 중요도를 알 수 있음.

- feature_importances_는 ndarray형태로, 각각의 값은 피처의 중요도를 의미함. 

import seaborn as sns; import numpy as np;
%matplotlib inline

print(f"Feature importances:{np.round(dt_clf.feature_importances_, 3)}")
for name, value in zip(iris_data.feature_names, dt_clf.feature_importances_):
  print(f"{name}: {value:.3f}")

 

- 피처별 중요도 값은 각각 0.025, 0, 0.555, 0.42임. 이를 피처 이름과 묶으면 각 값이 sepal length~petal width에 해당한다는 것을 알 수 있음. 

 

from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
%matplotlib inline

plt.title("3 Class values with 2 Features Sample data creation")
X_features, y_labels = make_classification(n_features=2, n_redundant=0, n_informative=2,
                                           n_classes=3, n_clusters_per_class=1, random_state=0)
#분류를 위한 테스터용 데이터 생성

plt.scatter(X_features[:, 0], X_features[:, 1], marker='o', c=y_labels, s=25, edgecolor='k')
#그래프로 두 피쳐에 대한 2차원 좌표 시각화. 각 클래스 값은 색으로 구분

 

- 학습데이터에만 지나치게 최적화된 분류 기준은 테스트 데이터 세트에서의 정확도를 떨어뜨릴 수 있다. 이에 리프노드 생성 규칙을 완화하는 등 하이퍼 파라미터 설정을 바꾸어가며 예측 성능을 높일 수 있다.

- 복잡한 모델보다 트리 깊이를 낮춘 단순한 모델이 더 효과적인 결과를 가져올 수도 있음

각 피처 중요도 시각화(uci 사용자 행동인식 데이터세트 예측 분류)

 

 

03. 앙상블 학습

앙상블 학습(Ensemble Learning) : 여러 개의 분류기(Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법.

- 대부분의 정형 데이터 분류에는 앙상블이 좋음. 대표적인 알고리즘은 랜덤 포레스트와 그래디언트 부스팅.

- 쉽고 편하면서도 성능이 강력한 것이 특징

- 유형은 크게 보팅Voting, 배깅Bagging, 부스팅Boosting 세 가지로 나뉘며 이 외에도 스태킹 등이 있음.

- 보팅 : 같은 데이터세트에 서로 다른 알고리즘의 분류기를 결합하는 것

- 배깅 : 같은 알고리즘의 분류기에 (원본 학습 데이터에 대한)다른 데이터 샘플링으로 학습해 보팅 수행. 랜덤 포레스트.

*부트스트래핑Bootstraping분할방식 : 개별 Classifier에게 데이터를 샘플링해 추출하는 방식

- 배깅 앙상블 : 개별 분류기가 부트스트래핑으로 샘플링된 데이터세트에 대해 학습해 각각의 예측 수행 결과를 보팅으로 최종 값을 선정하는 방식. 배깅은 중첩을 허용하는 것이 특징.

- 부스팅 : 여러 분류기가 순차적으로 학습하되, 점점 가중치를 부스팅함. 성능이 뛰어남. 대표 모듈로는 그라디언트 부스트, XGBoost, LIGHTGBM

- 스태킹 : 여러 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어 다른 모델(메타 모델)로 재학습시켜 결과 예측

 

  • 보팅 유형 - 하드 보팅과 소프트 보팅

 - 하드 보팅 : 다수결과 비슷. 다수 분류기가 결정한 예측값을 최종 결괏값으로 선정.

- 소프트 보팅 : 각 레이블 값의 확률 평균을 낸 뒤 가장 높은 확률의 값을 최종 결괏값으로 선정.

- 일반적으로 소프트 보팅의 예측 성능이 더 좋음.

- 보팅, 배깅, 부스팅 등의 앙상블 방법은 단일 ML 알고리즘보다 뛰어난 예측 성능을 보이는 경우가 많음

- ML 모델의 성능은 어떻게 '높은 유연성'을 가지고 현실에 대처할 수 있는가가 중요한 평가 요소로 작용함

- 앙상블은 결정 트리의 단점을 수십~수천 개의 분류기를 결합함으로써 극복함

 

 

04. 랜덤 포레스트

랜덤 포레스트 : 여러 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각 데이터를 샘플링해 학습한 뒤 보팅을 통해 예측 결정

- 배깅 : 같은 알고리즘으로 여러 분류기를 만들어 보팅으로 최종 결정. 대표적인 알고리즘이 랜덤 포레스트.

- 개별 분류기의 기반 알고리즘은 결정 트리이나 학습하는 데이터 세트는 전체 중 일부가 중첩되어 샘플링 된 데이터 세트(이를 부트스트래핑 분할방식이라 함)

- 랜덤포레스트의 서브세트Subset은 부트스트래핑으로 만들어진 임의의 데이터를 말함.

- 데이터가 중첩된 개별 데이터 세트에 결정 트리 분류기를 각가 적용하는 게 랜덤 포레스트

 

- 트리 기반 앙상블 알고리즘의 단점 : 하이퍼 파라미터가 너무 많음, 튜닝 시간이 긺, 튜닝 이후 성능이 좋아지는 경우가 드묾 (n_estimators, max_features, max_depth, min_samples_leaf등 결정트리 파라미터를 랜덤포레스트에서도 사용)

- 랜덤 포레스트는 CPU 병렬처리로 빠른 학습 가능. 이에 기반 모델로 사용되는 경우도 많음.

- 랜덤 포레스트 분류기도 결정 트리 분류기와 마찬가지로 feature_importances_로 알고리즘의 피처 중요도를 알 수 있음

*random_state를 정해주지 않고 학습 수행 등을 할 경우, 같은 결과를 얻기 힘듦*

각 피처 중요도 시각화

 

좌 결정트리, 우 랜덤포레스트 피처 중요도 시각화