본문 바로가기

딥러닝

모두의 딥러닝 (9) - 과적합 피하기

과적합을 설명하기 위해 먼저 세즈노프스키 교수의 광물 데이터를 설명하자면

1988년 그는 힌튼 교수가 발표한 역전파 알고리즘에 관심을 가지고 있어 은닉층과 역전파가 얼마나 큰 효과가 있는지 실험해보고파 광석과 일반 돌을 가져다 놓고 음파 탐지기를 쏜 후 그 결과를 데이터로 정리했다. 지금부터 세즈노프스키 교수가 만들어 공개한 음파 탐지기 데이터 정보를 이용해 광물과 돌을 구분하는 실험을 해보자!

Index가 208개이므로 총 샘플의 수는 208개!

 

 

dtypes에서 보이는 것처럼 부동소수 형태(float64)의 60개 속성과 1개의 클래스(object)가 있다.

현재 학습한 결과 학습셋 안에서 학습을 한 결과 99%의 예측 정확도를 보이고 있다. 하지만 이렇게 학습셋에만 집중을 하면 새로운 데이터에 적용을 해도 현재만큼의 예측 정확도를 보여주지 못하고 이미 학습을 이 학습 데이터셋에 너무 맞춰지는 상황(과적합)이 일어난다.

그래서 학습을 하는 데이터셋과 이걸 시험해볼 테스트셋을 완전히 구분한 후 학습과 동시에 테스트를 병행해야함!

예를 들어 데이터셋이 총 100개의 샘플로 이루어져있고 70개를 학습셋, 30개를 테스트셋으로 나눠 학습을 한다면 신경망을 만들어 70개의 샘플로 학습을 진행 후 결과를 저장하는데 이 파일을 '모델'이라고 부른다. 모델은 다른 셋에 적용할 경우 학습 단계에서 보여줬던 그대로 다시 수행하므로 나머지 30개의 샘플로 실험해 나온 정확도를 보고 학습 상태 확인!

주어진 데이터를 학습셋과 테스트셋으로 나누는 함수sklearn 라이브러리의 train_test_split()함수!

보는 거와 같이 train_test_split함수를 통해 전체 데이터중 테스트셋의 비율(=0.3)을 정해 모델을 실행하는 부분에서 만들어진 학습셋으로 학습(model.fit())을, 테스트셋으로 테스트(model.evaluate())를 했다.

 

테스트셋으로만 실험을 해본 결과 아까 학습셋을 100%으로 실험한 예측률과 차이가 난다! 

결국 테스트를 더 정확히 설정해야 밖에서도 더 잘 작동할 수 있는데 이건 필요한 데이터가 충분하다는 전제하에 일어난다. 결국 데이터가 충분하지 않으면 좋은 결과를 내기 어려운데 이렇게 데이터의 70%를 학습셋으로 사용해야돼서 테스트셋으로 사용하는 데이터 비율은 30%밖에 안된다. 이 정도로는 실제로 얼마나 이 모델이 잘 작동하는지 확신할 수 없다.

이러한 단점을 보완하고자 만든 방법이 바로 K겹 교차 검증(k-fold cross validation)!

k겹 교차 검증이란 데이터셋을 여러 개로 나누어 하나씩 테스트셋으로 사용하고 나머지를 모두 합해서 학습셋으로 사용하는 방법이다. 예를 들어 5겹 교차 검증을 하면 100%의 데이터셋을 5등분해서 처음에는 1번째의 데이터셋을 테스트셋, 2~5번째의 데이터셋을 학습셋으로 실행시키고 다음에는 2번째의 데이터셋을 테스트셋으로 실행시켜 계속 반복하는 것!(sklearn의 StratifiedKFold()함수)

딥러닝이 잘 구동되는걸 확인할 수 있고 실행 후 10번의 테스트 값들이 출력된다!

이번 장에서는 모델에 대해 배웠는데 우리는 최고의 모델이 필요하므로 최고의 모델 단 하나만 있으면 된다! 다음 장에는 최고의 모델만 저장하는 방법에 대해 배워보자!