도미 / 빙어 데이터를 이용해 어떠한 생선인지 분류할 수 있는 프로그램 만들기

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.show()

빙어 데이터를 추가하고 그래프를 그려보자.

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.show()

 # K-최근접 이웃 알고리즘 

= 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용하는 알고리즘.

사이킷런을 이용하므로 데이터를 2차원 리스트로 만들어야 한다.

 

==> zip() 함수 이용! + 리스트함축

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

fish_data = [[l,w] for l,w, in zip(length,weight)]

 

도미 = 1, 빙어 = 0 으로 표현한다면 정답리스트는 1이 35개, 그 뒤로 0이 14개가 나온다.

fish_target = [ 1 ] * 35 + [ 0 ] * 14

사이킷런 패키지에서 KNeighborsClassifier 임포트

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
혹은
import sklearn
kn = sklearn.neighbors.KNeighborsClassifier()

kn.fit(fish_data, fish_target)
kn.score(fish_data , fish_target)

KNeighborsClassifier.fit() ==> 알고리즘 훈련하는 메서드

KNeighborsClassifier.score() ==> 사이킷런에서 모델을 평가하는 메서드

fit, score 모두 매개변수는 ( 데이터, 정답) 이다.

 

 

 # 참고 데이터 개수

KNeighborsClassifier 클래스의 기본값은 5개의 데이터를 참고로한다.

n_neighbors = n 를 통해 참고할 데이터 개수 설정 가능

 

만약 위의 데이터 모두를 참고한다면 ? (도미 35개, 빙어 14개)

kn = KNeighborsClassifier(n_neighbors=49)  #참고 데이터를 49로 한 모델

 

==> 다수의 데이터가 도미이므로 어떤데이터를 넣어도 무조건 도미로 예측할 것이다.

 

==> 정말 그런지 살펴보자.

kn49= KNeighborsClassifier(n_neighbors=49)
kn49.fit(fish_data, fish_score)
kn.49.score(fish_data, fish_score)

0.714285714285143
print(35/49)

0.7142857142857143

전체49 中 도미가 35개이므로 기대값과 일치한다.

 

 

+ Recent posts