BLOG

인사이트/블로그

아주 쉽게 풀어쓴 Train, Validation, Test

루이
2022-03-10

요즘 열풍처럼 번지는 피트니스 문화.


남녀불문 피트니스에 대한 관심이 높아지고 있습니다_feat. 훈련 "Train"!


너도나도 건강한 라이프스타일을 시도하며 트레이닝 과정에 뛰어들고 있습니다. (저는 이것이 점점 먹고살기 힘들어지는 이 시대에 노력으로 그나마 바꾸는 게 가능한 내 몸에 투자하자는 생각이 굳어진 현상이 아닐까 합니다 건강 최고)


Train(훈련) 과정을 잘 거쳐야 좋은 성과를 낼 수 있다는 것은 비단 머신러닝에만 적용되는 것은 아닌가봅니다. 

Train set, Test set에서 Train을 '기차'로 잘못 해석하는 경우가 있어 '훈련'이라는 의미가 한번에 와닿으시도록 물꼬를 터봤는데요 (솔직히 처음 들으면 기차인지 훈련인지 헷갈리잖아요 저만 그래요?) 인공지능 머신러닝 모델이 지도학습을 하려면 우선 학습절차가 있어야 하므로 무조건 '트레이닝' 과정을 거쳐야 한다는 것, 이해 가시죠?

기계는 반드시 훈련을 거쳐 성능을 쌓아올린 후 그것을 평가하는 단계로 모델 완성을 해줘야 합니다.


Train set 와 Test set이 필요한 이유가 여기에 있어요. '학습-평가'는 필수적인 루틴입니다. 

그렇다면 Train과 Test가 정확히 무엇인지 데이터 예시를 통해 이해해보겠습니다. 또, #검증(Validation)과정은 무엇인지도 k-fold의 개념을 통해 알아보겠습니다.



Train set: 무에서 유로 가기 위해 요구되는 필수 데이터

80%는 학습량으로!


우선 앞선 Lending Club, Pitney Bowes 게시글에도 나와있듯 데이터는 Train set 과 Test set으로 쪼개져 모델링에 활용됩니다. 여기서 둘의 비율은 일반적으로 train:test = 80: 20 으로 할당됩니다. 학습량의 비중이 월등히 높죠. 원래 시험을 앞두고 긴 시간동안 여러 교재를 아우르며 준비하지만, 시험은 짧은 시간 내 몇 페이지로 보는 경우가 비일비재하잖아요?


Train set은 기계에게 a를 넣으면 b가 나온다는 공식을 알려주는 지침서입니다. 개념설명을 제공하는 교과서와 같다고 보시면 됩니다. 모델 개발 자체에 쓰이는 데이터이죠. 


쉽게 현 시국의 예시를 들어볼까요? 

여러분이 외출을 하고 돌아왔습니다. 다음날부터 기침을 하고 오한이 들어 덜컥 겁이 납니다. 바로 임시 선별소에 가서 검사를 하고 오죠. 다음날 다행히 음성결과가 뜹니다. 


코로나 증상은 다양합니다. '복통', '오한', '발열', '미각 상실', '두통', '기침' 등 여러 가지가 있는데, 어떤 사람은 별 증세가 없어도 코로나 양성이 뜨고, 어떤 사람은 모든 증상을 다 가지고 있는데도 음성이 뜹니다. 


신체적 증상과 질병 양성 여부의 관계를 알아보고 싶다고 할 때, 기계가 접하게 되는 첫 번째 자료이자 개념서가 바로 Train dataset입니다.

Covid-19 관련 데이터 예시를 보실게요. 여러분은 '나'에 해당합니다.


코로나 양성 머신러닝 분석 데이터

COVID-19 symptoms dataset.csv

 

이 데이터를 살펴보면 변수명을 제외하고는 전부 0과 1로 테이블이 채워져 있습니다. 가,나,다,라 그리고 마의 각자의 증상을 0또는 1로 표기한 것인데요, 기침을 하면 1, 기침이 없으면 0으로 나타낸 직관적인 값입니다.


파란색 칼럼이 바로 코로나 양성 또는 음성 여부를 알려주는 지표입니다. 우리가 알고 싶은 결과값이죠.

is_Positive가 우리의 타겟변수, 즉 y축 값이자 목표변수가 되는 것이죠.

양성(Positive)이면 1, 음성(Negative)이면 0으로 뜨는 형태를 가집니다. 


 이 데이터가 하나의 완성본이라고 보았을 때, 전체값을 통째로 학습을 시킨다면 기계가 시험을 볼 분량은 사라지고 맙니다. 시험지까지 이미 공부해버려서 답을 아는 상태가 된 것이죠. 


 따라서 학습 시작 전에 시험을 볼 분량을 미리 구비해 놓을 할 필요가 있습니다. 


코로나 머신러닝 데이터 학습세트

Train Set.csv


이렇게 80%를 떼어서 트레인 데이터를 통해 4가지 정보를 학습시킨 후, 남은 20%는 테스트 데이터로 남겨놓는 것입니다. '가~라'의 사례로 충분히 학습을 한 후, '마'는 과연 양성(Positive)일까 아닐까를 테스팅해보는것이죠. 


Test Set: 성능을 측정하기 위해 아껴두었던 데이터

20%로는 시험을 본다

 머신러닝 코로나 데이터분석 테스트세트

Test Set.csv


Train set를 떼어내고 남은 20%의 이 데이터가 바로 Test Set이 됩니다. 저 한줄짜리 데이터로 시험을 보게 되는 것이죠. 

'마'가 '기침'도 하고 '발열'증세가 있으며 '미각 상실',' 복통', '오한', '두통'을 모두 겪고 있다면 양성일까 아닐까? 를 예측하는 것이 Test set을 통해 기계가 푸는 문제입니다. 

is_Positive 칸을 비워놓고 기계가 답을 내도록 한 다음, 실제 답인 1과 비교합니다. (보시듯 정답은 양성이네요. 모든 증상이 있는데 음성일리가..너무 쉬웠네요.)


그런데 교과서만으로 학습한 후 바로 수능을 봤을 때 성적이 잘 나올 확률이 과연 얼마나 될까요? 

중간중간 모의고사를 봐주며 학습내용을 잘 이해했는지, 잘못 알았던 부분은 없는지 체크하는 과정이 필요하지 않을까요?

"교과서로 공부해서 서울대 갔어요"라는 학생은 가뭄에 콩 나듯 있는 것처럼, 우리도 인공지능 기계에게 단순 교과서만이 아닌 '모의고사'를 통해 자신의 성능을 체크하고 변수를 조정할 기회를 줘야 합니다. 

그래서 검증(validation) 세트가 필요합니다.


Validation Set: 검증 과정으로 성능을 측정할 기회를 미리 주겠다

이 친구도 학습에 관여할뿐, 직접 기계에 학습을 시키는 것은 아닙니다


검증 세트는 Train 세트과 Test 세트 사이의 괴리를 보완합니다. 학습을 시킨다기보다 학습한 내용을 말 그대로 검증하며, 머신러닝 모델에 있어서 성능을 검증하는 기회를 제공합니다. 


교과서만 읽다가 딱 한 번의 시험으로 평가 기회가 끝난다면, 새로이 업그레이드된 상태를 시험해보고 싶으나 더 이상 시험문제가 없어서 확인할 수가 없겠죠. 이런 안타까운 상황을 막고자 Validation(검증) 세트가 존재합니다.


※ 아일리스의 #다빈치랩스는 개발데이터와 검증데이터 분량을 자동으로 8:2로 나눠주는 기능을 제공합니다. 굳이 트레인 데이터를 직접 쪼개지 않아도 된다는 뜻입니다.  


머신러닝 학습세트와 검증세트의 분할

80:20으로 나뉜 개발(train):검증(validation) 데이터


검증 데이터는 테스트 데이터와는 절대 겹치면 안되겠죠? 그래서 학습 대기 중이던 '가~라'의 데이터를 가져와서 검증 분량을 또 따로 확보합니다.

보통 트레인(개발) 데이터와 검증 데이터도 8:2의 비율로 나누는데, 이번에는 자료의 칼럼수가 적다는 점을 고려해 60:20으로 나눠볼게요. 


학습세트에서 검증세트 떼오기 Train Set.csv 에서 검증 데이터를 떼어옵니다.

검증데이터세트 추출

Validation Set.csv

학습세트 더하기

Train Set(new).csv


학습량은 당장은 줄겠지만 검증을 통해 더 정교해진 모델을 구축할 수 있게 되므로 긍정적인 변화라고 볼 수 있습니다. 이런 것을 데이터 분할, 데이터 스플릿(data split)이라고 부릅니다. 


검증 방법의 대표적인 방법론: K-fold Cross Validation

종이를 K-1번 접으면 K개의 칸이 생깁니다. 그래서 K-fold 래요


검증 과정에서 가장 일반적으로 쓰이는 방법론은 K-fold Cross Validation( K-겹 교차검증)입니다. 

검증 데이터를 K개로 쪼개고, 각각 쪼개진 데이터 중 한 폴드(fold)는 테스트를 시키고 나머지는 학습을 시키는 방법인데요, 이렇게 하는 이유는 자료 추출의 균일성을 확보하기 위한 것에 있습니다. 데이터를 효과적으로 검증하고 업그레이드할 수 있다는 장점이 있죠. 


다빈치랩스 솔루션에서도 K-fold 교차검증을 실시합니다. 

검증세트 k-fold 설정

아주 작게 보이는 K-fold 기능....기본 fold는 3겹!

학습세트와 테스트세트의 분리 k-fold

k-fold의 진행방식. k개로 나눠 k번씩 학습. 공정하고 균일한 평가방식이다 이거야

그림출처 https://vvnn.tistory.com/m/5


위의 그림은 K=5로 설정했네요. 데이터를 5개의 폴드로 나눕니다. 그리고 이 폴드 중 하나를 골라 테스트시키고, 나머지 부분은 학습에 사용하죠. 이 과정을 폴드만 새로 바꿔가며 5번을 반복합니다. 한 마디로 데이터셋에 있는 모든 샘플이 테스트될 수 있도록 하는 것이죠. 


최종적으로는 모델 성능의 평균을 계산하여 총 성능값을 도출합니다. 


이 과정을 통해 얻을 수 있는 효과는 크게 두 가지가 있습니다. 

우선 과적합(overfitting), 즉, 데이터를 과하게 학습하는 것을 막을 수 있습니다. 

단지 트레인 데이터만으로 학습을 하고 시험을 본다면 트레인 데이터에 대해서만 빠삭하고 실제 테스트에서는 오차가 증가할 수 있어요. 

트레인 데이터는 결국 전체 데이터의 일부분에 속하기 때문에, 한 부분만 과하게 학습되면 전체적으로는 정확성이 떨어지는 결과가 나옵니다. 나무만 보다가 숲을 보지 못한다고 생각하시면 됩니다. 이것을 막기 위해서 검증 데이터로 미리 모의평가를 실시하는 것입니다. 


두 번째, 모델의 올바른 일반화 성능을 추정할 수 있습니다. 테스트로 바로 뛰어들기 전 성능을 검증할 수 있는 예비 단계를 마련하는 것이죠. 결론적으로 모델이 더 정교해지는 효과를 누리게 됩니다. 이미 검증 세트의 '라'의 결과가 0(음성)이라는 것을 알고 있지만 이것을 가려두고 맞혀 보면서 예측 정확성을 검토할 수 있도록 합니다.


validation set

Validation Set.csv




Train, Validation, Test를 다 하는 게 Train, Test만 하는 것보다 나아요

두 번 쪼개는 게 수고스러워서 그렇지


training set validation set test set

사진 출처: https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets


A와 B 둘 다 머신러닝 모델링에 사용되는 방법입니다. 그러나 A의 Training - Test 두 단계보다는 B처럼 Validation단계를 포함하는 것이 모델 성능 개선에 도움될 것입니다.


보통 학습에 사용되는 데이터와 테스트에 사용되는 데이터는 우리가 직접 따로 구비를 해야 합니다. 전체 데이터를 100이라 본다면 80대 20 분량으로 나누어 각각의 파일로 저장을 하고, 데이터 학습에는 80의 파일을, 테스트에는 20의 파일을 직접 업로드해야 한다는 것이죠.


이 상황에서 검증 데이터를 나누는 일까지 있으면 번거롭겠죠? 다빈치랩스는 트레인 데이터를 업로드하기만 하면 순수 학습에만 쓰이는 개발 데이터와 검증 데이터를 80대 20으로 알아서 나누어 줍니다. 한 마디로 트레인-테스트 데이터만 일차적으로 분할해 주면 된다는 말이죠.


한 번만 트레인 데이터를 학습시켜주면 알아서 척척 개발과 검증 과정을 책임지는 기특한 다빈치랩스


 개발, 검증, 테스트 세트의 각 존재 이유가 이해 되시나요? 


훈련은 순수 학습을 위해,

검증은 학습 내용을 검토하고 성능을 체크해보기 위해,

테스트는 개발-검증을 거친 모델의 최종 능력을 시험해보기 위해 존재합니다.


워낙 훈련과 검증이 혼용되는 경우가 많아 오늘 포스트를 통해 개념을 짚어보았습니다. 머신러닝의 기초 지식을 쌓는 데에 도움 되셨으면 좋겠습니다.


다음 포스트에는 머신러닝의 다양하고 흥미로운 활용 사례들을 잔뜩 담아 오겠습니다!