brunch

You can make anything
by writing

C.S.Lewis

by 체리곰 Jun 10. 2023

왜 Cross Validation을 해야 할까?

bias-variance trade-off와 비복원추출



몇몇 부트캠프에서는 Cross validation을 단순히 성능을 올리기 위해서 사용하는 기법이라고 소개하곤 합니다. 이런 오개념은 상당히 널리 퍼져 있는 오해 중 하나로, 오히려 Cross Validation은 제한된 데이터셋을 가지고 모델의 성능을 정확히 측정하기 위해 사용하는 일종의 방법 중 하나입니다. Cross Validation을 사용하여 데이터에 문제가 있는지, 아니면 모델에 문제가 있는지를 확인하고 이 둘 중 하나를 개선하기 위해 사용하는 방법이죠. 그렇다면 Cross Validation의 이론적 배경을 자세히 설명하고, 이게 현실에서 어떻게 적용될 수 있는지 알아보도록 하겠습니다.


1. Bias와 Variance는 Trade-off 관계이다.

한번 오지선다 시험을 보는 두 사람이 있다고 가정해봅시다. 당연히 시험을 보려면 공부를 해야 하지만, 두 사람은 전혀 공부를 하지 않았죠. 그래서 두 사람은 각자 다른 방법을 통해 시험에서 고득점을 노려보려고 합니다. 한 사람은 아예 하나의 숫자를 랜덤으로 골라서 그 숫자만 계속 찍기로 했습니다. 나머지 한 사람은 저번 시험에 나온 번호 그대로 찍기로 했죠. 


이걸 각각 두 사람이 Bias가 높다, 그리고 Variance가 높다는 식으로 이야기할 수 있습니다. 한 사람은 정답이 무조건 하나로 나올 것이라는 전제조건을 가지고 있기 때문에 Bias가 높은 것이고, 반대로 나머지 한 사람은 정답을 저번 시험에 나온 그대로 찍는다고 하니 Variance가 높은 것이죠.


다시 말해, Bias가 높다는 것은 모델이 가지고 있는 전제조건이 너무 강력하다는 것입니다. 이런 모델의 대표격 중 하나가 바로 선형 회귀입니다. 아직도 많은 분야에서 사용되는 이 모델은 독립변수 x에 따라 y가 선형으로 변화할 것이라는 가정을 하고 있습니다. 때문에 독립변수 x에 따라 y가 선형으로 변하지 않는 경우에는 모델이 힘을 쓰지 못합니다. 


한편 Variance가 높은 경우는 어떤 경우가 있을까요? 데이터셋이 실제 값을 반영하지 못하고 있는 경우에 Variance가 매우 높을 것입니다. 아마 온라인 세계가 이런 high variance의 경우일 겁니다. 상위 1%, 하위 1%에 대한 글만 올라오는 경향이 많으니까요. 아니면 모델이 너무 복잡한 경우에도 여기에 해당할 수 있습니다. 특정 데이터셋에 대해서만 특화되어 있으니까요.


잠깐, 그런데 지금 우리는 trade-off 관계에 대해서 이야기하고 있지 않았나요? 네 맞습니다. 재밌게도 이 bias와 variance는 trade-off 관계를 가지고 있습니다. 이는 수학적으로 증명이 된 내용이지만, 이번 포스팅에서는 (브런치에선 LaTeX가 지원되지 않는 관계로...) 수식을 빼고 이야기를 해보도록 하겠습니다.


일단 한 가지 가정이 필요합니다. 데이터셋이 무한대로 순차적으로 계속 들어온다는 가정입니다. 이 가정은 매우 중요합니다. 통계학을 배워보신 분이라면 아시겠지만, 우리가 가지고 있는 데이터는 모두 샘플입니다. 우리가 알고 싶은 어떠한 사실에 대한 데이터를 전수조사하는 것은 불가능합니다. 그렇기 때문에 이런 가정을 넣는 것입니다.


