Train Data / Valid Data / Test Data

 

우리가 지금 청소기를 개발하고 있다고 가정하자. 나는 적은 에너지로 흡입력을 높이는 방법을 연구했고 개발했다. 그것을 실제로 청소기에 적용하고자 하여 팀을 꾸렸고 우리 팀은 시제품으로 나갈 청소기를 만들었다. 청소기가 완성되었으니 우리의 일은 끝난걸까? 그렇다면 정말 좋겠지만 우리는 이것이 우리가 원하는대로 제대로 작동하는지 테스트를 해봐야한다. 만약에 우리가 원하는대로 작동하지 않는다면, 원인과 이유를 찾아 내 우리가 원하는대로 작동하도록 만들어야한다.

 

수집한 데이터를 Train용과 Test용으로 나누었다.

 

인공지능도 마찬가지이다. 성능이 원하는만큼 나오는지에 대해 테스트를 해야만한다. 특히 인공지능은 여러 개의 데이터의 유사성과 관계성을 파악하여 알고리즘을 만들기 때문에 테스트가 반드시 필요하다. 학습시킨 데이터로는 정확도가 90% 이상이 나오지만 실제로 처음보는 테스트 데이터에서는 정확도가 60%가 나올 수도 있기 때문이다. (지금 내가 하고 있는 프로젝트가 그렇다 개빡쳐)

 

 


 

 

LG 에어컨의 유명한 일화로, 사람의 음성을 인식하는 AI 에어컨을 만들어 최종 컨펌을 받으려고 했으나 표준어로 학습시킨 AI에 '니 뭐꼬' 를 투척시켜 다양한 사투리를 재학습시킨 일화처럼 (개발자의 눈물이 여기까지 느껴지는 일화) 제품이 실제로 상용화되기전에는 테스트 단계가 반드시 필요하다. 이 LG의 일화같은 경우는 밑처럼 이해할 수 있다.

 

수집한 데이터를 Train / Valid / Test 로 나누었다.

 

개발자들이 표준어(Training Set)로 열심히 학습 시켰고, '너의 이름이 뭐니', '넌 누구니', '당신의 이름은 무엇입니까'와 같은 표준어의 데이터들(Validation Set)로 모델의 성능을 파악했지만 부회장의 '니 뭐꼬'(Test Set) 앞에 무너져 다시 처음부터 Train Data를 재수집하여 새롭게 학습시키는 결과가 나타났다. 이게 올바른 예시라고 볼 수는 없겠으나 어떻게든 Train Data / Valid Data / Test Data 에 대해 이해시키려는 노력으로 받아주길 바란다.

 

예로 든 LG 에어컨의 상황같은 경우를 찬찬히 살펴보자면 개발자들은 Train Data와 Valid Data를 사용해 표준어를 잘 이해하는 인공지능을 만들었다. (그러니까 무려 부회장의 컨펌을 받으러 갔겠지) 아마 부회장이 서울분이셨다면 이 인공지능은 테스트마저 성공적으로 마무리 되었을 가능성이 높다. 이러한 생각은 Valid Data를 사용하는 이유와 밀접한 관련이 있다. Valid Data는 학습을 통해 만들어진 모델이 잘 예측하는지를 평가하기 위해서 사용된다. 이해를 쉽게 하기 위해 밑에 이미지를 참고하자.

 

loss, acc, val_loss, val_acc를 볼 수 있다.

 

우리는 Train Data를 통해 학습을 시켜 알고리즘을 만들기 때문에 당연히 Train Data로는 성능이 좋을 수 밖에 없다. 하지만 처음 보는 데이터에서 우리의 모델은 어떻게 작동될까? 그것을 알기 위해 만든 데이터가 Valid Data이다. 위의 경우는 Train Data의 성능이 좋은 것은 물론이고 Valid Data의 정확도도 평균적으로 95%인 꽤 괜찮은 모델이라고 볼 수 있겠다. 따라서 우리는 Valid Data를 통해 Test Data에서도 우리가 원하는 결과를 얻을 수 있음을 기대할 수 있다. (하지만 '니 뭐꼬'처럼 Test Data에서 예상치 못한 상황이 발생하여 정확도가 떨어지는 경우도 있다. 이런 경우는 눈물을 머금으며 새롭게 시작해야한다.)

 

 

loss, acc는 높지만 val_loss, val_acc가 낮은 경우

 

하지만 이런 경우는 어떤가? 학습시킨 Train Data에서의 정확도는 높지만 처음 보는 데이터인 Valid Data에서의 정확도는 현저히 떨어진다. 이런 경우는 Test Data로 검증을 하기도 전에 모델이 잘못되었음을 알 수 있다. 또한 이런 경우는 Train Data에 대해 Overfitting이 일어났을 가능성을 말해준다. 이렇게 Valid Data를 이용하면 Test Data로 가기 전에 모델을 검증하고 잘못된 부분을 유추하여 모델을 고칠 수 있다.

 

+) Overfitting이란 학습에 사용한 데이터에 지나치게 적합한 것을 의미한다. 우리의 인공지능은 학습된 데이터를 기반으로 새롭게 본 데이터에 대해서도 유추하여 예측해야하는데 학습된 데이터에 지나치게 적합되어 있으면 새로운 데이터에서 효과적인 성능을 나타낼 수 없다. 이런 경우는 정규화를 거치거나 Epoch를 줄여 Overfitting을 줄인다.

 

 


 

 

그런데 왜 Valid Data를 사용하는걸까?

 

지금까지 설명한 내용을 보면 이것들은 Test Data를 사용해서도 충분히 할 수 있는 일이라는 생각이 든다. 필자도 처음에는 그랬다. 하지만 Test Data는 말 그대로 Test이다. 이게 무슨 말이냐면, 시중에 나가기 직전에 하는 간단한 테스트정도라고 이해하면 되겠다. 시중에 나가기 직전이라함은, 모든 오류들을 잡은 모델을 말 그대로 간단히 테스트한다고 보면 되겠다. 따라서 이 Test Data는 모델의 성능에 영향을 미치지 않고 단지 최종적으로 모델의 성능을 평가한다. Valid Data같은 경우는 val_loss, val_acc 등을 통해 나타난 수치를 통해 모델을 새롭게 만들고 조정하는 역할을 한다.

 

 

약간 쳇바퀴도는 설명같다고 느낄 수 있겠다. 그렇다면 더 단순히 말하겠다. Valid Data는 Train Data의 일부로 개발자가 이미 정답을 알고 있다. 그래서 개발자는 val_loss, val_acc같은 값을 알 수 있다. 하지만 Test Data는 개발자가 정답을 알고 있지 않다고 가정한다. 정답이 없는 테스트용 데이터들을 이미 만들어진 모델에 적용시켜 예측한 정답 값을 만들면 개발자는 모르는 Test Data의 정답과 비교하여 최종적인 정확도를 나타낸다. 만약 Test Data에서의 정확도가 낮다면 개발자는 모델을 다시 만들어야겠으나, 모델을 다시 설정할 때 Test Data는 어떤것도 관여하지 않는다. 왜냐하면 답을 모르기 때문이다. 이것은 정말 말 그대로 단지 검증용이다. 여기서 Test Data의 정답을 알아내 모델에 적용하면 그것은 더 이상 Test Data가 아니고 Valid Data가 된다.

 

 

 


 

 

 

Cross Validation (교차 검증)

 

하지만 위와 같이 Train Data를 Train Data와 Valid Data로 나누는 것은 Train Data가 많은 경우이다. 하지만 Train Data가 충분하지 않은 경우에서 Train Data와 Valid Data로 나누는 것은 매우 비효율적인 짓이다. (애초에 학습시킬 데이터도 적어 죽겠는데 거기서 또 나누는거니까) 따라서 이렇게 데이터가 적은 경우에는 Cross Validation(교차 검증)을 사용한다. 

 

Hold out / 이미지 재탕

 

단순히 Train Data와 Test Data로 나누면 무슨 문제가 발생할까? 이것은 매우 간단한 방식이지만 앞서 말한것처럼 모델을 만드는데 Test Data가 도움을 주지 못하므로 적은 양의 Train Data로는 좋은 성능을 기대하기 어려울 것이다. 또 데이터양이 너무 적기 때문에 Train Data와 Test Data를 어떻게 나누느냐에 따라 모델의 성능이 천차만별로 달라진다.

 

 


 

 

그렇다면 위와 같은 경우를 피하기 위해, 가지고 있는 데이터를 모두 사용하여 모델을 생성하면 이 모델은 학습에 사용한 데이터에는 성능이 좋지만 새로운 데이터에 대해서는 성능이 나쁜 모델이 된다(Overfitting). 이런 것을 막기 위해, 적은 데이터로도 Overfitting을 방지하고 일반화할 수 있는 방법을 평가하는 모델 검증 기법이 바로 Cross Validation(교차 검증)이다.

 

또한 추가적으로 Cross Validation을 하면 Hyperparameter Tuning을 할 수 있다. 여기서 Hyperparameter란, KNN에서는 k, 나이브베이즈에서 laplace, 의사결정트리의 trials, SVM의 lambda와 gamma, 신경망의 learning rate와 hidden을 의미한다. Hyperparameter Tuning으로 최적의 파라미터를 찾을 수도 있다.

 

Cross Validation(교차 검증)은 Train Data와 Test Data로 한 번 나누는 것보다 더 안정적이고 뛰어난 동계적 평가 방법으로 데이터를 여러 번 반복해서 나누고 여러 모델을 학습한다. 교차 검증에는 여러가지 방법이 있다.

 

1. K-Fold

 

K-Fold

K-Fold는 Train Data Set을 K개로 나누고 나눈 K개 중 한 개를 Valid, 나머지를 Training 용으로 사용하여 학습한다. Train Data로 학습을 한 후 한 개의 Valid Data로 모델을 테스트하여 성능을 측정한다. 이 때의 성능 평가는 Valid Data를 통해 얻은 정밀도의 평균과 표준편차 등으로 평가 할 수 있다. 같은 방식으로 K개의 모델을 반복한다. 최종 성능은 각각의 모델들의 성능 평가의 산술 평균으로 나타낸다. K-Fold는 모든 데이터를 학습과 평가용으로 사용할 수 있기 때문에 적은 데이터로 높은 정확도를 얻을 수 있으나, 학습 속도가 느리다.

 

 

2. Stratified K-Fold

 

K-Fold 와 Stratified K-Fold

 

 

예를 들어 데이터가 000000000011111111112222222222 로 구성되어 있다고 하자. 이걸 기존의 K-Fold로 나눈다면 어떻게 될까. 무조건 성능이 좋지 않게 나올 것이다. 이렇게 데이터가 특이하게 나뉜 경우를 위해 Stratified K-Fold를 사용한다. Stratified K-Fold는 각 Fold의 데이터 분포를 같게 해준다. 예로 든 데이터 같은 경우는 0,1,2로 10개의 Fold가 구성될 것이다. 이렇게 되면 데이터가 편향되지 않아 원래의 K-Fold의 장점을 잘 살리며 학습될 것이다.

 

 

3. Leave One Out (LOO)

 

K-Fold 교차 검증에서 K가 데이터 개수와 같을 때를 Leave One Out (LOO)라고 한다. 즉, 데이터 한 개를 하나의 모델로 하여 K-Fold 교차 검증을 한다는 말이다. 만약 데이터가 0부터 9까지 총 10개라고 하면 각 모델은 0,1,2,3,4,5,6,7,8,9 하나씩만을 갖는 모델이 될 것이고 이 모델로 K-Fold를 진행한다는 뜻이다. 이것은 적은 데이터에서 효과가 있으나 데이터가 많아지면 매우 느려진다.

 

 

4. Leave P Out

 

LOO와 비슷하지만, 여기서는 P개 만큼을 제외하고 Train Set과 Test Set을 만든다. 즉, N개의 데이터에 대해 Train_size=N-P, Valid_size=P 로 모델을 만들고 총 N개의 데이터에 대해 만큼 연산한다. LOO보다 더 느리다.

 

 

 

5. Shuffle Split

 

Shuffle Split


반복 횟수를 Train Fold, Valid Fold 개수와 독립적으로 조절할 수 있다. 또 Train Fold, Valid Fold의 합을 전체 Fold의 수와 다르게 설정도 가능하다.

 

 

6. Bootstrap

 

계산하기 어려운 데이터들의 분산, 평균, 편차 등을 구하는 통계기법으로 모집단의 분포도를 알 수 없을 때 사용한다. 데이터 양이 적을 때 모델의 통계적 신뢰도를 높이기 위해 사용되며, 데이터 셋 내에서 복원추출 방법을 이용해 새로운 샘플을 만든다. 이런 방식으로 충분히 많은 샘플이 생기면 모집단의 통계치를 추정할 수 있다.

'인공지능 > 인공지능 이론' 카테고리의 다른 글

8. Regression (회귀)  (0) 2019.09.08
7. 머신러닝종류  (0) 2019.09.08
5. 타이타닉(3) / 학습모델설정  (0) 2019.08.26
4. 타이타닉 (2) / 전처리  (0) 2019.08.22
3. 타이타닉 / EDA (탐색적 자료 분석)  (0) 2019.08.22

+ Recent posts