5장. 갈림길을 배우다 — 분류
이 장의 질문: "예/아니오"는 어떻게 배우는가? 회귀의 뼈대를 분류로 확장하며, 시그모이드·소프트맥스·교차 엔트로피 — 딥러닝 끝까지 쓰일 부품 셋 — 를 손에 넣는다.
전제: 2장(모델·손실·최적화), 3장(확률, 최대가능도).
직선으로 예/아니오를 답하려면
종양의 크기로 악성/양성을 판별하는 문제를 보자. 입력은 숫자(크기), 출력은 범주(악성=1, 양성=0)다. 2장의 직선
우리가 원하는 출력은 3장에서 배운 언어로 정확히 표현된다 — 확률이다. "악성일 확률 0.93". 그러려면 직선의 출력(아무 실수)을 0과 1 사이로 구겨 넣는 장치가 필요하다. 그 장치가 시그모이드(sigmoid) 함수다.
모양을 말로 그리면: 입력
이 모델이 로지스틱 회귀다(이름에 회귀가 붙었지만 분류 모델이다 — 역사적 명명의 장난이니 그러려니 하자). 구조를 음미하라. 직선 부분
채점은 어떻게 하나: 교차 엔트로피의 탄생
손실 함수가 필요하다. 제곱오차를 재활용하면 안 되나? 되긴 되는데, 두 가지 이유로 나쁜 선택이다. 하나는 기술적 문제 — 시그모이드와 제곱오차를 겹치면 손실 지형이 밥그릇 모양이 아니게 되고, 모델이 크게 틀렸을 때 오히려 기울기가 0에 가까워져 학습이 굼떠진다. 다른 하나가 본질적이다 — 3장에서 약속했듯, 손실은 발명이 아니라 확률 가정에서 도출하는 것이다. 도출해 보자.
모델이 확률을 출력하니, 최대가능도 원리를 그대로 적용할 수 있다. "지금 파라미터라면, 실제로 관측된 정답들이 나올 확률은 얼마인가?" 정답이 1인 데이터에는 모델이 말한
읽는 법: 각 데이터에서, 정답이 1이면(
숫자로 감을 잡자. 정답이 1일 때: 모델이
선택지가 여럿이면: 소프트맥스
예/아니오가 아니라 고양이/개/새처럼 선택지가
읽는 법:
이 소프트맥스 + 교차 엔트로피 조합을 눈에 새겨 두라. MNIST 숫자 분류부터 GPT의 "다음 단어 고르기"(선택지 수만 개짜리 분류!)까지, 딥러닝 분류의 최종 출구는 거의 예외 없이 이 조합이다. 게다가 이 조합은 미분하면 기울기가
작은 보너스 하나: 소프트맥스의 점수를 온도
완전히 다른 두 가지 발상
로지스틱 회귀는 "점수를 배우는" 접근이다. 분류를 보는 전혀 다른 시각 둘을 짧게 만나 두자. 대비 속에서 각 방법의 성격이 선명해진다.
k-최근접 이웃(kNN): 배우지 않고 기억한다. 훈련 데이터를 통째로 저장해 두고, 새 입력이 오면 가장 가까운
서포트 벡터 머신(SVM): 여유를 최대화한다. 두 무리를 가르는 직선은 무수히 많다. 그중 무엇이 최선인가? SVM의 답 — 양쪽 무리에서 가장 멀리 떨어진 직선, 즉 여유(마진)가 최대인 경계다. 아슬아슬하게 가르는 경계보다 넉넉하게 가르는 경계가 새 데이터의 흔들림에 강하리라는, 일반화에 대한 기하학적 직관이다. 여기에 커널 트릭(데이터를 고차원으로 은근슬쩍 보내 직선으로 못 가르던 것을 가르게 하는 기법)을 더해, 딥러닝 이전 시대를 SVM이 평정했었다. 지금도 중소 규모 데이터에서는 여전히 강력한 기본기다.
세 접근의 대비를 정리하면 — 로지스틱 회귀는 확률 점수를, kNN은 이웃을, SVM은 여유를 믿는다. 같은 문제에 이렇게 다른 철학이 가능하다는 것, 그리고 셋 다 "모델·손실·최적화"의 틀(kNN은 극단적으로 퇴화한 경우지만) 위에 있다는 것을 함께 기억하라.
손을 움직여 보자
이론이 손에 붙는 데는 몇 줄이면 충분하다.
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
X, y = load_breast_cancer(return_X_y=True) # 유방암 진단 데이터 (569건, 특징 30개)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42)
model = LogisticRegression(max_iter=5000)
model.fit(X_tr, y_tr) # 내부에서: 교차 엔트로피 + 경사 기반 최적화
print("정확도:", model.score(X_te, y_te)) # ~0.96
print("확률 출력:", model.predict_proba(X_te[:3]).round(3))predict_proba가 내놓는 확률을 눈으로 확인하라. 그리고 model.coef_(학습된
핵심 요약
- 분류는 조건부 확률
를 배우는 문제다. 점수(선형 결합)를 시그모이드(2지선다)나 소프트맥스( 지선다)로 확률로 번역한다. - 손실은 최대가능도에서 도출된 교차 엔트로피 — "정답에 부여한 확률의
". 확신에 찬 오답을 극형으로 다스린다. - 소프트맥스 + 교차 엔트로피는 GPT까지 이어지는 딥러닝 분류의 표준 출구이며, 기울기가
로 떨어지는 아름다운 짝이다. - 다른 발상들: kNN(이웃 다수결 — 표현과 거리의 중요성, 차원의 저주), SVM(마진 최대화 — 일반화의 기하학).
스스로 점검
- 정답이 1인 데이터에 모델 A는
, 모델 B는 를 내놓고 맞췄다. 반대로 정답이 0인 다른 데이터에 A는 , B는 를 내놓았다(B는 틀림). 각 경우의 교차 엔트로피 벌점을 계산해, 이 손실이 무엇을 장려하고 무엇을 벌하는지 말해 보라. - 점수
의 소프트맥스는? 점수 은? 온도 으로 나눈 은? (계산기를 써도 좋다.) - 스팸 필터에서 "정상 메일을 스팸으로 오판하는 것"이 반대보다 훨씬 치명적이라면, 결정 임계값 0.5를 어느 방향으로 옮겨야 하나?
- kNN이 "학습이 없는" 모델이라는 말의 의미와, 그럼에도 성능이 표현(벡터화)에 크게 의존하는 이유를 설명해 보라.
다음 장에서
지금까지의 모델은 모두 "점수를 합산"하는 한 가족이었다. 다음 장은 전혀 다른 사고방식 — 스무고개처럼 질문을 던져 데이터를 쪼개 나가는 결정 트리, 그리고 평범한 트리 수백 그루를 묶어 최강의 실무 병기로 만드는 앙상블의 마법이다. 테이블 데이터의 현재 챔피언이 거기서 나온다.