KNN : K-Nearest Neighbors (k-최근접 이웃)
1. 개념
클래스가 알려지 데이터 셋 안에서, 새로운 데이터가 가장 유사한 k개의 샘플을 선정하여
가장 많이 나온 클래스를 새로운 데이터의 클래스로 결정.
학습이 이뤄지지 않고, 예측 과정에서 연산이 이뤄짐. (게으른 모델)
! 그만큼 Feature 엔지니어링과 설계가 매우 중요
Q0. '유사하다'의 의미가 무엇인가?
A0. 수치형 데이터의 경우 직관적으로 좌표 평면 위에 나타냈을때, 가깝다를 기준으로 한다.
Q1-1. 좌표 평면에 어떻게 나타낼 것인가?
A1-1. 가깝다, 즉 거리를 기준으로 하기 때문에 데이터 특성(Feature) 사이 차원의 영향을 제거하기 위해 표준화 혹은 정규화를 진행해서 사용.
Q1-2. 가깝다의 정의는 어떻게 할 것인가?
A1-2. 일반적으로 유클리드 거리 혹은 멘해튼 거리를 사용한다.
Q2. 범주형 데이터는 어떻게 하는가?
A2. 거리 기반 특성을 고려해서, 원-핫 인코딩을 하는 것이 보편적이나, 차원(Feature 수)이 너무 증가함에 따라 차원의 저주에 빠질 수 있음. 차원 증가 및 거리 왜곡 문제를 인식하고, 필요시 다른 인코딩 방식 또는 거리 척도 변경을 고려해야한다.
Q2-1. 다른 인코딩 방식에는 무엇이 있는가?
1. 라벨 인코딩 (Label Encoding)
방법: 각 범주에 숫자를 부여 (예: red=0, green=1, blue=2)
장점: 구현이 간단하고 차원 증가 없음.
단점: 숫자 간 순서나 크기 의미 없음, 순서를 학습하는 모델은 잘못 해석할 수 있음.
주의점: 거리 계산에서 blue(2)와 green(1) 간 차이를 의미 있게 해석함 → 거리 개념이 라벨상에 의미가 있을 때 사용 가능
ex) red-blue와의 관계보다 red-green의 관계가 더 가깝다.
2. 빈도 인코딩 (Frequency Encoding)
방법: 각 범주를 해당 범주가 등장한 빈도로 치환 (예: red=100개, green=50개, blue=10개 → red=100)
장점: 수치형 데이터처럼 사용할 수 있어 KNN에서도 사용할 수 있음.
단점: 범주 간 의미가 실제 값의 차이와 다를 수 있음.
KNN 주의점: 값이 큰 범주가 더 가깝다고 오해될 수 있음 → 정규화 필수
3. 타겟 인코딩 (Target Encoding)
방법: 각 범주를 해당 범주의 평균 타겟 값으로 치환 (예: red가 80%의 확률로 label=1이면 0.8)
장점: 예측 성능 향상 가능성 있음.
단점: 데이터 누수(leakage) 위험이 큼 → 반드시 K-Fold로 처리해야 함
KNN 주의점: 사용 가능하지만, 누수 방지 처리를 반드시 해야 함.
데이터 누수란? : 학습 시점에 사용하면 안 되는 정보가 모델에 유입되어, 테스트 성능이 실제보다 과도하게 높게 나오는 현상. 모델이 결과를 알고 학습하는 듯한 상황
4. 해싱 인코딩 (Hash Encoding / Feature Hashing)
방법: 해시 함수를 이용해 고정된 수의 열에 분산 배치
장점: 차원을 고정 가능, 고차원에서도 사용 가능
단점: 해시 충돌 가능성, 해석 어려움
KNN 주의점: 충돌에 의한 거리 왜곡 주의
5. 이진 인코딩 (Binary Encoding)
방법: 라벨 인코딩 후, 이진수로 변환하여 열을 나눔 (예: red=1 -> 001, green=2 -> 010, blue=3 -> 011...)
장점: 차원 수를 log₂(n)으로 줄일 수 있음
단점: 해석 어려움, 순서가 생기는 문제 있음
KNN 주의점: 거리 계산 시 이진 값들이 간접적으로 순서를 나타낼 수 있어 주의 필요
7. 임베딩 (Embedding)
방법: 각 범주를 저차원 벡터로 매핑 (주로 딥러닝에서 사용)
예: color=red → [0.3, -1.2, 0.8]
장점: 거리 기반 알고리즘에 잘 맞음, 의미론적 거리 보존 가능
단점: 학습 필요 (주로 신경망 기반 모델과 함께 사용)
KNN 주의점: 전처리로 학습된 임베딩을 사용하면 유용함
Q2-2. 거리 척도 변경
KNNDistanceMetric = "euclidean" 이 아닌 경우도 고려 (예: hamming, manhattan, cosine, gower 등)
sklearn의 KNN은 Gower distance를 직접 지원하지 않지만, gower 패키지 등을 이용하거나 커스텀 거리 함수를 구현 가능.
2. 장점
- 구현 간단 : 훈련 단계가 거의 없고, 거리 계산만으로 동작함
- 가정이 적음 : 데이터 분포에 대한 가정이 필요 없음 (비모수 모델)
- 다중 클래스 문제에 강함 : 자연스럽게 다중 클래스 분류 가능
- 이상치에 강할 수 있음 (k값이 클 경우) : k를 늘리면 노이즈 영향이 줄어듦
- 새로운 데이터 추가 시 유연함 : 모델 재학습 없이도 새 데이터 반영 가능 (메모리 기반)
3. 단점
- 계산량이 많음 : 모든 예측에서 전체 데이터를 스캔 → 느림 (특히 데이터가 많을 때)
- 차원의 저주 (Curse of Dimensionality) : 차원이 높아질수록 거리 계산이 무의미해짐
- 범주형 변수 처리 어려움 : 숫자형 위주 거리 계산 → 범주형 변수는 거리 왜곡 가능
- 스케일에 민감함 : 변수 단위가 다르면 큰 값이 거리 계산을 지배함 → 정규화 필수
- 메모리 사용량 큼 : 전체 학습 데이터를 저장해야 함 (instance-based learning)
4. 과적합 방지
- k 값 조절
k=1이면 과적합 가능성 높음 → 적절히 큰 k (일반적으로 홀수, 3~15) 사용 - 거리 가중치 적용
가까운 이웃에 더 많은 가중치를 주면 노이즈 영향 줄임 (weights='distance' 옵션) - 데이터 정규화/스케일링
거리 기반 모델이므로 반드시 StandardScaler, MinMaxScaler 등으로 정규화 필요 - 특성 선택 또는 차원 축소
PCA, SelectKBest 등으로 차원을 줄이면 과적합 방지 + 속도 향상 - 노이즈 제거
이상치 제거, 데이터 클렌징 등으로 품질 개선