← 모델 목록
수업 실습 2026-08-25 · tabular-classification
최근접 이웃 계열 (거리 기반 분류)

KNeighborsClassifier (scikit-learn)

KNN 퇴사 여부 분류 - 스케일링 전후 비교 (ML 기초 숙제)
모델
가장 가까운 학습 샘플 k개(여기서는 5개)의 다수결로 분류하는 scikit-learn 모델. 거리로 판단하므로 피처 단위(스케일)에 민감함
사용 목적
피처 스케일링(StandardScaler)이 거리 기반 모델 결과를 얼마나 바꾸는지 직접 확인하려고 사용 (ML 기초 숙제)
코드
mnmms/mldl
가중치
없음
accuracy100.0%
실험2회 · 대표 r2
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

  • 수업 제공 CSV 500행 · 퇴사 252 / 잔류 248
  • train 400 · test 100 (stratify, seed 20)

학습

  • n_neighbors 5 · 기본값
  • CPU · scikit-learn 1.9.0
  • 학습 시간 [미확인]

결과

  • 스케일링 전 accuracy 0.46
  • StandardScaler 후 accuracy 1.00

배운 점

  • 연봉(수천만 단위)이 거리를 지배하면 KNN이 무너짐
  • 정답 열(left_company)이 입력에 남아 있어 1.00은 누수 결과
개요용도 의도한 용도: 스케일링 전후로 같은 KNN을 학습해 정확도 차이를 보는 전처리 숙제 대상 사용자: 해당 없음 (학습용) …

용도

  • 의도한 용도: 스케일링 전후로 같은 KNN을 학습해 정확도 차이를 보는 전처리 숙제
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 실제 퇴사 예측. 입력에 정답 열이 남아 있어 점수를 믿을 수 없음

모델 정보

항목 값
베이스 모델 직접 구현 (처음부터 학습)
크기 · 변형 KNeighborsClassifier(n_neighbors=5), 나머지 기본값 (유클리드 거리, uniform 가중치)
리비전 scikit-learn 1.9.0 (uv.lock 기준)
아키텍처 학습 샘플을 저장해 두고, 새 샘플과 가장 가까운 5개의 다수결로 0/1 예측
학습 방식 처음부터 학습 (지도학습)
프롬프트 · 에이전트 구성 해당 없음
데이터확보 방식 공개 데이터셋 그대로 (수업 제공 합성 데이터로 보임 [미확인] ) 출처 수업 자료 data/standard_sca…
항목 값
확보 방식 공개 데이터셋 그대로 (수업 제공 합성 데이터로 보임 [미확인])
출처 수업 자료 data/standard_scaler_clear_difference.csv
직접 수집 내용 해당 없음
이용 조건 확인 해당 없음 (수업 자료)
규모 500행 × 8열 (employee_id, age, annual_salary_krw, satisfaction_score, overtime_hours_month, commute_distance_km, tenure_years, left_company)
분할 train 400 / test 100 (8:2, stratify, 시드 20)
레이블·클래스 분포 퇴사(1) 252 / 잔류(0) 248 (CSV를 세어 확인)
전처리 employee_id, tenure_years 제거. r2는 StandardScaler (train으로 fit, test는 transform만)
개인정보·민감정보 처리 해당 없음 (가상의 직원 데이터)
학습하이퍼파라미터 n_neighbors=5 에폭 / 스텝 해당 없음 학습 시간 [미확인] (노트북에 시간 측정이 없음) 하드웨어 …
항목 값
하이퍼파라미터 n_neighbors=5
에폭 / 스텝 해당 없음
학습 시간 [미확인] (노트북에 시간 측정이 없음)
하드웨어 CPU (scikit-learn). 장비 이름 [미확인]
프레임워크 scikit-learn 1.9.0, pandas 3.0.5
시드 · 재현 방법 train_test_split(test_size=0.2, random_state=20, stratify=y)
결과accuracy (r1, 스케일링 없음) 0.46 test 100 - accuracy (r2, StandardScaler) 1…
지표 값 테스트셋 비교 대상 (baseline 등)
accuracy (r1, 스케일링 없음) 0.46 test 100 -
accuracy (r2, StandardScaler) 1.00 test 100 r1
  • [🚩AI 설명] r2의 1.00은 믿을 수 없는 값입니다. 입력 X = df.drop(columns=["employee_id", "tenure_years"])에 정답 열 left_company가 그대로 남아 있습니다(노트북 출력의 X 표에 left_company 열이 보임). 스케일링 후에는 이 열의 거리 차이가 다른 열과 비슷한 크기가 되어, 사실상 정답을 보고 맞힌 셈입니다.
  • [🚩AI 설명] r1이 0.46(동전 던지기 수준)인 것은 annual_salary_krw(수천만~1억대)가 거리 계산을 거의 독차지해서 다른 피처(정답 열 포함)가 무시되었기 때문으로 보입니다.

