관리 메뉴

TEAM EDA

[Machine Learning Advanced] 7강. 머신러닝 강의 - 데이터 셋 분할 본문

EDA Study/Machine Learning Advanced

[Machine Learning Advanced] 7강. 머신러닝 강의 - 데이터 셋 분할

김현우 2023. 8. 8. 01:26

 

이번 강의에서는 학습 된 모델을 평가하는 과정에 대해 알아보겠습니다. 주어진 데이터를 학습 및 검증, 평가 셋으로 나누는 방법론에 대해 배우고 장단점과 언제 어떤 방법을 선택할지에 대해 살펴봅니다. 평가함수에 대해 모델의 성능을 측정하고, 결과를 해석해서 머신러닝 프로세스를 반복하는 과정에 대해 이해해보도록 하겠습니다. 

 

데이터 셋 분할은 무엇을 의미하며, 왜 하는 것일까요? 

선택한 모델을 학습하기 위해서는 먼저 데이터를 Train / Valid / Test 총 3가지의 데이터로 나눠야 합니다. 일반적으로 저희가 가진 데이터는 전체 데이터의 일부분입니다. 그렇기에, 학습 데이터에서 엄청 잘 나온다고 실제 미래 데이터가 들어왔을때 잘 나온다는 보장이 없습니다. 그렇기에, 이러한 모델의 성능을 보장해줄 데이터가 필요하고 그게 평가 데이터가 됩니다. 

 

각각의 데이터는 서로 다른 역할을 가집니다. 먼저, 

 

학습 데이터는 모델이 패턴을 학습하고 일반화하는 데 사용됩니다. 

 

검증 데이터는 모델의 훈련 중에 모델의 성능을 평가하고 조정해주는 역할을 하며, 모델의 일반화 능력이나 하이퍼파라미터 튜닝 등의 작업을 할때 사용됩니다. 예를들어, LightGBM 같은 모델의 경우 검증 데이터를 통해서 num iterration을 정하게 됩니다. 

 

평가 데이터는 학습이 끝난 모델을 최종적으로 평가할때 사용됩니다. 실제, 모델이 학습 기간동안에 보지 못했던 데이터에 대해 얼마나 잘 일반화 되는지를 측정하는 데 사용되어야 하며, 이를 통해 모델의 성능을 평가할 수 있습니다.

 

만약, 평가 데이터나 검증 데이터가 실제 전체 데이터를 잘 반영하지 못한다면 (미래에 들어올 데이터) 어떻게 될까요? 학습한 모델이나 실험의 내용은 모두 물거품이 됩니다. 그렇기에, 검증 데이터와 평가 데이터를 어떻게 잘 설정하는지 항상 고민해야합니다. 비슷하게, 검증 데이터와 평가 데이터의 분포가 다르거나 서로 다른 패턴을 보유하고 있으면 학습 데이터를 얼마나 잘 검증하든 평가 데이터에 대해서는 성능이 안좋게 나올 것입니다. 하지만, 이는 쉽지 않은 작업입니다. 도메인이나 데이터의 특성에 따라서 나누는 방법이 다르고, 어떤 목적을 가지고 있냐에 따라서도 다르게 합니다. 예를들어, 시간의 흐름에 따라 데이터가 자주 바뀌는 경우 최근 데이터를 평가 셋으로 두고 그렇지 않은 경우 랜덤하게 하거나, 못본 유저들에 대해 예측할때는 유저단위로 평가 셋을 구성하는 식으로 차이가 납니다. 

 

 

참고로 대회 같은 경우에서는 평가 데이터는 이미 고정된 경우가 많고, 학습 데이터와 평가 데이터만 주어지는 경우가 많습니다. 저희는 이런 상황에서 어떻게 주어진 원본 학습 데이터를 새로운 학습 데이터와 새로운 검증 데이터로 분할하는 방법에 대해 보도록 알아보도록 하겠습니다. 

 

Holdout

가장 대표적인 방식인 Holdout입니다. Holdout은 주어진 데이터를 80:20 등과 같이 분리를 하는 기법입니다. 이때, 랜덤하게 분리를 할 수도 있고 시간에 따라서 가장 최근 데이터 20%를 검증 데이터로 둘 수도 있습니다. 혹은, 위에서 언급한 예시처럼 새로운 사람에 대해 성능을 평가하고 싶은 경우 전체 사람 기준으로 20%를 검증 데이터로 둬서 평가를 할 수도 있습니다. 이는 주어진 데이터의 특징에 따라 (시간의 흐름에 따라 데이터가 자주 바뀌는 경우) 혹은 목적에 따라 (기존에 못본 사람에 대한 평가) 달라지는 부분이니 데이터와 도메인에 대한 이해를 가지고 진행해야합니다. 

 

이러한 Holdout 방식은 가장 기본적이지만 많이 사용되는 방법론입니다. 그 이유는, 빠른 속도로 모델을 검증할 수 있다는 것입니다. 하지만, 일부 데이터는 학습에 전혀 참여하지 않기에 성능이 일반적으로 낮습니다. (보통은 좋은 퀄리티의 학습 데이터가 많으면 많을 수록 성능이 오르는 편입니다.) 또한, 전체 데이터가 아닌 일부 20%의 데이터에 대해서만 검증을 했기에 상대적으로 신뢰성이 떨어지는 단점이 있습니다. 

 

[장점]

1. 빠른 속도로 모델에 대한 검증이 가능 

 

[단점] 

1. 일부 데이터가 학습에 참여하지 못함으로 성능이 일반적으로 낮은 편.

2. 전체 데이터에 대해 검증한 것이 아닌 일부분에 대해서만 검증했기에 완전히 신뢰성있다고 보장할 수 없음 

 

KFold 

