머신러닝의 알고리즘
지도학습(Supervised learning)
훈련을 할 때 데이터와 정답으로 이루어진 훈련데이터를 이용하여 학습을 하게 하는 것
데이터 : 지도학습에서는 데이터를 입력이라 정의
정답 : 지도학습에서는 정답을 타깃으로 정의
특성: 입력에 사용된 값들을 특성이라 한다.
비지도학습(Unsupervised learning)
훈련을 할 때 데이터만 주고 학습을 시키는 것
훈련 세트와 테스트 세트
훈련세트
훈련에 사용되는 데이터
테스트 세트
평가에 사용하는 데이터
실습
이제 도미와 빙어를 구분하는 프로그램을 만들 것이다.
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_length는 물고기의 길이를 의미하는 데이터 배열이고, fish_weight는 물고기의 무게를 나타내는 데이터들의 배열이다.
fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1]*35 + [0]*14
fish_data는 for문을 활용하여 이차원 배열을 만들어 하나의 인덱스에 fish_length와 fish_weight을 구성하는 데이터이다.
fish_target은 fish_data의 정답으로써 도미의 개수는 35개, 빙어의 개수는 14임을 알려준다.
전체 데이터는 49개의 샘플이 있고, 사용하는 특성은 무게와 길이 딱 2개이다.
데이터의 처음 35개를 훈련세트로, 나머지 14개를 테스트 세트로 사용할 것이다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
이제 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier를 임포트한다.
그리고 임포트한 KNeighborsClassifier 클래스의 객체를 만든다.
train_input = fish_data[:35]
train_target = fish_target[:35]
test_input = fish_data[35:]
test_target = fish_target[35:]
훈련때 사용할 세트부터 설정을 해보자
fish_data 0 부터 34번째 인덱스까지의 데이터를 train_input으로 설정하고
fish_target 0 부터 34번째 인덱스까지의 데이터를 train_target으로 설정한다.
실제 테스트에 사용할 세트도 설정한다.
fish_data 35 부터 마지막 인덱스까지를 test_input으로 설정한다.
fish_target 35 부터 마지막 인덱스까지를 test_target으로 설정한다.
훈련세트로 fit()메서드를 호출해 모델을 훈련하고 테스트 세트로 score()메소드를 호출해 잘 되는지 평가를 해보자.
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
0.0
0.0이 나오는게 당연하다.
*현재는 fish_data의 처음부터 35개까지가 도미이고, 14개가 빙어의 데이터인데 이를 섞지 않으면 무조건 훈련할 시, 100%로 도미를 다 맞추고, 테스트 시 0%로 도미를 맞출 것이다. *
왜냐하면 훈련시 도미 데이터로만 훈련을 했기 때문에, 빙어 데이터만 있는 테스트 때는 하나도 맞추지 못한다
이게 바로 샘플링 편향이라는 것이다.
샘플링 편향
훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우쳤다는 의미로 샘플링 편향이라고 부른다.
이를 해결할 수 있는 라이브러리가 있다. 바로 numpy이다.
numpy란?
numpy는 파이썬의 대표적인 배열 라이브러리로 이를 이용하여 고차원의 배열을 손쉽게 만들고 조작할 수 있는 간편한 도구를 많이 제공한다.
import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr)
print(input_arr.shape)
[[ 25.4 242. ] [ 26.3 290. ] . . . [ 14.3 19.7] [ 15. 19.9]] (49, 2)
파이썬 리스트를 numpy 배열로 바꾸기 위해 numpy의 array() 함수에 파이썬 리스트를 전달한다.
또한 shape 속성이 있는데 이는 (샘플 수, 특성 수)를 나타낸다.
즉, 49개의 샘플 수가 있고, 특성 수는 2개가 있는 것을 shape속성을 통해 알 수 있다.
그런데, 배열을 무작위로 만들어 놓기 위해선 target_arr 변수 즉, 정답도 해당 인덱스에 해당하는 정답이어야 옳은 학습과 테스트를 진행할 수 있다.
index = np.arange(49)
np.random.shuffle(index)
numpy arange() 함수에 정수 N을 전달하면 0에서부터 N-1까지 1씩 증가하는 배열을 만든다.
이후 random패키지에 있는 shuffle로 주어진 배열을 무작위로 섞는다.
그러면 현재 index는0부터 48까지 49개의 숫자들이 들어간 배열이 만들어진 후, 랜덤으로 섞였다.
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
랜덤하게 섞인 0부터 34까지의 index 배열의 값이 input_arr배열의 인덱스로 들어가면서 train_input의 값을 정해주고 있다.
train_target도 마찬가지,
그다음 동일한 매커니즘으로 테스트 세트 14개를 만들어 준다.
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()
이제 학습한 것을 바탕으로 predict() 메서드를 사용하여 테스트 세트의 예측 결과와 실제 타깃을 확인해보자
kn.predict(test_input)
test_target
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
정답과 테스트의 결과가 동일하게 나온 것을 볼 수 있었다.
100%로 정답을 맞췄다.
'STUDY' 카테고리의 다른 글
[AI] 특성공학과 규제 (0) | 2022.11.06 |
---|---|
[AI] 선형회귀 (0) | 2022.11.06 |
[AI] k-최근접 이웃 회귀 (1) | 2022.11.06 |
[AI] 데이터 전처리 (0) | 2022.11.06 |
Discord 봇 (0) | 2020.04.23 |