K-최근접 이웃(KNN)이란? AI에서 가까운 사례의 정답으로 새 입력을 예측하는 방법
TL;DR
K-최근접 이웃(K-Nearest Neighbors, KNN)은 새 입력과 가까운 학습 사례 k개를 찾고 그 사례의 정답을 모아 예측하는 방법입니다. 분류는 이웃의 투표를, 회귀는 이웃 정답값의 평균을 이용합니다. 이웃 수와 거리 기준, 특징의 단위에 따라 결과가 달라지며 가까운 사례가 있다는 이유만으로 예측을 신뢰해서는 안 됩니다.
핵심 3줄 요약
- 핵심 1
가까운 사례의 정답을 참고합니다. 학습 데이터를 보관하고 새 입력 주변의 라벨이나 수치를 모아 예측합니다. - 핵심 2
거리와 이웃 수가 모델을 바꿉니다. k, 가중치, 스케일링을 같은 검증 조건에서 함께 비교합니다. - 핵심 3
이웃 검색과 예측은 다른 단계입니다. ANN은 후보를 빠르게 찾는 검색 방식이고 KNN 분류·회귀는 이웃의 정답을 결합하는 방법입니다.
이 글에서 다룰 내용
- KNN의 한 문장 정의와 사례 기반 학습
- 이웃의 투표와 평균으로 이해하는 예시
- 거리 계산·이웃 선택·정답 결합의 순서
- k·가중치·거리 척도와 스케일링
- ANN·K-means·로지스틱 회귀와의 차이
- 실전 사용처와 데이터 분리·평가 체크리스트
- 고차원·동점·확률 해석의 주의점
K-최근접 이웃을 한 문장으로 정의하면 무엇인가요?
K-최근접 이웃은 입력 공간에서 새 사례와 가까운 k개의 학습 사례를 골라, 이웃의 정답 라벨이나 값을 결합하는 비모수 예측 방법입니다.
한국어로 K-최근접 이웃법, 영어 약자로 k-NN 또는 KNN이라고도 부릅니다. 여기서 k는 예측마다 참고할 이웃의 수입니다. 고객 문의의 유형처럼 정해진 범주를 맞히면 분류이고 소요 시간처럼 연속적인 수치를 맞히면 회귀입니다.
scikit-learn 사용자 가이드는 이 방법을 사례 기반 학습으로 설명합니다. 기본 KNN은 학습 데이터에서 하나의 공통 회귀식이나 신경망 가중치를 먼저 구하지 않습니다. 사례를 보관하고 필요하면 검색 구조를 만든 뒤, 새 입력이 들어올 때 주변 사례를 찾아 판단합니다.
한 줄 정리: KNN은 비슷한 입력에는 비슷한 정답이 있을 것이라는 가정을 사용하는 예측 방법입니다. 무엇을 비슷하다고 볼지는 사람이 정한 특징과 거리 기준에 달려 있습니다.
쉬운 예시로 이해해 볼까요?
두 가지 품종 A와 B를 구분한 감자 기록이 있다고 가정해 보겠습니다. 각 기록에는 크기와 무게를 같은 기준으로 변환한 특징, 실제 품종 라벨이 있습니다. 새 감자의 특징과 가장 가까운 기록 5개를 찾아 품종을 예측합니다. 아래 숫자는 원리를 설명하기 위한 가정 예시입니다.
가까운 순서의 품종이 A, B, A, A, B라면 A가 3개이고 B가 2개입니다. 모든 이웃에 같은 가중치를 주는 KNN 분류는 A를 고릅니다. 이때 A의 투표 비율은 3/5, 곧 0.6입니다. 0.6이라는 값은 이웃 구성에서 계산한 확률 추정치이며 실제 정답률이 반드시 60%라는 보증은 아닙니다.
예측 대상이 품종 대신 작업 시간이라면 회귀가 됩니다. 선택한 이웃 3개의 작업 시간이 10분, 12분, 14분일 때 같은 가중치로 평균을 내면 예측은 12분입니다. 참고할 이웃을 찾는 앞부분은 같지만, 정답을 합치는 규칙과 평가 지표가 달라집니다.
쉬운 예시: 새 사례와 닮은 기록을 먼저 꺼내고 그 기록에 적힌 정답을 모아 답한다고 생각하세요. 품종 이름은 투표로, 작업 시간은 평균으로 결합합니다.
왜 AI에서 KNN이 중요한가요?
단순한 기준 모델로 비교하기 좋습니다
복잡한 학습 구조 없이 특징과 거리의 유용성을 시험합니다. 선형 모델이 놓치는 국소적인 패턴을 잡을 수도 있어 새 데이터셋의 비교 기준이 됩니다. 다만 구현이 단순하다는 말과 운영 비용이 작다는 말은 다릅니다. 보관할 데이터와 질의 때의 거리 계산 비용도 따로 확인합니다.
입력 표현이 적절한지 살펴볼 수 있습니다
예측에 참고한 이웃을 직접 보면 서로 다른 품종이 왜 가까워졌는지, 비슷한 문서가 왜 멀어졌는지 조사하기 쉽습니다. 이웃 목록은 문제를 찾는 단서이지 인과 설명은 아닙니다. 잘못된 라벨이나 우연히 비슷한 기록이 예측을 이끌 수도 있습니다.
KNN은 어떤 순서로 작동하나요?
1. 특징과 정답을 함께 준비합니다
분류·회귀 KNN에는 학습 입력 X와 정답 y가 필요합니다. 입력 한 행이 한 사례이고 열은 특징입니다. 훈련 세트와 평가 세트를 먼저 분리한 다음 전처리를 맞춥니다. 정답 이름을 입력 특징에 끼워 넣거나 같은 사례의 복사본을 양쪽에 넣으면 평가가 부풀려집니다.
2. 새 입력과 학습 사례의 거리를 구합니다
크기와 무게처럼 단위가 다른 특징을 원래 숫자 그대로 섞으면 큰 단위의 특징이 거리를 지배할 수 있습니다. scikit-learn의 스케일링 예시는 같은 KNN도 특징 척도를 바꾸면 분류 경계가 크게 달라짐을 보여 줍니다. 표준화가 항상 최선인 것은 아니며 어떤 특징이 예측에 필요한지도 함께 봅니다.
3. 가장 가까운 k개 이웃을 고릅니다
선택한 거리 기준으로 가까운 사례부터 k개를 찾습니다. scikit-learn의 kneighbors는 이웃까지의 거리와 학습 데이터에서의 위치를 반환합니다. 그 위치로 원래 기록과 라벨을 연결할 수 있습니다. 충분히 멀리 떨어진 입력에도 가장 가까운 이웃은 존재할 수 있으므로 실제 거리도 확인합니다.
4. 이웃의 라벨이나 수치를 결합합니다
KNeighborsClassifier는 클래스별 투표를, KNeighborsRegressor는 정답 수치의 평균을 이용합니다. 같은 가중치라면 각 이웃의 기여가 같고 거리 가중치라면 가까운 이웃의 영향이 커집니다. 분류의 predict_proba 결과는 classes_의 클래스 순서와 함께 읽습니다.
핵심 인사이트: 이웃을 찾는 과정과 이웃의 정답을 합치는 과정은 분리해서 확인하세요. 잘못 고른 이웃에 올바른 투표 규칙을 적용해도 좋은 예측이 나오지 않습니다.
이웃 수와 주요 설정은 무엇을 뜻하나요?
n_neighbors는 판단에 참여할 사례 수입니다
k가 작으면 아주 가까운 패턴에 민감하지만 잡음이나 잘못된 라벨 하나의 영향도 커집니다. k가 커지면 예측이 대체로 매끄러워지는 대신 다른 집단까지 섞일 수 있습니다. 모든 데이터에 맞는 k는 없습니다. 교차 검증으로 후보를 비교하고 각 훈련 분할에서 사용할 수 있는 표본 수를 넘지 않게 정합니다.
weights는 이웃의 영향력을 정합니다
uniform은 이웃에 같은 가중치를 줍니다. distance는 거리의 역수에 비례한 가중치로 가까운 이웃을 더 크게 반영합니다. 거리 0인 중복 사례는 단순히 손으로 나눗셈을 하기보다 라이브러리의 처리 규칙을 따르고 서로 다른 라벨이 같은 특징을 갖는지도 점검합니다.
metric과 p는 가까움의 기준입니다
기본 Minkowski 거리에서 p가 2이면 유클리드 거리, 1이면 맨해튼 거리입니다. 범주 이름을 임의 숫자로 바꾼 값에 수치 거리를 적용하면 존재하지 않는 순서나 간격을 만들 수 있습니다. metric을 precomputed로 정한다면 특징 배열 대신 거리 행렬을 넣으며, 학습할 때 행렬은 정사각형이어야 합니다.
algorithm은 이웃을 찾는 계산 방식입니다
scikit-learn은 brute, kd_tree, ball_tree와 자동 선택인 auto를 제공합니다. 이 설정은 이웃 탐색의 계산 방식이며 투표 규칙인 weights와 역할이 다릅니다. 희소 입력에서는 설정과 관계없이 brute-force 검색을 사용합니다. 트리 방식이 모든 차원과 표본 규모에서 더 빠른 것은 아닙니다.
KNN과 헷갈리는 용어는 무엇이 다른가요?
근사 최근접 이웃 검색과의 차이
ANN은 가까운 후보를 빠르게 찾으면서 정확한 이웃 일부를 놓칠 수 있는 검색 방법입니다. 이 글의 KNN은 찾은 이웃의 정답을 결합해 분류나 회귀 예측을 내는 방법입니다. 기존 근사 최근접 이웃 검색 설명은 검색 재현율과 속도에 초점을 맞춥니다. 후보를 찾는 단계와 최종 예측의 정확도는 따로 평가합니다.
K-means와의 차이
K-means는 정답 라벨 없이 데이터를 중심점 주변의 군집으로 나눕니다. KNN 분류·회귀는 정답이 붙은 학습 사례를 참고합니다. K-means의 K는 군집 수이고 KNN의 k는 예측에 참여할 이웃 수입니다. 이름에 같은 문자가 들어가도 모델의 목적과 출력이 다릅니다.
로지스틱 회귀와의 차이
로지스틱 회귀는 특징의 계수와 편향 항을 학습해 선형 점수를 확률로 바꿉니다. 기본 KNN은 하나의 전역 계수식을 구하지 않고 새 입력 주변의 학습 사례를 이용합니다. 두 방법 모두 분류에 쓰지만 경계의 형태, 데이터 저장량, 예측 비용이 달라 같은 평가 데이터로 비교해야 합니다.
이웃 검색과 LOF의 차이
NearestNeighbors는 정답 y 없이 이웃과 거리를 찾는 도구입니다. LOF는 주변 이웃의 상대적인 밀도를 비교해 이상 정도를 계산합니다. 같은 이웃을 참고하더라도 이웃 목록, 클래스 예측, 이상 점수는 서로 다른 출력이므로 한 결과를 다른 결과로 읽지 않습니다.
실전에서는 어디에 쓰이나요?
라벨이 붙은 이미지나 수치 사례를 분류합니다
사용자 가이드는 손글씨 숫자와 위성 영상 장면 등 분류 문제를 소개합니다. 이미지에서는 픽셀이나 미리 구한 특징을 입력으로 삼을 수 있습니다. 촬영 조건이나 특징 추출 방식이 달라지면 거리의 의미도 달라지므로 학습과 운영 입력의 처리 방식을 맞춥니다.
비슷한 사례의 연속값을 예측합니다
조건이 비슷한 과거 기록의 값을 평균 내는 회귀 기준 모델로 사용합니다. 기본적인 동일 가중치나 양의 거리 가중치 평균은 선택한 이웃 정답의 범위 안에서 예측합니다. 관측 범위를 벗어나 계속 증가하는 추세를 자동으로 외삽하는 모델로 생각하면 안 됩니다.
새 특징 표현의 품질을 비교합니다
같은 라벨 데이터에서 입력 특징만 바꿔 KNN 성능을 비교하면 그 표현이 정답별 가까움을 잘 보존하는지 살펴볼 수 있습니다. 이때 데이터 분할과 k, 거리 기준을 함께 기록합니다. 특징을 만든 모델이 평가 데이터를 이미 보았는지도 확인해야 공정한 비교가 됩니다.
KNN을 적용할 때 어떤 순서로 확인하나요?
1. 예측 대상과 분할 기준을 정합니다. 클래스인지 수치인지 먼저 적고 같은 사람이나 장비의 기록이 훈련과 평가에 섞이지 않게 합니다. 시간순 예측이라면 미래 기록을 이웃 후보로 쓰지 않도록 시간 기준으로 나눕니다.
2. 전처리는 훈련 데이터에서만 맞춥니다. 결측값 대체와 표준화에 필요한 통계를 훈련 분할에서 계산하고 평가에는 그대로 적용합니다. 교차 검증에서는 전처리와 KNN을 파이프라인으로 묶어 매 분할 안에서 다시 학습합니다.
3. k·가중치·거리를 함께 비교합니다. k만 바꾸고 입력 단위를 방치하지 않습니다. 표본 수가 작은 분할에서도 설정이 유효한지 확인하고 복잡한 후보를 늘리기 전에 단순한 분류·회귀 기준 모델과 비교합니다.
4. 틀린 사례의 이웃을 읽습니다. 예측값뿐 아니라 이웃 거리, 원래 라벨, 클래스별 오류를 남깁니다. 클래스 불균형이 크면 전체 정확도만으로 부족합니다. 회귀라면 큰 오차가 특정 범위에 집중되는지도 봅니다.
5. 예측 시간과 보관 범위를 점검합니다. 표본 수가 늘어날 때 질의 시간과 메모리 사용량을 실제로 측정합니다. 이웃의 원본 기록을 보여 주는 기능에는 접근 권한을 적용하고 불필요한 개인정보를 노출하지 않습니다.
실전 체크: 데이터 분리, 전처리 통계, 이웃 수, 거리 기준, 예측 품질, 질의 비용을 같은 실험 기록에 남기세요. 한 번의 좋은 점수보다 입력 조건을 바꿔도 결과가 유지되는지 확인하는 편이 중요합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 고차원의 거리를 과신하지 않습니다. 특징이 많아지면 가까운 이웃을 구분하기 어렵거나 검색이 비효율적일 수 있습니다. 불필요한 특징 제거와 차원 축소를 후보로 검토하되, 차원 축소도 평가 데이터를 미리 보지 않도록 훈련 과정 안에 둡니다.
둘째, 홀수 k가 모든 동점을 없애지는 않습니다. 이진 분류의 동일 가중치 투표에서는 유용하지만 다중 클래스나 거리 가중치에서는 동점이 남을 수 있습니다. 특히 k번째와 그다음 사례의 거리가 같고 라벨이 다르면 scikit-learn 문서가 경고하듯 학습 데이터의 순서가 결과에 영향을 줄 수 있습니다.
셋째, 가까운 이웃의 비율을 검증된 확률로 읽지 않습니다. 이웃 모두가 같은 라벨이어도 학습 범위 밖의 입력일 수 있습니다. 확률의 신뢰성이 필요한 업무라면 별도 데이터에서 확률 구간별 실제 정답 비율도 확인합니다.
넷째, 자기 자신을 이웃으로 넣은 평가를 구분합니다. 학습 입력을 그대로 다시 질의하면 자기 자신이 거리 0인 이웃으로 들어갈 수 있습니다. API에서 질의 입력을 생략할 때의 자기 제외 동작과 별도 배열을 전달할 때의 동작을 확인하고 최종 성능은 분리한 데이터로 판단합니다.
주의: 이웃이 가깝다는 사실은 정답의 보증이 아닙니다. 입력의 단위, 중복 기록, 라벨 오류, 학습 범위를 벗어난 사례를 함께 확인하세요.
자주 묻는 질문
Q1. KNN은 학습이 없는 알고리즘인가요?
기본 KNN은 하나의 예측 계수식을 최적화하는 대신 학습 사례를 보관하고 검색을 준비합니다. 전처리와 이웃 탐색 구조 구성도 필요하므로 아무 준비도 없는 방법이라고 부르면 부정확합니다.
Q2. k는 항상 홀수로 정해야 하나요?
반드시 그렇지는 않습니다. 이진 분류에서 동일 가중치 투표의 동점을 줄이는 데 도움이 되지만 회귀에서는 같은 이유가 적용되지 않습니다. k의 선택은 데이터와 검증 결과를 기준으로 합니다.
Q3. KNN은 분류에만 쓰나요?
아닙니다. 이웃의 클래스 라벨을 모으면 분류이고 연속적인 정답값을 평균 내면 회귀입니다. 가까운 이웃 목록만 찾는 비지도 검색 기능과도 구분합니다.
Q4. 데이터가 많으면 무조건 더 정확해지나요?
관련 있는 사례와 정확한 라벨이 늘면 도움이 될 수 있지만 잘못된 사례나 중복, 다른 분포의 기록이 늘면 오히려 방해가 됩니다. 데이터 증가에 따른 질의 비용과 메모리도 확인합니다.
Q5. 표준화만 하면 좋은 이웃을 찾을 수 있나요?
아닙니다. 단위 차이를 줄여도 예측과 무관한 특징이나 잘못된 범주 표현은 남습니다. 전처리와 거리 기준을 비교하고 실제로 선택된 이웃이 업무상 비슷한 사례인지 확인해야 합니다.
출처
마무리
K-최근접 이웃은 새 입력과 가까운 학습 사례를 찾고 그 정답을 모아 예측하는 방법입니다. 분류에서는 투표, 회귀에서는 평균을 이용하며 이웃 수와 가중치, 거리 기준, 입력 표현이 결과를 결정합니다.
처음 사용한다면 k를 고르는 일보다 데이터 분리와 특징 단위부터 확인하세요. 틀린 예측의 이웃을 직접 읽고 확률 해석과 질의 비용까지 점검하면 KNN을 단순한 예제를 넘어 실제 비교 기준으로 사용할 수 있습니다.
