ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 분류 - 4
    Python Machine Learning/분류 2020. 8. 11. 13:35

    랜덤 포레스트

    - 배깅의 대표적인 알고리즘으로 배깅은 같은 알고리즘으로 여러 개의 분류기를 만들어서 보팅으로 최종 결정하는 알고리즘으로 기반 알고리즘은 결정 트리입니다.

    - 즉 랜덤 포레스트는 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅을 통해 예측 결정을 하게 됩니다.

    - 개별적인 분류기의 기반 알고리즘은 결정트리이지만 학습하는 데이터 세트는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 세트입니다. 이렇게 데이터 세트를 중첩되게 분리하는 것을 부트스트래핑 분할 방식이라고 합니다.

     

    랜덤 포레스트 하이퍼 파라미터

    1. n_estimators : 랜덤 포레스트에서 결정 트리의 개수를 지정하며 디폴트는 10입니다. 늘릴수록 학습 수행 시간이 오래 걸리는 단점이 존재합니다.

    2. max_features : 결정트리에 사용된 max_features파라미터와 같습니다. 랜덤 포레스트에서는 'None'이 아니라 'auto', 즉 'sqrt'와 같습니다.

    3. 결정트리에서 과적합을 개선하기 위해 사용되는 max_depth, min_samples_leaf는 랜덤 포레스트에서도 동일합니다.

     

    부스트 

    - 부스팅 알고리즘은 여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식입니다.

    - 대표적으로는 그래디언트 부스트, AdaBoost가 있습니다.

     

    Adaboost

    - 첫 번째 약한 학습기로 분류한 것에서 잘못 분류된 오류 데이터에 대해서 가중치 값을 부여하며, 에이다 부스트는 이렇게 약한 학습기가 순차적으로 오류 값에 대해 가중치를 부여한 예측 결정 기준을 모두 결합해 예측을 수행합니다.

     

    그래디언트 부스트

    - Adaboost와 유사하나, 가중치 업데이트를 경사 하강법을 이용하는 것이 큰 차이입니다. 오류식은 y- f(x)이며 오류식을

    최소화하는 방향성으로 반복적으로 가중치 값을 업데이트하는 것이 경사 하강법입니다. ( y : 분류의 실제 결과값, x : 피처, f( ) :  피처에 기반한 예측 함수 ) 

    - 사이킷런에서는 그래디언트 부스트 기반의 분류를 위해서 GradientBoostingClassifier 클래스를 제공합니다.

    - 다음 예제는 그래디언트 부스트를 이용해 사용자 행동 데이터 세트를 예측 분류하는 예제입니다.

     

    ==> 높은 정확도가 나왔지만 3분이 넘는 수행 시간은 그래디언트 부스트가 극복해야 할 중요한 과제입니다. 

     

    GBM 하이퍼 파라미터 

    1. loss : 경사 하강법에서 사용할 비용 함수를 지정합니다. 기본값은 'deviance'.

    2. learning_rate : GBM이 학습을 진행할 때마다 적용하는 학습률입니다. Weak learner가 순차적으로 오류 값을 보정해 나가는데 적용하는 계수이며 기본값은 0.1이며 0~1 사이의 값을 지정할 수 있습니다.

    3. n_estimators : weak learner의 개수입니다. 기본값은 100이며 개수가 많을 수록 예측 성능이 좋아질 수 있지만 수행 시간이 오래 걸립니다.

    4. subsample :  weak learner가 학습에 사용하는 데이터의 샘플링 비율입니다. 기본값은 1이며 이는 전체 학습 데이터를 기반으로 학습한다는 의미입니다.

     

     

    XGBoost( eXtra Gradient Boost )

    - GBM에 기반하고 있으며, 단점인 느린 수행 시간 및 과적합 등의 문제를 해결했으며 특히 병렬 학습이 가능해 기존 GBM보다 빠른 학습이 가능합니다.

     

    XGBoost 특징

    - 1. 뛰어난 예측 성능

    - 2. GBM 대비 빠른 수행 시간

    - 3. 과적합 규제

    - 4. 나무 가지치기

    - 5. 결손값 자체 처리 

    - 6. 자체 내장된 교차 검증 -> 지정된 반복 횟수가 아니라 교차 검증을 통해 평가 데이터 세트의 평가 값이 최적화 되면

                                           반복을 중간에 멈출 수 있는 조기 중단 기능이 있습니다.

     

    - XGBoost의 파이썬 패키지명은 'xgboost'이며 파이썬 래퍼 XGBoost모듈과, 사이킷런 래퍼 XGBoost 모듈이 있습니다.

     

    XGBoost 하이퍼 파라미터

    1. 일반 파라이터

    2. 부스터 파라미터 : 최적화, 부스팅, regularization등 관련 파라미터를 지칭합니다. ( 하이퍼 파라미터는 여기에 속함 )

    3. 학습 태스크 파라미터 : 학습 수행 시의 객체 함수ㅡ 평가를 위한 지표 등을 설정하는 파라미터입니다.

     

    부스터 파라미터

    1. eta [ default = 0.3, alias: learning_rate ] : GBM의 학습률( learning rate )과 같은 파라미터이며

      파이썬 래퍼 기반 xgboost를 이용할 경우 디폴트 0.3, 사이킷런 래퍼 기반 xgboost를 이용할 경우 디폴트 0.1.

    2. num_boost_rounds : GBM의 n_estimators와 같은 파라미터 

    3. min_child_weight : GBM의 min_child_leaf와 유사하며 과적합을 조절하기 위해 사용됩니다.

    4. gamma [ default=0, alias: min_split_loss ] : 트리의 리프 노드를 나눌지 결정하는 값으로 해당 값보다 큰 손실이 갑소된 경우에 리프 노드를 분리하며, 값이 클수록 과적합 감소 효과가 있습니다.

    5. max_depth : 트리 기반 알고리즘의 max_depth와 같습니다.

    6. sub_sample [ default = 1 ] : GBM의 subsample과 동일하며 과적합되는 것을 제어하기 위해 데이터를 샘플링하는 비율을 지정합니다.

    7. colsample_bytree[ default=1 ] : GBM의 max_features와 유사하며 트리 생성에 필요한 피처를 임의로 샘플링 하는데 사용하며 많은 피처가 있는 경우 과적합을 조정하는데 적용합니다.

    8. lambda [default=1, alias: reg_lambda] : L2 Regularization적용 값으로 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있습니다.

    9. alpha [default=1, alias: reg_alpha] : L1 Regularization적용 값으로 피처 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있습니다.

    10. scale_pos_weight [ default=1 ]: 한쪽으로 치우친 비대칭 클래스 데이터 세트의 균형의 유지를 위한 파라미터입니다.

     

    과적합 해결 고려사항

    1. eta를 낮춥니다.

    2. max_depth를 낮춥니다.

    3. min_child_weight값을 높입니다.

    4. gamma 값을 높입니다.

    5. subsample, colsample_bytree를 조정합니다.

     

    파이썬 래퍼 XGBoost 적용

    다음 예제는 파이썬 래퍼 XGBoost 적용한 예제로 위스콘신 유방암 예측 데이터 세트입니다.

    데이터 세트 로딩

     

    종양이 악성이면 0 , 양성이면 1

     

    전체 데이터 중 80%는 학습용, 20%는 테스트용으로 분할

     

    --> 파이썬 래퍼 XGBoost는 학습용과 테스트용 데이터 세트를 위해 DMatrix를 생성합니다.     주요 입력 파라미터는 data : 피처 데이터 세트, label : 분류의 경우에는 레이블 데이터 세트, 회귀의 경우는 종속값 데이터 세트( 숫자형 )입니다.

     

    학습을 수행하기 전 XGBoost의 하이퍼 파라미터 설정. 주로 딕셔너리 형태로 입력

     

    - max depth : 트리 최대 깊이.

    - eta : 학습률.

    - 예제 데이터가 이진 분류이므로 목적함수( 예측결정함수 )는 이진 로지스틱.

    - 오류 함수의 평가 성능 지표는 logloss.

    - num_rounds( 부스팅 반복 횟수)는 400회.

    - 조기 중단할 수 있는 최소 반복 횟수는 100회.

     

    주어진 하이퍼 파라미터와 early stopping 파라미터를 train( ) 함수의 파라미터로 전달하고 학습. 

     

    - 조기 중단을 수행하려면 evals 파라미터에 eval 데이터 세트를 명기시켜줘야 합니다.

    train( )으로 학습을 수행하면 반복 시 train-error와 eval-logloss가 지속적으로 감소

     

    - 파이썬 래퍼 XGBoost는 train( ) 함수를 호출해 학습을 수행하고 완료된 모델 객체를 반환하며, 테스트 데이터 세트에 예측을 수행하기 위해서 predict( ) 메서드를 이용합니다. XGBoost의 predict( ) 함수는 예측 결과를 추정할 수 있는 확률 값을 반환합니다.

     

    예측 확률이 0.5 보다 크면 1 , 그렇지 않으면 0 으로 예측값 결정하여 List 객체인 preds에 저장

     

    get_clf_eval( )을 통해 예측 평가

     

    xgboost 패키지는 plot_importance( )를 이용해 바로 피처 중요도를 시각화할 수 있으며, 호출 시 파라미터로 앞에서 학습이 완료된 모델 객체 및 맷플롯립의 ax 객체를 입력해야 합니다.

     

    - 내장된 plot_importance( )이용 시 유의 할 점은 xgboost 넘파이 기반의 피처 데이터로 학습 시 피처명을 알 수 없어

    피처 순서별로 f자 뒤에 순서를 붙여서 x 축에 나열됩니다.

     

     

    사이킷런 래퍼 XGBoost

    - 사이킷런의 기본 Estimator를 그래도 상속했기에 fit( )과 predict( )만으로 학습과 예측이 가능하며, 사이킷런을 위한

      래퍼 XGBoost는 분류를 위한 래퍼 클래스인 XGBClassifier, 회귀를 위한 래퍼 클래스인 XGBRegressor 입니다.

    - n_estimators와 num_boost_round 하이퍼 파라미터는 동일한 파라미터이지만 XGBClassifier 같은 사이킷런 래퍼

      XGBoost 클래스에서는 n_estimators를 적용합니다.

    - XGBClassifier는 기존 사이킷런에서 사용하는 하이퍼 파라미터와 호환성을 유지하기 위해 기존 xgboost 모듈에서 사용

      하는 네이티브 하이퍼 파라미터를 변경했습니다.

      1. eta -> learning_rate

      2. sub_sample -> sumsample

      3. lambda -> reg_lambda

      4. alpha -> reg_alpha

     

    사이킷런 래퍼 클래스 XGBClassifier 적용

    다음 예제는 사이킷런 래퍼 클래스 XGBClassifier 적용한 예제로 위스콘신 유방암 예측 데이터 세트입니다.

     

    사이킷런 래퍼 XGBoost에서도 조기 중단을 수행할 수 있으며 fit( )에 입력하면 되며 다음과 같은 인자가 포함되어야 합니다.

    1. 반복 횟수를 정의하는 early_stopping_rounds

    2. 조기 중단을 위한 평가 지표인 eval_metric

    3. 성능 평가를 수행할 데이터 세트인 eval_set ( 테스트 데이어 세트여야 함 )

    하이퍼 파라미터 설정, 학습 데이터는 앞 예제에서 분리한 데이터 적용
    211번에서 311번까지 early_stopping_rounds = 100으로 지정된 100번의 반복 동안 성능 평가 지수가 향상되지 않았기 때문에 더 이상 반복하지 않고 멈춤.
    조기 중단으로 학습된 XGBClassifier의 예측 성능이며, 테스트 실제 레이블 값, 예측 레이블을 인자로 입력해 예측 성능 평가. 

    ==> 조기 중단값을 너무 급격하게 줄이면 예측 성능이 저하될 우려가 있습니다.

     

    피처의 중요도 시각화

    'Python Machine Learning > 분류' 카테고리의 다른 글

    분류 - 6  (0) 2020.08.12
    분류 - 5  (0) 2020.08.12
    분류 - 3  (0) 2020.08.11
    분류 - 2  (0) 2020.08.10
    분류( Classification ) - 1  (0) 2020.08.10
Designed by Tistory.