AI/혼공학습단9기_DL&ML

[혼공머신] 4주차 과제 - 트리 알고리즘

moviewine 2023. 1. 26. 20:14

1. Contents

 

1) Decision Tree(결정 트리)

  • Decision Tree(결정 트리)는 예 / 아니오에 대한 질문을 이어나가면서 정답을 찾아 학습하는 알고리즘으로서, 비교적 예측 과정을 이해하기 쉽고 성능도 뛰어남.
  • Impurity(불순도)는 결정 트리가 최적의 질문을 찾기 위한 기준. Scikit-learn에는 Gini Impurity와 Entropy Impurity가 있음.
    • 노드에서 데이터를 분할할 기준을 criterion이라고 하며, DecisionTreeClassifier 클래스의 criterion 매개변수의 기본 값이 "gini"임.
    • Gini Impurity(지니 불순도)는 "1 - (음성 클래스 비율^2 + 양성 클래스 비율^2)"로 계산하며, 0.5가 나올 경우 클래스의 비율이 불명확해 지므로 최악이 됨.
    • Entropy Impurity도 노드의 클래스 비율을 사용하지만 gini와 같이 제곱 형태가 아닌 밑이 2인 로그를 사용하여 곱함.
  • Information Gain(정보 이득)은 부모 노드와 자식 노드의 Impurity 차이. Decision Tree Classifier에서는 Information Gain이 최대화 되도록 학습함.
  • Decision Tree Classifier는 Decision Tree 분류 클래스로서, 제한 없이 성장하면 Trainset에 과적합되기 쉬우므로 자라날 수 있는 트리의 최대 깊이(max_depth)를 정하는 "가지치기"를 통해 Decision Tree의 성장을 제한함. Scikit-learn의 Decision Tree 알고리즘은 여러 가지 가지치기 매개변수를 제공함.
    • "from sklearn.tree import DecisionTreeClassifier" 라이브러리를 dt라는 변수로 선언하고, 매개변수로서 max_depth를 설정함.
    • max_depth는 트리가 성장할 최대 깊이 지정. 기본값은 "None"이며 리프 노드가 순수하거나 min_samples_split 보다 샘플 개수가 적을 때 까지 성장함.
    • criterion 매개변수는 Impurity를 지정하며 기본값은 지니 불순도를 의미하는 "gini"임. "entropy"를 선택하여 엔트로피 불순도를 사용할 수 도 있음.
    • splitter 매개변수는 노드를 분할하는 전략을 선택함. 기본값은 "best"로 Information Gain이 최대가 되도록 분할함. "Random"이면 임의의 노드를 분할.
    • min_samples_split는 노드를 나누기 위한 최소 샘플 개수임(기본값: 2).
    • max_features 매개변수는 최적의 분할을 위해 탐색할 특성의 개수를 지정함(기본값: None-모든 특성 사용)
  • plot_tree()는  Decision Tree 모델을 시각화 함.
    • 첫 번째 매개변수로 Decision Tree모델 객체를 전달.
    • max_depth 매개변수로 나타낼 트리의 깊이를 지정함(기본값: None - 모든 노드 출력)
    • feature_names 매개변수로 특성의 이름을 지정.
    • filled 매개변수를 True로 지정하면 타켓값에 따라 노드 안에 색을 채움.
  • Feature Importance(특성 중요도)는 결정 트리에 사용된 특성이 Impurity를 감소하는데 기여한 정도를 나타내는 값. Feature Importance를 계산할 수 있는 것이 Decision Tree의 또 다른 장점임.
  • Pandas > info(): DataFrame의 요약된 정보 출력. Index와 Column Type을 출력하고 null이 아닌 값의 개수, 메모리 사용량을 보여줌. Verbose 매개변수의 기본값(True)를 False로 바꾸면 각 열에 대한 정보를 출력하지 않음.
  • Pandas > describe(): DataFrame 열의 통계 값을 제공함. 수치형의 경우 최소, 최대, 평균 표준편차와 사분위값 등이 출력됨. 문자열 같은 객체 타입은 열은 자주 등장하는 값과 횟수 등이 출력됨. Percentiles 매개변수에서 백분위수를 지정함. 기본값은 0.25, 0.5, 0.75 임.

 

2) Cross Validation(교차 검증)과 Grid Search(그리드 서치)

  • Validation Set(검증 세트)는 하이퍼파라메터 튜닝을 위해 모델을 평가할 때, test set을 사용하지 않기 위해 훈련 세트에서 다시 떼어 낸 데이터 세트임.
  • Cross Validation(교차 검증): Train Set를 여러 폴드로 나눈 다음 한 폴드가 검증 세트 역할을 하고 나머지 폴드에서 모델을 훈련하는 것. Cross Validation은 이런 식으로 모든 폴드에 대해서 검증 점수를 얻어 평균하는 방법.
    • cross_validate(): 교차 검증을 수행하는 함수
    • 첫 번째 매개변수에 cross validation을 수행할 모델 객체를 전달함.
    • 두 번째와 세 번째 매개변수에 특성과 타켓 데이터를 전달함.
    • scoring 매개변수에 검증에 사용할 평가 지표를 지정할 수 있음(기본적으로 분류모델은 "accuracy", 회귀모델은 "r2")
    • cv 매개변수에 교차 검증 폴드 수나 스플리터 객체를 지정할 수 있음(기본값: 5).
    • 회귀일 때는 KFold클래스를 사용하고 분류일 때는 StratifiedKFold 클래스를 사용하여 5 Fold cross validation을 수행.
    • n_jobs 매개변수는 cross validation을 수행할 때 사용할 CPU 코어 수를 지정(기본값: 1, 모든 코어 사용: -1)
    • return_train_score 매개변수를 True로 지정하면 train set 점수도 반환(기본값: False)
  • Grid Search(그리드 서치): 하이퍼파라메터 탐색을 자동화 해주는 도구. 탐색할 매개변수를 나열하면 교차 검증을 수행하여 가장 좋은 검증 점수의 매개변수 조합을 선택함. 마지막으로 이 매개변수 조합으로 최종 모델을 훈련함.
    • GridSearchCV는 cross validation으로 하이퍼파라메터 탐색 수행
    • 최상의 모델을 찾은 후 trainset 전체를 사용해 최종 모델을 훈련
    • 첫 번째 매개변수로 grid search를 수행할 때 모델 객체를 전달
    • 두 번째 매개변수에는 탐색할 모델 매개변수 값을 전달
    • scoring, cv, n_jobs, return_train_score 매개변수는 cross_validate() 함수와 동일함.
  • Random Search(랜덤 서치): 연속된 매개변수 값을 탐색할 때 유용함. 탐색할 값을 직접 나열하는 것이 아닌 탐색값을 샘플링할 수 있는 확률 분포 객체를 전달함. 지정된 횟수만큼 샘플링 하여 cross validation을 수행하기 때문에 시스템 자원이 허락하는 만큼 탐색량을 조절할 수 있음. 
    • RandomizedSearchCV는 cross validation으로 랜덤한 하이퍼파라메터 탐색을 수행함.
    • 최상의 모델을 찾은 후 train set 전체를 사용해 최종 모델을 훈련함.
    • 첫 번째 매개변수로 grid search를 수행할 모델 객체를 전달함.
    • 두 번째 매개변수에는 탐색할 모델 매개변수와 확률 분포 객체를 전달함.
    • scoring, cv, n_jobs, return_train_score 매개변수는 cross_validate() 함수와 동일함.

 

