본문 바로가기
DB 공부하기

230403_DB복습

by 보랏 2023. 4. 3.

안녕하세요. 보랏입니다.

 

오늘 또 새로운 한 주가 시작되어 복습 내용 올리도록 하겠습니다.

 

오늘 배운 내용은 머신러닝 랜덤포레스트, XGBoost와

vscode에서 django설치를 배웠는데, 지금 제 데스크탑에서 계속 오류가 발생해서 

다시 해결하는대로 한 번에 올리도록 하겠습니다. 

죄송합니다.

 

복습 시작하겠습니다.

 

 

1. 랜덤 포레스트

앙상블 모델(ensemble learning)

  • 정형 데이터를 다루는 데 가장 뛰어난 성과를 내는 알고리즘

랜덤 포레스트

  • 랜덤포레스트는 의사결정트리가 모여서 생성
  • 의사결정트리에서 수 많은 요소(feature)를 기반으로 target을 예측한다면, 오버피팅 발생
  • 따라서 random forest는 전체 feature중 랜덤으로 일부 feature만 선택해 하나의 결정트리를 생성
  • 또 전체 feature중 랜덤으로 일부 feature를 선택해 또 다른 결정트리를 생성하며, 여러 개의 의사 결정트리를 만드는 방식으로 구성 → 의사결정마다 하나의 예측 값을 도출
  • 이렇게 여러 결정 트리들이 내린 예측 값 중, 가장 많이 나온 값(분류모델) 혹은 평균값(회귀모델)을 최종 예측 값으로 정함

 

랜덤 포레스트 장점

  • Classification(분류) 및 Regression(회귀) 문제에 모두 사용 가능
  • Missing value(결측치)를 다루기 쉬움
  • 대용량 데이터 처리에 효과적
  • 모델의 노이즈를 심화시키는 Overfitting(오버피팅) 문제를 회피하여, 모델 정확도를 향상시킴
  • Classification 모델에서 상대적으로 중요한 변수를 선정 및 Ranking 가능

랜덤 포레스트 적용 모델

  • 분류모델(RandomForestClassifier) : 랜덤포레스트가 분류모델을 실행 시 전체 특성 개수의 제곱근만큼의 특성을 선택함
  • 예) 4개의 특성이 있다면 노드마다 2개를 랜덤하게 선택하여 사용
  • 회귀모델(RandomForestRegressor) : 전체 특성 사용

 

랜덤 포레스트 적용 사례

<aside> 💡 고객 이탈은 복잡하며 일반적으로 제품 비용, 최종 제품에 대한 만족도, 고객 지원 효율성, 지불 용이성, 계약 기간, 제공되는 추가 기능, 성별, 연령, 위치 등 많은 요소를 포함합니다. 랜덤 포레스트 알고리즘은 이러한 모든 요소에 대한 의사 결정 트리를 생성하여 조직의 고객 중 이탈 위험이 높은 고객을 정확하게 예측할 수 있습니다.

 

랜덤 포레스트 코드

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']))

 

2. XGBoosting

Boosting

  • 여러 개의 약한 Decision Tree를 조합해서 사용하는 Ensemble기법 중 하나
    • 즉, 약한 예측 모형들의 학습 에러에 가중치를 두고, 순차적으로 다음 학습 모델에 반영하여 강한 예측 모형을 만드는 것

XGBoost

  • XGBooset는 Extreme Gradient Boosting의 약자
  • Boosting기법을 이용하여 구현한 알고리즘은 Gradient Boost가 대표적인데, 이 알고리즘을 병렬 학습이 지원되도록 구현한 라이브러리가 XGBoost
  • Regression, Classification 문제를 모두 지원하며, 성능과 자원 효율이 좋아 인기있는 알고리즘

XGBoost장점

  • GBM대비 빠른 수행시간
    • 병렬 처리로 학습, 분류 속도가 빠름
  • 과적합 규제 (Regularzation)
    • 표준 GBM경우 과적합 규제기능이 있으나, XGBoost는 자체에 과적합 규제 기능으로 강한 내구성을 지님
  • 분류와 희귀영역에서 뛰어난 예측 성능 발휘
    • 즉, CART(Classification and regression tree) 앙상블 모델을 사용
  • 조기 종료 기능 있음
  • 다양한 옵션을 제공하여 Customizing등이 용이

XGBoost 코드

XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
                 colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1,
                 importance_type='gain', interaction_constraints='',
                 learning_rate=0.1, max_delta_step=0, max_depth=5,
                 min_child_weight=1, missing=nan, monotone_constraints='()',
                 n_estimators=100, n_jobs=0, num_parallel_tree=1, random_state=0,
                 reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1,
                 tree_method='exact', validate_parameters=1, verbosity=None)

