상세 컨텐츠

본문 제목

[혼자 공부하는 머신러닝+딮러닝]데이터 다루기 - 훈련 세트와 테스트 세트

AI

by 래모 2023. 10. 5. 20:58

본문

이 게시물은 혼자 공부하는 머신러닝+딮러닝 교재를 기반으로 작성되었습니다.

 

 

k-최근접 이웃 알고리즘

클래스를 통해서 구현하는데!

 

KNeighborsClassifier

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()

 

fit ()

kn.fit(학습할 데이터, 기준)

kn 객체에 데이터와 그 기준을 넘겨주면 이것들을 토대로 학습을 시킨다

러머신러닝에선 이런 과정을 훈련이라고 부른다

 

score ()

kn.score(테스트데이터, 평가 갈래혹은 기준?)

위 fit 메서드로 훈련시킨 것을 토대로 score 메서드를 이용하여 얼마나 잘 훈련되었는지 평가할 수 있다.

이 메서드는 0에서 1 사이의 값을 반환하며 1 데이터는 모든 데이터를 정확히 맞혔다는 것을 뜻한다.

 

 

 

지도 학습 비지도 학습

지도학습 : ( 데이터 = 입력 ) + ( 정답 = 타깃 ) = 훈련 데이터

 

입력으로 사용된 것들 = 특성

 

비지도 학습: 입력 데이터만

 

훈련 세트와 테스트 세트

머신러닝 알고리즘의 성능을 제대로 평가하려면 훈련 데이터와 평가에 사용할 데이터가 각각 달라야한다.

이렇게 하는 가장 간단한 방법은 평가를 위해 또 다른 데이터를 준비하거나 이미 준비된 데이터 중에서 일부를 떼어 내어 활용하는 것이다.(일반적으로 후자의 경우가 많음)

 

아무튼! 테스트 세트평가에 사용되는 데이터를 말하고 훈련 세트훈련에 사용되는 데이터를 말한다.

 

 

샘플링 편향

일반적으로 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우쳤다는 의미

 

책에서는 머신러닝을 훈련시킬 때 빙어 데이터 없이 도미 데이터만 훈련시켜 놓고 테스트세트에 빙어를 넣으면 분류할 수 없는 것을 예시로 들었다.

 


훈련 모델 만들기

다음과 같은 도미와 빙어의 길이와 몸무게 데이터가 있다

bream_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]
bream_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]
smelt_length = [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]
smelt_weight = [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를 만들어주었다

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

fish_data = [[l,w] for l,w in zip(length, weight)]

fish_target = [1] * 35 + [0] * 14 # 앞에서 35개는 도미 뒤에 14개는 빙어



고차원 배열을 손쉽게 만들고 조작할 수 있는 넘파이를 사용하여 배열 형태를 바꿔준다

import numpy as np

input_arr = np.array(fish_data)
target_arr = np.array(fish_target)

 

 

이후 도미와 빙어 데이터를 랜덤하게 섞고 훈련데이터와 테스트 데이터를 만들어준다

np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)

train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]] # 랜덤하게 섞은 걸 처음 35개만큼 가져옴

 

이 데이터를 확인해보면 도미와 빙어가 적절히 섞여 있다

plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])

plt.show()

 

이제 훈련시켜보자

kn.fit(train_input, train_target)

 

훈려시킨 것을 토대로 모델을 테스트 해보자

kn.score(test_input, test_target) # 1

 

 

그럼 이제 predict메서드로 테스트 세트의 예측 결과와 실제 타깃을 확인해보면!!

정확한 모델을 만들었다!!

 

관련글 더보기