본문 바로가기
의사결정나무의 HyperParameter Tuning에 대한 Intuition

의사결정나무를 어떤 방식으로 만든다는 것은 바로 전에 살펴본 대로 알겠는데, 막상 성능이 좋은 의사결정나무를 만들기 위해서 어떤 식으로 HyperParameter를 Tuning 해야 할지 대략의 감이 있어야 하겠습니다. 

우선 의사결정나무를 만든 후에는 조정할 수 있는 여러가지 HyperParameter가 있을 수가 있겠죠. 그 종류와 설명을 대략 늘어놓아보면 다음과 같습니다. 

 

① min_samples_split (최소 분할 샘플수)
노드를 분할하기 위한 최소한의 샘플 데이터 수이고, 작게 설정할수록 분할하는 노드가 많아지고, 각 분할 노드는 적은 수의 샘플로 자세하게 분할되겠죠. 그러면 나무모형이 과적합될 가능성이 높아집니다. 

② min_samples_leaf (최소 말단 노드 샘플수)
말단 노드가 되기 위한 최소한의 샘플 데이터 수이고, 비대칭적 데이터의 경우 특정 클래스의 데이터가 극도로 작은 것으로 관찰될 수 있습니다. 이 경우는 적절하게 설정하면 너무 한쪽으로만 몰리지 않도록 도움이 되고, 샘플이 너무 작으면 너무 자세하게 최종 결과를 예측하겠죠. 

③ max_features (최대 특성수)
최적의 분할을 위해 고려할 최대 피처 개수이고, 기본적으로는 데이터 세트의 모든 피처를 사용해 분할을 하게되는데, 이것도 잘 보면 너무 많은 Feature를 이용해서 나무가 복잡해지는 경향을 만듭니다. 적절한 수의 특성이 이용되는 게 좋겠죠. 또는 아예 필요 없는 Feature를 없애버리는 Feature Engineering이 필요할 수도 있겠습니다.

④ max_depth (나무 길이(깊이))
나무의 최대 깊이를 규정하는 것이고, 기본적으로는 완벽하게 클래스가 분류될 때까지 깊이를 계속 키우며 분할하거나, 노드가 가지는 데이터 개수가 min_samples_split(노드 분할을 위한 최소한의 샘플수) 보다 작아질 때까지 계속 깊이를 키우는 데요, 깊이가 너무 깊어지면 너무 자세하게 가지를 분할하게 되어 과적합될 수 있으므로 적절한 값으로 통제가 필요합니다. 

⑤ max_leaf_nodes (최대 말단노드 개수)
말단 노드의 최대 갯수로써 노드의 개수가 너무 많으면 이것도 복잡한 나무를 만듭니다. 그러니까 적절하게 분류되도록 말단 노드수를 조정합니다.  

자, 어떤 HyperParameter들이 있는지 봤습니다. 별거 없죠?
Training후에 Test Data로 성능을 평가해 보면, 여러 가지 증상이 나타날 수 있는데 그 증상들을 기준으로 하여 HyperParameter 최적화를 위한 해결책들을 늘어놓으면 다음과 같습니다. 

우선 학습된 모형이 과적합이라고 판단될 때에는 어떻게 할까요? 과적합의 대표적인 증상은 다음과 같은데요. 훈련 데이터에 대해 높은 정확도를 보이지만 테스트 데이터에서는 성능이 떨어고, 나무의 깊이(depth)가 지나치게 깊고 가지가 너무 많습니다. 데이터의 작은 변화에도 트리 구조가 크게 변할 수 있어 불안정해지고, 노이즈나 이상치에 과도하게 민감하게 반응하여 나무모형이 복잡해집니다. 결과적으로 극단적인 과적합은 말단 노드(terminal node)에서 불순도(impurity) 측정값(예: gini index 또는 entropy)이 0에 가까워집니다

이런 과적합이 왜 발생했는지를 분석해 보려면,  말단 노드들에 극소수의 샘플들만 포함되어 있지는 않은지 확인해 보고, → 만일 그렇다면, min_samples_leaf를 증가시켜서 각 리프노드의 최소 샘플수를 늘리거나, max_depth를 감소시켜서 나무의 최대 깊이를 제한해 봅니다. 

