1. 지도 학습과 비지도 학습
머신러닝 알고리즘은 크게 지도 학습과 비지도 학습으로 나눌 수 있다.
입력데이터만 있을 경우 비지도 학습 알고리즘을 사용한다
2. 훈련 세트와 테스트 세트
평가에 사용하는 데이터를 테스트 세트, 훈련에 사용되는 데이터를 훈련 세트라 부른다.
훈련에 사용한 데이터로 모델을 평가하는 것은 적절하지 않다.(정확도가 항상 100%가 나오므로) 훈련 데이터에서 일부를 떼어내어 테스트 세트로 사용해 평가해야 한다.
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.fit(train_input, train_target)
kn.score(test_input, test_target)
정확도가 0.0으로 샘플링 편향 오류 발생.
3. 샘플링 편향
마지막 14개를 테스트 세트로 사용할 경우 훈련세트에는 빙어가 하나도 들어 있지 않다. 빙어 없이 모델을 훈련하면 빙어를 올바르게 분류할 수 없다.
일반적으로 훈련세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우치는 샘플링 편향이 발생한다.
넘파이를 이용해 골고루 샘플을 뽑아서 훈련세트와 테스트 세트를 만들어야 한다.
넘파이
넘파이는 파이썬 대표적인 배열 라이브러리이다. 고차원의 배열을 손쉽게 만들고 조작할 수 있는 간편한 도구를 제공한다.
import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
대부분의 경우 행을 샘플, 열을 특성으로 둔다. shape()
속성은 행과 열 크기를 출력한다.
print(input_arr.shape) # 이 명령을 사용하면 (샘플 수, 특성 수를 출력합니다)
무작위로 샘플을 고를 때 주의해야 될 점은 input_arr와 target_arr은 함께 선택되어야 된다는 점이다.(빙어의 길이 속성이 도미의 속성으로 섞이면 안되므로) 아예 인덱스를 섞은 다음 input_arr와 target_arr에서 샘플을 선택하면 무작위로 훈련세트를 나누는 셈이 된다.
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
배열 인덱싱은 1개의 인덱스가 아닌 여러 개의 인덱스로 한 번에 여러개의 원소를 선택할 수 있다.
ex) a = up.array([5, 6, 7, 8]) -> a[[1, 3]] = 6, 7
train_input = input_arr[index[:35]]
train_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()
새로 만든 훈련세트와 테스트 세트로 k-최근접 이웃 모델을 훈련한다.
predict()
메서드로 테스트 세트의 예측결과와 실제 타깃을 확인한다. (predict 메서드가 반환하느 값은 단순한 파이썬 리스트가 아닌 넘파이 배열임을 유의한다.)
kn.fit(train_input, train_target) #우선 kn모델을 훈련한 후
kn.score(test_input, test_target) #훈련 케이스와 다른 테스트 케이스로 평가
kn.predict(test_input)