이 포스팅은 혼자 공부하는 머신러닝 + 딥러닝 책을 공부하고 정리한 것 입니다.
마켓에서 팔기 시작한 생선은 도미, 곤들매기, 농어, 강꼬치고기, 로치, 빙어, 송어이다. 이 생선들은 물류 센터에 많이 준비되어 있다. 이 생선들을 프로그램으로 분류한다고 가정해 보자. 어떻게 프로그램을 만들어야 할까?
1. 도미 데이터 준비하기
머신러닝은 누구도 알려주지 않는 기준을 찾아서 일을 한다. 다시 말해 누가 말해주지 않아도 머신러닝은 '30~40cm 길이의 생선은 도미이다 라는 기준을 찾는다.
머신 러닝은 어떻게 이런 기준을 스스로 찾을 수 있을까?
35마리의 도미를 준비했다. 저울로 잰 도미의 길이(cm)와 무게(g)를 파이썬 리스트로 만들면 다음과 같다
bream_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]
bream_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]
첫번째 도미의 길이는 25.4cm, 무게는 242.0g 이고, 두 번째 도미의 길이는 26.3cm 무게는 290.0g 이다. 각 도미의 특징을 길이와 무게로 표현한 것, 이런 특징을 특성(feature)이라고 한다. 특성은 데이터의 특징이다.
두 특성을 숫자로 보는 것 보다 그래프로 표현하면 데이터를 잘 이해할 수 있고 앞으로 할 작업에 대한 힌트를 얻을 수도 있다. 길이를 x축 무게를 y축으로 정하고 각 도미를 이 그래프에 점으로 표시하는데 이런 그래프를 산점도(scatter plot) 라고 부른다.
import matplotlib.pyplot as plt
plt.scatter(bream_length,bream_weight)
plt.xlabel('length')
plt.ylabel('weigth')
plt.show()
2. 빙어 데이터 준비하기
smelt_length = [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]
smelt_weight = [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]
2개의 산점도를 한 그래프로 그리기
plt.scatter(bream_length,bream_weight)
plt.xlabel('length')
plt.ylabel('weigth')
plt.scatter(smelt_length,smelt_weight)
plt.show()
빙어도 도미와 비슷하게 길이와 무게가 비례하지만 늘어나는 정도가 조금 다르다. 이제 이 두 데이터를 스스로 구분하기 위한 첫 번째 머신러닝 프로그램은 만들어 본다.
첫 번째 머신러닝 프로그램
여기에서는 가장 간단하고 이해하기 쉬운 k-최근접 이웃(K-Nearest Neighbors)알고리즘을 사용해 도미와 빙어 데이터를 구분해 본다.
k-최근접 이웃 알고리즘을 사용하기 전에 준비했던 도미와 빙어 데이터를 하나의 데이터로 합친다. 파이썬에서는 다음처럼 두 리스트를 더하면 하나의 리스트로 만들어 준다.
length=bream_length + smelt_length
weight=bream_weight + smelt_weight
이제 length 와 weight 리스트는 다음과 같다
이 책에서 사용하는 머신러닝 패키지는 사이킷런 이다. 이 패키지를 사용하려면 다음처럼 각 특성의 리스트를 세로 방향으로 늘어뜨린 2차원 리스트를 만들어야 한다. (사이킷런은 머신러닝 패키지이며 2차원 리스트가 필요하다.)
fish_data=[[l,w] for l,w in zip(length,weight)]
print(fish_data)
생선 49개의 길이와 무게를 모두 준비했다. 마지막으로 준비할 데이터는 정답 데이터 이다. 즉 첫번째 생선은 도미이고, 두 번째 생성도 도미라는 식으로 각각 어떤 생선인지 답을 만드는 것이다. 왜 이런 작업이 필요할까? 머신러닝 알고리즘이 생선의 길이와 무게를 보고 도미와 빙어를 구분하는 규칙을 찾기를 원한다. 그렇게 하려면 적어도 어떤 생선이 도미인지 빙어인지를 알려 주어야 한다.
도미와 빙어를 숫자 1과 0으로 표현해 보자. 예를 들어 첫 번째 생선은 도미이므로 1이고 마지막 생선은 빙어이므로 0이 된다. 앞서 도미와 빙어를 순서대로 나열했기 때문에 정답 리스트는 1이 35번 등장하고 0이 14번 등장하면 된다.
fish_target=[1] * 35 + [0] * 14
print(fish_target)
이제 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsclassifier를 임포트 하고, 임포트한 KNeighborsClassifier 클래스의 객체를 먼저 만든다.
from sklearn.neighbors import KNeighborsClassifier
kn=KNeighborsClassifier()
이 객체에 fish_data와 fish_target을 전달하여 도미를 찾기 위한 기준을 학습시킨다. 이런 과정을 머신러닝에서는 훈련(training)이라고 부른다. 사이킷런에서는 fit()메서드가 이런 역할을 한다.
kn.fit(fish_data,fish_target)
fit() 메서드는 주어진 데이터로 알고리즘을 훈련시킨뒤 훈련한다.
사이킷런에서 모델을 평가하는 메서드는 score() 메서드 이다. 이 메서드는 0에서 1 사이의 값을 반환한다. 1은 모든 데이터를 정확히 맞혔다는 것을 나타낸다. 예를 들어 0.5라면 절반만 맞혔다는 의미이다.
kn.score(fish_data,fish_target)
--> 1.0 이 값을 정확도(accuracy)라고 부른다.
k-최근접 이웃 알고리즘
앞에서 첫 번째 머신러닝 프로그램을 성공적으로 만들었다. 여기에 사용한 알고리즘은 k-최근접 이웃이다. 이 알고리즘은 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용한다.
kn.predict([[30,600]])
predict() 메서드는 새로운 데이터의 정답을 예측한다. 이 메서드도 앞서 fit() 메서드와 마찬가지로 리스트의 리스트를 전달해야 한다.
이렇게 생각하면 k-최근접 이웃 알고리즘을 위해 준비해야 할 일은 데이터를 모두 가지고 있는게 전부이다. 새로운 데이터에 대해 예측할 때는 가장 가까운 직선거리에 어떤 데이터가 있는지를 살피기만 하면 된다. 단점은 k-최근접 이웃 알고리즘의 이런 특징 때문에 데이터가 아주 많은 경우 사용하기 어렵다. 데이터가 크기 때문에 메모리가 많이 필요하고 직선거리를 계산하는 데도 많은 시간이 필요하다.
사이킷런의 KNeighborsClassifer 클래스도 마찬가지이다. 이 클래스는 _fit_X 속성에 우리가 전달한 fish_data를 모두 가지고 있다. 또 _y 속성에 fish_target을 가지고 있다.
print(kn._fit_X)
print(kn._y)
몇개의 가까운 데이터를 참고하는지는 정하기 나름이다. 기본값은 5이고 n_neighbors 매개변수로 바꿀수 있다.
결론
도미와 빙어를 구분하기 위해 첫번째 머신러닝 프로그램을 만들어 보았다.
먼저 도미 35마리와 빙어 14마리의 길이와 무게를 측정해서 리스트로 만든다. 그다음 도미와 빙어 데이터를 합려 치스트의 리스트로 데이터를 준비한다.
이번에 사용한 머신러닝 알고리즘은 k-최근접 이웃 알고리즘이다. 이 알고리즘은 주변에서 가장 가까운 5개의 데이터를 보고 다수결의 원칙에 따라 데이터를 예측한다. 이 모델은 이 챕터에서 준비한 도미와 빙어 데이터를 모두 완벽하게 맞혔다.
이번 챕터에서는 KNeighborsClassifer 클래스의 fit(), score(), predict() 메서드를 사용해 보았다.
'Machine Learning > Basic' 카테고리의 다른 글
[3-3] 특성 공학과 규제 (0) | 2021.04.06 |
---|---|
[3-2] 선형 회귀 (0) | 2021.04.05 |
[3-1] k-최근접 이웃 회귀 (0) | 2021.04.05 |
[2-2] 데이터 전처리 (0) | 2021.04.04 |
[2-1] 훈련 세트와 테스트 세트 (0) | 2021.04.03 |