앙상블 학습
더 좋은 예측 결과를 만들기 위해 여러개의 모델을 훈련하는 머신러닝 알고리즘이다.
랜덤 포레스트
대표적인 결정 트리 기반의 앙상블 학습 방법이다.부트스트랩 샘플을 사용하고 랜덤하게 일부 특성을 선택하여 트리를 만드는 것이 특징이다.
엑스트라 트리
랜덤 포레스트와 비슷하게 결정 트리를 사용하여 앙상블 모델을 만들지만 부트스트랩 샘플을 사용하지 않는다. 대신 랜덤하게 노드를 분할해 과소적합을 감소시킨다.
그레이디언트 부스팅
랜덤 포레스트와 엑스트라 트리와 달리 결정트리를 연속으로 추가하여 손실함수를 최소화하는 앙상블 방법이다. 훈련 속도는 느리지만 더 좋은 성능을 기대할 수 있다.
그레이디언트 부스팅의 속도를 개선한 것이 히스토그램 기반 그레이디언트 부스팅 이며 안정적인 결과와 높은 성능으로 인기가 높다.
RandomForestClassifier
ExtraTreesClassifier
GrandientBoostingClassifier
HistGrandientBoostingClassifier
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
wine = pd.read_csv('https://bit.ly/wine-date')
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_)
rf=RandomForestClassifier(oob_score=True,n_jobs=-1,random_state=42)
rf.fit(train_input,train_target)
print(rf.oob_score_)
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_)
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']))
gb.fit(train_input,train_target)
print(gb.feature_importances_)
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)
permutation_importance는 특성을 하나씩 랜덤하게 섞어서 모델의 성능이 변하는지 관찰을 해서 특성 중요도를 계산한다.
n_repeats는 랜덤하게 특성을 섞을 횟수를 지정한다.
permutation_importance 가 반환하는 객체는 반복하여 얻은 특성중요도,평균,표준편차이다.
result=permutation_importance(hgb,test_input,test_target,n_repeats=10,random_state=42,n_jobs=-1)
print(result.importances_mean)
hgb.score(test_input,test_target)
출처: 혼공머신