다음으로는 대회에서 많이 활용되는 KFold입니다. KFold는 주어진 데이터를 80:20 등과 같이 분리를 하는 Holdout을 K번 반복한 방법입니다. 이때, Holdout처럼 랜덤하게 혹은 사람에 따라 나누는 걸 할 수 있습니다. 단, 이를 K번 반복하되 서로간에 데이터를 안겹치도록 하는게 특징입니다. 

 

이러한 KFold 방식은 전체 데이터를 학습에 참여시킴으로서 Holdout의 단점을 해결할 수 있습니다. Holdout의 경우 20%의 검증 데이터가 학습에 참여하지 못한 반면, KFold는 그렇게 빠지는 부분이 없이 모두가 학습에 균등하게 참여합니다. 그리고, 20%만이 아닌 모든 부분에 대해 검증을하기에 신뢰성 또한 보장됩니다. 하지만, Holdout의 장점인 빠른 속도가 KFold에서는 단점으로 작용합니다. Holdout을 K번 반복하기에 속도가 최소 K배 이상걸립니다. 그렇기에 데이터가 큰 경우 이러한 단점은 더 크게 다가올 수 있습니다. 

 

참고로, 이러한 KFold는 K개 만큼의 모델을 만들고 이를 평가 셋에 적용해 추론한 다음 결과를 평균냅니다. 그렇기에, 추론파트에서도 속도가 K배가 걸리게 됩니다. 

 

[장점]

1. 모든 데이터셋이 학습에 참여함 

2. 전체 데이터에 대해 검증을 진행하기에, 신뢰성을 보장할 수 있음 

3. Fold별 결과물을 앙상블하기에 대부분의 경우 모델의 성능이 Holdout 대비 높은 편임 

 

[단점] 

1. 같은 방식의 Holdout 대비 K배 만큼 속도가 소요됨 (학습 및 추론 모두 K배) 

2. K의 선택이 필요 

 

Stratified KFold 

분류 대회에서 가장 많이 활용되는 StratifiedKFold입니다. 방법은 KFold와 동일합니다. 단, 폴드별로 y의 비율도 동일하다는게 Stratified KFold의 특징입니다. 데이터의 양이 충분하면 문제가 없겠지만 y클래스가 imbalance한 경우 KFold를 적용하면 y의 비율이 달라지는 상황이 발생할 수 있습니다. 그런 경우를 방지하고자, 모든 학습 셋과 검증 셋에 대해 y의 비율을 동일하게 분포시키는 나누는 방법정도로 보시면 됩니다. 

 

[장점]

1. KFold의 장점 모든 점 

2. y의 분포가 동일해서 불균형에서 오는 부분이 일부 해소 (폴드별로 클래스 분포를 고려) 

 

[단점] 

1. KFold와 동일 

 

Group KFold 

Group KFold는 특정 목적하에서 사용됩니다. 아까 Holdout 예시에서 새로운 사람에 대해 예측을 하고 싶은 경우를 봤었습니다. 그리고, 이때 사람을 기준으로 Train과 Valid를 나눌 수 있다고 했습니다. 그걸 KFold에 확장한게 Group KFold입니다. GroupKFold는 Group (예시에서는 사람)을 Fold별로 분배하는 역할을 합니다. 여기서 분배라는 의미는 Train과 Valid에 같은 값이 들어가지 않도록 한다는 의미입니다. 예를들어, 루루, 라라, 디디, 티티, 츄츄 5명 고양이의 매일의 식사량이 있다고 생각해보겠습니다. 저는 새로운 고양이 나나가 들어왔을때 해당 나나의 식사량이 궁금합니다. 그런 경우, 고양이의 이름을 Group으로 해서 나누면 

 

Fold0의 Train은 라라, 디디, 티티, 츄츄 Valid는 루루의 식사량

Fold1의 Train은 루루, 디디, 티티, 츄츄  Valid는 라라의 식사량

Fold2의 Train은 루루, 라라, 티티, 츄츄 Valid는 디디의 식사량

Fold3의 Train은 루루, 라라, 디디, 츄츄 Valid는 티티의 식사량

Fold4의 Train은 루루, 라라, 디디, 티티 Valid는 츄츄의 식사량

 

위와 같은 형태로 폴드가 나뉘게 됩니다. (즉, 내가 설정한 Group의 값을 Train이면 Train / Valid이면 Valid 한쪽에만 가게하고 절대 둘이 겹치지 않게 한다는 의미입니다) 이런 방법은 위의 새로운 사람(고양이)에 대해 예측하는 경우도 유용하고 일반적으로 환자 데이터에 사용하기 유용합니다. 새로운 환자의 질병을 예측하게 될 경우 Train 과 Valid에 같은 환자의 정보가 들어있으면 Data Leakage 라는게 발생할 수 있습니다. (Data Leakage는 정보의 누수로 새로운 환자에 대해 정보를 몰라야하는데, Train, Valid에 같은 환자가 있으면 모델이 해당 환자의 패턴을 학습해 정보를 알아버리기 때문입니다) 

 

[장점]

1. KFold의 장점 모든 점 

2. Group을 분배할 수 있음 

 

[단점] 

1. KFold와 동일 

 

 

그 외에도 시계열 데이터에서 많이 사용하는 Time Series split 등 여러가지의 방법이 있고, GroupKFold와 StratifiedKFold는 결합해서 사용할 수도 있습니다.

 

처음 언급한 것처럼 Train, Valid, Test를 만들어야 제대로된 모델의 학습과 성능 측정이 가능합니다. 그래야 실험이 유의미하고 분석이 정확해집니다. 그리고, 오프라인 성능으로 끝나는 게 아니라 해당 모델의 성능이 서비스 상에서 성능과 차이가 있는지 확인하고 이 사이의 추세가 같아지도록 노력 해야합니다.