티스토리 뷰
훈련 세트와 테스트 세트
- 지도 학습: 데이터와 타깃(boolean으로 이루어진 결과값)을 주고 모델을 지도해 학습시키는 방법
- 비지도 학습: 데이터만 주어지고, 비슷한 데이터끼리 묶는 등 지도적인 방법 없이 학습시키는 방법
- 강화학습: 주변 환경에서 행동에 대한 피드백을 받아 개선시키는 학습 방법
훈련에 사용한 데이터를 그대로 테스트에서도 사용하면 모델은 100%의 완성도를 보여준다. 연습 문제가 그대로 시험 문제로 나온 상황과 동일하다. (전혀 테스트가 되지 않는다는 뜻이다.) 그러므로 훈련에 사용할 데이터셋과 테스트에서 사용할 데이터셋은 꼭 분리해서 사용하도록 한다.
이전에 포스팅했던 1강과 동일한 코드에서 훈련 데이터셋, 테스트 데이터셋만 바꿔준 다음에 다시 실행해보았다.
하지만 이번에는 '샘플링 편향'이라는 문제가 발생했다. 아까전에 35개의 도미와 14개의 빙어가 차례로 정렬된 49개의 데이터에서 35개, 14개로 나누었기 때문에 훈련 세트에는 도미 데이터만, 테스트 세트에는 빙어 데이터만 존재한다. 다시 말해서 데이터가 한쪽으로만 편향되어 잘못 학습될 수 있다는 뜻이다. 그러므로 두 데이터셋에는 적절한 비율로 데이터가 섞여있어야 하고, 지금부터 데이터를 라벨링할 수 있는 방법에 대해 자세히 알아보고자 한다.
- numpy 라이브러리
numpy 배열을 만들어주는 라이브러리인 것 같다. array() 메소드로 배열을 생성한다.
배열을 사용하기 전에 아까 말했던 샘플링 편향이 생기지 않도록 데이터 값을 마구 섞어줘야 한다. arange(49) 메소드로 0~49까지의 인덱스 리스트를 생성한 다음, shuffle 메소드로 인덱스 리스트를 섞어주었다. 그림 속 빨간 글씨의 리스트가 배열 리스트를 섞은 결과를 의미하는데, 앞의 35개 인덱스가 가리키는 데이터를 train 용도로, 이후의 데이터를 test 용도로 사용할 것이다.
scatter 함수로 데이터셋의 결과를 확인하면, 이전과 다르게 테스트 데이터와 훈련 데이터가 적절히 섞여 있는 것을 확인할 수 있다.
결과
데이터 전처리
우리가 만든 모델에 150g, 25cm의 도미를 넣는다면 과연 빙어로 예측할까? 아니면 도미로 예측할까?
numpy 라이브러리를 사용해서 두 리스트를 합쳐 하나의 배열을 만들자. column_stack() 메소드는 주어진 배열들을 열로 여기고 세로로 데이터를 넣어 새로운 배열을 생성한다.
이제 훈련 데이터를 만든다. concatenate()는 두 배열을 합쳐주는 메소드이고, ones()은 1로 이루어진 배열을, zeros()는 0으로 이루어진 배열을 손쉽게 만들어준다.
사이킷런의 train_test_split() 메소드를 사용하면 파라미터로 주어진 데이터 배열을 적절히 섞어 train dataset과 test dataset으로 쉽게 나눌 수 있다. stratify 칸에 타겟 데이터를 함께 넣어주면 타겟과 일반 데이터가 골고루 섞인 데이터셋을 얻을 수 있다.
그럼 이제 이 데이터셋으로 150g, 25cm의 물고기가 무엇인지 예측해보자. 우리가 만든 모델은 [0.]이라는 결과값을 출력하는데, 이 결과값의 의미는 이 물고기가 빙어라고 예측된다는 것이다. kn.kneighbors() 메소드로 주변 k개의 데이터를 확인해보면 가장 가까운 5개의 데이터 중에서 빙어 데이터가 4개라는 사실을 확인할 수 있다. -> 마름모꼴.
우리가 그래프를 육안으로 보면 위에 있는 도미 데이터들이 빙어 데이터들보다 더 가깝다고 느낄 것이다. 하지만 우리가 그래프의 x축과 y축 scale을 다르게 설정했기 때문에 그렇게 보이는 것이다. 두 축의 scale을 동일하게 설정하면 오른쪽 아래와 같은 그래프가 나타나고 빙어 데이터들과의 거리가 도미보다 더 짧다는 결과를 확인할 수 있다.
더 가까운 물고기를 고르는 기준을 바꾸기 위해서 사용할 수 있는 첫 번째 해결 방법은 표준 점수다. 표준 점수는 (특성 - 평균) / 표준편차를 의미하며 현재 머신러닝에서 데이터 전처리로 가장 많이 사용되는 기법이다. 가장 먼저 numpy의 mean() 함수로 훈련 데이터셋의 평균값과 std() 함수로 표준편차를 구한다. 그 다음, 훈련 데이터에 평균을 빼고 표준편차로 나누어 표준 점수를 준비한다.
훈련 데이터의 표준 점수를 구했다면 타겟 데이터도 똑같은 방식으로 표준점수를 구한다. 이렇게 얻은 표준 점수를 그래프에 표시하면 처음의 knn 방식과 비슷한 위치에 데이터들이 위치하게 된다.
test 데이터셋도 표준점수로 변환해서 사용한다. 그래프를 그려보면 타겟 데이터와 가장 가까운 5개의 데이터가 모두 도미 데이터로 출력된다. 이렇게 스케일을 조정하는 전처리 과정으로 모델의 정확도를 높여 문제를 해결해 보았다.
'DIARY' 카테고리의 다른 글
[헤드퍼스트 디자인패턴] 2. 옵저버 패턴 (0) | 2022.07.27 |
---|---|
Flutter Game Engine (+ 인터페이스 계층 설계) 스터디 회고 (0) | 2022.06.27 |
자바로 배우는 리팩토링 입문 - 유키 히로시 리뷰 (3) [END] (0) | 2022.04.12 |
자바로 배우는 리팩토링 입문 - 유키 히로시 리뷰 (2) (0) | 2022.04.12 |
자바로 배우는 리팩토링 입문 - 유키 히로시 리뷰 (1) (0) | 2022.04.11 |
- Total
- Today
- Yesterday
- 백준27211
- linuxtouch
- SELECT #SELECTFROM #WHERE #ORDERBY #GROUPBY #HAVING #EXISTS #NOTEXISTS #UNION #MINUS #INTERSECTION #SQL #SQLPLUS
- GithubAPI
- awk프로그램
- virtualbox
- whatis
- 버추억박스에러
- cat
- linux파일
- 백준
- Linux
- atq
- api문서
- 쇼미더코드
- 코테
- OnActivityForResult
- E_FAIL
- 리눅스cron
- linuxawk
- Baekjoon27219
- 사용자ID
- 리눅스
- 백준27219
- Baekjoon27211
- GitHubAPIforJava
- 버추억박스오류
- baekjoon
- cron시스템
- linuxgedit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |