본문 바로가기

Study/Introduction to ML with python - 한빛

[Book] 2. 지도학습 - (2)

Book Title : Introduction to Machine Learning with Python
- 파이썬 라이브러리를 활용한 머신러닝 -

 

 

지은이 : 안드레아스 뮐러, 세라 가이도

옮긴이 : 박해선
출판사 : 한빛미디어

 

코드 출처

https://github.com/rickiepark/introduction_to_ml_with_python

 

GitHub - rickiepark/introduction_to_ml_with_python: 도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의

도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의 주피터 노트북과 코드입니다. Contribute to rickiepark/introduction_to_ml_with_python development by creating an account on GitHub.

github.com


개요
책을 읽고 줄거리를 요약

이미 알고 있는 부분은 빨리 넘어가고 모르는 부분 위주로 요약


2. 지도 학습  - (1)

2.3.4 나이브 베이즈 분류기

  • LogisticRegression이나 LinearSVC 같은 선형 분류기보다 훈련 속도 빠름
  • 일반화 성능은 낮음
  • 특성을 개별로 취급해 학습하여 각 특성에서 클래스별 통계를 단순하게 취합하여 효과적임
  • scikit-learn에 구현된 나이브 베이즈 분류기 : GaussianNB, BernoulliNB, MultinomialNB
GaussianNB  
  • 어떤 연속적인 데이터에도 적용 가능
  • 대부분 매우 고차원인 데이터셋에 사용
BernoulliNB
  • 이진 데이터에 적용
  • 텍스트 데이터 분류 시 사용
  • 희소한 데이터를 카운트 하는데 사용
  • 클래스별로 각 특서의 표준편차와 평균
MultinomialNB
  • 카운트 데이터에 적용
  • 텍스트 데이터 분류 시 사용
  • 희소한 데이터를 카운트 하는데 사용
  • 클래스별로 특성의 평균을 계산
  • 0이 아닌 특성이 비교적 많은 데이터셋에서 BernoulliNB보다 성능이 높음

2.3.5 결정 트리

  • 결정에 다다르기 위해 예/아니오 질문을 하면서 학습
  • 결정 트리를 학습한다는 것은 정답에 가장 빨리 도달하는 예/아니오 질문 목록을 학습하는 것
과대 적합을 막는 전략

1. 사전 가지치기(pre-prunning) 

  • 트리 생성을 일찍 중단하는 전략
  • 트리의 최대 깊이 제한
  • 리프틔 최대 개수 제한
  • 노드가 분할하기 위한 포인트의 최소 개수를 지정

2. 사후 가지치기(post-prunning)  

  • 트리를 만든 후 데이터 포인트가 적은 노드를 삭제하거나 병합하는 전략

유방암 데이터셋을 이용한 사전 가지치기 효과 확인

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
cancer  = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify = cancer.target)

tree = DecisionTreeClassifier(random_state = 0)
tree.fit(X_train, y_train)
print("훈련셋 점수 : ",tree.score(X_train, y_train))
print("테스트셋 점수 : ", tree.score(X_test, y_test))

훈련셋 점수 :  1.0
테스트셋 점수 :  0.9370629370629371
  • 리프 노드가 모두 순수 노드이므로 훈련 셋 점수는 1.0
  • 이 말은 훈련 데이터의 모든 레이블을 완벽하게 알 만큼 깊게 만들어 짐

훈련 데이터에 완전히 학습되기 전에 사전 가지치기를 트리에 적용해 트리의 성장을 멈추기

tree = DecisionTreeClassifier(max_depth = 4, random_state = 0)
tree.fit(X_train, y_train)
print("훈련셋 점수 : ",tree.score(X_train, y_train))
print("테스트셋 점수 : ", tree.score(X_test, y_test))

훈련셋 점수 :  0.9882629107981221
테스트셋 점수 :  0.9300699300699301

결정 트리 분석

  • 트리 모듈의 export_graphviz 함수를 이용해 트리 시각화 가능
  • 깊이가 4만 되어도 트리가 복잡함

트리의 특성 중요도

  • 트리를 만드는 결정에 각 특성이 얼마나 중요한지를 평가

결정 트리 장단점

  • 모델을 시각화할 수 있어서 이해 쉬움
  • 데이터 스케일에 구애받지 않음
  • 특성의 스케일이 서로 다르거나 이진 특성과 연속적인 특성이 혼합되어도 잘 작동
  • 사전 가지치키를 사용해도 과대 적합되는 경향이 있음

