혼자 공부하는 머신러닝 + 딥러닝 - 마켓과 머신러닝
생선 이름을 자동으로 알려주는 머신 러닝을 간단히 만들어보자.
도미 그룹의 길이와 무게, 빙어 그룹의 길이와 무게를 각각 생성한다.
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]
#도미 그룹의 정보
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]
#빙어 그룹의 정보
이제 이를 바탕으로 산점도를 그려보자. 산점도를 그리기 위해서 matplotlib 패키지의 pyplot 함수를 불러온다.
import matplotlib.pyplot as plt
plt.scatter(bream_length, bream_weight) #도미 그룹의 산점도
plt.scatter(smelt_length, smelt_weight) #빙어 그룹의 산점도
plt.xlabel('length') #x축의 제목을 설정
plt.ylabel('weight') #y축의 제목을 설정
plt.show()
이 두 데이터를 구분하기 위한 간단한 첫 번째 머신러닝 프로그램을 만들어보자.
첫 번째로는 k-최근접 이웃 알고리즘을 사용하여 만들어본다.
두 그룹을 하나의 그룹으로 합친다.
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
그 다음은 사이킷런 (scikit_learn) 패키지를 사용하는데, 이 패키지는 머신러닝 패키지이며 2차원 리스트 (배열)이 필요하다. 이 2차원 리스트를 만드는 과정을 거친다.
fish_data = [[a,b] for a, b in zip(length, weight)]
다음은 도미를 1, 빙어를 0 으로 표현하여 도미와 빙어를 리스트에 담아 표현한다.
fish_target = [1] * 35 + [0] * 14
이제 사이킷런에서 k-최근접 이웃 알고리즘을 구현하는 클래스인 KNeighborsClassifier를 불러온다.
그 후 객체를 먼저 생성한다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn이라는 객체에 fish_data와 fish_target을 전달하여 도미를 찾기 위한 기준을 학습시킬건데, 이런 과정을 머신 러닝에서는 훈련이라고 부른다. 사이킷런에서는 fit() 매서드가 이런 역할을 하게 된다. 학습을 시키고, kn이 잘 훈련되었는지 평가하는 과정을 거치게 되는데, 이때 사용하는 매서드는 score() 매서드이다. score() 은 0과 1사이의 값을 반환한다. 1은 모든 데이터를 정확히 맞혔다는 것이다. 정확도라고 부를 수 있다.
kn.fit(fish_data, fish_target)
kn.score(fish_data, fish_target)
1.0
만약 길이가 30, 무게가 600인 물고기는 어느 종류일까? 이를 알아보기 위한 매서드는 predict() 매서드로, 새로운 데이터의 정답을 예측한다.
kn.predict([[30,600]])
array([1])
즉, 30, 600의 물고기는 도미로 예측이 된다는 얘기다.
k-최근접 이웃 알고리즘은 새로운 데이터에 대해 예측할 때 가장 가까운 직선거리에 어떤 데이터가 있는지 살피기만 하면 된다. 그러나 데이터가 아주 많은 경우에는 사용하기 어려운 단점이 있다.
KNeighborsClassifier 매서드는 fit() 매서드에 전달한 데이터를 모두 저장하고 있다가 새로운 데이터가 등장하면 가장 가까운 데이터를 참고하여 분류하게 된다.
그리고 이 KNeighborsClassifier 클래스의 기본 값은 5로 5개의 데이터를 참고한다는 이야기이다. 이 기준은 n_neighbors 매개변수로 바꿀 수 있다.
그러면 참고 데이터를 49개로 바꿔서 생각해보자.
kn49 = KNeighborsClassifier(n_neighbors = 49)
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
0.7142857142857143
이 결과값은 전체 49마리 생선 중 35마리의 도미의 비중이므로 어떤 값을 넣든 도미만 올바르게 맞출 수 있다.