본문 바로가기

머신러닝 & 딥러닝

[혼자 공부하는 머신러닝] 02-1 훈련세트와 테스트세트

<핵심 키워드>

지도학습: 입력값과 타깃값이 존재해야 사용이 가능 (K-최근접 이웃 알고리즘도 지도학습에 속함)

 

비지도 학습: 타깃데이터가 없음, 예측하는게 아닌 입력데이터를 바탕으로 특징을 찾는데 적합함

 

훈련 세트: 모델을 훈련할 때 사용하는 데이터, 클수록 좋다

 

테스트 세트: 보통 전체 데이터의 20~30퍼센트만 활용, 전체 데이터가 엄청 크다면 1%만 써도 좋다.

 

사이킷런의 입력데이터와 출력데이터는 모두 넘파이 배열 형태로 나온다.

(행: 샘플, 열: 특성)

 

샘플: 배열 구성 요소

특성: 샘플 구성 요소 

 

<알아두어야 하는 코드>

np.arange(15): 일정한 간격의 배열을 만듬, 기본간격은 1   [0,1,2...14] 의 넘파이 배열이 만들어짐

 

np.random.shuffle(Mylist): Mylist의 배열 요소들을 무작위로 섞음

 

np.random.seed(42): 시드값을 고정해서 랜덤으로 돌려도 항상 같은 결과가 나오게 함

 

arr[[0,3]]: 넘파이 배열에서 0, 1, 2번의 샘플 3개를 가져옴, 일반적인 슬라이스가 아니라 ':' 이며, [[]] 중괄호가 두개 쓰임을 유의

 

 

 

 

아래는 전체 코드 입니다.

# https://bit.ly/hg-02-1
#%%
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 = [[길이,무게] for 길이, 무게 in zip(fish_length, fish_weight)]
fish_target = [1]*35 + [0]*14    # 물고기별 타겟값 설정




#%%
# K-이웃 알고리즘 사이킷런 클래스 불러오기 
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier(n_neighbors=5)

# 샘플링 편향 방지를 위한 섞기 자료 섞기 실행
import numpy as np

fish_data_arr = np.array(fish_data)
fish_data_target_arr = np.array(fish_target)

print(fish_data_arr.shape)    # (샘플의수, 샘플구성요소(특성개수)) 를 출력한다  (49마리, 2개의 특성)


np.random.seed(30)
random_index = np.arange(49)
np.random.shuffle(random_index)    # 인덱스 섞기 



train_sample = fish_data_arr[random_index[:35]]     # 넘파이 배열 또한 슬라이스 후 넘파이임
train_target = fish_data_target_arr[random_index[:35]]

test_sample  = fish_data_arr[random_index[35:]]    
test_target  = fish_data_target_arr[random_index[35:]]

print(type(train_sample))  # <class 'numpy.ndarray'>
# 넘파이 배열 슬라이스할때 :가 아닌 , 임을 기억하자 그리고 [[]] 2개임
print(fish_data_arr[[0,2]], '물고기 0,1번 샘플 가져오기')





#%% 
# 트레인셋과 테스트셋을 산포도로 그려보기
import matplotlib.pyplot as plt
plt.scatter(train_sample[:,0], train_sample[:,1])     # 이제 이해함 [:,0]의 의미는 모든 행에서 0번째 열을 가져온다는 의미(생선 길이)를 X축, 생선 무게를 Y축으로삼고 점 찍기
plt.scatter(test_sample[:,0], test_sample[:,1])
plt.xlabel('length')
plt.ylabel('weight')
plt.savefig('a.png')


# %%
# 이제 트레인셋을 학습시키고 테스트셋으로 평가 해보기
kn.fit(train_sample, train_target)
kn.score(test_sample, test_target)    # 전부 다 맞춤

kn.predict(test_sample)    # 테스트 입력값의 타겟값 리스트 출력됨
print(test_target)