3) 트리의 앙상블

  • Ensemble Learning(앙상블 학습): 더 좋은 예측결과를 만들기 위해 여러 개의 모델을 훈련하는 머신러닝 알고리즘
  • Random Forest(랜덤 포레스트): 대표적인 결정 트리 기반의 앙상블 학습 방법. 부트스트랩 샘플을 사용하고 랜덤하게 일부 특성을 선택하여 트리를 만듦.
    • RandomForestClassifier는 Random Forest분류 클래스임.
    • n_estimator 매개변수는 emsemble을 구성할 트리의 개수를 지정(기본값: 100)
    • criterion매개변수는 impurity를 지정하며 기본값은 "gini"이고 "entropy"를 선택하여 엔트로피 불순도를 사용할 수 있음.
    • max_depth는 트리가 성장할 때 최대 깊이를 지정(기본값: None)
    • min_sample_split: 노드를 나누기 위한 최소 샘플 개수(기본값: 2)
    • max_features 매개변수: 최적의 분할을 위해 탐색할 특성의 개수(기본값: auto - 특성 개수의 제곱근)
  • Extra Trees(엑스트라 트리): Random Forest와 동일하게 Decision Tree를 사용하여 Emsemble 모델을 만들지만 부트스트랩 샘플을 사용하지 않으며, 랜덤하게 노드를 분할해 과대적합을 감소시킴.
    • ExtraTreesClassifier: Extra Tree 분류 클래스
    • bootstrap: 부트스트랩 사용여부(기본값: False)
      • Bootstrap sample이란 random식으로 뽑는 방법의 sample을 말하며, 가령 100개 샘플 중 10개를 뽑을 때 1개를 뽑고 다시 집어 넣은 다음 다시 1개를 뽑는 방식에서의 sample을 말함.
      • 즉, data set에서 중복을 허용하여 data를 sampling하는 방식임.
      • 일반적으로 random forest와 extra trees 모델은 train set에서 중복을 허용하여 bootstrap sample을 만들어 decision tree를 training함.
    • oob_score: OOB sample 사용하여 훈련한 모델을 평가할 지 지정(기본값: False)
      • Random Forest와 Extra Tree에서 boostrap sample을 만들어 decision tree를 훈련할 때, bootstrap sample에 포함되지 않고 남는 sample을 OOB라고 함. OOB를 통해 bootstrap sample로 train한 decision tree를 평가함. 
    • n_jobs: 병렬 실행에 사용할 CPU 코어 수를 지정(기본값: 1, -1은 전체 코어 사용)
  • Gradient Boosting(GB: 그래디언트 부스팅): Random Forest나 Extra Tree와 달리 Decision Tree를 연속적으로 추가하여 손실 함수를 최소화 하는 앙상블 방법 (훈련속도가 느려지지만 더 좋은 성능 기대). 깊이가 얕은 Decision Tree를 사용하여 이전 트리의 오차를 보완하는 방식.
    • GradientBoostingClassifier: Graident Boosting 분류 클래스
    • loss: 손실함수. 기본값 "deviance"
    • learning_rate: 트리가 앙상블에 기여하는 정도(기본값: 0.1)
    • n_estimators: 부스팅 단계를 수행하는 트리의 개수(기본값: 100)
    • subsample: 사용할 train set sample비율 지정(기본값: 1)
    • max_depth: 개별 회귀 트리 최대 깊이 (기본값: 3)
  • Histogram based Gradient Boosting: Gradient Boosting 속도를 개선한 방법이며, 안정적인 결과와 높은 성능을 갖음. 정형 데이터를 다루는 머신러닝 알고리즘 중 가장 인기가 많음.
    • HistGradientBoostingClassifier: 히스토리 기반 gradient boosting 분류 클래스
    • learning_rate 매개변수: 학습률 또는 감쇠율(기본값: 0.1. 1인 경우 감쇠가 전혀 없음)
    • max_iter: 부스팅 단계를 수행하는 트리의 개수(기본값: 100). n_estimators 대신 활용. 성능을 높일 때 변화를 줌.
    • max_bins: 입력 데이터를 나눌 구간의 개수(기본값: 255).

 

 

2. Cross Validation 설명

 

  • 원칙적으로 validation set를 만들면 그 만큼 train set이 줄기 때문에 많은 데이터를 training에 활용할 수 없습니다. Training score를 높이기 위해 train set 수가 많으면 좋겠지만, 그렇다고 validation set 수를 줄일 수는 없습니다(이 경우 validation test score가 불안정해 집니다). 
  • 이를 위해 Cross Validation을 이용하는 것이며, 좀 더 안정적인 validation score를 얻고 training에 더 많은 데이터를 사용할 수 있습니다.
  • 아래 그림은 3-Fold Cross Validation 을 설명한 그림으로, K-Fold Cross Validation(K=3)에서 train set을 3 부분으로 나누어 수행한 경우입니다.

 

Cross Validation

 

3. Ensemble Coding

 

  • 앙상블 모델 중 Ramdom Forest 을 시험해 보기 위해여 data를 준비합니다.
  • Input data와 Target data를 선언하되, input은 2차원, target은 1차원 numpy array로 만듭니다.
    • Input이 2차원인 이유는 회귀나 분류 연산을 수행할 시 역행렬을 취하는 과정에서 차원이 하나 더 늘어나기 때문입니다. 즉, 2차원 data를 train data로 쓰면 역행렬을 써서 회귀선의 기울기나 절편을 구하기 쉽기 때문입니다. 또한 scikit learn의 target은 1차원으로 설정하기 때문입니다.
  • sklearn.model_selection의 train_test_split기능을 통해 train data와 test data를 구분합니다.

 

