K-최근접 이웃
'유유상종'의 알고리즘
새 고객은 어떤 상품을 살까?
새로운 고객이 쇼핑몰에 방문했습니다. 이 고객과 가장 비슷한 기존 고객 5명이 모두 프리미엄 상품을 샀다면, 이 고객도 프리미엄 상품을 살 가능성이 높지 않을까요?
이것이 바로 K-최근접 이웃(K-Nearest Neighbors, KNN) 알고리즘의 핵심입니다. "비슷한 것끼리 모인다"는 직관을 그대로 알고리즘으로 만든 것입니다. 수학 공식을 외울 필요 없이, 주변 이웃의 다수결로 분류합니다.
이 장에서는 KNN 알고리즘을 직접 그려보고, K값, 거리 측정법, 차원의 저주, 피처 스케일링의 효과를 체험합니다.
KNN의 작동 원리: 다수결
KNN은 머신러닝 알고리즘 중 가장 직관적입니다. 새로운 데이터가 들어오면:
- 기존 데이터와의 거리를 모두 계산한다.
- 거리가 가장 가까운 K개의 이웃을 찾는다.
- K개 이웃 중 다수결로 클래스를 결정한다.
전학 온 첫날, 급식 메뉴를 고르지 못합니다. 주변에 앉은 5명(K=5)을 보니 3명이 A메뉴, 2명이 B메뉴를 먹고 있습니다. 다수결로 A메뉴를 선택합니다. 이것이 KNN입니다.
KNN의 모든 것은 이 한 문장에 달려 있습니다: 가까운 데이터는 비슷한 특성을 가진다. 카페에서 주변을 둘러보세요. 같은 테이블에 앉은 사람들은 보통 같은 그룹(친구, 동료, 가족)입니다. 가까이 있다는 것 자체가 유사성의 증거입니다. 이 가정이 성립하지 않는 데이터에서는 KNN이 제대로 작동하지 않습니다.
맨해튼 거리: d(a, b) = |a1-b1| + |a2-b2| + ... + |ap-bp|
실습 1: 2D KNN 분류기
캔버스에 직접 데이터 포인트를 찍고 KNN 분류를 체험하세요. 빨간점/파란점을 찍은 뒤, "?" 모드로 새 점을 찍으면 K개 최근접 이웃의 다수결로 분류합니다.
K=1은 가장 가까운 딱 한 명만 보는 것입니다. 그 한 명이 특이한 사람(노이즈)이면 판단이 완전히 빗나갑니다. 마치 전학 온 첫날, 바로 옆에 앉은 한 명이 우연히 반에서 가장 독특한 아이였다면? 반대로 K를 반 전체 인원(K=전체)으로 놓으면, 반에서 A형 학생이 더 많으니 누가 와도 무조건 A형이라고 답합니다 -- 다수결이 무의미해지는 것이죠. 적절한 K는 이 두 극단 사이의 균형점입니다.
실습 2: K값의 효과
같은 데이터에 K=1, K=5, K=50을 적용해봅시다. K가 커질수록 결정 경계가 부드러워지지만, 너무 크면 세밀한 패턴을 놓칩니다.
K = 1 (과적합)
K = 5 (적절)
K = 50 (과소적합)
실습 3: 거리 측정법 비교
"거리"를 어떻게 재느냐에 따라 "이웃"이 달라집니다. 유클리드 거리는 직선거리(새가 날아가는 거리), 맨해튼 거리는 격자형 도로를 따라 가는 거리입니다.
유클리드 (L2)
이웃 영역: 원형
모든 방향으로 같은 거리 = 같은 가까움
맨해튼 (L1)
이웃 영역: 마름모형
축 방향 이동만 허용 = 격자형 거리
유클리드 거리
맨해튼 거리
실습 4: 차원의 저주
2차원에서는 "가까운 이웃"이 정말 가깝습니다. 하지만 차원이 높아지면 모든 데이터가 서로 멀어집니다. "가장 가까운 이웃"과 "가장 먼 점"의 거리 차이가 거의 없어지는 기이한 현상이 벌어집니다.
원룸(1차원: 긴 복도)에서 가까운 사람은 정말 바로 옆에 있습니다. 축구장만한 방(2차원)에서는 좀 더 멀어집니다. 100층짜리 초고층 빌딩(100차원)에서는? "가장 가까운 사람"도 수백 미터 떨어져 있고, "가장 먼 사람"과의 거리 차이가 거의 없습니다. 이 상황에서 "이웃" 개념은 무의미해집니다.
실습 5: 피처 스케일링의 중요성
두 변수가 있습니다: 소득(10,000~100,000원)과 나이(20~60세). 단위 차이가 크면 소득이 거리 계산을 완전히 지배합니다. 나이는 무시되는 것과 같습니다.
키 차이가 10cm(예: 170 vs 160)이고, 연봉 차이가 1,000만원(예: 5000 vs 4000)이라고 합시다. 유클리드 거리를 계산하면 sqrt(102 + 10002) = sqrt(1,000,100)입니다. 키 차이 10은 연봉 차이 1000 앞에서 사실상 무시됩니다. 결과적으로 KNN은 "연봉만 보고" 이웃을 결정하게 됩니다. 이것은 우리가 원하는 결과가 아닙니다. 스케일링(표준화 또는 정규화)을 통해 모든 변수를 같은 범위로 맞춰야, 각 변수가 공정하게 거리 계산에 참여합니다.
스케일링 없이 (원본)
스케일링 후 (표준화)
KNN의 장단점 정리
장점
- 이해하기 매우 쉽다 (직관적)
- 훈련 과정이 없다 (빠른 준비)
- 비선형 결정 경계를 자연스럽게 만든다
- 분류와 회귀 모두 가능하다
- 새 데이터 추가가 간단하다
단점
- 예측이 느리다 (모든 거리를 계산)
- 고차원에서 성능이 급락한다 (차원의 저주)
- 피처 스케일링이 필수이다
- 해석이 어렵다 (왜 그렇게 분류했는지?)
- 메모리를 많이 사용한다 (전체 데이터 저장)
- KNN은 "가장 가까운 K개 이웃의 다수결"로 분류하는 직관적인 알고리즘이다.
- K=1은 과적합, K가 너무 크면 과소적합. 적절한 K는 교차 검증으로 찾는다.
- 유클리드 거리(원형)와 맨해튼 거리(마름모형)는 데이터에 따라 성능이 다르다.
- 고차원에서는 "가까운 이웃"의 의미가 약해진다 (차원의 저주).
- 거리 기반 알고리즘은 반드시 피처 스케일링을 먼저 해야 한다.
다음 장 예고: KNN은 데이터를 "분류"했습니다. 다음에는 데이터를 "그룹으로 묶는" 클러스터링을 배웁니다.