Skip to content
PART 4 · 21장

K-최근접 이웃

'유유상종'의 알고리즘

새 고객은 어떤 상품을 살까?

새로운 고객이 쇼핑몰에 방문했습니다. 이 고객과 가장 비슷한 기존 고객 5명이 모두 프리미엄 상품을 샀다면, 이 고객도 프리미엄 상품을 살 가능성이 높지 않을까요?

이것이 바로 K-최근접 이웃(K-Nearest Neighbors, KNN) 알고리즘의 핵심입니다. "비슷한 것끼리 모인다"는 직관을 그대로 알고리즘으로 만든 것입니다. 수학 공식을 외울 필요 없이, 주변 이웃의 다수결로 분류합니다.

쉽게 말하면: 새 학생이 전학 오면, 우리는 그 학생이 어떤 성격인지 주변 친구들을 보고 짐작합니다. 옆에 앉은 친구들이 조용한 아이들이면 "이 아이도 조용한 편이겠구나", 활발한 아이들 사이에 있으면 "이 아이도 활발하겠구나"라고 생각하죠. KNN은 정확히 이 방식으로 작동합니다 -- 새 데이터 포인트의 "성격"을 주변 이웃 데이터를 보고 판단하는 것입니다.

이 장에서는 KNN 알고리즘을 직접 그려보고, K값, 거리 측정법, 차원의 저주, 피처 스케일링의 효과를 체험합니다.

KNN의 작동 원리: 다수결

KNN은 머신러닝 알고리즘 중 가장 직관적입니다. 새로운 데이터가 들어오면:

  1. 기존 데이터와의 거리를 모두 계산한다.
  2. 거리가 가장 가까운 K개의 이웃을 찾는다.
  3. K개 이웃 중 다수결로 클래스를 결정한다.
비유: 전학생의 급식 메뉴 선택
전학 온 첫날, 급식 메뉴를 고르지 못합니다. 주변에 앉은 5명(K=5)을 보니 3명이 A메뉴, 2명이 B메뉴를 먹고 있습니다. 다수결로 A메뉴를 선택합니다. 이것이 KNN입니다.
"가까울수록 비슷하다" -- 거리의 핵심 가정
KNN의 모든 것은 이 한 문장에 달려 있습니다: 가까운 데이터는 비슷한 특성을 가진다. 카페에서 주변을 둘러보세요. 같은 테이블에 앉은 사람들은 보통 같은 그룹(친구, 동료, 가족)입니다. 가까이 있다는 것 자체가 유사성의 증거입니다. 이 가정이 성립하지 않는 데이터에서는 KNN이 제대로 작동하지 않습니다.
유클리드 거리: d(a, b) = sqrt( (a1-b1)2 + (a2-b2)2 + ... + (ap-bp)2 )
맨해튼 거리: d(a, b) = |a1-b1| + |a2-b2| + ... + |ap-bp|
KNN의 특별한 점: 대부분의 ML 알고리즘은 훈련 단계에서 모델(수식)을 학습합니다. 하지만 KNN은 훈련 단계가 없습니다. 데이터를 그대로 저장해놓고, 예측할 때 거리를 계산합니다. 이런 방식을 "게으른 학습(lazy learning)"이라 합니다.

실습 1: 2D KNN 분류기

캔버스에 직접 데이터 포인트를 찍고 KNN 분류를 체험하세요. 빨간점/파란점을 찍은 뒤, "?" 모드로 새 점을 찍으면 K개 최근접 이웃의 다수결로 분류합니다.

목표: 1) 빨간/파란 점을 각각 10개 이상 찍으세요. 2) "분류 모드"로 전환 후 빈 공간을 클릭하세요. 3) K값을 바꿔가며 결정 경계가 어떻게 변하는지 관찰하세요.
K=5
빨간점
-
파란점
-
분류된 점
-
현재 K
-
K=1일 때: 결정 경계가 매우 복잡하고 울퉁불퉁합니다 (과적합). K가 너무 크면 경계가 지나치게 단순해집니다 (과소적합). 적절한 K를 찾는 것이 KNN의 핵심입니다.
쉽게 말하면 -- K 선택의 중요성:
K=1은 가장 가까운 딱 한 명만 보는 것입니다. 그 한 명이 특이한 사람(노이즈)이면 판단이 완전히 빗나갑니다. 마치 전학 온 첫날, 바로 옆에 앉은 한 명이 우연히 반에서 가장 독특한 아이였다면? 반대로 K를 반 전체 인원(K=전체)으로 놓으면, 반에서 A형 학생이 더 많으니 누가 와도 무조건 A형이라고 답합니다 -- 다수결이 무의미해지는 것이죠. 적절한 K는 이 두 극단 사이의 균형점입니다.

실습 2: K값의 효과

같은 데이터에 K=1, K=5, K=50을 적용해봅시다. K가 커질수록 결정 경계가 부드러워지지만, 너무 크면 세밀한 패턴을 놓칩니다.

목표: 세 가지 K값의 결정 경계를 비교하고, 정확도가 가장 높은 K를 찾으세요. "데이터 생성" 버튼으로 새로운 데이터를 만들어 반복 실험해보세요.

K = 1 (과적합)

정확도
-

K = 5 (적절)

정확도
-

K = 50 (과소적합)

정확도
-
K 선택의 원칙: K=1은 노이즈에 민감하고, K=N(전체 데이터)은 항상 다수 클래스만 예측합니다. 일반적으로 sqrt(N) 근처에서 시작하여 교차 검증으로 최적 K를 찾습니다. K는 홀수로 설정하면 동점을 피할 수 있습니다.

실습 3: 거리 측정법 비교

"거리"를 어떻게 재느냐에 따라 "이웃"이 달라집니다. 유클리드 거리는 직선거리(새가 날아가는 거리), 맨해튼 거리는 격자형 도로를 따라 가는 거리입니다.

유클리드 (L2)

이웃 영역: 원형

모든 방향으로 같은 거리 = 같은 가까움

맨해튼 (L1)

이웃 영역: 마름모형

축 방향 이동만 허용 = 격자형 거리

목표: 거리 측정법을 토글하며 이웃 영역의 모양이 어떻게 달라지는지 확인하세요. 데이터 분포에 따라 더 나은 거리 측정법이 다릅니다.
K=5

유클리드 거리

맨해튼 거리

유클리드 정확도
-
맨해튼 정확도
-

실습 4: 차원의 저주

2차원에서는 "가까운 이웃"이 정말 가깝습니다. 하지만 차원이 높아지면 모든 데이터가 서로 멀어집니다. "가장 가까운 이웃"과 "가장 먼 점"의 거리 차이가 거의 없어지는 기이한 현상이 벌어집니다.

비유: 방이 커질수록 이웃이 멀어진다
원룸(1차원: 긴 복도)에서 가까운 사람은 정말 바로 옆에 있습니다. 축구장만한 방(2차원)에서는 좀 더 멀어집니다. 100층짜리 초고층 빌딩(100차원)에서는? "가장 가까운 사람"도 수백 미터 떨어져 있고, "가장 먼 사람"과의 거리 차이가 거의 없습니다. 이 상황에서 "이웃" 개념은 무의미해집니다.
쉽게 말하면 -- 차원의 저주란: 좁은 복도(1차원)에 100명이 서 있으면 사람들이 다닥다닥 붙어 있습니다. 이웃을 찾기 쉽습니다. 같은 100명을 거대한 체육관(2차원)에 풀어놓으면 사이 공간이 늘어납니다. 이것을 축구장(3차원), 초고층 빌딩(100차원)으로 계속 확장하면? 같은 인원이 점점 넓은 공간에 흩어지면서, 결국 모든 사람이 비슷하게 멀리 떨어져 있습니다. "가장 가까운 이웃"이라는 개념 자체가 의미를 잃는 것입니다. 이것이 KNN의 가장 큰 약점이며, 고차원 데이터에서는 차원 축소가 필수인 이유입니다.
목표: 차원 슬라이더를 올리면서 최근접 이웃까지의 거리가 어떻게 변하는지 관찰하세요. 고차원에서는 최근접 거리와 최원접 거리의 비율이 1에 가까워집니다.
차원: 2
현재 차원
-
최근접 거리 (평균)
-
최원접 거리 (평균)
-
최근접/최원접 비율
-
1에 가까울수록 위험
차원의 저주 대응법: 1) 차원 축소: PCA 등으로 불필요한 차원을 제거합니다. 2) 피처 선택: 중요한 변수만 남깁니다. 3) 더 많은 데이터: 고차원에서는 기하급수적으로 더 많은 데이터가 필요합니다.

