베짱이와 노는 개미

ML#6 - K최근접 이웃 회귀 본문

AI(머신러닝+딥러닝) 프로젝트

ML#6 - K최근접 이웃 회귀

jsistop16 2021. 8. 7. 22:48

머신러닝에서의 학습은 지도학습과 비지도학습이 있다

지도학습은 다시 회귀와 분류로 나뉜다

오늘은 회귀를 공부해보자

회귀는 임의의 어떤 숫자를 예측하는 것이다.

내년도 경제성장률 예측, 배달 도착 시간 예측 등등이 예시에 포함된다

오늘은 회귀방법 중에 K최근접 이웃 회귀에 대해서 알아보겠다

일단 K최근접이웃알고리즘의 원리를 다시한번 보면

예측하련느 샘플에 가장 가까운 샘플 K개 를 선택한다.

이 샘플들의 무리(클래스)를 확인하고 다수 클래스를 새로운 샘플의 클래스로 예측한다.

예를들어 삼각형과 사각형모양의 샘플이 여러개있는 산점도에서

우리가 예측하려는 샘플 주변에 사각형2개 삼각형 1개가 있다면 사각형이 2개로 다수이기 때문에

예측하려는 샘플의 클래스는 사각형이 되는것이다.

K최근접이웃 회귀는 K최근접이웃 알고리즘과 다른점이 무엇이냐면 '회귀'이기 떄문에 클래스가 아니라 임의의 수치를 예측한다는 것이다.

그렇다면 예측하는 수치는 과연 무엇일까? 바로 평균값으로 예측하는것이다.

예측하려는 샘플 주변에 100, 80, 60 이라는값이 있다면 이 3 수치의 평균인 80으로 예측하는 것이다.

자 이제 코드로 한번 알아보자 직접 구현해보자

농어라는 물고기의 무게를 예측해볼것이다.

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor

perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 21.0,
       21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 22.5, 22.7,
       23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 27.3, 27.5, 27.5,
       27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 36.5, 36.0, 37.0, 37.0,
       39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 40.0, 42.0, 43.0, 43.0, 43.5,
       44.0])

perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
       115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
       150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
       218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
       556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
       850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
       1000.0])
print(perch_weight.shape) #1차원 배열임을 확인

train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight, random_state=42) #모두다 1차원 배열

train_input=train_input.reshape(-1,1) #사이킷런에 훈련세트를 사용하기위해서는 훈련세트가 2차원 배열이어야함
test_input=test_input.reshape(-1,1) #그래서 reshape메소드를 이용하여 2차원으로 바꿔줌

knr = KNeighborsRegressor()

knr.fit(train_input, train_target)

print(knr.score(test_input, test_target)) #R제곱 값(결정계수) 1에 가까울수록 타겟과 비슷하게 예측한 것

처음 보는 함수가 보인다 reshape() 이다.

 

reshape()는 배열의 크기를 지정할수 있는 메소드이다.

 

reshape(원하는 행 수, 원하는 열 수)로 매개변수를 전달한다.

 

예를들어 arr=[1,2,3,4,5,6]이라는 배열이 있을때

 

arr.reshape(3,2)라고 하면 3행 2열의 2차원 배열로 변형해준다

[[1,2]

[3,4]

[5,6]]

이렇게 나온다

 

여기서 하나의 매개변수에 -1 값을 넣으면 알아서 배정해라 라는 뜻이다

 

예를들어 같은 배열 arr에 arr.reshape(-1,3)이라고 하면

 

행의개수 -1에 열의 개수 3

 

다시말해서 열의 개수 3개를 맞추기 위해서 행의 개수는 알아서 맞춰라 가 되는것이다.

 

그럼 원소의 개수가 총 6개이므로 열이 3개라면 행은 2개여야한다.

 

이 행의 개수 2개 라는값을 알아서 찾아라 라는 말이 -1이다

 

원소의 개수가 너무 많거나 모를때 사용하기 유용한 스킬이다.