KNN
K Nearest Neighbors
- 가장 간단한 머신러닝 알고리즘
- 새로운 데이터 포인트를 예측하기 위해 가장 가까운 K개의 이웃을 참조
- 회귀(연속적인 값을 예측)의 경우 이웃 값들의 평균
- 분류(범주를 예측)의 경우 이웃 값들의 다수결
- 훈련 단계가 없고, 모든 계산이 예측 시에 이루어지는 게으른 학습(lazy learning) 방식
K에 따른 차이
- K가 작으면
- 적은 사례만으로 예측하므로 노이즈에 민감
- K가 커지면,
- 많은 사례를 검색하야 하므로 계산 비용이 증가
- 거리가 먼 사례도 예측에 포함될 수 있어 너무 크면 성능 저하
스케일링 Scaling
- 데이터의 특성을 일정한 범위나 분포로 변환하는 과정
- 데이터셋의 각 특징(피처)들이 서로 다른 단위와 범위를 가질 경우 비교나 해석이 어려움
- 많은 머신러닝 알고리즘, 특히 KNN은 특징 간의 스케일 차이에 민감
- 한 특징의 값이 매우 크거나 작은 경우, 모형이 그 특징에 지나치게 의존하게 되어 과적합(overfitting) 이 발생할 수 있음
- 방법:
- 정규화(normalization)
- 표준화(standardization)
정규화 Normalization
- 데이터를 특정 범위(주로 [0, 1])로 변환하는 방법
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
normalized = scaler.fit_transform(
df[['mileage', 'year', 'my_car_damage', 'other_car_damage']])
- 문헌에 따라서는 정규화는 스케일링과 동의어로 사용하기도 함
- 이때는 위의 방법은 최소-최대 정규화로 구분
표준화 Standardization
- 평균이 0, 표준편차가 1이 되도록 변환하는 방법
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')
퀴즈
사용자 정보 입력
퀴즈를 시작하기 전에 이름과 소속을 입력해주세요.