[C02 머신러닝 프로젝트 AtoZ]04 테스트 세트 만드는 방법 개선
무작위 샘플링으로 테스트 세트 만들기
방법1) data를 무작위로 섞은 다음 앞에서부터 test_ratio의 비율만큼 테스트 세트로 만든다.
- 문제: 위 섞기를 반복하면, 머신러닝 알고리즘이 전체 데이터셋을 보게 됨: 이런 상황은 피해야 함
- 즉, 항상 똑같은 테스트 세트가 만들어지도록 해야 함.
- 해결1) 테스트 세트를 만들 때 저장하고 다음번 실행할 때는 처음 만들어둔 것을 이걸 불러와서 쓰는 것
- 해결2) 항상 같은 난수가 생각되도록 np.random.permutation()을 호출할 때 괄호 안에 난수 발생기 초깃값을 지정하는 것
- 그래도 문제: 데이터세트가 업데이트되면 index 번호가 늘어나 랜덤추출이 의미가 없어짐 항상 일괄적으로 같은 결과가 보장되어야 함
방법2) 각 샘플마다 고유한 식별자(id)를 가지고 이를 사용하기
- 예를 들어 행의 인덱스를 가지고, 마지막 인덱스의 20%에 해당하는 녀석들을 테스트로, 나머지는 훈련 세트로
- 각 인스턴스의 id로 해시값을 계산하고 해시값의 마지막 바이트 값이 51(256의 20%)보다 작거나 같은 경우만 테스트 세트로 보낸다.
- 이렇게 하면 데이터세트가 업데이트되어도 기존 훈련세트의 영향을 받지 않을 뿐더러, 새로 추가된 데이터세트에서도 일괄적으로 20%의 테스트 세트를 생성할 수 있다.
방법3) sklearn의 train_test_split()을 사용하기
- train_test_split()은 기본적으로 75%:25%로 훈련세트와 테스트 세트를 나누지만, test_size, train_size 매개변수를 통해 비율을 조절할 수 있다.
위 무작위 샘플링들의 문제점
- 데이터셋이 충분히 크다면 문제가 없지만, 그렇지 않다면 샘플링 편향이 생김
- 예를 들어 설문조사시 1000명에게 질문을 하려면, 단순히 랜덤하게 1000명을 뽑는것이 아니라, 전체 인구를 대표할 수 있는 1000명을 선택하기 위해 노력해야 함
계층적 샘플링 도입
계층적 샘플링
- 전체 인구를 계층이라는 동질의 그룹으로 나누고, 테스트 세트가 전체를 대표하도록 각 계층에서 올바른 수의 샘플을 추출한다.
- 예를 들어 인구의 51.3%가 여성이라면, 샘플을 추출할때도 여성이 1000명의 샘플 중 513명이 되도록 하는 것
소득 카테고리를 잘 대표하는 샘플 뽑기
- 주택 가격을 예측하는데 소득이 중요하다고 판단(의뢰인이)했다면 - 소득 카테고리를 잘 대표할 수 있게 샘플을 뽑아야 한다
- 중간소득 히스토그램을 살펴보자
- 0부터 1.5 간격으로, 6 이상은 하나로 묶으면 적당할 것 같다
Leave a comment