2.3.6 결정 트리의 앙상블

  • 앙상블이란 여러 머신러닝 모델을 연결하여 더 강력한 모델을 만드는 기법
  • 랜덤 포레스트(random forest) 와 그레이디언트 부스팅(gradient boosting) 모델이 분류와 회귀 문제의 다양한 데이터셋에서 효과적이라고 입증

랜덤 포레스트

  • 결정트리의 주요 단점은 과대 적합되는 경향이 있다는 것인데 랜덤 포레스트는 이 문제를 회피할 수 있음
  • 각 트리는 데이터 일부에 과대적합하는 경향을 가져서 서로 다른 방향으로 과대 적합 트리를 많이 만들고 그 결과를 평균 내는 방식
  • 랜덤 포레스트로 예측 할 때는 먼저 알고리즘이 모델에 있는 모든 트리의 예측을 만듦
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
import mglearn
X, y = make_moons(n_samples = 100, noise = 0.25, random_state = 0)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify = y, random_state = 3)

forest = RandomForestClassifier(n_estimators = 5, random_state= 0)
forest.fit(X_train, y_train)

fig, axes = plt.subplots(2, 3, figsize = (10, 5))

for i, (ax,tree) in enumerate(zip(axes.ravel(), forest.estimators_)):
    ax.set_title("tree {}".format(i))
    mglearn.plots.plot_tree_partition(X, y, tree, ax = ax)
mglearn.plots.plot_2d_separator(forest, X, fill = True, ax =axes[-1, -1], alpha = .4)
axes[-1, -1].set_title("random forest")
mglearn.discrete_scatter(X[:, 0], X[: ,1], y)

랜덤 포레스트 장단점

  • 성능이 매우 뛰어나고 매개변수 튜닝을 많이 하지 않아도 잘 작동함
  • n_jobs 매개변수를 이용해 사용할 CPU 코어 수 지정 가능
  • 희소한  고차원 데이터에는 잘 작동하지 않음

그레이디언트 부스팅 회귀 트리

  • 여러 개의 결정 트리를 묶어 강력한 모델을 만드는 전략
  • 회귀와 분류 모두 사용
  • 이전 트리의 오차를 보완하는 방식
  • 메모리를 적게 사용하며 예측이 빠름

그레이디언트 부스팅 회귀 트리 장단점

  • 매개변수를 잘 조정해야 하며 훈련시간이 오래 걸림
  • 희소한 고차원 데이터에는 잘 작동하지 않음
  • 특성의 스케일을 조정하지 않아도 

2.3.7 다른 앙상블 알고리즘

배깅(Bagging) 

  •  Boostrap aggregating
  • 중복을 허용한 랜덤 샘플링으로 만든 훈련 세트를 사용해 분류기를 각기 다르게 학습

엑스트라 트리(Extra-Tress)

  • 후보 특성을 무작위로 분할한 다음 최적의 분할을 찾음
  • 예측 방식은 랜덤 포레스트와 동일하게 각 트리가 만든 확률 값을 평균
  • 랜덤 포레스트보다 계산 비용이 비교적 적지만 무작위 분할 때문에 일반화 성능을 높이려면 많은 트리를 만들어야 하는 경우가 있어 랜덤 포레스트가 더 선호됨

에이다 부스트(AdaBoost)

  • Adaptive Boosting
  • 약한 학습기 사용
  • 이전의 모델이 잘못 분류한 샘플에 가중치를 높여서 다음 모델 학습
  • 훈련된 각 모델은 성능에 따라 가중치 부여
  • 모델이 예측한 레이블을 기준으로 모델의 가주 이를 합산하여 가장 높은 값을 가진 레이블을 선택하여 예측

2.3.8 커널 서포트 벡터 머신

  • kernelized support vector machines
  • 입력 데이터에서 단순한 초평면으로 정의되지 않는 더 복잡한 모델을 만들 수 있도록 확장한 것

커널 기법

  • 수학적 기교를 사용해 새로운 특성을 많이 만들지 않고서도 고차원에서 분류기를 학습시키는 방법

커널 서포트 벡터 머신 장단점

  • 데이터의 특성이 적어도 복잡한 결정 경계를 만들 수 있음
  • 데이터의 특성이 적을 때와 많을 떄 모두 잘 작동하지만 샘플이 많을 때는 잘 맞이 않음
  • 데이터 전처리와 매개변수 설정에 신경을 많이 써야 함
  • 예측이 어떻게 결정되었는지 이해가 어려워서 비전문가에게 모델 설명하기 난해