머신러닝 알고리즘은 크게 지도학습(supervised learning) 비지도학습(unsupervised learning)으로 나눌 수 있다. 지도학습 알고리즘은 훈련하기 위한 데이터와 정답이 필요하다.
지도학습에서 데이터는 입력, 정답은 타깃이라고 하고 이 둘을 합쳐 훈련데이터라고 부른다.
k-최근접 이웃 알고리즘은 입력데이터와 타깃을 사용했으므로 지도 학습 알고리즘 이다.
머신러닝 알고리즘의 성능을 제대로 평가하려면, 훈련 데이터와 평가에 사용할 데이터가 각각 달라야 한다.
평가를 위해 또 다른 데이터를 준비하거나, 이미 준비된 데이터 중에서 일부를 떼어 내어 활용한다.
평가에 사용되는 데이터를 테스트 세트, 훈련에 사용되는 데이터를 훈련세트라고 한다.
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
#처음 35개를 훈련세트로 나머지 14를 테스트 세트로 사용
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
#훈련세트로 입력값 중 0부터 34번째 인덱스까지 사용
train_input = fish_data[:35]
#훈련세트로 타깃값 중 0부터 34번째 인덱스까지 사용
train_target = fish_target[:35]
#테스트 세트로 입력값 중 35번째 부터 마지막 인덱스까지 사용
test_input = fish_data[35:]
#테스트 세트로 타깃값 중 35번째 부터 마지막 인덱스까지 사용
test_target = fish_target[35:]
kn = kn.fit(train_input, train_target)
# train 샘플을 훈련세트로 선택
kn.score(test_input, test_target)
#test샘플로 평가
0.0
훈련세트와 테스트 샘플이 골고루 섞여있지 않아 샘플링이 한쪽으로 치우쳐진 샘플링 편향이 일어남
고차원의 배열을 손쉽게 만들고 조작할 수 있는 간편한 도구
import numpy as np
#리스트를 넘파이 배열로 바꾸기
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr)
[[ 25.4 242. ] [ 26.3 290. ] [ 26.5 340. ] [ 29. 363. ] [ 29. 430. ] [ 29.7 450. ] [ 29.7 500. ] [ 30. 390. ] [ 30. 450. ] [ 30.7 500. ] [ 31. 475. ] [ 31. 500. ] [ 31.5 500. ] [ 32. 340. ] [ 32. 600. ] [ 32. 600. ] [ 33. 700. ] [ 33. 700. ] [ 33.5 610. ] [ 33.5 650. ] [ 34. 575. ] [ 34. 685. ] [ 34.5 620. ] [ 35. 680. ] [ 35. 700. ] [ 35. 725. ] [ 35. 720. ] [ 36. 714. ] [ 36. 850. ] [ 37. 1000. ] [ 38.5 920. ] [ 38.5 955. ] [ 39.5 925. ] [ 41. 975. ] [ 41. 950. ] [ 9.8 6.7] [ 10.5 7.5] [ 10.6 7. ] [ 11. 9.7] [ 11.2 9.8] [ 11.3 8.7] [ 11.8 10. ] [ 11.8 9.9] [ 12. 9.8] [ 12.2 12.2] [ 12.4 13.4] [ 13. 12.2] [ 14.3 19.7] [ 15. 19.9]]
#(샘플수, 특성수)출력
print(input_arr.shape)
(49, 2)
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
#인덱스를 무작위로 섞기
index
array([13, 45, 47, 44, 17, 27, 26, 25, 31, 19, 12, 4, 34, 8, 3, 6, 40, 41, 46, 15, 9, 16, 24, 33, 30, 0, 43, 32, 5, 29, 11, 36, 1, 21, 2, 37, 35, 23, 39, 10, 22, 18, 48, 20, 7, 42, 14, 28, 38])
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
[13 45 47 44 17 27 26 25 31 19 12 4 34 8 3 6 40 41 46 15 9 16 24 33 30 0 43 32 5 29 11 36 1 21 2 37 35 23 39 10 22 18 48 20 7 42 14 28 38]
print(input_arr[13],train_input[0])
[ 32. 340.] [ 32. 340.]
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
1.0
kn.predict(test_input)
#테스트 세트에 대한 예측결과가 정답과 일치
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
test_target
#predict가 반환하는것은 넘파이 배열
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])