brunch

You can make anything
by writing

C.S.Lewis

by 박경아 Sep 23. 2022

5. 어떤 예측이 좋은 예측인가?

[마케터를 위한 머신러닝, 딥러닝 사전]

지난 글에서는 사이킷런이나 셀프 서브드툴을 사용하면 머신러닝 모델링 과정 자체는 몇 개의 간단한 명령어로 학습, 예측, 평가할 수 있었다. 하지만 어떤 데이터를 테스트 데이터로 할 것이며, 어떤 예측이 좋은 예측이고, 그것을 어떻게 평가할 것인가? 이번 글에서는 실제 머신러닝 모델링 과정에서 고려해야 할 문제들에 대해 조금 더 생각해 보도록 하자.



무엇을 테스트 데이터로 할 것인가?


머신러닝이 학습하는 법이라는 이전 글에서 머신러닝이 학습하는 궁극의 목적은 바로 가능한 어떤 경우에도 원하는 수준의 예측 성능을 내기 위해서라고 했다. 즉, 데이터의 패턴을 가장 잘 일반화할 수 있는 모델과 가중치를 찾는 것이다.


하지만 현실에서 우리가 이용할 수 있는 데이터는 데이터의 패턴을 일반화하기에 한정적인 경우가 많을 것이고, 이를 가지고 어떻게 좋은 일반화 성능을 낼 수 있을 것인가? 그래서 머신러닝은 데이터의 질과 함께 양이 중요하다는 전제를 항상 깔고 있다고 생각한다. 우리가 실제 머신러닝 학습을 통해 얻는 결과는 현실의 모든 데이터를 학습할 수 없기에 학습 데이터(훈련 데이터)의 평가 결과인 학습 성능이라 할 수 있다.


학습성능이 좋다고 일반화 성능이 좋으리란 보장이 없다. 그래서 실제 시험 성적을 가늠할 수 있는 일종의 모의고사를 쳐서 모델의 성능을 평가하게 되는데 바로 테스트 데이터를 학습한 모델에 넣어서 나오는 테스트 성능이다. 머신러닝이 학습에 사용하지 않은 테스트 데이터로 평가해 일반화 성능을 가늠해 보는것이다.


하지만 전체 데이터에서 어떤 것을 테스트 데이터셋으로 할 것인가? 어떤 것을 테스트 데이터셋으로 하느냐에 따라 결과는 조금 때론 많이 달라질 수 있다. 특히, 분류 문제에서 클래스 별 데이터 불균형이 심한 경우에는 희소 클래스는 아예 학습이 되지 않을 수 있는 문제가 발생한다. 그래서 테스트 데이터셋을 나눌 때 그냥 무작위(Shuffle)로 추출하는 방법도 있고, 원래 데이터셋의 클래스 비율을 유지하면서 전략적으로 테스트셋을 추출하는 방법도 있고, 원래 데이터 순서대로 곱게 자를 수도 있도 있다. 

사이킷런의 train_test_split 함수


요기서 하나 더 데이터를 훈련 데이터와 테스트 데이터로 나누지 않고 훈련-검증- 테스트 데이터로 나누는 방법도 있다. 테스트 데이터는 그대로 놔두고 훈련 데이터를 다시 훈련과 검증 데이터로 나눠 다른 모델이나 하이퍼 파라미터 튜닝 등을 시도한 결과를 검증 데이터로 평가하면서 개선해 나가는 것이다. 검증 성능을 모델이 최종 모의고사를 보기 전에 실력 향상을 위해 보는 꾸준히 보는 쪽지 시험에 비유하기도 한다. 이렇게 함으로써 테스트 데이터는 학습과 개선에 사용하지 않고 순수하게 모의고사 용으로만 사용할 수 있다.  


데이터의 양이 충분하다면 훈련, 검증, 테스트 데이터로 나눠 모델을 학습시키고 개선하고 평가하면 되겠지만 모델을 일반화하기에 데이터가 부족하거나 혹은 데이터 양이 충분해도 성능을 안정적으로 평가하고 싶을 때 교차검증(K-fold Cross Validation)이라는 방법을 사용하기도 한다. 테스트 데이터는 그냥 나두고 훈련 데이터를 K개의 그룹으로 나눠 각 그룹을 훈련용과 검정용으로 골고루 한 번씩 사용하면서 모델의 성능을 그 평균으로 평가하는 것이다. 


https://scikit-learn.org/stable/modules/cross_validation.html



어떤 모델이 좋은 모델인가?


자, 이제 데이터를 훈련-검증-테스트 데이터로 나누고 머신러닝 모델을 이용해 한 차례 학습이 끝났다고 하자.

훈련 점수를 보니 90점인데 검증 점수는 89점이라고 하자. 훈련 데이터를 사용해 모델이 학습했으므로 보통 훈련 점수가 좀 더 높은 경우가 많을 것이다. 하지만 훈련 점수는 90점인데 검증 혹은 테스트 데이터는 85점 혹은 80점이라면? 