추론 성능 (CPU / GPU)

측정 안 함.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
GPU 해당 없음 (scikit-learn은 CPU 전용) - - - -
실험 기록2회 측정 · 대표 r2

같은 모델을 설정·분류기를 바꿔 2번 측정한 기록입니다. ★ r2이(가) 대표 결과(맨 위 수치)입니다.

직전 실행에서 바뀐 설정지표 최고값
실행날짜바뀐 점scalern_neighborssplit_seedaccuracy학습 시간
r1
스케일링 없음
2026-08-25기준: 원본 값 그대로 입력none52046.0%-
★ r2
StandardScaler
2026-08-25train으로 fit한 StandardScaler를 train·test에 적용StandardScaler520100.0%-
accuracy 변화 실행 순서대로 · 높을수록 좋음
r1 · 스케일링 없음
46.0%
r2 · StandardScaler
100.0%
한계 · 배운 점한계 알려진 실패 유형: 정답 열이 입력에 포함됨 (데이터 누수). 정답 열을 빼고 다시 측정하지 않음 [미확인] 편향 / 공…

한계

  • 알려진 실패 유형: 정답 열이 입력에 포함됨 (데이터 누수). 정답 열을 빼고 다시 측정하지 않음 [미확인]
  • 편향 / 공정성 이슈: 해당 없음 (가상 데이터)
  • 성능이 떨어지는 입력 조건: 스케일링하지 않은 입력 (r1)

배운 점

  • 같은 모델·같은 분할에서 StandardScaler 하나로 정확도가 0.46 → 1.00으로 바뀜 (노트북 출력)
  • 스케일러는 train으로만 fit하고 test에는 transform만 적용 (노트북 주석)
  • [🚩AI 설명] 다음에 해 볼 것: left_company를 X에서 빼고 r1·r2를 다시 측정하기. 그래야 스케일링 효과만 따로 볼 수 있음
사용 방법코드 셀 5개
In [1]데이터 불러오기
import pandas as pd

df = pd.read_csv('./data/standard_scaler_clear_difference.csv')
df.head()
In [2]입력·정답 나누기
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

X = df.drop(columns=["employee_id", "tenure_years"])
y = df["left_company"]
In [3]학습·평가 데이터 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=20, stratify=y)
print(X_train.shape)
print(X_test.shape)
Out[3] 출력 보기
(400, 6)
(100, 6)
In [4]스케일링 없이 학습 (r1)
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
result = model.predict(X_test)
accuracy = accuracy_score(result, y_test)
accuracy
Out[4] 출력 보기
0.46
In [5]StandardScaler 적용 후 학습 (r2)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train_scaled, y_train)
result = model.predict(X_test_scaled)
accuracy = accuracy_score(result, y_test)
accuracy
Out[5] 출력 보기
1.0

같은 과제·데이터셋 비교

같은 과제·데이터셋으로 학습한 모델이 생기면 여기에서 비교됩니다.