안녕하세요 IT`s 닝겐입니다.
전 글에서 사용한 생선 데이터를 가지고, 사이킷런에서 제공되는 K-최근접 이웃 알고리즘을 통해 임의의 생선 데이터가 Bream인지, Smelt인지 구분하는 코드를 알아보겠습니다. 그 전에 머신러닝 공부를 하시게 되면 Numpy와 Pandas에 대한 이야기를 많이 접하게 될 것입니다. 이는 데이터를 하기 쉽게 정리해놓는 수단이라고 여기시면 될 것같습니다.
저 또한 해당부분에 대해 깊이 공부한것은 아니지만, 자세히 알아두시면 데이터가 어떻게 저장되어 있는지 변환이 어떻게 되었는지 보다 잘 이해하실수 있지만, 모른다고 코딩이 불가능한것은 아닙니다.
1. 과정
- 준비된 Bream, Smelt 데이터는 길이와 무게가, Bream은 35개 데이터, Smelt는 14개 데이터임을 인지하셔야합니다.
- Bream과 Smelt에 대한 무게와 길이 데이터를 무게, 길이 별로 합치도록 합니다.
- 합쳐진 무게와 길이데이터를 2차원 배열로 변환하도록합니다. [ EX: (길이, 무게) ]
- Bream과 Smelt를 구분하기 위한 타겟데이터를 생성하도록합니다, Bream, Smelt의 길이, 무게 데이터는 순서대로 35개의 Bream과 14개의 Smelt로 합쳐저 있으며, 이를 타겟데이터로 만들면, 35개의 '1', bream과 14개의 '0' Smelt로 만들수 있습니다.
- 만들어진 데이터를 K-최근접 이웃 알고리즘을 통해 훈련하고, 그 평가점수를 확인하겠습니다.
2. 코딩
## 생선 bream과 smelt의 length와 weight데이터 준비
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]
# 길이 데이터 합, 무게 데이터 합
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
# 길이와 무게 데이터의 2차원 배열 변환, 그에 맞는 타겟데이터 생성
fish_data = [[l, w] for l, w in zip(length, weight)]
fish_target = [1]*35 + [0]*14
# K- 최근접 이웃을 통한 데이터 훈련 및 평가
from sklearn.neighbors import KNeighborsClassifier
kn49 = KNeighborsClassifier(n_neighbors=49)
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
3. 결과

4. 해석
- K-최근접 알고리즘 객체생성 시 n_neighbors=49 매개변수는 최근접 이웃이 49라는것을 의미하며, 기본값은 5입니다.
- K-최근접 알고리즘은 최근접이웃데이터를 합하여 그 평균값을 기준으로 데이터를 분류하는 알고리즘으로, 위 와같은경우 최근접데이터가 데이터의 전부이기 때문에, 참이 되는 값을 분류하게 됩니다.
- 따라서 35개의 Bream 데이터를 우리는 '1' 인 참으로 설정했기에 총 49개의 생선데이터 중 참으로 설정한 Bream의 비율이 71.42%임을 알 수 있습니다.

'Python ML, Deep Learning' 카테고리의 다른 글
Python 머신러닝 #분류하기 (K-최근접 이웃#2) (0) | 2021.04.21 |
---|---|
Python 머신러닝 #기계학습 이해하기 (0) | 2021.04.19 |
Python 머신러닝 #1 colab환경 준비 (1) | 2021.04.19 |
Python 머신러닝 시작하기 (1) | 2021.04.19 |