학습한 데이터는 잘 맞추지만 검증이나 테스트 데이터에서 성능이 약해지는 경우를 모델이 과적합 혹은 과대적합(Overfitting) 되었다고 이야기한다. 당연히 좋은 일반화 성능을 기대할 수 없을 것이다. 이 경우에는 모델이 좀 더 일반적인 패턴을 인식할 수 있도록 데이터의 양을 늘리거나 모델에 규제(Regularization)을 가해 학습을 인위적으로 방해하는 방법 등을 사용할 수 있다. 규제에 대해서는 선형회귀를 공부할 때 릿지, 라쏘 등의 정규화 선형회귀를 통해 좀 더 알아보도록 하자.


이와 반대로 검증 데이터의 성능이 더 높거나 혹은 훈련과 검증 성능이 모두 낮은 경우는? 모델이 과소적합(Underfiting)되었다고 이야기한다. 즉, 아직 모델이 학습 데이터를 충분히 학습하지 않았다고 할 수 있는데 데이터를 해석할 수 있는 좀 더 복잡한 모델을 사용해보거나 데이터 피처들을 다항(Polynomial)으로 만들어 좀 더 복잡해진 형태(데이터)를 학습시키는 기법 등을 사용할 수 있다.


결론적으로 학습 데이터는 물론이고 테스트 데이터에서도 성능을 만족할 만한 모델을 찾아가야 할 것이다. 


https://wikidocs.net/152777



어떻게 평가할 것인가?


모델에 대한 평가를 점수 혹은 성능이라는 말로 퉁쳐왔지만 이 점수는 구체적으로 무엇을 말하는 것일까? 이전 글에서 score라는 함수를 사용했는데 분류의 경우 0부터 1 사이의 클래스를 맞춘 비율, 즉 정확도를 출력하고, 회귀의 경우 R2라고 하는 회귀결정계수를 출력해준다. 참고로 R2는 데이터의 전체 분산에서 회귀모델에 의해 설명된 분산이 차지하는 비중으로 1에 가까울 수록 모델의 설명력이 높다고 판단하는 지표이다.


어떤 평가지표를 사용할 것인지는 해결하고자하는 문제나 지표를 이용해 모델에서 얻고자 하는 정보 등에 따라 다른데, 주로 회귀에서는 모델이 예측해야 할 실제 값과 예측값의 차이(오차)를 평가하는 것이 직관적이다. 앞서 강아지의 일일 적정 급식량을 예측하는 회귀 문제에서 MSE(Mean Squared Error)를 손실함수로 사용한 적이 있는데 MSE가 가장 낮은 모델을 찾기 위해 MSE를 평가 지표로 있을 것이다. 외에도 MAE(Mean Absolute Error), RMSE(Root Mean Squared Error) 모두 실제값과 예측값의 차이를 나타내는 지표들이다.


분류의 경우는 기본적으로 전체 데이터에서 클래스를 맞춘 비율, 즉 정확도(Accuracy)를 평가지표로 사용하는데 데이터 클래스에 불균형이 심한 경우, 예를 들어 전체 데이터 1000명 가운데 실제 코로나 확진자가 10명이 있다고 할 때 모두 음성으로 예측해도 정확도는  990/1000=0.99에 달한다. 이런 경우 대다수의 Negative 클래스보다 소수의 Positive 클래스를 제대로 맞추는 게 더 중요한데 이 경우 사용할 수 있는 평가 지표가 재현율(Sensitivity)이나 정확도(Precision)이다.


아래 Confusion Metrics에서 재현율은 TP/(TP+FN)로 실제 코로나에 걸린 사람들 가운데 양성으로 맞게 예측한 것을 말한다. 정밀도는 TP/(TP+FP)로 코로나 양성으로 예측한 사람 가운데 실제 코로나인 경우를 계산한다. 둘 다 TP(True Positive)에 초점을 맞춘 지표인데, 재현율과 정밀도는 하나가 커지면 하나가 줄어드는 trade-off 관계에 있는 경우가 많은 만큼 클래스가 불균형한 경우 두 지표의 조화평균을 의미하는 F1 score를 평가 지표로 많이 사용한다.


https://manisha-sirsat.blogspot.com/2019/04/confusion-matrix.html


더 나아가 분류 예측 결과 나온 확률을 얼마부터 양성이라고 분류할 지 정하는 기준점(Threshold)에 따라 TPR(True Positive Rate)과 FPR(False Positive Rate)이 변화는지 관계를 보여주는 ROC 곡선이 있는데, ROC는 허용할 수 있는 FPR에 따라 TPR이 최대가 되는 Threshold를 정하는 데 사용할 수 있다. AUC (Area Under ROC Curve)는 ROC 아래 면적의 크기를 나타내는 것으로 Threshold를 통틀어 예측을 가장 잘하는 모델을 찾고자 할 때 사용할 수 있을 것이다. 




* 함께 읽어보면 좋은 자료

1. Accuracy(정확도), Recall(재현율), Precision(정밀도), 그리고 F1 Score

2. ROC and AUC, Clearly Explained!

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