머신러닝 알고리즘은 지도 학습
(supervised learning)과 비지도 학습
(unsupervised learning)으로 나눌 수 있다.
지도학습은 학습 알고리즘을 위한 데이터와 정답이 필요하다.
지도학습
에서 생선의 길이와 무게는 입력
(input)과 타깃
(target)이라 하고 이 둘을 합쳐 훈련 데이터
(training data)라고 부른다.
지도 학습
은 정답이 있으니 알고리즘이 정답을 맞히는 것을 학습한다.
비지도 학습
은 정답이 주어지지 않고 입력 데이터만 사용한다.
이런 종류의 알고리즘은 정답을 사용하지 않으므로 무언가를 맞힐 수 없다.
(대신 데이터를 파악하거나 변형하는데 도움을 준다.)
훈련 세트
(train set)는 모델을 학습시킬 때 사용하는 데이터이고 테스트 세트
(test set)는 모델의 성능을 평가할 때 사용한다.
일반적으로 준비된 데이터 세트의 일부를 떼어내어 사용한다.
(만약 훈련 세트로 학습을 시키고 훈련 세트로 성능을 평가한다면 무조건 100%가 나올 것이다)
하나의 데이터를 sample
이라 부른다.
이제 생선의 두 class를 두 개의 feature(길이, 무게)로 나눈 후 학습 및 정확도 계산을 진행합니다.
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: 45, test: 14 나누기 train_input = fish_data[:35] train_target = fish_target[:35] test_input = fish_data[35:] test_target = fish_target[35:] kn.fit(train_input, train_target) # 훈련 kn.score(test_input, test_target) # 정확도 0
scroe는 0이 나온다.
score가 0이 나오는 이유가 뭘까? fish_length, fish_weight를 유심히 보면 알겠지만 앞에서 35개는 도미, 14개는 빙어의 샘플이 존재했기 때문이다.
도미 데이터만 학습하고 빙어로 테스트를 했기 때문에 당연한 결과이다.
이를 두고 샘플링 편향
이라 부른다.
이를 위해 numpy
를 사용해야한다. 샘플링 편향
을 일으키지 않기 위해 샘플을 임의로 뽑아
train set과 test set을 추출하는 과정을 알아보자
(배열을 섞은 후 나누는 방식과 무작위로 샘플을 고르는 방식이 있다. 후자를 택한다.)
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, test set 나누기 35, 14 train_input = input_arr[index[:35]] train_target = target_arr[index[:35]] 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.fit(train_input, train_target) kn.score(test_input, test_target) # 정확도 print(kn.predict(test_input)) # 샘플 예측 print(test_target) # 기존 샘플과 비교
위와 같이 train set과 data set이 나뉘어진 것을 확인할 수 있다.