그리고요, 과소적합이라고 판단될 때도 있겠죠. 과소적합의 증상은 훈련 데이터와 테스트 데이터 모두에서 안 좋은 성능을 보이고, 모델이 데이터의 패턴을 제대로 포착하지 못해 복잡한 관계를 학습하지 못하고요, 모델이 지나치게 단순하여 데이터의 특성을 충분히 반영하지 못합니다. 걍 모형이 잘 동작하지 안 하는 걸 과소적합이라고 할 수도 있겠군요.

이런 과소적합이 왜 발생했는지 분석해 보려면,  각 노드들에 분할된 데이터들이 너무 많은 것 아닌가를 확인합니다. → 만일 그렇다면 min_samples\_split을 줄여서 더 많은 분할을 허용하거나, 트리가 너무 단순해 보인다면, max_depth를 증가시켜서 더 깊은 나무를 만들 수 있도록 해야 합니다. 
 
그러니까 과적합, 과소적합일 때에는 목표가 각 리프노드에 적절한 양의 데이터가 있을 수 있도록 하는 것을 목표로 하면 되겠습니다. 

그리고, 분류의 경우 이게 동작을 하긴 하는데  특정 클래스의 성능이 현저히 떨어지는 경우가 있는데 이때에는 다수의 클래스에 너무 적은 수의 데이터가 편향되어 훈련되어 있지 않은지 확인합니다. 
→ 만일 그렇다면, min_samples_leaf를 증가시켜서 리프 노드에 다양한 클래스의 샘플이 포함되도록 합니다. 
 
그리고, 나무모형을 들여다 봤더니 일부 중요한 특성이 나무의 분기에서 무시되고 있거나, 불필요한 특성들이 자꾸 포함되는 것 같은 느낌적인 느낌이 있을 수 있겠죠?
→ 만일 그렇다면, max_features를 증가시켜 각 분할에서 고려할 특성의 수를 늘려서, 모형에서 무시되는 feature가 포함되게 하거나, max_features를 감소시켜 각 분할에서 고려할 특성의 수를 제한합니다.
  
스토리는 이 정도 입니다. 이제까지의 내용을 모두 종합해서, 마지막 응용문제를 하나 보자면, 연속형 회귀에 결정나무를 사용하는 경우에는 데이터의 작은 변화에도 트리 구조가 크게 변하는 증상이 있을 수 있습니다. 그럼 어떻게 하면 좋을까요? 이럴 때에는 min_samples\_leaf를 증가시켜 각 리프 노드의 최소 샘플 수를 늘려 안정성을 높입니다. 

"결국, 정리하자면, 별건 없고, 
1) 각 노드에 데이터가 너무 없으면 모형 전체를 좀 줄여서 각 노드에 적절하게 데이터가 들어가게 하고,  2) 각 노드에 데이터가 너무 많으면 전체를 더 늘려서 각 노드에 적절하게 데이터가 나뉘어 들어가게 해서 균형 잡힌 나무 모형을 만드는 것"이 의사결정나무 모형의 HyperParameter 최적화 과정이라고 생각하면 좋겠습니다. 예쁜 나무를 만드는 과정이라고나 할까요?

이 현상에 대한 감을 이용한 방식은 논리적으로 찾아가는 방식이니까 제가 좋아하는 방식입니다만  이렇게 찾아낸 값들이 가장~ 최적화된 방법인지 확인할 수 있는 방법이 없습니다. 그러니까 어쨌든 정답에 가까운 최선의 HyperParameter를 찾아가는 최적화하는 방식이 있는데, 그것이 Grid Search, Bayesian Optimization 뭐 그런 것들입니다. Grid Search는 걍 HyperParameter를 막 바꿔가면서 비교한 후에 제일 좋은  성능을 내는 HyperParameter의 조합을 찾아가는 것을 말하고 - 이래도 되나 싶게 약간 막무가내식이긴 합니다. -, Bayesian은 MCMC(마코프체인 몬테카를로)에서 하나 점을 찍고, 다음 점을 추천하는 방식을 들여다본 적이 있었는데, 그것과 비슷하게 일단 HyperParameter를 찍고, 그다음 HyperParameter를 추천하는 뭐 그런 알고리즘적인 최적화 방법입니다. 이것은 언젠가는 자세히 살표볼 기회가 있으리라 생각하고, 여기에서는 이렇게 이야기가 끝이 나는 것이 좋겠습니다. 

친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -



댓글





친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -