본문 바로가기
데이터사이언스/인공지능을 처음공부하는 사람들을 위한 글

머신러닝과 데이터분석에서 중요한 실험 설계1

by 미스터탁 2022. 9. 7.

저번 글에서 DS/AI를 위해서는 데이터가 무엇보다 중요하며, 신뢰도를 확보하기 위해서는 적절한 실험 설계가 동반되어야 한다고 강조하였다. 일반적으로 실험 설계를 하는 방법은 아래 그림과 같이, 우리가 가지고 있는 데이터를 학습/검증/테스트 데이터로 랜덤하게 (5:3:2 또는 4:3:3의 비율로) 나누고 실험하는 것이다. 

 

 

 

그러나 이는 데이터가 매우 많고 이상적인 상황인 경우에 해당하는 이야기이며, 데이터가 많지 않은 경우에는 학습/테스트만 (7:3, 8:2, 9:1의 비율로) 나누기도 한다. 결국 모델에 영향을 끼치는 것은 데이터의 수이기 때문에, 학습 데이터를 많이 늘리면 늘릴수록 모델의 성능은 자연스럽게 높아진다. 우리가 학습, 테스트의 데이터를 9:1의 비율로 나누었다고 가정을 해보자. 우리는 10회 또는 20회 이상 반복하여  평균 성능을 측정할 수 있다. 통계적으로 실험을 하는 횟수를 높이면 모든 관측치는 한번 이상씩 학습 데이터로 사용되고 테스트 데이터로 사용될 확률이 높아진다. 이를 확정적으로 수행하기 위한 방법이 k-fold 교차 검증(k-fold cross validation)이다.

 

k를 5로 정했다고 가정해보자. 그렇다면, 아래 그림처럼 전체 데이터를 5개의 fold로 랜덤하게 분할하고, 첫번째 fold를 검증 데이터로 사용하고, 나머지 네개의 fold를 학습데이터로 사용한다. 그리고 모형을 학습시키고, 첫번째 fold에 대해 예측을 하고 성능을 계산한다. 이를 각각 fold에 대해 5번 반복한다. 그러면, 우리는 각 fold가 4번 씩 학습에 사용되고 1번씩 검증 데이터로 사용된다라는 것을 확인 할 수 있다. 일반적으로는, 위 방식처럼 랜덤하게 분할하여 실험하는 방식보다 cross-validation 기법이 조금 더 신뢰도를 확보하는데 많이 사용된다. 그러나 이 또한, 랜덤하게 데이터를 k fold로 구분할때 마다 다르게 성능이 측정되기 때문에, 결국 위 방식과 마찬가지로 10회 또는 20회이상 반복하여 성능을 측정내는 것이 좋다.  

 

 

실험설계에서 중요한 것은 신뢰도를 확보하는 것인데, 위에서 언급한 바와 같이 랜덤하게 데이터를 나누고 반복 수행을 하여 정확한 모델의 성능을 측정하는 것이 중요하다. 하지만, 이보다 더 중요한 것이 있다. DS/AI을 처음 공부할 때 많이 놓치는 부분이며 필자 또한 처음 공부할때 실수 했던 부분이다. 실험 설계를 할때에 테스트 데이터는 우리가 절때 보지 못한 새로운 데이터라고 가정하여야 한다는 것이다. 이는 물론 매우 기본적이고 당연한 이야기 이다. 하지만, 우리가 현업에서 다루는 데이터는 우리가 머신러닝을 처음 배울 때 다루는 데이터와 같지 않을 가능성이 매우 높다. 

 

일반적으로 우리가 다루는 데이터는 행과 열로 이루어져있다. 행은 관측치를 의미하고, 열은 독립변수를 의미한다. 그리고 우리가 모델을 학습시킬 때에는 관측치들끼리 그리고 독립변수들끼리 독립이라고 가정을 한다. 그런데, 관측치끼리 독립이 아닌 상황이라면 어떻게 해야할까 ? 대표적인 경우가 시계열 데이터를 다룰때이다. 

우리가 주식 데이터를 분석을 해본다고 가정해보자. '삼성전자'의 주식 데이터가 30년치가 있고, 우리의 목표는 내일의 주가를 예측해서 돈을 버는 것이다. 그렇다면, 30년치의 데이터를 가지고 8:2로 랜덤하게 분할해서 학습시키고 테스트하여, 성능이 80%가 나왔을때, 우리는 과연 80%의 확률로 돈을 벌수 있다라고 말할 수 있을까?

 

 

반응형

 

 

