머신러닝은 크게 지도 학습과 비지도 학습으로 나눌 수 있다.
지도 학습에서 데이터와 정답을 입력(input)과 타킷(target)이라고 하고, 이 둘을 합쳐 훈련 데이터라고 부른다.
입력에는 여러가지의 특성을 가진다. (길이, 무게)

타깃 데이터가 없고 예측하는 것이 아닌 입력 데이터에서 어떤 특성을 찾는데 사용된다.
머신러닝 모델을 학습하고 평가하는 데 사용되는 데이터의 일부분을 나타낸다.
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
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
# 훈련 세트
train_input = fish_data[:35] # 입력값 0~34번 인덱스
train_target = fish_target[:35] # 타깃값 0~34번 인텍스
# 테스트 세트
test_input = fish_data[35:] # 입력값 35에서 마지막 인덱스
test_target = fish_target[35:] # 타깃값 35에서 마지막 인덱스
# 모델 훈련
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
# 출력 0.0
데이터가 클래스 간에 불균형하게 분포되어 있기때문에 *샘플링 편향으로 해당 모델의 성능이 0.0이 출력된다.
💡 샘플링 편향
샘플링 편향은 훈련 세트와 테스트 세트가 대표적인 데이터를 포함하지 않을 때 발생한다.
넘파이는 다차원 배열을 다루는 파이썬 라이브러리로, 행렬 연산과 같은 작업을 효율적으로 수행할 수 있다.
넘파이를 활용하여 데이터를 배열로 변환하고 배열을 조작하여 훈련 세트와 테스트 세트를 구성한다.
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:]]
numpy를 사용하여 데이터를 무작위로 고르게 분포하게 하여 샘플링 편향을 해결한다.
#훈련 세트와 테스트 세트의 데이터가 고르게 분포하였는지 확인
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel('lenth')
plt.ylabel('weight')
plt.show()
# k-최근접 이웃 모델 훈련
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
# 예측
kn.predict(test_input)
# 출력 array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])

훈련 세트 : 파랑
테스트 세트 : 주황