우리가 보통 머신러닝에서 에러라고 부르는 것은 모델이 예측한 값과 실제 값의 차입니다. 모델은 샘플링된 데이터를 학습한 것이고요. 이제 데이터셋을 무한대로 들여오고 학습한 뒤 에러를 계산할 수 있겠네요? 그렇다면 이렇게 무한대로 만들어진 모델들의 에러를 평균을 내볼 수 있습니다. 이렇게 되면 수학적 유도를 통해  무한하게 들어오는 데이터셋으로 만들어진 모델의 에러값은 크게 두 개를 더한 값이 됩니다. 첫째가 바로 Variance로, 하나의 데이터셋으로 학습한 모델의 결과값에서 모든 데이터셋을 학습한 모델의 에러를 뺀 값의 기대값입니다. 두번째는 Bias의 제곱입니다. 모든 데이터셋을 학습한 모델의 결과값에서 실제 값을 뺀 값입니다. 


앞서 Variance는 하나의 데이터셋으로 학습한 모델의 결과값 빼기 모든 데이터셋을 학습한 모델의 에러를 뺀 값이라고 했습니다. 그렇다면, 이 값은 데이터셋의 문제에 대해서 이야기한다고 볼 수 있습니다. 데이터셋이 실제 값을 반영하지 못하거나, 아니면 특정 데이터셋에 지나치게 모델이 fitting되었다고 볼 수 있는 것입니다. 한편, Bias는 모든 데이터셋을 학습한 모델의 결과값에서 실제 값을 뺀 것이라 앞서 언급했습니다. 그렇다면 모든 데이터셋을 학습하더라도 실제 값에는 완전히 이르지 못했다는 뜻이 되겠죠? 다시 말해서 이것은 모델 자체의 한계로 인해 실제 값에 완전히 도달하지 못했다는 의미입니다. 


그런데 Bias와 Variance 설명에서 이상한 점을 못 찾으셨나요? 두 개 모두 "모든 데이터셋을 학습한 모델"이 들어가있고, 심지어 부호가 반대입니다. 즉, Bias를 줄인다고 해도 Variance는 늘어나고, Variance를 줄이면 Bias가 높아진다는 의미입니다. 이것이 바로 Bias-Variance의 진정한 의미입니다.


2. K-Fold Cross Validation

물론 당연히 현실에서 Bias와 Variance를 구할 수는 없습니다. 샘플이 아닌 완전한 데이터셋을 구하는 것은 현실에서는 불가능합니다. 설령 오늘 전수조사를 했다고 해도 내일 새로운 데이터셋이 생길테니까요. 그렇다면 이 Bias-Variance Trade-off가 정말 별 쓸모가 없는 내용이냐? 그렇지 않습니다. 이 내용은 Cross Validation의 이론적 기초가 되는 내용이기 때문입니다.


Cross validation은 우리가 "Bias와 Variance를 알 수는 없지만, Bias와 Variance를 추정은 해볼 수 있지 않겠냐" 라는 생각에서 시작한 것입니다. 즉, 우리가 완벽한 데이터셋을 얻을 수는 없지만, 그래도 완벽한 데이터셋을 얻은 것처럼 시뮬레이션은 해볼 수 있지 않느냐는 생각이지요. 그것이 바로 K-Fold Cross Validation입니다. 지금 가지고 있는 데이터셋을 K개만큼 나눈 다음, 모델을 K개의 데이터셋으로 각각 학습한 뒤 Bias와 Variance의 추측치를 계산해보는 것입니다. 


그런데 통계학을 배워보신 분들이라면 어디선가 들어본 적 있으실 겁니다. 바로 Bootstraping이라는 기법입니다. 중심극한이론을 기초로 한 Bootstraping은 복원추출의 일종입니다. 이 Bootstraping을 통해서 Confidence interval, 즉 내가 알기를 원하는 값은 몇퍼센트의 확률로 값이 어디에서부터 어디에 분포해 있다는 것을 알 수 있습니다. 물론 Bootstraping은 복원추출이고 K-Fold Cross Validation은 비복원추출이라는 차이가 있습니다. 간단한 예시로 두 추출방법의 차이를 알아봅시다. 복원추출은 공이 가득 들어있는 상자가 있을 때 공을 뽑은 뒤 다시 뽑은 공을 상자에 넣은 뒤 또 공을 뽑는 것이지만, 비복원 추출은 한번 뽑은 공을 다시 상자에 넣지 않고 공을 뽑는 것이라고 이해하시면 되겠습니다.


K-Fold Cross Validation의 방법은 다음과 같습니다. 


1. 데이터셋을 K개로 나눈다.

