상세 컨텐츠

본문 제목

[Practical Statistics for Data Scientists] B팀: Bagging and the Random Forest

본문

앙상블 모델은 단일 모델을 사용하는 것보다 더 나은 성능을 보인다. 앙상블의 간단한 버전은 다음과 같은데,

  1. 데이터에 대해 예측 모델을 만들고 그 결과를 기록한다.
  2. 같은 데이터에 대해 여러 모델을 만들고 결과를 기록한다.
  3. 각 record에 대해 예측된 결과들의 평균을 구한다.

즉, 앙상블은 여러 모델의 집합을 이용해서 하나의 예측을 이끌어내는 방식이다. 

하지만, 우리가 자주 사용하는 앙상블 기법은 bagging과 boosting이라는 기법이며, 그 모델로는 Random forest와 Boosting tree가 있다. 

 

Bagging

bagging(boostrap aggregating)의 핵심은 복원추출이라고 할 수 있다.(이것만 빼면 기본 앙상블과 동일하다)

  1. 만들 모델 개수 M과 모델을 만드는 데 사용할 레코드의 개수 n(n < N)의 값을 초기화한다. 반복 변수 m = 1
  2. 훈련 데이터로부터 복원추출 방법으로 n개의 부분 데이터 X,Y를 부트스트랩 재표본 추출한다.
  3. 의사결정 규칙을 얻기 위해 X, Y를 이용해 모델을 학습한다
  4. 모델 개수를 늘인다(m < M이면 다시 부트스트랩 반복)

한마디로 원본 데이터에서 랜덤으로 데이터를 추출해 모델을 여러개 돌려본 후, 합쳐서 결과를 내는 방식이다.

Random Forest

random forest는 baggin기법을 적용한 모델이다.

record를 표본추출할 때, 변수 역시 샘플링을 돌린다. 랜덤 포레스트에서는 일반적인 트리 모델과 달리 알고리즘의 각 단계마다, 고를 수 있는 변수가 랜덤하게 결정된 전체 변수들의 부분집합에 한정된다. 즉, 랜덤포레스트에서는 배깅과 분할을 위한 변수의 부트스트랩 샘플링이 추가된다.

그렇다면 각 단계마다 몇 개 정도의 변수를 샘플링 하는 것이 좋은가? 보통은 전체 변수가 p개일 때 루트 p개 정도를 선택한다. 파이썬의 경우 sklearn에서 RandomForestClassifier 매서드를 활용한다. 

기본적으로 500개의 트리를 학습을 통해 생성한다(n_estimators = 500) 여기서는 변수가 2개이기 때문에, 부트스트랩 샘플의 크기가 1인 것을 확인할 수 있다. 

 

랜덤 포레스트모델의 장점은 feature, record수가 많은 데이터에서 발휘된다. 특히나, 다수의 예측 변수 중 어떠한 변수가 중요한 지를 자동으로 결정하는 기능이 있다. 

파이썬에서 다음과 같이 RandomForestClassifier는 학습 중 피쳐 중요도에 대한 정보를 수집하고, feature_importances_를 통해 이를 보여줄 수 있다.

df = pd.DataFrame({
'feature': X.columns,
'Accuracy decrease': [np.mean(scores[column]) for column in X.columns], 'Gini decrease': rf_all.feature_importances_,
    })
    df = df.sort_values('Accuracy decrease')
    fig, axes = plt.subplots(ncols=2, figsize=(8, 4.5))
    ax = df.plot(kind='barh', x='feature', y='Accuracy decrease',
                 legend=False, ax=axes[0])
    ax.set_ylabel('')
    ax = df.plot(kind='barh', x='feature', y='Gini decrease',
                 legend=False, ax=axes[1])
    ax.set_ylabel('')
    ax.get_yaxis().set_visible(False)

이 때 변수 중요도를 측정하는 데에는 두 가지 방법이 있다.

  1. 변수 값이 랜덤하게 있다면, 모델 정확도가 감소하는 정도를 측정한다.(해당 변수가 예측에 미치는 모든 영향력을 제거)
  2. 특정 변수를 기준으로 분할이 일어난 모든 노드에서 불순도 점수의 평균 감소량을 측정한다. 이는, 해당 변수를 포함하는 것이 노드의 순도를 얼마나 개선하는지를 나타낸다.

 

시각화 한 변수 중요도

해당 그래프는 각각 accuracy와 지니 계수를 이용해 변수 중요도를 보여준다. 

관련글 더보기

댓글 영역