본문 바로가기
Bigdata

머신러닝 - K-최근접 이웃 회귀(KNN Regression) 알고리즘 특징과 코드

by 올엠 2024. 6. 8.
반응형

k-최근접 이웃 회귀(KNN Regression)은 새로운 데이터의 출력 값을 예측하기 위해 훈련 데이터의 출력 값과 가장 가까운 k개의 데이터를 사용합니다. k는 사용자 설정 매개변수이며, 값이 작을수록 더 많은 데이터를 고려하게 되고, 값이 클수록 더 적은 데이터를 고려하게 됩니다.

k-최근접 이웃 회귀 알고리즘은 훈련 데이터에서 새로운 데이터와 가장 가까운 k개의 데이터를 찾아서, 해당 k개의 데이터의 출력 값을 평균하여 새로운 데이터의 출력 값을 예측하는 방식이다.

k는 예측에 사용된 최근접 이웃 갯수로 만약 3개으로 하였다면, 3개의 최근접 이웃의 데이터를 통해 값을 예측한다.

 

y(x) = \frac{\sum_{i=1}^k y_i^k}{k}

- y(x)는 새로운 데이터 x의 출력 값을 예측한 값

- y_i^k는 훈련 데이터에서 x와 가장 가까운 k개의 데이터의 출력 값

k는 사용자 설정 매개변수

장점

  1. 구현이 간단하다.
  2. 데이터에 대한 가정이 필요하지 않다.
  3. 예측 관점으로 다양한 데이터에서 잘 작동한다.

단점으로는 새로운 데이터의 출력 값을 예측하기 위해 많은 계산이 필요 할 수 있다는 점이다.

그리고 훈련 데이터에 이상치가 있을 경우 예측 성능이 저하될 수 있수 있다는 점이다.

k-최근접 이웃 회귀 알고리즘은 다음과 같이 (이미지, 텍스트 분류, 추천 시스템)보통 분류 혹은 추천에 사용할 수 있는 알고리즘이다.

예제를 위해 보스턴 아파트 가격을 예측하는 코드는 다음과 같다.

아래 데이터는 

보스턴 주택가격 데이터는 1970년대 보스턴에 있는 506개 주택의 가격과 관련된 특징 값을 가지고 있다.

 

x축은 주택의 특징 값으로 다음과 같은 13개의 특징 값이 있다.

  • CRIM: 인구 10만 명당 범죄율
  • ZN: 25,000 평방피트 이상의 단독 주택 비율
  • INDUS: 비상업용 토지 비율
  • CHAS: 찰스 강 경계에 위치한 여부
  • NOX: 일산화질소 농도
  • RM: 주택당 방 수
  • AGE: 주택의 건축 연도
  • DIS: 5개의 주요 고용 센터까지의 접근성
  • RAD: 고속도로 접근성
  • TAX: 재산세율
  • PTRATIO: 학생/교사 비율
  • B: 흑인 인구 비율

y축은 주택의 가격으로, 10,000달러 단위로 표시된다.

그리고 학습을 할 때, 주택 가격인 MEDV 을 drop하어 주택 가격을 제외하고 x축으로 만들고 y축에는 주택 가격만 사용하여 학습함으로써, 특정 특징을 입력하였을때, 가장 가까운 3개의 값의 평균으로 주택가격을 예측하는 코드를 작성할 수 있다.

import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsRegressor



def get_data():
  # 보스턴 주택가격 데이터
  data = pd.read_csv("https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv")


  # 훈련 데이터와 테스트 데이터를 분리
  train_data = data.sample(frac=0.8, random_state=2023)
  test_data = data.drop(train_data.index)


  # 훈련 데이터와 테스트 데이터의 특징 값을 추출
  x_train = train_data.drop("MEDV", axis=1)
  y_train = train_data["MEDV"]
  x_test = test_data.drop("MEDV", axis=1)
  y_test = test_data["MEDV"]


  return x_train, y_train, x_test, y_test





def main():
  """
  k-최근접 이웃 회귀 알고리즘을 사용하여 아파트 가격을 예측

  Args:
    x_train: 훈련 데이터의 특징 값
    y_train: 훈련 데이터의 출력 값
    x_test: 테스트 데이터의 특징 값

  Returns:
    테스트 데이터의 예측 값
  """



  # 훈련 데이터와 테스트 데이터 가져오기
  x_train, y_train, x_test, y_test = get_data()


  #학습
  model = KNeighborsRegressor(n_neighbors=3)
  model.fit(x_train, y_train)


  # 테스트 데이터의 예측 값을 계산
  predictions = model.predict(x_test)


  # 예측 결과 출력
  print("테스트 데이터의 예측 값:", predictions)


if __name__ == "__main__":
  main()

 

반응형