머신러닝

[머신러닝] K-최근접 이웃 알고리즘(K-NN)

서노리 2022. 4. 22. 01:25
반응형

K-최근접 이웃 알고리즘은 주변 K개의 이웃 데이터를 통해 예측을 수행하는 분류 / 회귀형 머신러닝 알고리즘이다.

KNeighborsClassifier

KNeighborsClassifier는 K-최근접 이웃 알고리즘을 수행하는 분류형 클래스이다.다음과 같은 예시로 KNeighborsClassifier의 동작 원리를 알아보자.

import pandas as pd

# 빈 데이터프레임 객체 생성
X = pd.DataFrame()
print(X)

X['rate'] = [0.3, 0.8, 0.0999]
print(X)

X['price'] = [10000, 5000, 9500]
print(X)

# 종속변수 생성
y = pd.Series([0, 1, 0])

# 스케일 전처리 과정을 수행
# - price 컬럼의 값을 rate 컬럼의 값과 동일한 범위를 가지도록
#   데이터를 수정
#   (데이터의 값은 수정되지만 원본 값에서 가지는 상대적인 크기는 유지)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X)
X = scaler.transform(X)

 

KNeighborsClassifier 클래스를 불러와 모델 객체를 생성한다.

from sklearn.neighbors import KNeighborsClassifier
# 가장 인접한 1개의 데이터를 기준으로 판단
model = KNeighborsClassifier(n_neighbors=1)
model.fit(X, y)

 

예측할 데이터를 스케일 처리한 후 예측을 수행한다.

# 예측할 데이터
X_new = [[0.81, 7000]]

# 예측할 데이터의 스케일 처리를 수행
X_new = scaler.transform(X_new)

# 예측 수행
pred = model.predict(X_new)
print(pred)      # 1

 

X_new의 예측 결과로 1이 출력되었는데 이는 어떻게 나온 결과일까?

 

※ 최근접 이웃 알고리즘의 학습 및 예측 방법

- 학습 : fit 메소드에 입력된 데이터를 단순 저장

- 예측 : fit 메소드에 의해 저장된 데이터와 예측할 데이터와의 유클리드 거리를 계산하여 가장 인접한 이웃 K개를 추출한다. 그리고 추출된 이웃의 y값을 이용하여 분류인 경우 다수결, 회귀인 경우 평균값을 결과로 한다.

 


KNeighborsRegressor

KNeighborsRegressor는 K-최근접 이웃 알고리즘을 수행하는 회귀형 클래스이다.

KNeighborsClassifier와 다른 점은 다수결이 아닌 평균값을 리턴하는 것이다.

 

다음과 같은 예시로 KNeighborsRegressor의 동작 원리를 알아보자.

import numpy as np

# 1차원 배열
X = np.arange(1,11)
print(X)

# 1차원 배열을 2차원으로 수정
X = X.reshape(-1, 1)
print(X)

# 종속변수 - 연속된 수치형
y = np.arange(10, 101, 10)
print(y)
from sklearn.neighbors import KNeighborsRegressor
model = KNeighborsRegressor(n_neighbors=2)
model.fit(X, y)

X_new = [[3.7]]
pred = model.predict(X_new)
print(pred)   # 35

X_new의 가장 가까운 이웃 2개는 3과 4로 이는 각각 30, 40의 값을 가진다. 따라서 예측값은 평균값인 35가 출력된다.

 

최근접 이웃 알고리즘으로 회귀분석을 했을 때의 한계점은 fit 메소드에서 입력된 X 데이터의 범위를 벗어나면 양 끝단의 값으로만 예측을 수행하게 된다 (즉, 학습 시 저장된 값 내에서만 예측이 가능하다).

X_new = [[57.7]]
pred = model.predict(X_new)
print(pred)  # 95

X_new = [[-10.7]]
pred = model.predict(X_new)
print(pred) # 15

 

이러한 한계점이 있어 선형 방정식을 기반으로한 회귀분석 머신러닝 클래스를 자주 사용한다.


 

반응형