아래 내용은 "혼자 공부하는 머신러닝+딥러닝" 을 공부하며 간략하게 정리한 내용입니다. 쉬운 사례로 어려운 수식 없이 설명하므로 입문자에게 강추하는 책입니다!
1. 시작하기 전에
한빛 마켓 김팀장은 점점 많아지는 물건을 파악하기에 역부족이라 요즘 한창 인가가 많은 머신러닝을 이용해 문제를 해결하고자 하였습니다. 앱마켓 최초로 살아 있는 생선을 판매하기 시작했고 가장 빠른 물류센터에서 곧바로 배송하기로 했습니다. 하지만 물류 센터 직원이 생선 이름을 외우지 못하는 문제가 발생하기 시작했고 김팀장은 담당자에게 자동으로 알려주는 머신러닝을 만들라고 지시하였습니다.
2. 도미 데이터 준비하기
한빛 마켓은 '도미', '곤들매기', '농어' '강꼬치고기', '로치', '빙어', '송어' 물고기를 판매하나 우선 '도미'와 '빙어'를 구분하기로 하였습니다. 이렇게 구분하는 문제를 분류(Classification)라고 부르고 구분하는 종류는 클래스(class)라고 부릅니다. 특히 이 장에서처럼 2개의 클래스 중 하나를 고르는 문제를 이진 분류(Binary classification)이라고 합니다.
담당자는 35마리의 도미를 준비하고 저울로 잰 도미의 길이와 무게를 파이썬 리스트로 만들었습니다.
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]
먼저 각 도미를 그래프에 점으로 표시해보도록 하겠습니다.
import matplotlib.pyplot as plt
plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
가로 x축은 길이, 세로 y축은 무게인 2개의 특성을 사용해 그린 그래프입니다. 생선의 길이가 길수록 무게가 많이 나간다고 생각하면 이 그래프 모습은 매우 자연스러울 것 입니다. 이렇게 산점도 그래프가 일직선에 가까운 형태로 나타나는 경우를 선형(linear)적이라고 합니다.
3. 빙어 데이터 준비하기
물류 센터에 빙어가 많지 않아 준비한 빙어는 14마리 입니다. 도미와 같이 파이썬 리스트로 만들어보겠습니다.
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]
빙어는 상대적으로 도미에 비해 크기도 작고 무게도 작습니다. 도미와 같이 빙어 그래프도 그려서 비교해 보겠습니다.
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
파이썬 matplot은 친절하게 2개의 산점도를 색깔로 구분합니다. 빙어도 역시 길이가 늘어날 수록 무게도 증가하지만 많이 늘지는 않았습니다. 이런 특성은 다음 장에서 알아보고 두 생선을 분류하는 프로그램을 만들어보겠습니다.
4. 첫 번째 머신러닝 프로그램
가장 간단하고 이해하기 쉬운 k-최근접 이웃(k-Nearest Neighbors)알고리즘을 사용해 두 생선을 분류해보겠습니다.
먼저 두 생선 리스트를 하나로 합쳐서 2차원 리스트로 만들어보겠습니다.
length = bream_length+smelt_length
weight = bream_weight+smelt_weight
fish_data = [[l, w] for l, w in zip(length, weight)]
그 다음 준비할 데이터는 정답 데이터입니다. 도미와 빙어를 순서대로 나열했기 때문에 정답 리스트는 1(도미)이 35번, 0(빙어)이 14번 나오도록 리스트를 만들어주겠습니다.
fish_target = [1]*35 + [0]*14
이제 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스 KNeighborsClassifier를 임포트하고, KNeighborsClassifier 클래스 객체를 만들어 이 객체에 학습(training)을 시켜보겠습니다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)
이제 객체 kn이 얼마나 잘 훈련되었는지 평가해보겠습니다. 사이킷런에서 모델을 평가하는 메서드는 score() 입니다. 이 메서드는 0-1 사이이 값을 반환하고 1은 모든 데이터를 정확히 맞혔다는 의미입니다.
kn.score(fish_data, fish_target)
→ 1.0
모든 답을 정확히 맞혔습니다. 이 값을 정확도(accuracy)라고 부르며 이 모델은 정확도 100%로 완벽하게 분류하였습니다.
(이부분엔 오류가 있으나 다음장에서~~~)
다음 2장에서는 데이터 형태에 따라 알고리즘에 미치는 영행에 대해서 배워보겠습니다.
감사합니다 :)
참고자료
혼자 공부하는 머신러닝+딥러닝
'머신러닝&딥러닝 > 책요약및리뷰' 카테고리의 다른 글
[혼자공부하는머신러닝+딥러닝] 3. 회귀 알고리즘과 모델 규제 (0) | 2022.06.15 |
---|---|
[혼자공부하는머신러닝+딥러닝] 2. 데이터 다루기 (0) | 2022.06.13 |
[XAI 설명가능한 인공지능] 3. 모델 튜닝하기-Xgboost (0) | 2022.05.17 |
[XAI 설명가능한 인공지능] 2. 모델 생성 및 해석 실습-Xgboost (0) | 2022.05.16 |
[XAI 설명가능한 인공지능] 1. 'XAI' 개념 및 개발 준비 (0) | 2022.05.16 |