이 글은 기존 Tistory 블로그에서 옮겨온 글입니다. 원문: https://jms3084.tistory.com/27
가지런히 정리되어 있는 CSV파일, 엑셀파일등을 정형 데이터라고 부른다.
글과 같은 텍스트 데이터, 사진, 음악등을 비정형 데이터라고 부른다.
정형 데이터를 다루는데 가장 뛰어난 성과를 내는 알고리즘이 앙상블 학습이다.
랜덤 포레스트
앙상블 학습의 대표 주자 중 하나로 안정적인 성능을 낸다.
결정트리를 랜덤하게 만들어 결정트리의 숲을 만든다.
각 결정 트리의 예측을 사용해 최종 예측을 만든다.

입력한 훈련 데이터에서 랜덤하게 샘플을 추출하여 훈련 데이터를 만든다. → 샘플의 중복을 허용한다.
이렇게 만들어진 샘플을 부트스트랩 샘플이라고 부른다.

→ 기본적으로 부트스트랩 샘플의 크기는 훈련세트의 크기와 같게 만든다.
각 노드를 분할할 때 전체 특성 중에서 일부 특성을 무작위로 고른 다음 최선의 분할을 찾는다.
분류 모델인 RandomForestClassifier은 기본적으로 전체 특성 개수의 제곱근만큼의 특성을 선택
→ 4개의 특성이 있는경우 노드마다 2개를 랜덤으로 선택하여 사용
회귀 모델인 RandomForestRegressor은 전체 특성을 사용한다.
사이킷런의 랜덤 포레스트는 기본적으로 100개의 결정트리를 이런 방식으로 훈련한다.
랜덤 포레스트는 랜덤하게 선택했으므로 훈련세트에 과대적합되는것을 방지하고 테스트 세트에서 안정적인 성능을 얻을 수 있다.(일반화 성능을 높임)
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']))
cross_validate 함수의 매개변수인 return_train_score은 기본값이 False이므로 평균을 출력하고 싶을 경우 True값으로 지정해줘야 한다.
랜덤 포레스트는 결정 트리의 앙상블이기때문에 DecisionTreeClassifier가 제공하는 중요한 매개변수를 모두 제공합니다.
→ criterion, max_depth, max_features, min_samples_split, min_impurity_decrease, min_samples_leaf 제공
RandomForestClassifier 클래스는 자체적으로 모델을 평가하는 점수를 얻을 수 있다.
부트스트랩 샘플에 포함되지 않고 남는 샘플 → OOB(out of bag) 샘플이라고 한다.
이 OOB샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있다.
OOB세트가 검증 세트의 역할을 한다고 볼 수 있다.
점수를 얻기 위해서는 RandomForestClassifier 클래스의 oob_score 매개변수를 True로 지정해야 함.(기본값이 False)
rf = RandomForestClassifier(oob_score=True, n_jobs=-1, random_state=42)
rf.fit(train_input, train_target)
print(rf.oob_score_)
OOB점수를 사용하면 교차 검증을 대신할 수 있어서 결과적으로 훈련 세트에 더 많은 샘플을 사용할 수 있다.
엑스트라 트리
랜덤포레스트와 비슷하게 동작, 기본적으로 100개의 결정트리를 훈련
랜덤포레스트와 동일하게 결정트리가 제공하는 매개변수들을 지원
가장 좋은 분할을 찾는 것이 아니라 전체 특성 중 일부 특성을 랜덤하게 선택하여 노드를 분할한다.
→ splitter 매개변수를 random으로 지정
랜덤으로 노드를 분할하기 때문에 빠른 계산 속도가 특징이다.
하나의 결정 트리에서 특성 무작위로 분할 → 성능 감소
많은 트리를 앙상블하기 때문에 과대적합을 막고 검증 세트의 점수를 높이는 효과가 있다.
사이킷런에서 제공하는 엑스트라 트리는 ExtraTreesClassifier 클래스
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(score[‘test_score’]))
엑스트라 트리는 부트스트랩 샘플을 사용하지 않는다.
→ 결정트리를 만들 때 전체 훈련 세트를 사용한다.
엑스트라 트리의 회귀 버전은 ExtraTreesRegressor
그레이디언트 부스팅
깊이가 얕은 결정 트리를 사용하여 이진 트리의 오차를 보완하는 방식으로 앙상블하는 방법
사이킷런의 GradientBoostingClassifier 클래스로 제공
→ 기본적으로 깊이가 3인 결정 트리 100개 사용
깊이가 얕기 때문에 과대적합에 강력하고 높은 일반화 성능을 기대할 수 있다.
경사 하강법을 사용하여 트리를 앙상블에 추가한다.
→ 결정 트리를 계속 추가하면서 가장 낮은 곳을 찾아 이동, 학습률 매개변수로 속도를 조정
분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수 사용
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier(random_State=42)
scores = cross_validate(gb, train_input, train_target, return_train_scores=True, n_jobs=-1)
print(np.mean(scores[‘train_score’]), np.mean(scores[‘test_score’]))
학습률을 증가시키고 트리의 개수를 증가시키면 성능 향상 가능
트리 훈련에 사용할 훈련 세트의 비율을 정하는 subsample의 기본값은 1이다.
1일 경우 → 전체 훈련 세트 사용
1보다 작을 경우 → 훈련 세트의 일부 사용
그레이디언트 부스팅의 회귀버전은 GradientBoostingRegressor 클래스
히스토그램 기반 그레이디언트 부스팅
정형데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘
- 입력 특성의 256개의 구간으로 나눈다. → 최적의 분할을 매우 빠르게 찾을 수 있다.
- 256개구간 중 하나를 떼어 놓고 누락된 값을 위해서 사용 → 누락된 특성 전처리가 필요 없다.
사이킷런의 HistGradientBoostingClassifier 클래스로 제공
HistGradientBoostingClassifier에서는 트리의 개수를 지정하는데 n_estimators 대신 부스팅 반복 횟수를 지정하는 max_iter을 사용한다.
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’]))
HistGradientBoosting의 특성 중요도를 계산하기 위해 permutation_importance() 함수 사용
→ 하나씩 랜덤하게 섞어서 모델의 성능이 변화하는지 관찰하여 어떤 특성이 중요한지 계산
훈련세트, 테스트세트, 사이킷런에서 제공하는 추정기 모델에도 사용 가능
매개변수인 n_repeats는 랜덤하게 섞을 횟수를 지정한다. 기본값은 5
특성중요도, 평균, 표준편차를 반환한다.(permutation_importance())
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)
히스토그램 기반 그레이디언트 부스팅의 회귀 버전은 HistGradientBoostingRegressor 클래스
히스토그램 기반 그레이디언트 부스팅 종류
사이킷런: HistGradientBoostingClassifier
XGBoost: XGBClassifier (부스팅 알고리즘, tree_method 매개변수를 hist로 지정시 히스토그램 기반)
lightgbm: LGBMClassifier
Copyright 2021. 박해선 All rights reserved.