본문 바로가기
ML

ML 1-3

by alscks 2024. 1. 28.
대-AI 시대가 도래함에 따라 기초적인 AI 지식 정도는 찍먹해 줘야 한다고 생각하여 공부를 시작

ML에 포스팅되는 대부분의 포스팅은 <혼자 공부하는 머신러닝+딥러닝(한빛미디어)> 교재를 통해  공부한 내용일 것입니다.

 

K - Nearest Neighborhodd(K-NN) 알고리즘

*구글 Colab은 파이썬을 기반으로 작동한다.

 

생선의 종류를 구분하는 경우를 K-NN으로 구현해보기.

  • 라이브러리 추가 import 사용
  • as ~ : C에서 typedef와 비슷하다.
  • 그래프를 점선도로 plot하기 : .stcatter 
  • .show를 통해 표시.

scatter를 합치면 한번에 표시 가능하다

 

  • K-NN알고리즘은 정답 데이터를 K-NN객체 안에 넣어 데이터를 통해 들어오는 입력값을 판단한다.
  • score함수는 성능평가에 사용.

사용한 전체 코드

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 # matplotlib.pyplot을 plt로 줄여서 사용.. typedef와 비슷?
plt.scatter(bream_length, bream_weight)
plt.xlabel("length")
plt.ylabel("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) #scatter를 연달아 사용하면 그래프를 합칠 수 있다.
plt.xlabel("length")
plt.ylabel("weight")
plt.show



length = bream_length + smelt_length
weight = bream_weight + smelt_weight #리스트 합치기
#사이킷 런 사용 -> x,y데이터를 세로로 나열한 2차원 리스트로 구성해야 함
#zip함수, 리스트 내포 구문 사용
fish_data = [[l,w] for l,w in zip(length,weight)] #zip()함수는 리스트에서 하나씩 데이터를 꺼내어 l,w에 할당
print(fish_data)#리스트 구성 확인

#위쪽 코드블럭과 이어서 코딩하려면 위쪽을 먼저 실행시켜야 함


#정답 데이터 만들기 -> bream과 smelt를 차례로 이었기 때문에 1(도미)가 35번 0(방어)가 14번 나오는 리스트를 만들어야 한다
fish_target = [1]*35 + [0]*14
print(fish_target)




#사이킷런 패키지 사용 / k-최근접 이웃 알고리즘 크래스인 KNeighborsClassifier 사용
from sklearn.neighbors import KNeighborsClassifier
#from ~ import구문은 특정 클래스만 import한다.

kn = KNeighborsClassifier() #객체 생성

kn.fit(fish_data,fish_target) #fit 메소드는 데이터로 알고리즘을 훈련

#score 메소드는 모델 평가 메소드. 0~1 사이 값을 반환함(1은 모든 데이터를 맞춘 것을 의미 / 0은 빵개)?

kn.score(fish_data, fish_target)





#임의의 데이터들로 실제 알고리즘의 작동을 확인
#predict메소드 사용(정답을 예측)

kn.predict([[30,600],[18,39]]) #바깥 대괄호는 test케이스들을 담는 대괄호, 안쪽은 개별 test case




print(kn._fit_X) #k-최근접 알고리즘은 fish_data를(훈련시긴 데이터를)모두 가지고 있음




# 몇개의 data를 k-최근접 알고리즘은 사용하나?
# 매개변수를 통해 변경할 수 있음

kn49 = KNeighborsClassifier(n_neighbors=49) #새로운 객체 생성후 매개변수 변경

kn49.fit(fish_data, fish_target)
print(kn49.score(fish_data, fish_target))
print(35/49)




print(35/49) #전체 생선중 도미

#코드 셀은 마지막 실행 코드의 반환값만 자동 출력.
#모든 코드를 한 셀에 넣으면 중간의 반환값은 출력하지 않는다.
#두 값을 모두 print해주거나 코드 셀을 나누어야 함

 

  1. matplotlib.scatter : 산점도를 표시하는 함수
  2. scikit-learn
    • KNeighborsClassifier() : 최근접 이웃 분류 모델을 만드는 사이킷런 클래스(매개변수로 이웃의 개수 정하기. 기본값은 5)
    • fit() : 모델을 훈련할 때 사용하는 메소드. 정답과 데이터를 입력.
    • predict() : 훈련하고 예측할 때 사용하는 메소드
    • score() : 성능 측정 # 입력 개수 대비 맞은 개수 

'ML' 카테고리의 다른 글

ML4 확률적 경사 하강법8  (0) 2024.08.07
ML3 / 다중회귀, 특성공학  (0) 2024.07.28
2-1  (0) 2024.01.29