본문 바로가기

코딩/Python

[코딩] 트리 앙상블(랜덤포레스트, 그라디언트부스팅, 엑스트라트리, XG부스트, 라이트GBM) - 혼자 공부하는 머신러닝 딥러닝

반응형
목차
  1. 데이터
  2. RandomForest
  3. ExtraTree
  4. Gredient Boosting
  5. Histogram based Gradient Boosting
  6. XGBoost
  7. LightGBM

 

데이터
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)

 

RandomForest

  부트스트랩  샘플을 이용,노드를 분할할  때  일부 특성을 무작위로 고른다음 이 중에서  최선의 분할을 찾음.(분류:  전체 특성개수의 제곱근,   회귀: 젠체특성)    *부트스트랩 : 데이터세트에서 중복을 허용하여 데이터를 샘플리링  하는 방식(1개를 뽑고 다시 가방에  넣어   그 다음 샘플을  뽑는 방식)

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)
#return_train_score 가 True이면 검증점수뿐만아니라 훈련세트에 대한 점수도 같이 반환
#n_job는 cpu의 코어 사용 갯수,  -1이면 전부 사용 
print(np.mean(scores['train_score']),np.mean(scores['test_score']))

rf.fit(train_input, train_target)
print(rf.feature_importances_)
ExtraTree 

 랜덤포레스트와 비슷하게 작용, 기본적으로 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']))

rf.fit(train_input, train_target)
print(rf.feature_importances_)
GradientBoosting

 깊이가 얕은 결정트리를 사용하여 이전  트리의  오차를  보완하는 방법으로 앙상블, GradientBoostingClassifier는  기본적으로  3인결정트리를 100개 사용.  깊이가 얕은 결정트리를 사용하기 때문에 과대적합에 강함. 분류에서는 로지스틱  손실함수를 사용하고,  회귀에서는 평균 제곱 오차함수를 사용.

#그라디언트부스팅
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.fit(train_input, train_target)
print(gb.feature_importances_)
Histogram based Gradient Boosting 

입력특성을 256개의 구간으로 나누고 노드를 분할할 때  최적의 분할을 매우 빠르게 찾을 수 있음.

#히스토램 기반 그라디언트 부스팅
from sklearn.ensemble import HistGradientBoostingClassifier
hgb = HistGradientBoostingClassifier(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.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)

 

XGBoost
#XG부스트
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']))

 

LightGBM
#lightGBM
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']))
  1. RandomForest
  2. ExtraTree
  3. Gredient Boosting
  4. Histogram- based Gradient Boosting
  5. XGBoost
  6. LightGBM
반응형