데이터 과학 미니북 - 3. 데이터 분석
3장에서는 여러가지 모델을 살펴보았습니다. 이번 단원에서는 마지막으로 모델을 평가하는 방법에 대해서 설명합니다. 앞서 3.2.2 단원에서 예측 대상 변수가 범주형인 모델은 분류 모델(Classification Model, Classifier), 예측 대상 변수가 수치형인 모델은 회귀 모델(Regression Model, Regressor)이라고 설명 드렸는데요, 분류 모델을 평가하는 데에는 주로 정확도(Accuracy)를, 회귀 모델을 평가하는데는 주로 손실(Loss)을 지표로 사용합니다. 본 단원에서는 우선 이 두 가지 지표를 살펴봅니다. 그리고 나서 모델 성능 저하의 원인을 분석할 때 필요한 과소적합(Underfit), 과적합(Overfit) 개념에 대하여 알아봅니다.
분류 모델을 평가하는 데에는 주로 정확도(Accuracy)라는 지표를 사용합니다. 병원에서 진료를 받다 보면, “특정 질병에 대해 양성 또는 음성으로 진단을 받았고, 해당 검사의 정확도는 95 % 입니다.”라는 식의 설명을 들을 수 있습니다. 이 95 %라는 수치는 실험실에서 검사 결과와 실제 양성, 음성 데이터를 분석하여 얻는 것입니다.
예를 들어 [표 1]은 100 명을 대상으로 검사 결과로 예측된 양성/음성 값과, 실제 양성/음성 값을 조사하여 데이터로 만든 것입니다. 이 중에서 예측 값과 실제 값이 같은 녹색 부분은 검사가 옳은 것이고, 예측과 실제가 다른 붉은색 부분은 검사가 틀린 것입니다. 이 데이터는 검사가 옳은 경우가 총 95 건, 틀린 경우가 5 건으로서, 검사의 정확도가 95 %라고 주장할 수 있는 근거가 됩니다.
분석 모델을 평가할 때 쓰이는 ‘정확도’라는 지표는 앞서 의료 검사에서의 정확도와 같은 방식으로 계산되는 것입니다. [표 1]과 같이 예측 값과 실제 값을 비교하는 표를 혼동 행렬(Confusion Matrix)이라고 합니다. 이 행렬의 4개 영역은 [표 2]와 같이 각각 명칭이 붙여져 있습니다.
이 혼동 행렬로부터 분류 모델을 평가하는 여러가지 지표가 도출되는데, 이 장의 제목인 '정확도'를 포함해서, 가장 널리 쓰이는 3가지 지표만 뽑아보면 다음과 같습니다.
의료 검사 정확도 측정을 위한 혼동 행렬[표 1]에서 정확도, 정밀도, 재현율은 각각 95 %, 71 %, 63 % 입니다. 정확도에 비해 나머지 두 지표는 좋다고 하기 애매한 수치입니다.[1] 이 지표들 중에 어떤 것이 중요한가 하는 것은 모델의 활용 목적에 따라 달라집니다. 비즈니스에서 거짓 양성이 심각한 결과를 초래하는 경우 모델에게는 100 % 가까운 정밀도가 요구됩니다. 반대로 거짓 음성 문제가 심각한 경우 높은 재현율이 요구됩니다.[2] 일반적인 경우, 즉, 특별한 비즈니스 요구 사항이 없다면, 분류 모델은 정밀도, 재현율, 정확도가 균형있게 모두 우수한 것이 좋습니다.
회귀 모델을 평가하는 데에는 손실(Loss)이라는 지표를 사용합니다. 손실은 모델 반응 변수에 대한 예측 값과 실체 측정값의 차이를 의미하며, 이 차이를 수치화 하는 방식은 모델에 따라 여러 가지가 있습니다. 앞서 3.2.1 단원에서 선형 회귀 모델의 손실은, 평균오차제곱(MSE, Mean Squared Error)으로 수치화한다는 것을 배웠습니다. MSE는 자주 쓰이는 손실 수치화 방법 중의 하나입니다.
MSE와 함께 자주 쓰이는 손실이 크로스 엔트로피 손실(Cross Entropy Loss)입니다. MSE는 반응 변수가 애초부터 수치형 변수로 다양한 실수 값을 가질 수 있을 때 주로 사용하는 반면, 크로스 엔트로피는 반응 변수가 원래는 범주형 변수였는데 가변수를 도입하여 수치형 변수로 변환된 것인 경우에 주로 쓰입니다.
물론, 반응 변수가 범주형인 경우에는 앞서 배운 혼동 행렬을 사용할 수 있습니다. 그러나, 심층신경망 등 모든 변수가 수치형일 때만 활용할 수 있는 모델들이 있기 때문에, 범주형 반응 변수까지 전부 수치형으로 바꾼 다음 크로스 엔트로피 손실을 사용하는 것입니다. [표 3]은 MSE와 크로스 엔트로피 손실을 비교해서 보여주고 있습니다.
크로스 엔트로피 손실 중에서 반응 변수의 범주가 2가지인 경우를 특별히 이진 크로스 엔트로피 손실(Binary Cross Entropy Loss)라고 부릅니다. 이것은 분류 모델 성능 평가를 위해 가장 많이 쓰이는 지표 중의 하나입니다.
앞서 정확도와 손실 개념을 배웠고, 이를 통해 어떤 모델의 성능이 좋거나 나쁘다고 평가할 수 있게 되었습니다. 그런데 모델의 성능이 나쁘게 나온다면 그 다음에는 어떻게 해야 할까요? 우선 모델 성능이 낮은 원인을 파악해야 할 것입니다. 모델 성능이 나빠지는 원인을 논할 때 가장 중요한 개념이 과소적합, 과적합 개념입니다.
모델이 잘 학습되어 정확도가 높거나 손실이 낮은 경우를 “잘 맞춰졌다”는 의미로 굿핏(Goodfit)이라고 합니다. 과소적합(Underfit)과 과적합(Overfit)은 문자 그대로 각각 “덜 맞춰졌다”, “너무 맞춰졌다”는 뜻입니다.
Goodfit: 잘 맞춰졌다
Underfit: 덜 맞춰졌다 (과소적합)
Overfit: 너무 맞춰졌다 (과적합)
이들을 이해하기 위해서는 먼저 본 데이터(Seen Data)와 못 본 데이터(Unseen Data)의 개념을 알아야 합니다. 봤느냐 못 봤느냐의 주체는 모델입니다. 본 데이터는 모델 학습에 사용한 데이터를 말합니다. 못 본 데이터는 본 데이터와 동일하지 않으면서, 모델 학습 과정에 사용하지 않은 데이터를 말합니다. 본 데이터, 못 본 데이터와 비슷한 의미로 사용되는 단어들을 정리하면 다음과 같습니다.
본 데이터(Seen Data) ≒ 학습 데이터(Training Data)
못 본 데이터(Unseen Data) ≒ 테스트 데이터(Test Data) ≒ 검증 데이터(Validation Data)
손실과 관련하여, 본 데이터로 측정한 손실을 학습 손실(Training Loss), 못 본 데이터로 측정한 손실을 테스트 손실(Test Loss)이라고 부릅니다.
본 데이터와 못 본 데이터는 처음부터 정해져서 나오는 것이 아닙니다. 모델을 학습시키는 과정에서 전체 데이터 중의 일부는 모델에게 보여주고, 일부는 보여주지 않습니다. 왜 기왕 가지고 있는 데이터를 전부 모델에게 보여주지 않는 것일까요? 바로 ‘과적합’이라는 성능 저하 요인이 발생하는지 확인하기 위해서 입니다. 다음 예를 통해 살펴 보겠습니다.
[그림 1]은 x, y 두 개 변수로 구성된 데이터 셋을 가정하고, x를 예측 변수, y를 반응 변수로 하는 모델을 수립했을 때, 과소적합된 모델, 잘 적합된 모델, 과적합된 모델을 각각 보여주고 있습니다. 그림에 쓰인 데이터는 실험용으로 임의로 생성한 것으로, 고차 함수(Polynomial Function) 값에 랜덤 노이즈(Random Noise)를 섞는 방식으로 만들었고, 회색 점으로 이루어진 산포도로 나타나고 있습니다. 녹색 선으로 그려진 모델들은 고차 함수기반으로 복잡도를 높여가면서 만들었고, 그 내용 및 성능 평가 결과는 [표 4]와 같습니다.
표를 보면, 과소적합 모델은 잘적합된 모델에 비해 학습 손실, 테스트 손실 모두 큽니다. 이런 경우에 대한 주된 해결책은 모델 복잡도를 높이는 것입니다. 여기서 사용한 고차 함수 모델의 경우 함수의 차수만 높여주는 것으로 모델 복잡도를 높일 수 있습니다. 트리 모델의 경우 트리를 더 크게 만들면 되고, 신경망의 경우 뉴런이나 계층을 더 늘려주면 됩니다. 학습 방식이 시간을 들여 점진적으로 성능을 향상하는 방식일 경우[3] 학습 시간을 더 늘려주는 것도 방법입니다.
과적합된 모델은 잘 적합된 모델에 비해 학습 손실은 작으나 테스트 손실은 큽니다. 본 데이터에 너무 맞춰졌기 때문에 못 본 데이터에 대한 적응력이 낮다고 볼 수 있습니다. 여기 사례에서와 같이 모델이 노이즈까지 모두 패턴으로 인식해 학습해 버려서 모델이 이상한 방향으로 뒤틀린 것이라고도 볼 수 있습니다. 과적합에 대한 주된 해결책은 모델 복잡도를 낮추는 것입니다. 고차 함수 모델은 차수를 낮추고, 트리 모델은 나무 크기를 줄이고, 신경망은 뉴런 개수나 계층을 줄이면 됩니다. 점진적 학습 방식의 경우, 학습 시간을 줄이는 것도 방법입니다.
머신 러닝 모델은 일반적으로 그 복잡도가 높기 때문에, 여러분이 모델을 만들면서 주로 마주치는 것은 과적합 문제입니다. 과적합에 대한 해결책으로 모델 복잡도를 낮추는 것 외에 정규화(Regularization) 기법이 있습니다. 정규화란 과적합을 방지하기 위한 보조 알고리즘으로 각 모델 별로 여러가지가 개발되어 있습니다. 예를 들어 선형 모델에서는 릿지(Ridge), 라소(Lasso)등의 기법이 널리 쓰이고, 신경망에서는 드롭아웃(Dropout) 기법이 널리 쓰입니다.
데이터 과학 실무를 맡다 보면, 과적합이나 과소적합 개념 만으로 설명하기 힘든 모델 성능 저하를 자주 만나게 됩니다. 이런 경우는 애초에 데이터가 턱없이 부족한 것이 원인인 경우가 많습니다.
[그림 2]에서 왼쪽은 앞 단원에 과소적합/과적합을 설명하면서 사용했던 데이터입니다. 만약에 모델 학습에 사용하도록 주어진 전체 데이터가 오른쪽 그림과 같다면 어떻게 될까요? 데이터 과학자가 이런 데이터를 이용하여 아무리 잘 적합된 모델을 만들어낸다 해도, 실제 서비스에 배치된 모델은 좋은 성능을 내지 못합니다. 실제 서비스에는 왼쪽 그림과 같은 데이터들이 들어올 수 있기 때문입니다.
실무에서 데이터 과학자에게 턱없이 부족한 데이터가 던져지는 경우는 적지 않습니다. 이런 경우 주어진 데이터만 가지고 데이터 과학자가 할 수 있는 것은 별로 없습니다. 주어진 데이터가 애초에 어떤 현상을 설명하기에 충분한 수준인 지[4] 파악하는 것은 실무를 오래 수행하면서 익혀야 하는 감각 중의 하나입니다. 데이터가 부족하다면, 모델의 적합을 논하기에 앞서 데이터부터 채워야 합니다. 1.4 단원에서 말했듯이, 모델은 결국 데이터의 특징을 담아낸 것입니다. 데이터가 없으면 모델도 없습니다.
[1] 예에서 정확도가 높은데 나머지 두 지표가 낮은 이유는, 실험 데이터의 양성/음성 비율이 크게 차이가 나기 때문입니다. 실험 데이터의 대부분이 음성입니다. 이런 레이블 데이터 불균형은 현업에서 자주 발생하는 일이고, 이를 보완하는 방법도 있으나, 이 책에서는 다루지 않습니다.
[2] 앞의 예로는 "대량 살상 무기에 대해 양성 반응을 보이는 나라에 전쟁을 선포한다."라는 문제를 생각해 볼 수 있겠습니다. 뒤의 예로는 "한번 유출되면 조단위 피해가 발생하는 정보 보안 문제"를 생각해 볼 수 있겠습니다.
[3] 많은 학습 방식이 이러합니다. 예를 들어 경사하강법(Gradient Descent) 방식이 있습니다.
[4] 이 부분을 통계적으로 표현하면, “표본이 모집단의 특징을 고르게 반영하고 있는 지”입니다.