Data Preparation for Random Forest

 

  • 이제 ensemble 모델 중 Random Forest를 시험해 보겠습니다. Random Forest는 분류를 하는 것과 회귀해석을 하는 모델이 있는데, 지금은 분류 모델을 시험해 보겠습니다.
  • "rf"라는 변수에 모델을 집어 넣습니다. rf = RandomForestClassifier로 선언하고, 매개변수를 설정하여 연산에 활용할 cpu 수(n_jobs)와 데이터를 임의로 섞도록 합니다.
  • 모델은 cross_validate(교차 검증)을 통해 검증하도록 scores라는 변수를 선언하며, 이로서 train 혹은 validate data 수를 손실하지 않고 효율적인 검증을 할 수 있게 합니다. cross_validata의 매개변수에는 적용 모델, input data, target data를 필수적으로 포함시킵니다.
    • return_train_score를 True로 지정하여, train data에 대한 검증 결과도 얻을 수 있습니다.
    • cross_validate는 Fold(폴드) 수 만큼 시도한 검증 결과를 평균내는 것이므로, 최종적인 모델 검증 결과는 numpy의 평균 함수를 통해 얻습니다.
  • Input data의 어떠한 feature(특성)이 결과에 중요한 영향을 미쳤는 지 알기 위해서 rf.feature_importances_로 확인합니다.
  • Boostrap의 훈련 결과를 확인하기 위해서 oob_score를 True로 지정한 후 평가할 수도 있습니다. rf.oob_socre_를 입력하면 됩니다.

 

Random Forest Model Training & Feature Importance

 

  • Extras Trees는 강력한 앙상블 분류 모델 중의 하나입니다.
  • Extra Trees 모델도 역시 cross_validate로 검증할 수 있고 적용할 수 있는 매개변수는 Random Forest와 동일합니다.
  • Input 의 특성 중 가장 중요한 영향을 미치는 인자를 확인하는 feature importance도 확인할 수 있습니다. 명령어는  et.feature_importances_ 입니다.

 

Extra Trees Model Training & Feature Importance

 

  • Gradient Boost 역시 좋은 효과를 보여주는 분류 모델입니다.
  • Gradient Boost는 설정할 수 있는 매개변수 중, n_estimator가 있는데 ensemble의 구성할 수 있는 트리의 수 입니다.
  • Learning_rate(학습률)을 낮게 설정하여 연산의 발산(divergence)를  막을 수 있습니다.
  • 이 모델 역시 cross_validate를 통해 교차검증을 할 수 있고, feature_importances_ 또한 확인할 수 있습니다.

 

Gradient Boosting Model Training & Feature Importance

 

  • HistGradientBooostingClassifier는 GradientBoostingClassifier 모델이 갖고 있는 한계(연산 속도)를 개선한 모델이며, 안정적인 결과와 높은 성능을 보여줍니다.
  • 이 모델 역시 cross_validate으로 train 및 validate data 손실 없이 검증이 가능합니다.
  • 한편, HistGradientBoostingClassifier는 input data 특성의 중요성을 판단할 때, permutation_imporance라는 기능을 활용합니다.
    • Permutation의 가장 큰 장점은 모델을 다시 학습할 필요가 없다는 점이고, 반면 feature를 무작위로 섞기 때문에 실행마다 feature importance가 달라질 수 있다는 단점이 있습니다.
    • 매개변수로서 모델명, input 및 target data, 또한 몇 번 shuffle할 지 결정하는 n_repeats등 있습니다.

 

Histogram Boosting  Model Training & Permutation Importance - 1
Histogram Boosting  Model Training & Permutation Importance - 2

 

  • 가장 많이 들어본 앙상블 분류 모델은 xgboost일 것입니다.
  • 매개변수로서 tree_method를 설정할 ruddn, histgram based gradient boosting 알고리즘을 적용할 수 있습니다.
  • cross_validate를 통해 효율적인 모델 검증도 가능합니다.

 

  • 또 많이 사용하는 histogram based gradient boosting모델은 LightGBM입니다. 
  • 역시 cross_validate를 적용할 수 있습니다.

 

XGBoost / LightGBM  Model Training