정형데이터를 다루는데 가장 뛰어난 성과를 내는 알고리즘 = 앙상블 학습
이 알고리즘은 대부분 결정 트리를 기반으로 만들어져 있다.
랜덤 포레스트
랜덤포레스트는 앙상블 학습의 대표 주자 중 하나로 안정저인 성능 덕분에 널리 사용되고 있다.
->결정트리를 랜덤하게 만들어 결정트리의 숲을 만든다. 그리고 각 결정 트리의 예측을 사용해 최종 예측을 만든다.
랜덤 포레스트는 각 트리를 훈련하기 위한 데이터를 랜덤하게 만드는데, 우리가 입력한 훈련 데이터에서 랜덤하게 샘플을 추출하여 훈련데이터를 만든다.
이때 한 샘플이 중복되어 추출될 수도 있다.
이렇게 만들어진 샘플 = 부트스트랩 샘플
사이킷런의 랜덤 포레스트는 기본적으로 100개의 결정트리를 전체 특석 개수의 제곱근만큼의 특성을 선택하며 훈련.
그 다음 분류일때는 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 삼고,
회귀일때는 단순히 각 트리의 예측을 평균한다.
+) 분류는 샘플의 몇 개의 클래스 중 하나로 분류하는 문제고, 회귀는 임의의 어떤 숫자를 예측하는 문제이다.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
wine = pd.read_csv('https://bit.ly/wine_csv_data')
data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)
from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(rf, train_input, train_target, return_train_score = True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
결정트리의 큰 장점 중 하나인 특성 중요도를 계산한다.
랜덤포레스트의 특성 중요도는 각 결정 트리의 특성 중요도를 취합한 것
rf.fit(train_input, train_target)
print(rf.feature_importances_)
두번째 특성인 당도의 중요소가 감소하고 알코올 도수와 PH특성의 중요도가 조금 상승했다.
랜덤 포레스트가 특성의 일부를 랜덤하게 선택하여 결정트리를 훈련하기 때문이다.
-> 하나의 특성에 과도하게 집중하지 않고 좀 더 많은 특성이 훈련에 기여할 기회를 얻는다.
이는 과대적합을 줄이고 일반화 성능을 높이는데 도움이 된다.
RandomForestClassifier에는 자체적으로 모델을 평가하는 점수를 얻을 수 있다.
rf = RandomForestClassifier(oob_score=True, n_jobs=-1, random_state=42)
rf.fit(train_input, train_target)
print(rf.oob_score_)
OOB점수를 사용하면 교차 검증을 대신할 수 있어서 결과적으로 훈련세트에 더 많은 샘플을 사용할 수 있다.
엑스트라 트리
엑스트라 트리는 랜덤 포레스트와 매우 비슷하게 동작함.
기본적으로 100개의 결정트리를 훈련하고,
랜덤 포레스트와 동일하게 결정트리가 제공하는 대부분의 매개변수를 지원한다.
또한, 전체 특성 중에 일부 특성을 랜덤하게 선택하여 노드를 분할하는 데 사용한다.
랜덤 포레스트와 엑스트라 트리의 차이점은 부스트랩 샘플을 사용하지 않는다는 점.
즉, 각 결정 트리를 만들 때 전체 훈련 세트를 사용한다.
대신 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할한다.
하나의 결정트리에서 특성을 무작위로 분할한다면 성능이 낮아지겠지만 많은 트리를 앙상블 하기 때문에 과대적합을 막고 검증 세트의 점수를 높이는 효과가 있다.
from sklearn.ensemble import ExtraTreesClassifier
et = ExtraTreesClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(et, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
보통 엑스트라 트리가 무작위성이 좀 더 크기 때문에 랜덤 포레스트보다 더 많은 결정트리를 훈련해야 한다.
하지만 랜덤하게 노드를 분할하기 때문에 빠른 계산 속도가 엑스트라 트리의 장점이다
et.fit(train_input,train_target)
print(et.feature_importances_)
그레이디언트 부스팅
깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법.
깊이가 얕은 결정트리를 사용하기 때문에 과대적합에 강하고 일반적으로 높은 일반화 성능을 기대할 수 있다.
경사하강법을 사용하여 트리를 앙상블에 추가하고,
분류에서는 손실함수를 사용하며 회귀에서는 평균 제곱 오차 함수를 사용한다.
경사하강법처럼 결정트리를 계속 추가하면서 가장 낮은곳을 찾아 천천히 조금씩 이동한다.
학습률 매개변수로 속도를 조절한다.
et.fit(train_input,train_target)
print(et.feature_importances_)
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier(random_state=42)
scores = cross_validate(gb, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
거의 과대적합 되지 않는다. 그레이디언트 부스팅은 결정 트리의 개수를 늘려도 과대적합에 매우 강하다.
학습률을 증가시키고, 트리의 개수를 늘리면 조금 더 성능이 향상될 수 있다.
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier(random_state=42)
scores = cross_validate(gb, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
gb = GradientBoostingClassifier(n_estimators=500, learning_rate=0.2, random_state=42)
scores = cross_validate(gb, train_input, train_target,return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
결정트리 개수를 거의 5배나 늘렸지만 과대적합을 잘 억제하고 있다.
gb.fit(train_input,train_target)
print(gb.feature_importances_)
히스토그램 기반 그레이디언트 부스팅
정형 데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘이다.
먼저 입력 특성을 256개의 구간으로 나눈다. 따라서 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있다.
256개의 구간 중에서 하나를 떼어놓고 누락된 값을 위해서 사용한다.
->입력에 누락된 특성이 있더라도 이를 따로 전처리할 필요가 없다!
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
hgb = HistGradientBoostingClassifier(random_state=42)
scores = cross_validate(hgb, train_input, train_target, return_train_score=True)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
과대적합을 잘 억제하면서 그레이디언트 부스팅보다 조금 더 높은 성능을 제공한다.
from sklearn.inspection import permutation_importance
hgb.fit(train_input, train_target)
result = permutation_importance(hgb, train_input,train_target, n_repeats=10, random_state=42, n_jobs=-1)
print(result.importances_mean)
그레이디언트 부스팅과 비슷하게 조금 더 당도에 집중하고 있다.
hgb.score(test_input, test_target)
테스트세트에서는 약 87% 정확도를 얻었다.
실전에 투입하면 성능은 이보다는 조금 더 낮을것.
앙상블 모델은 확실히 단일결정 트리보다 좋은 결과를 얻을 수 있다.
from xgboost import XGBClassifier
xgb = XGBClassifier(tree_method='hist', random_state=42)
scores= cross_validate(xgb, train_input, train_target, return_train_score=True)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
from lightgbm import LGBMClassifier
lgb = LGBMClassifier(random_state=42)
scores = cross_validate(lgb, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
앙상블 학습 보고서
앙상블 학습은 정형 데이터에서 가장 뛰어난 성능을 내는 머신러닝 알고리즘 중 하나이다.
대표적인 앙상블학습은
사이킷런
- 랜덤포레스트: 부트스트랩 샘플 사용. 대표 앙상블 학습 알고리즘임.
- 엑스트라 트리: 결정 트리의 노드를 랜덤하게 분할함
- 그레이디언트 부스팅: 이진 트리의 손실을 보완하는 식으로 얕은 결정트리를 연속하여 추가함
- 히스토그램 기반 그레이디언트 부스팅: 훈련 데이터를 256개 정수 구간으로 나누어 빠르고 높은 성능을 냄
그 외 라이브러리
- XGBoost
- LightGBM
중간에 오류가 날때: 파이썬에서 xgboost 설치하기 (tistory.com)
파이썬에서 xgboost 설치하기
이렇게 오류가 난 경우에는 보통 pip를 통해 설치해주면 해결이 됩니다! 1. 먼저 업그레이드를 해주셔야 해요! pip install --upgrade pip 2. pip 설치해주시면 됩니다. pip install xgboost 3. 설치되었는지 확..
komalgeum.tistory.com
출처: 출처:http://www.yes24.com/Product/Goods/96024871
혼자 공부하는 머신러닝+딥러닝 - YES24
- 혼자 해도 충분하다! 1:1 과외하듯 배우는 인공지능 자습서 이 책은 수식과 이론으로 중무장한 머신러닝, 딥러닝 책에 지친 ‘독학하는 입문자’가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있
www.yes24.com
'Machine Learning > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
6-2.p303~ k-평균 (0) | 2021.10.29 |
---|---|
6-1.p286~ 군집 알고리즘 (0) | 2021.10.28 |
5-2.p242~ 교차 검증과 그리드 서치 (0) | 2021.10.28 |
03-3p150~특성 공학과 규제 (0) | 2021.09.13 |
01-1p.26~03-2p.149 (0) | 2021.09.13 |