- 마켓과 머신러닝
- 첫번째 머신러닝 프로그램
- 정리
초보 엔지니어가 한 마켓에서 생선을 분류하는 문제를 머신러닝을 활용하여 해결해보기로 했다. 생선을 분류 하는 일이니 생선의 특징을 알면 쉽게 구분할 수 있다. 초보 엔지니어는 우선 가장먼저 크기로 분류하는 방법을 선택했다.
if fish_length >= 30:
print("도미")
30cm보다 큰 생선이 무조건 도미라고 할 수는 없는 문제가 발생했다. 이런 문제들을 머신러닝은 스스로 기준을 찾아서 해결할 수 있다.
이제 머신러닝 프로그램을 만들어보자. 가장 간단한 k-최근접 이웃(k-Nearest Neightbors)알고리즘을 이용한다. 이 알고리즘을 사용해 도미와 방어 데이터를 하나로 합쳐보자.
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
사이킷런(scikit-learn)이라는 패키지를 사용하려면 각 특성의 리스트를 세로 방향으로 2차원 리스트를 만들어야 한다.
파이썬의 zip()함수를 이용하면 쉽게 2차원 리스트로 만들 수 있다.
fish_data = [[l,w] for l, w in zip(length, weight)]
print(fish_data)
결과
[[25.4, 242.0], [26.3, 290.0], [26.5, 340.0], [29.0, 363.0], [29.0, 430.0], [29.7, 450.0], [29.7, 500.0], [30.0, 390.0], [30.0, 450.0], [30.7, 500.0], [31.0, 475.0], [31.0, 500.0], [31.5, 500.0], [32.0, 340.0], [32.0, 600.0], [32.0, 600.0], [33.0, 700.0], [33.0, 700.0], [33.5, 610.0], [33.5, 650.0], [34.0, 575.0], [34.0, 685.0], [34.5, 620.0], [35.0, 680.0], [35.0, 700.0], [35.0, 725.0], [35.0, 720.0], [36.0, 714.0], [36.0, 850.0], [37.0, 1000.0], [38.5, 920.0], [38.5, 955.0], [39.5, 925.0], [41.0, 975.0], [41.0, 950.0], [9.8, 6.7], [10.5, 7.5], [10.6, 7.0], [11.0, 9.7], [11.2, 9.8], [11.3, 8.7], [11.8, 10.0], [11.8, 9.9], [12.0, 9.8], [12.2, 12.2], [12.4, 13.4], [13.0, 12.2], [14.3, 19.7], [15.0, 19.9]]
이제 머신러닝 알고리즘에게 생선의 길이와 무게를보고 도미와 방어를 구분하는 규칙을 알려줘야 한다. 위 데이터를 보면 도미와 방어를 순서대로 나열했기에 도미는 앞에서부터 35번 뒤로 빙어는 14번 등장하게 된다.
fish_target = [1] * 35 + [0] * 14
print(fish_target)
결과
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
👉1은 도미, 0은 방어의 데이터라는것을 알려줄 데이터 준비]
이제 사이킷런 패키지에 K-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier을 import해주고 import한 클래스의 객체를 만들어준다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
위 객체에서 fish_data, fish_target을 전달하고 도미를 찾는 기준을 학습시킨다. fit()함수를 사용하면 사이킷런에서 주어진 데이터로 알고리즘을 훈련시킨다.
kn.fit(fish_data, fish_target)
이제 훈련이 잘 되었는지를 평가해본다.
0~1사이값을 반환하며 1로갈수록 정확도가 올라간다.
kn.score(fish_data, fish_target)
이제 머신러닝 프로그램은 도미와 빙어를 구분할 수 있게 되었다.
코드 링크
https://github.com/dreamjh1111/machine-running/blob/main/fish_models.ipynb