베짱이와 노는 개미

ML#3-테스트세트,훈련세트 본문

AI(머신러닝+딥러닝) 프로젝트

ML#3-테스트세트,훈련세트

jsistop16 2021. 8. 4. 23:53

오늘은 앞서 봤던 데이터들로 테스트세트와 훈련세트를 구성해보고

 

학습시킨후에 제대로 학습됐는지 확인까지 해보겠다

 

from sklearn.neighbors import KNeighborsClassifier

import numpy as np

 

fish_length = [25.426.326.529.029.029.729.730.030.030.731.031.0

                31.532.032.032.033.033.033.533.534.034.034.535.0

                35.035.035.036.036.037.038.538.539.541.041.09.8

                10.510.611.011.211.311.811.812.012.212.413.014.315.0]

fish_weight = [242.0290.0340.0363.0430.0450.0500.0390.0450.0500.0475.0500.0

                500.0340.0600.0600.0700.0700.0610.0650.0575.0685.0620.0680.0

                700.0725.0720.0714.0850.01000.0920.0955.0925.0975.0950.06.7

                7.57.09.79.88.710.09.99.812.213.412.219.719.9]

 

fish_data=[[l, w] for l,w in zip(fish_length, fish_weight)]

target_data=[0]*35 + [1]*14

 

kn = KNeighborsClassifier() #k-최근접이웃알고리즘 객체 생성

 

input_arr=np.array(fish_data)

target_arr=np.array(target_data)

 

index=np.arange(49)

np.random.seed(49)

np.random.shuffle(index)

 

train_input=input_arr[index[:35]] #훈련세트에서1~35번쨰로 설정(물고기 특성값)

train_target=target_arr[index[:35]] #훈련세트에서 1~35번째 설정(정답 값)

 

test_input=input_arr[index[35:]] #테스트세트로 36~49번째 설정(물고기 특성값)

test_target=target_arr[index[35:]] #테스트세트로 36~49번째 설정(정답 값)

 

kn=kn.fit(train_input, train_target) #학습시키기

 

kn.score(train_input, train_target) #훈련이 잘되었는지

 

print(test_target)

kn.predict(test_input) #새로운 데이터의 정답 예측

 

test_target

 

일단 코드를보면

 

bream과 smelt 길이 무게 데이터를 리스트형태로 저장해두고

 

fish_data라는 변수에 zip함수를 사용하여 bream, smelt배열을 2차원으로 바꿔준다

 

그리고 target_data라는 변수에 bream과 smelt를 구별하도록 0과 1로 구분해준다

 

target_data라는 변수는 기계가 제대로 학습했는지 확인하기위한 정답지 용도라고 생각해주면 된다.

 

코드의 큰 틀을 설명해보자면

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

일단 전체 데이터 개수 49개

 

이중 bream관련 데이터 35개 smelt관련 데이터 14개 -> fishdata

마찬가지로 정답지 용도인 target_data 1값 35개 0값 14개 -> targetdata

 

input_arr->fish_data를 넘파이를 사용하여 2차원 배열로 만들어놓은것

target_arr->target_data를 넘파이를 사용하여 1차원배열로 만들어놓은것(차이 없음)

 

index의 쓰임이 중요한데

 

만약 기계에 bream관련된 35개의 데이터를 가지고만 학습을 시키고

 

테스트는 smelt관련된 14개의 데이터로만 진행된다면 당연히 이 기계는 제대로된 효과를 낼수없다.

 

smelt관련된 데이터를 학습한적이 없는데 smelt만을 예측하라고 했기떄문!!

 

그래서 테스트용 데이터를 만들때는 무작위로 잘 섞어주는것이 중요하다.

 

그래서 index를사용하는것이다.

 

numpy모듈에 arange메소드로 0~48개의 정수를 받고

 

그 index값들을 shuffle 메소드로 랜덤으로 섞어준다.

 

그리고 이제 본격적으로 train용 데이터와 test용 데이터를 나눠준다

 

train용 데이터는 1~35번째 데이터로 구성

test용 데이터는 36~49번째 데이터로 구성

 

이떄 인덱스가 무작위로 섞여있는 상황이기 때문에 각각의 데이터순서에서 인덱스를 처음부터 불러주면

 

알아서 섞여있는 데이터가 호출되는 방식인것이다.

 

제대로 섞인 데이터를 마련하기위해서 index라는 기능을 거쳐서 구현하는것이다.

 

그리고 kn이라는 객체를 만들고 fit메소드를 통해 기계에 학습을해준다(35개의 훈련용 데이터 사용)

 

잘 훈련되었는지 score메소드 활용

 

predict() 메소드는 새로운 데이터를 예측해준다.

 

제대로 예측하는지 보기위해서 어떻게 해야될까 고민해보니

 

predict메소드의 결과값과 test_rarget의 값이 같은지를 보면 될것같다.

 

target데이터들은 프로그램이 생선을 문자로 구별못하기떄문에 0과1이라는 숫자로 구별하게끔 하기위한 장치이다.