GIL's LAB

랜덤 포레스트(이진 분류)의 하이퍼 파라미터 튜닝 본문

데이터사이언스/머신러닝

랜덤 포레스트(이진 분류)의 하이퍼 파라미터 튜닝

GIL~ 2022. 7. 25. 10:53

이번 포스팅에서는 이진 분류를 위한 랜덤포레스트의 하이퍼 파라미터를 튜닝하는 방법에 대해 알아보겠습니다.

랜덤포레스트는 sklearn.ensemble.RandomForestClassifier를 이용해서 구현하겠습니다.

 

하이퍼 파라미터

sklearn.ensemble.RandomForestClassifier의 주요 하이퍼 파라미터(함수 인자)는 다음과 같습니다.

하이퍼 파라미터에 대한 설명은 scikit learn의 공식 문서를 참고해서 작성했습니다.

  • n_estimators: 랜덤포레스트를 구성하는 결정나무의 개수로 기본값은 100입니다. 
  • criterion: 결정 나무의 노드를 분지할 때 사용하는 불순도 측정 방식으로, 'gini', 'entropy' 중 하나로 입력합니다. 'gini'는 지니 불순도(Gini impurity)를 'entropy'는 엔트로피(entropy)를 나타냅니다. 
  • max_depth: 결정 나무의 최대 깊이입니다. 만약 None으로 입력하며 잎 노드가 완전 순수해지거나 모든 잎 노드에 min_samples_split_samples보다 적은 수의 샘플을 포함할 때까지 결정 나무를 학습시킵니다.
  • max_features: 결정 나무를 분지할 때 고려하는 특징 수(int) 혹은 비율(float)입니다. 기본값은 sqrt로 특징 개수에 루트를 씌운 값입니다. 
  • max_samples: 각 결정 나무를 학습하는 데 사용할 샘플의 개수(int) 혹은 비율(float)입니다. 

 

실험 데이터

실험에 사용할 데이터는 KEEL에서 수집했으며, 수집한 데이터 목록은 다음과 같습니다. 

  • banana
  • bands
  • bupa
  • chess
  • crx
  • ecoli-0_vs_1
  • glass0
  • glass1
  • heart
  • housevotes
  • ionosphere
  • iris0
  • magic
  • mammographic
  • monk-2
  • mushroom
  • pima
  • ring
  • saheart
  • sonar
  • spambase
  • tic-tac-toe
  • titanic
  • twonorm
  • wdbc
  • wisconsin

선정한 26개 데이터는 이진 분류 데이터로 소수 클래스의 비율이 30%를 넘는 데이터입니다. 

 

실험 방법

각 데이터마다 최대 5천번의 랜덤 샘플링을 수행해서 하이퍼 파라미터에 따른 F1-score를 측정합니다.

각 하이퍼 파라미터를 샘플링하는 확률 분포는 다음과 같이 정의했습니다.

  • n_estimator: 로그유니폼(하한: 10, 상한: 1000, 샘플링 후 int로 변환)
  • criterion: gini와 entropy를 각 50%의 확률로 선택
  • max_depth: 로그유니폼(하한: 3, 상한: 50, 샘플링 후 int로 변환)
  • max_features: 유니폼(하한: 0.2, 상한: 1.0)
  • max_samples: 유니폼(하한: 0.2, 상한: 1.0)

이렇게 측정한 데이터를 바탕으로 주요 하이퍼 파라미터와 그 범위를 식별하겠습니다.

 

실험 결과

데이터에 따른 성능 범위 

magic 데이터의 경우에는 범위가 0으로 하이퍼 파라미터에 따른 성능 차이가 없습니다.

그에 반해 mammographic 데이터의 경우에는 범위가 0.4로 하이퍼 파라미터에 따른 성능 차이가 매우 큽니다.

따라서 데이터에 따라 랜덤 포레스트 모델의 하이퍼 파라미터를 튜닝하는게 중요할 수도, 중요하지 않을 수도 있습니다.

 

 

n_estimators에 따른 성능 분포

데이터별로 n_estimators에 따른 F1 score의 평균을 구해보겠습니다.

다른 인자의 영향을 최소화하기 위해 n_estimators를 [10, 20), [20, 30)과 같이 구간화하고 각 구간에 속하는 평균 F1 score를 사용하겠습니다. 또한, 그래프가 보기 지저분해서 이동평균(m = 3)을 사용해서 그래프를 그렸습니다.

 

 

 

n_estimators 외에 다른 인자의 영향을 배제하지 않았기에(다음 번엔 그리드 서치를 해서 이런 영향을 배제해야겠습니다), 순전히 n_estimators의 영향이라고 보긴 힘들 수 있습니다.

이 점을 염두해보고 해석해보겠습니다.

crx, heart, iris0, mammographic, sonar와 같이 n_estimator_group에 따른 변동이 크지 않고 특별한 추세가 보이지 않기도 하지만, bupa, ring, pima, tic-tac-toe, twonorm과 같이 어느정도 증가하다가 수렴하기도 합니다.

따라서 n_estimators는 적당히 큰 숫자로 고정하면 되지, 다양한 값을 튜닝할 필요는 없다고 할 수 있습니다.

다만, n_estimators가 크면 아래와 같이 학습 시간은 아래와 같이 당연히 비례해서 커지므로 주의해야 합니다.

참고로 이 데이터는 (683, 9) 크기의 작은 데이터이기 때문에 각 모델을 학습하는데 적은 시간이 걸렸지만, 당연히 데이터가 클수록 많은 시간이 소요됩니다.

 

criterion에 따른 성능 분포

criterion에 따른 데이터별 분포는 다음과 같습니다. 

차이가 많이 나지 않아서 20개만 조그맣게 나타냈습니다.

 

구체적으로 데이터별 entropy와 gini일 때의 F1 점수의 평균은 다음과 같습니다.

보다시피 평균적으로 0.000 ~ 0.004 정도의 작은 차이만 있습니다.

따라서 criterion은 특별히 튜닝할 필요가 없는 하이퍼 파라미터라고 할 수 있습니다.

 

 

max_depth에 따른 성능 분포

max_depth에 따른 성능 분포는 다음과 같습니다.

max_depth에 따른 성능 분포는 아래 두 가지 케이스로 구분할 수 있습니다.

(1) 특정 값에서 수렴하는 경우 (예: saheart는 12부터 수렴함)

(2) 초기 값이 가장 크고 줄어들다 수렴하는 경우 (예: wdbc는 초기에 가장 크다가 6정도에서 최소를 찍고 그 이후로 변동이 크지 않음)

 

수렴하는 이유는 max_depth가 어느 정도 수치 이상이 되면 분지할 것이 없어 나무의 깊이가 고정되기 때문입니다.

다시 말해, max_depth가 1000이든 10000이든 사실 같은 나무를 학습하게 될 것입니다.

감소하는 이유는 배깅을 한 샘플 데이터가 작아서 그렇습니다.

예를 들어, wdbc 데이터는 크기가 (569, 30)에 불과하므로 초기에 값이 컸다가 계속 작아집니다.

 

따라서 데이터 크기에 따라 max_depth를 튜닝해야 하며, 데이터가 작다면 3 ~ 10 정도의 범위에서, 데이터가 크다면 5 ~ 20 정도의 범위에서 튜닝하는 것이 좋다고 할 수 있습니다.

데이터에 상관없이 탐색 공간을 줄이고 싶다면 [3, 5, 10, 15] 정도에서 튜닝하는 것이 가장 좋아보입니다.

 

 

max_samples에 따른 성능 분포

그래프가 너무 지저분한 것을 방지하기 위해, 이동 평균(m = 10)을 적용하여 시각화했습니다.

크게 보면 다음과 같이 세 가지 케이스로 구분할 수 있을 것 같습니다.

(1) max_samples가 증가함에 따라 F1 score도 증가하는 케이스 (예: tic-tac-toe, heart)

(2) max_samples가 감소함에 따라 F1 score가 증가하는 케이스 (예: wdbc)

(3) max_samples와 크게 관련이 없는 케이스 (예: banana)

 

max_samples에 따라 변동하는 것은 사실이므로 튜닝은 필요해보입니다.

다만 극단에서 값이 좋은 경우가 많으므로 0.2와 0.8 정도만 튜닝하면 좋을 것 같습니다.

 

 

max_features에 따른 성능 분포

그래프가 너무 지저분한 것을 방지하기 위해, 이동 평균(m = 10)을 적용하여 시각화했습니다.

max_features와 어느정도 유사한 패턴을 보입니다.

마찬가지로 다음과 같이 세 가지 케이스로 구분할 수 있을 것 같습니다.

(1) max_features가 증가함에 따라 F1 score도 증가하는 케이스 (예: tic-tac-toe, banana)

(2) max_features가 감소함에 따라 F1 score가 증가하는 케이스 (예: wisconsin, twonorm)

(3) max_features와 크게 관련이 없는 케이스 (예: heart)

 

max_features에 따라 변동하는 것은 사실이므로 튜닝은 필요해보입니다.

다만 극단에서 값이 좋은 경우가 많으므로 0.2와 0.8 정도만 튜닝하면 좋을 것 같습니다.

 


하이퍼 파라미터 튜닝 실험에 관한 질문이나 추가 실험 요청 사항이 있으시면 댓글이나 이메일(gils_lab@naver.com)을 남겨주시기 바랍니다. 

해당 포스팅이 도움되었다면 공감 버튼 클릭부탁드립니다!  

Comments