| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
                            Tags
                            
                        
                          
                          - 회귀
 - Machine Learning
 - regression
 - 머신러닝
 - AI
 - PCA
 - ChatGPT
 - 분류
 - 해커톤
 - Classification
 - LG Aimers
 - LLM
 - 딥러닝
 - 오블완
 - 지도학습
 - OpenAI
 - LG Aimers 4th
 - supervised learning
 - 티스토리챌린지
 - deep learning
 - GPT-4
 - gpt
 - LG
 
                            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
 
728x90
    
    
  반응형
    
    
    
  '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 |