실습 5: 피처 스케일링의 중요성

두 변수가 있습니다: 소득(10,000~100,000원)나이(20~60세). 단위 차이가 크면 소득이 거리 계산을 완전히 지배합니다. 나이는 무시되는 것과 같습니다.

비유: 키를 센티미터로 재면 170cm, 미터로 재면 1.7m. 센티미터 기준이면 "키 차이 10cm"가 "몸무게 차이 10kg"보다 같은 영향을 미칩니다. 하지만 미터 기준이면 키 차이는 0.1m로 줄어들어 몸무게가 지배합니다. 단위의 선택이 결과를 바꿉니다.
쉽게 말하면 -- 키(cm)와 연봉(만원)을 같이 넣으면?
키 차이가 10cm(예: 170 vs 160)이고, 연봉 차이가 1,000만원(예: 5000 vs 4000)이라고 합시다. 유클리드 거리를 계산하면 sqrt(102 + 10002) = sqrt(1,000,100)입니다. 키 차이 10은 연봉 차이 1000 앞에서 사실상 무시됩니다. 결과적으로 KNN은 "연봉만 보고" 이웃을 결정하게 됩니다. 이것은 우리가 원하는 결과가 아닙니다. 스케일링(표준화 또는 정규화)을 통해 모든 변수를 같은 범위로 맞춰야, 각 변수가 공정하게 거리 계산에 참여합니다.
목표: "스케일링 없이"와 "스케일링 후" KNN 결과를 비교하세요. 스케일링 후에 정확도가 어떻게 변하는지 확인하세요.
K=5

스케일링 없이 (원본)

스케일링 후 (표준화)

스케일링 전 정확도
-
스케일링 후 정확도
-
소득 범위
-
원본 단위
나이 범위
-
원본 단위
실무 규칙: 거리 기반 알고리즘(KNN, SVM, K-means 등)은 반드시 피처 스케일링을 먼저 해야 합니다. 표준화(평균 0, 표준편차 1) 또는 Min-Max 정규화(0~1)가 가장 흔한 방법입니다. 트리 기반 알고리즘(결정 트리, 랜덤 포레스트)은 스케일링이 불필요합니다.

KNN의 장단점 정리

장점

  • 이해하기 매우 쉽다 (직관적)
  • 훈련 과정이 없다 (빠른 준비)
  • 비선형 결정 경계를 자연스럽게 만든다
  • 분류와 회귀 모두 가능하다
  • 새 데이터 추가가 간단하다

단점

  • 예측이 느리다 (모든 거리를 계산)
  • 고차원에서 성능이 급락한다 (차원의 저주)
  • 피처 스케일링이 필수이다
  • 해석이 어렵다 (왜 그렇게 분류했는지?)
  • 메모리를 많이 사용한다 (전체 데이터 저장)
이 장의 핵심
  • KNN은 "가장 가까운 K개 이웃의 다수결"로 분류하는 직관적인 알고리즘이다.
  • K=1은 과적합, K가 너무 크면 과소적합. 적절한 K는 교차 검증으로 찾는다.
  • 유클리드 거리(원형)와 맨해튼 거리(마름모형)는 데이터에 따라 성능이 다르다.
  • 고차원에서는 "가까운 이웃"의 의미가 약해진다 (차원의 저주).
  • 거리 기반 알고리즘은 반드시 피처 스케일링을 먼저 해야 한다.

다음 장 예고: KNN은 데이터를 "분류"했습니다. 다음에는 데이터를 "그룹으로 묶는" 클러스터링을 배웁니다.