일반 파라미터

  • booster [기본값 = gbtree]
    • 어떤 부스터 구조를 쓸지 결정
    • 의사결정기반모형(gbtree), 선형모형(gblinear), dart 등이 있음
  • n_jobs
    • XGBoost를 실행하는데 사용되는 병렬 스레드 수
  • verbosity[기본값 = 1]
    • 유효한 값 : 0 , 경고 : 1, 정보 : 2, 디버그 : 3

부스터 파라미터 - gbtree booster

  • learning_rate [기본값 : 0.3]
    • learning_rate가 높을수록 과적합 하기 쉽다
  • n_estimators [기본값 : 100]
    • 생성할 weak learner의 수
    • learning_rate가 낮을 땐, n_estimators를 높여야 과적합이 방짐됨
  • max_depth [기본값 : 6]
    • 트리의 maximum depth
    • 적절한 값이 제시되어야 하고 보통 3~10사이 값이 적용됨
    • max_depth가 높을수록 모델의 복잡도가 커져 과적합 하기 쉽다
  • min_child_weight [기본값 : 1]
    • 관측치에 대한 가중치 합의 최소를 말함
    • 값이 높을수록 과적합이 방지
  • gamma [기본값 : 0 ]
    • 리프노드의 추가분할을 결정할 최소손실 감소값이다.
    • 해당값보다 손실이 크게 감소할 때 분리한다.
    • 값이 높을수록 과적합이 방지된다.
  • subsample [ 기본값 : 1 ]
    • weak learner가 학습에 사용하는 데이터 샘플링 비율이다.
    • 보통 0.5 ~ 1 사용된다.
    • 값이 낮을수록 과적합이 방지된다.
  • colsample_bytree [ 기본값 : 1 ]
    • 각 tree 별 사용된 feature의 퍼센테이지이다.
    • 보통 0.5 ~ 1 사용된다.
    • 값이 낮을수록 과적합이 방지된다.
  • lambda [기본값 = 1, 별칭 : reg_lambda]
    • 가중치에 대한 L2 Regularization 적용 값
    • 피처 개수가 많을 때 적용을 검토
    • 이 값이 클수록 과적합 감소 효과
  • alpha [기본값 = 0, 별칭 : reg_alpha]
    • 가중치에 대한 L1 Regularization 적용 값
    • 피처 개수가 많을 때 적용을 검토
    • 이 값이 클수록 과적합 감소 효과

민감하게 조정하는 변수

  • booster 모양
  • eval_metric(평가함수) / objective(목적함수)
  • eta
  • L1 form (L1 레귤러라이제이션 폼이 L2보다 아웃라이어에 민감하다.)
  • L2 form

과적합 방지를 위해 조정해야하는 것

  • learning rate 낮추기 → n_estimators은 높여야함
  • max_depth 낮추기
  • min_child_weight 높이기
  • gamma 높이기
  • subsample, colsample_bytree 낮추기

graphviz 설치

  • graphbiz 설치 (https://graphviz.org/)
  • cmd (관리자 권한) : pip install graphviz
  • 시스템 속성 - 환경변수 - path에 해당 문구 추가
    • 윈도우 10 : ;C:\Program Files\Graphviz\bin\dot.exe;C:\Program Files\Graphviz\bin\;
    • 윈도우 11 :
    C:\Program Files\Graphviz\bin\dot.exe
  • C:\Program Files\Graphviz\bin\

 

시각화

  • XGBoost모형을 시각화함으로써 개발한 예측모형의 성능에 대해 더 깊은 이해가 가능
  • 의사결정나무 시각화를 위해서 graphviz라이브러리 설치를 하여, path설정 진행

 

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

dt_clf = DecisionTreeClassifier(random_state= 42)
iris_data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state= 42)
dt_clf.fit(X_train,y_train) #훈련

from sklearn.tree import export_graphviz
export_graphviz(dt_clf, out_file = 'tree.dot', class_names = iris_data.target_names,  #시각화
                feature_names=iris_data.feature_names, impurity=True, filled = True)
with open("./tree.dot") as f:
    dot_graph = f.read()
import graphviz
graphviz.Source(dot_graph)

 

 

'DB 공부하기' 카테고리의 다른 글

230405_DB복습  (0) 2023.04.05
230404_DB복습  (0) 2023.04.04
230329_DB복습  (0) 2023.03.29
230327_DB복습  (0) 2023.03.27
230323_DB복습  (0) 2023.03.23