우선, 전체 구간을 랜덤하게 8:2로 나누게 되면 모델을 학습할 때에 미래 정보가 들어가게 된다. 아래 그림처럼 (단순한 상황을 가정하였다) 빨간색이 학습데이터, 파란색이 검증 데이터라고 할 때, 검증 데이터를 예측하는게 무의미하다. 그 이유는, 미래의 주식을 가지고 과거를 예측한 꼴이 되기 때문이다. 혹자는 각각의 관측치를 독립적으로 만들면 되지 않느냐 라고 생각 할 수 있지만, 아무리 관측치를 독립으로 만들려고 해도 관측치끼리의 상관관계는 남을 수 밖에 없고, 이미 주식이라는 것 자체가 미래값에는 과거의 값이 반영되어 있기 때문에 무의미하다. 즉, 시계열 데이터를 다룰때 이와 같이 실험설계를 하면 무의미한 결과가 나온다. 이렇게 실험 설계를 하면 일반적으로 성능은 잘 나온다. 미래데이터로 과거를 예측했기 때문에 당연한 결과이다. 하지만 그 결과는 신뢰 할 수 없으며 실제로 쓸수 없는 모델이라는 것을 알아두자. 

 

그렇다면 우리는 이 문제에 대하여 어떻게 실험 설계를 진행해야 할까? 보통 이런 시계열 문제에 대해서는 window sliding validation 기법을 활용한다. Window size를 10으로 정하면, 아래 그림처럼 처음 10개의 데이터를 가지고 학습을 하고 그 다음 데이터를 예측한다. 

 

 

그리고 아래 그림처럼 1 time을 이동시켜서 2번째 데이터부터 11번째 데이터까지 학습을 시키고 12번째 데이터를 예측한다. 이를 데이터의 끝까지 반복하고, 모든 예측치에 대하여 오차를 구하고 평균을 낸다. 그러면 전 구간에 대하여 우리모델의 주식 예측 정확도를 구할 수 있다. 물론, 주식이라는 것은 변수가 많고, 상승 하락장마다 예측 성공률이 다를 것이기 때문에, 구간별로 예측 정확도를 보여준다면 조금 더 신뢰도를 높일 수 있을 것이다. 

 

 

이제 조금 더 깊게 들어가보자. 엄청나게 좋은 모델을 구축하여 삼성전자 주식의 상승/하락 예측 정확도 80%를 달성했다고 가정하다. 우리는 무조건 돈을 벌 수 있을 것인가? 이에 대해 대답을 하려면 조금 더 구체적으로 생각해 봐야 한다. 우리 나라 증시는 미 증시의 영향을 많이 받는다. 그렇다면, 미 증시의 변수를 넣어야 할 것인가? 대부분 Yes라고 할 것이다. 분명 미 증시에 관한 변수를 넣으면 예측 모델의 정확도는 준수하게 나올 가능성이 높다. 미 증시는 한국 시간으로 새벽에 장이 끝난다. 그렇다면, 미 증시에 관한 변수가 삽입되고 삼성전자의 주식 예측은 언제 할수 있는가? 바로 한국 시간 새벽~아침, 바로 한국 증시가 시작되기 전이다. 주식을 하는 사람들은 알것이다, 이는 의미가 없다는 것을. 오늘 한국 증시가 좋을지 좋지 않을지는 AI 모델이 아니여도 우리는 어느 정도 알 수 있다. 미 증시가 급등하면 한국 증시도 오르는 경향이 있고, 미 증시가 급락하면 많은 사람들이 한국 증시가 개장하기 전부터 벌벌 떤다 (한국 증시가 급락할걸 알기 때문에). 여기서 가장 큰 문제는 우리의 모델로 삼성전자 주식을 예측해서 오를 것을 안다고 하더라도, 살수가 없다. 증시가 개장함과 동시에 이미 가격이 오른 상태로 시작하기 때문에, 어제의 가격으로 사는 것이 불가능하다.

 

그렇다면, 현실적으로 우리가 돈을 벌기 위해서는 오늘 한국 증시가 끝나기 5분전에 모델 학습과 예측을 완료하여야하고 매수 또는 매도가 진행되어야 한다. 다시 한번 강조 하건데, 한국 증시가 끝나고 예측하는 것은 의미가 없다. 오늘 만원인 주식이 내일  2만원이 된다는 걸 알아도, 만원에 살수가 없기 때문이다. 한국 증시가 끝나기전에 모델을 만들어야 한다면, 결국 우리는 미증시의 변수를 넣을 수가 없다. 그렇다면 자연스럽게 모델의 정확도는 내려가게 된다. 만약 이와 같이 모델을 만들었음에도 불구하고 예측 정확도가 70% 이상이 나온다면, 장담컨데 떼돈을 벌 수 있을 것이다. 

 

지금까지 주식을 예로 들어 시계열 데이터를 다룰 때 실험 설계를 어떻게 해야하는지 다루어 보았다. 실험 설계에서 가장 중요한 것은, 테스트 데이터는 우리가 절대 보지 못한 새로운 데이터라고 가정하는 것이다. 더불어서, 모델을 만드는 목적과 실제 사용하는 것을 가정해보고 실험 설계를 하여야 하낟. 

 

반응형

댓글