ML

[핸즈온 머신러닝 2판] 테스트 세트 만들기

Foo 2020. 9. 6. 05:15
728x90

본 포스팅의 내용은 핸즈온 머신러닝 2판의 p.85~p.90의 2.3.4 테스트 세트 만들기의 보충 설명을 포함하고 있습니다.

 

p.86을 보면 다음과 같이 train_set, test_set을 split한다.

 

이렇게 split한 test_set는 문제가 있다.

프로그램을 실행할 때마다 다른 test_set가 생성된다는 것이다.

첫번째 실행된 test_set
두번째 실행된 test_set

 

책에서는 2가지 해결책을 제시하고 있다.

1. test_set를 최초 1회 실행할 때 저장하고, 이후 실행시에는 이를 불러온다.(파일 형태이거나 DB에 넣거나)

2. np.random.permutation()을 호출하기 전에 seed를 지정하는 방법(ex. np.random.seed(42) )

 

하지만 저자는 이 두 가지 방법 모두 문제가 있다고 함.

어떤 케이스에서 문제가 발생하냐면, 데이터 이 업데이트가 되는 경우 문제가 발생한다.

사실 이 부분 설명하려고 포스팅을 했다.

 

다음과 같이 예시를 들어보겠다.

최초 10,000개의 데이터를 8:2로 나누어 2,000개를 test_set로 삼았다.

나는 이를 이용해 열심히 학습을 해서 모델을 만들어 내었다.

그런데 다음날 데이터가 추가되어 총 데이터가 20,000개가 되었다. 이를 위의 코드로 다시 나누게되면

8:2로 나누어, 이번에는 4,000개가 test_set이 된다.

 

여기서 문제가 발생한다.

1. 데이터의 양 자체가 달라져서 shuffle을 할 경우 기존에 train_set과 test_set이 뒤죽박죽이 된다.

2. 1에서 파생되는 문제일 수 있는데, 설령 기존 test_set에 있던 데이터가 모두 다시 test_set으로 들어왔다고 가정해도, 기존에 train_set에 있던 데이터가 test_set으로 들어오게 된다. 이는 test_set을 절대 들여다 보지 않아야하는 원칙에 위배되고, 이는 overfitting을 유발한다.

 

이를 피하기 위해 책에서는 unique하게 구분될 수 있는 id 값을 이용하여 해결하는 방법을 제시한다.