2. 모델을 학습한다. K-1개의 데이터는 학습용으로, 나머지 하나의 데이터는 테스트용으로 사용한다.

3. 이미 테스트용으로 사용한 데이터를 학습용으로 다시 넣고, 테스트용으로 사용하지 않은 또 다른 데이터를 테스트용으로 사용한다

4. 이를 K번 반복한다.



어찌되었건, 이 추출기법을 통해서 모델의 성능을 추정할 수 있습니다. 이 때 사용될 수 있는 metric 중 하나가 바로 Precision과 Recall입니다. 머신러닝을 해보신 분이라면 상당히 많이 들어보셨을 metric인데요, 이것은 각각 모델이 True라고 분류한 것 중에서 실제 True인 것의 비율과 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율입니다. 즉, Precision이 높아지면 False Positive가 낮아지고, Recall이 높아지면 False negative가 낮아집니다.


 그리고 Precision과 Recall의 조화 평균이 바로 F-measure Score입니다. 보통 F1 Score로 알고 있는데요, 실제로는 Precision과 Recall을 완전히 동등하게 보는 F-measure가 F1 Score입니다. F-measure의 실제 식은 다음과 같습니다.


여기서 우리는 precision과 recall이 무엇을 의미하는지 논의할 필요가 있습니다. 위에서 이미 의미를 설명하지 않았냐고요? 반만 맞는 이야기입니다. 위에서 Bias와 Variance를 설명했고 이를 통해 모델을 손봐야 할지, 데이터셋을 손봐야 할지 그 해답을 알 수 있다고 했는데 실제로는 Bias와 Variance를 측정할 수 없다고 했고, 다만 이를 추정할 수 있도록 시뮬레이션을 해보는 게 Cross Validation이라고 했잖아요? 그렇기 때문에 이 두 measurement가 무슨 역할을 하는지 알아보는 것이 중요합니다.


먼저 precision이 1에 가깝고 recall이 0에 가까운 상황을 가정해봅시다. 모델이 True라고 분류한 경우가 실제 True인 경우가 많지만, 실제 True인 것 중에서 모델이 True라고 한 비율이 거의 0에 가깝네요. 그런데 bias는 모델이 너무 간단하거나 모델에 걸려있는 규제가 너무 강력해서(앞서 말씀드린 선형회귀의 예시처럼) 모델의 성능이 나오지 않는 경우라고 말씀드렸습니다. 따라서 precision이 높고 recall이 낮다면 high bia - low variance case에 가깝다고 볼 수 있을 겁니다. 


한편, recall은 어떨까요? precision이 0에 가깝고 recall이 1에 가까운 상황을 살펴보겠습니다. 실제 True인 것 중 모델이 True라고 예측한 것은 1에 가깝지만, 모델이 True라고 분류한 것 중 실제 True인 것은 0에 가깝네요. 그런데 variance는 앞서 말했듯 데이터셋이 실제 값을 반영하지 못하거나, 아니면 모델이 특정 데이터셋에 지나치게 fitting된 모델이라는 것을 보여준다고 했습니다. 따라서 이 경우는 high variance-low bias case에 가깝다고 볼 수 있겠습니다.


이를 통해 Cross Validation이 어떻게 활용될 수 있는지 알아봤습니다. 만약 Precision이 높은데 Recall이 낮으면 더 복잡한 모델을 사용하거나 모델에 걸려있는 규제를 해제하면 됩니다. 더 복잡한 특징을 잡아내야 하는데 규제로 인해 특징을 잘 잡아내지 못하고 있으니까요. 한편 Recall이 높은데 Precision이 낮으면 데이터셋을 다시 살펴보거나 모델에 Regularization을 걸 필요가 있습니다. 데이터셋이 실제 데이터를 반양하지 못하거나, 아니면 모델이 특정 데이터셋에 지나치게 fitting되었다는 의미일 수 있으니까요.


이를 통해서 Precision-Recall trade-off 관계의 의미와 이것이 K-Fold Cross validation에 어떻게 적용될 수 있는지를 보았습니다. 이를 통해서 여러분의 머신러닝 관련 지식이 조금이라도 늘었길 바랍니다. 궁금하거나 잘못된 내용이 있으면 언제건 댓글 부탁드립니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari