본문 바로가기
기계학습(ML)/Tree based Model

n222 RandomForest/ OrdinalEncoder

by kiimy 2021. 6. 19.
728x90
728x90
  • 랜덤포레스트 모델을 이해하고 문제에 적용할 수 있습니다.
  • 순서형인코딩(Ordinal encoding) 과 원핫인코딩을 구분하여 사용할 수 있습니다.
  • 범주형 변수의 인코딩 방법이 트리모델과 선형회귀 모델에 주는 영향 이해합니다.

* decision Trees / RandomForest 차이점

결정트리모델은 한 개의 트리만 사용하기 때문에 한 노드에서 생긴 에러가 하부 노드에서도

계속 영향을 주고 트리의 깊이에 따라 과적합되는 경향

==> 앙상블모델인 랜덤포레스트를 사용하면 됨

(= 과적합을 막아주고 복원추출과정을 시행하여 서로다른 학습시행 == 최종결과(다수결 or 평균)에 영향 X )

  1. 랜덤포레스트에서 학습되는 트리들은 배깅을 통해 만들어집니다.(bootstrap = true) 이때 각 기본트리에 사용되는 데이터가 랜덤으로 선택됩니다.
  2. 각각 트리는 무작위로 선택된 특성들을 가지고 분기를 수행합니다.(max_features = auto.)

 

* 결정트리와 randomforest의 기본트리의 차이점

==> 똑같은 depth에서 적합의 차이가 있고 / Randomforest = n_estimater 조정

  • 결정트리에서 분할을 위한 특성을 선택할 때, 모든 특성(n개)을 고려하여 최적의 특성을 고르고 분할하였습니다.
  • ==> 특성중요도에 따라(?) 질문을 먼저 분류하여 예측(= 불순도를 크게 감소하는데 많이 사용된 특성 )노드가 중요할 수록 불순도가 크게 감소
  • 하지만 랜덤포레스트에서는 특성 n개 중 일부분 k개의 특성을 선택(sampling) 하고 이 k개에서 최적의 특성을 찾아내어 분할합니다. 이때 k개는 일반적으로  를 사용합니다.
  • ==> 질문을 여러가지로 나눠서 좋은 결과의 총합을 (평균, 다수결)내어 예측( Aggregation )
  • 부트스트랩세트로 만들어진 기본모델들을 합치는 과정을 Aggregation

 

* 앙상블(Ensemble) 방법

한 종류의 데이터로 여러 머신러닝 학습모델(weak base learner, 기본모델)을 만들어

그 모델들의 예측결과를 다수결이나 평균을 내어 예측하는 방법

# 평균

  • 여러개의 추청값을 독립적으로 구한 뒤 평균을 취함
  • 결합 추정값은 분산이 줄어들기 때문에 단일 추정값보다 좋은 성능을 보임

# 부스팅

  • 순차적 model 생성
  • 결합된 모델의 편향을 감소시키기 위해 노력(?) ==  오차를 줄여나감
  • 목표= 여러개의 약한 모델들을 결합해 하나의 강력한 앙상블 모델 구축

* RandomForest

결정트리를 기본모델로 사용하는 앙상블 방법

다르게 샘플링된 데이터로 과적합 Tree를 만들고 그 결과들을 평균내서 사용하는 모델

# 최종 : 기본모델 만드는 방법( Bagging = bootstrap aggregating)

==> 원래 훈련 데이터셋의 일부를 사용해 여러모델을 훈련

       각각의 결과물을 결합해 최종결과 생성

1. 부트스트랩(Bootstrap) 샘플링

앙상블에 사용하는 작은 모델들은 bootstraping이라는 샘플링 과정으로 얻은 bootstrap set를 사용해 학습

= 복원추출(샘플을 뽑아 값을 기록하고 제자리에 돌려놓는 것) == 최종결과에 영향 X

표본의 63.2%에 해당하는 샘플 추출 / 추출되지않은 out-of-bag 샘플 36.8%

 

#oob_score로 모델 검증할 수 있지만 거의 안쓰임

 

2. bootstrap으로 만들어진 기본모델 Aggregation 합치기 ( bagging )

  • 회귀문제일 경우 기본모델 결과들의 평균으로 결과를 내고,
  • 분류문제일 경우 다수결로 가장 많은 모델들이 선택한 범주로 예측합니다.

*Ordinal Encoding

범주에 숫자를 인코딩 -> a b c -> 1, 2, 3 순서형으로 ( Tree에선 순서 상관 X )

(=범주들 간에 분명한 순위가 있을때 그 연관성에 맞게 숫자를 정해주는 것이좋음

ex) 영화 평점과 같은 특성은 순서형 인코딩

순서형 자료에 매우 적합한 인코딩 방식이다. 레이블 인코딩과 비슷할 수 있지만 레이블 인코딩은 인코딩을 하기 위해 들어오는 범주형 자료값들이 순서형 자료인지 아닌지 고려하지 않고 단순히 연속적인 숫자를 부여한다. 하지만 Ordinal 인코딩은 해당사항을 고려하게 된다.

 

그리고 데이터의 범주형 변수중 순서뿐만 아니라 알파벳 순서까지도 고려할 수 있다. Pandas를 사용하여 인코딩을 해줄 수 있긴 하지만 사용자가 주어진 범주형 변수를 보고 직접 변수 값들 간의 순서(order)를 dictionary 형태로 정의해주어야 한다. 그래서 직관적이긴 하지만 추가적인 코딩을 해야하는 수고가 필요하다.

==> 정확한 범주의 순위를 알고 있다면 mapping 파라미터 사용해서 지정해 줄 수 있다. 

 

사실 순서형 인코딩은 범주들 간에 분명한 순위가 있을때 그 연관성에 맞게 숫자를 정해주는 것이 좋다.

예를들어 영화 평점과 같은 특성은 분명히 순서형 인코딩이 적절

 

 

# Tree 구조에서 OneHotEncoding의 문제

순위, 연속성 x 다른의미로의 수치값으로 변환 해주는 것

= 중요한 특성이 상위노드에서 먼저 분할되는데

>> (high cardinality)특성은 OneHot으로 인해 상위노드에 선택기회가 적어짐

==> 인코딩에 포함되지 않은 기능의 중요성 순서를 모호하게하여 모델을 비효율적으로 만듬.

So, OneHot 영향 안받는 수치형 특성이 상위노드를 차지할 기회가 높고, 전체적인 성능 떨어질 수 있음

*특성 중요도 ( Feature importances )

중요도 점수는 분할을 위해 피처가 선택되는 빈도와 선택의 결과로 얼마나 많은 순도를 얻었는지 측정 한 것

 

학습 후에 특성들의 중요도 정보(Gini importance)를 기본으로 제공합니다. 중요도는 노드들의 지니불순도(Gini impurity)를 가지고 계산하는데 노드가 중요할 수록 불순도가 크게 감소한다는 사실을 이용

노드는 한 특성의 값을 기준으로 분리가 되기 때문에 불순도를 크게 감소하는데 많이 사용된 특성이 중요도가 올라갈 것입니다

==> 순열중요도와의 차이

columns ==> get_feature_names() / X_train.columns 

# 특성 중요도(onehot)
rf = pipe.named_steps['randomforestclassifier']
colnames = pipe.named_steps['onehotencoder'].get_feature_names()
importances = pd.Series(rf.feature_importances_, colnames)

# 특성 중요도(ordinal)
rf_ord = pipe_ord.named_steps['randomforestclassifier']
importances_ord = pd.Series(rf_ord.feature_importances_, X_train.columns)

 

728x90

댓글