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
- 입력 데이터에서 단순한 초평면으로 정의되지 않는 더 복잡한 모델을 만들 수 있도록 확장한 것
커널 기법
- 수학적 기교를 사용해 새로운 특성을 많이 만들지 않고서도 고차원에서 분류기를 학습시키는 방법
커널 서포트 벡터 머신 장단점
- 데이터의 특성이 적어도 복잡한 결정 경계를 만들 수 있음
- 데이터의 특성이 적을 때와 많을 떄 모두 잘 작동하지만 샘플이 많을 때는 잘 맞이 않음
- 데이터 전처리와 매개변수 설정에 신경을 많이 써야 함
- 예측이 어떻게 결정되었는지 이해가 어려워서 비전문가에게 모델 설명하기 난해
'Study > Introduction to ML with python - 한빛' 카테고리의 다른 글
[Book] 4. 비지도학습과 데이터 전처리 - (1) (0) | 2022.02.25 |
---|---|
[Book] 3. 비지도학습과 데이터 전처리 - (3) (0) | 2022.02.20 |
[Book] 3. 비지도학습과 데이터 전처리 - (2) (0) | 2022.02.17 |
[Book] 3. 비지도학습과 데이터 전처리 - (1) (0) | 2022.02.15 |
[Book] 1. 소개 (0) | 2022.02.06 |