일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 회귀
- supervised learning
- 머신러닝
- LG Aimers 4th
- deep learning
- 오블완
- PCA
- GPT-4
- LG
- 딥러닝
- 지도학습
- 해커톤
- regression
- AI
- LLM
- LG Aimers
- OpenAI
- 티스토리챌린지
- Classification
- Machine Learning
- ChatGPT
- 분류
- gpt
Archives
- Today
- Total
SYDev
Chapter 02-1: 훈련 세트와 테스트 세트 본문
지도 학습과 비지도 학습
- 지도 학습(supervised learning): 입력과 타깃을 전달하여 모델을 훈련한 다음 새로운 데이터를 예측하는 데 활용한다.
- 비지도 학습(unsupervised learning): 타깃 데이터 없이 학습한다. 따라서 입력 데이터에서 어떤 특징을 찾는 데 주로 활용한다.
- 지도학습에서 데이터와 정답을 입력(input)과 타깃(target)이라 부르며, 이 둘을 합쳐 훈련 데이터라 부른다.
훈련 세트와 테스트 세트
- 훈련 세트(train set): 모델을 훈련할 때 사용하는 데이터이다. 보통 훈련 세트는 크면 클수록 좋다.
- 테스트 세트(test set): 훈련된 모델을 평가할 때 사용하는 데이터이다. 보통 전체 데이터에서 20~30%를 테스트 세트로 사용하는 경우가 많다. 전체 데이터 크기가 커질수록 테스트 세트의 비율을 줄여도 충분해진다.
샘플링 편향
chapter 01-3에서 다루었던 모델을 훈련 세트(처음 35개)와 테스트 세트(나머지 14개)를 나누어 평가해보자.
fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0,
31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8,
10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0,
500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7,
7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1] * 35 + [0] * 14
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
train_input = fish_data[:35]
train_target = fish_target[:35]
test_input = fish_data[35:]
test_target = fish_target[35:]
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
그러나 위와 같이 균등하지 않게(훈련 세트에는 도미의 데이터만, 테스트 세트에는 빙어의 데이터만 들어감) 데이터를 나누면 다음과 같이 신뢰할 수 없는 정확도가 나오는 모델이 된다.
0.0
이처럼 훈련 세트와 테스트 세트에 샘플이 균등하게 섞여있지 않은 것을 샘플링 편향(sampling bias)이라고 부른다.
넘파이
- 넘파이(numpy): 파이썬의 대표적인 배열 라이브러리, 고차원 배열을 쉽게 만들고 조작할 수 있는 간편한 도구를 제공
import numpy as np #numpy의 import문
input_arr = np.array(fish_data) #파이썬 리스트를 넘파이 배열로 전환
target_arr = np.array(fish_target) #파이썬 리스트를 넘파이 배열로 전환
print(input_arr.shape) #(샘플 수, 특성 수) 출력
(49, 2)
문제 해결: 샘플링 편향
샘플링 편향을 numpy를 이용하여 쉽게 해결할 수 있다.
np.random.seed(42) #random하게 나오는 결과에 매겨진 시드
index = np.arange(49) #0부터 48까지 1씩 증가하는 인덱스
np.random.shuffle(index) #인덱스 순서를 무작위로 변형
print(index)
[29 38 2 45 44 39 22 43 10 0 18 30 48 33 21 4 24 32 12 31 20 23 26 42
14 15 40 41 9 36 11 47 17 28 37 5 46 3 35 16 13 34 7 6 27 19 1 25
8]
-> 0부터 48까지의 인덱스를 무작위로 섞음
train_input = input_arr[index[:35]] #배열 인덱싱, train_input에 random하게 섞인 35개의 index 순서로 input_arr의 샘플을 전달
train_target = target_arr[index[:35]] #배열 인덱싱, train_target에 random하게 섞인 35개의 index 순서로 target_arr의 샘플을 전달
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
-> 무작위로 섞인 index를 이용하여 균등하게 훈련 세트와 테스트 세트를 나눔(같은 index를 공유하기 때문에 input과 target 상관관계가 섞이지 않음)
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1]) #train_input에 저장된 첫 번째 특성이 x축, 두 번째 특성이 y축
plt.scatter(test_input[:,0], test_input[:,1]) #test_input에 저장된 첫 번째 특성이 x축, 두 번째 특성이 y축
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
-> 균등하게 섞인 훈련 세트와 테스트 세트(파란색이 훈련 세트, 주황색이 테스트 세트)
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
kn.predict(test_input)
test_target
1.0
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
-> 100%의 정확도, predict를 이용해 출력한 테스트 세트의 예측 결과와 실제 타깃이 일치
-> predict의 결과가 array()로 감싸 있는 것은 해당 값이 넘파이 배열이기 때문
참고자료
- 박해선, <혼자 공부하는 머신러닝+딥러닝>, 한빛미디어(주), 2022.2.4
'KHUDA 4th > 머신러닝 기초 세션' 카테고리의 다른 글
Chapter 03-2: 선형 회귀 (0) | 2023.08.03 |
---|---|
Chapter 03-1: k-최근접 이웃 회귀 (0) | 2023.08.03 |
[KHUDA 4th] 머신러닝 1주차 기초 세션 (08.02) (0) | 2023.08.03 |
Chapter 02-2: 데이터 전처리 (0) | 2023.07.30 |
Chapter 01-3: 마켓과 머신러닝 (0) | 2023.07.30 |