Skip to main content

KNN

K Nearest Neighbors

  • 가장 간단한 머신러닝 알고리즘
  • 새로운 데이터 포인트를 예측하기 위해 가장 가까운 K개의 이웃을 참조
  • 회귀(연속적인 값을 예측)의 경우 이웃 값들의 평균
  • 분류(범주를 예측)의 경우 이웃 값들의 다수결
  • 훈련 단계가 없고, 모든 계산이 예측 시에 이루어지는 게으른 학습(lazy learning) 방식

K에 따른 차이

  • K가 작으면
    • 적은 사례만으로 예측하므로 노이즈에 민감
  • K가 커지면,
    • 많은 사례를 검색하야 하므로 계산 비용이 증가
    • 거리가 먼 사례도 예측에 포함될 수 있어 너무 크면 성능 저하

스케일링 Scaling

  • 데이터의 특성을 일정한 범위나 분포로 변환하는 과정
  • 데이터셋의 각 특징(피처)들이 서로 다른 단위와 범위를 가질 경우 비교나 해석이 어려움
  • 많은 머신러닝 알고리즘, 특히 KNN은 특징 간의 스케일 차이에 민감
  • 한 특징의 값이 매우 크거나 작은 경우, 모형이 그 특징에 지나치게 의존하게 되어 과적합(overfitting) 이 발생할 수 있음
  • 방법:
    • 정규화(normalization)
    • 표준화(standardization)

정규화 Normalization

  • 데이터를 특정 범위(주로 [0, 1])로 변환하는 방법 X=XXminXmaxXminX^{\prime}=\frac{X-X_{min}}{X_{max}-X_{min}}
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
normalized = scaler.fit_transform(
df[['mileage', 'year', 'my_car_damage', 'other_car_damage']])
  • 문헌에 따라서는 정규화는 스케일링과 동의어로 사용하기도 함
  • 이때는 위의 방법은 최소-최대 정규화로 구분

표준화 Standardization

  • 평균이 0, 표준편차가 1이 되도록 변환하는 방법 X=XXminXmaxXminX^{\prime}=\frac{X-X_{min}}{X_{max}-X_{min}}
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
standardized = scaler.fit_transform(
df[['mileage', 'year', 'my_car_damage', 'other_car_damage']])

원핫 인코딩 one-hot encoding

  • 범주형 변수 변환에 널리 사용되는 방법
  • 범주의 개수만큼 새로운 특징(변수)를 만듦
  • 범주의 번호에 해당하는 특징만 1(hot), 다른 특징 값은 0(cold)으로
  • 차종은 2개이므로 2개의 컬럼이 만들어짐
  • 사이킷런 사용
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse_output=False)
one_hot = encoder.fit_transform(df[['model']])
  • pandas 사용
df['model'].str.get_dummies()

더미 코딩 dummy coding

  • 원핫 인코딩에서 한 특성은 다른 특징의 조합으로 결정됨
  • 앞에서 Avante = 1이면 반드시 K3 = 0 (역도 마찬가지)
  • 모델에 따라서는 학습에 문제가 생길 수 있으므로 특징 중 한 개는 제외
encoder = OneHotEncoder(sparse_output=False, drop='first')
encoded = encoder.fit_transform(df[['model']])

준비

  • X와 y 만들기
import numpy as np
X = np.hstack((normalized, encoded)) #준비된 데이터를 연결
y = df['price']
  • 데이터 분할(20%는 테스트 용으로)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size = 0.2, random_state = 42)

학습

  • 훈련: 분류의 경우 KNeighborRegressor 대신 KNeighbor Classifier 사용
from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor(n_neighbors=5) # K=5, 즉 5가지 유사 사례로 예측
knn.fit(X_train, y_train) # 훈련
knn.score(X_train, y_train) # 성능 평가
  • 테스트
knn.score(X_test, y_test) # 테스트 데이터로 성능 평가

예측

  • 예측
y_pred = knn.predict(X_test)
  • 평균 제곱 오차(MSE)
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred)
  • R제곱: 1-MSE/분산
  • 분산은 모든 값을 평균으로 예측했을 때의 MSE이므로, 이에 비해 MSE를 몇%나 줄였는지 평가
from sklearn.metrics import r2_score
r2_score(y_test, y_pred)

예측 가격 엑셀로 내보내기

import pandas as pd
pd.DataFrame({
'실제가': y_test,
'예측가': y_pred
}).to_excel('가격예측.xlsx')

퀴즈

사용자 정보 입력
퀴즈를 시작하기 전에 이름과 소속을 입력해주세요.

Q&A