Chapter 00

머신러닝 기초: 데이터에서 규칙을 배운다

스팸 메일을 거르는 규칙을 사람이 일일이 적는 대신, 스팸과 정상 메일 수만 통을 보여 주고 컴퓨터가 규칙을 스스로 찾게 할 수 있을까? 이것이 머신러닝이다. 이 책의 나머지 장(벡터, 뉴런, 학습, 트랜스포머, LLM…)은 모두 이 한 가지 아이디어 위에 서 있다. 이 장에서는 수식을 최소화하고, 대신 "모델을 어떻게 평가하고 어떻게 속지 않을 것인가"를 직접 계산해 보며 익힌다. 정확도 99%짜리 암 검진 모델이 실제로는 쓸모없을 수 있는 이유를 설명할 수 있다면 이 장의 목표를 달성한 것이다.

AI, 머신러닝, 딥러닝, 생성형 AI

뉴스에서는 AI, 머신러닝, 딥러닝, 생성형 AI가 거의 같은 뜻처럼 쓰이지만 범위가 다르다. 가장 넓은 인공지능(Artificial Intelligence, AI)은 "사람이라면 지능이 필요하다고 할 일을 기계가 하게 만드는 모든 기술"이다. 체스 프로그램의 탐색 알고리즘, 사람이 규칙을 적어 넣은 전문가 시스템도 AI다. 그 안의 머신러닝(Machine Learning, ML)은 규칙을 사람이 쓰지 않고 데이터로부터 학습하는 방법들이다. 다시 그 안의 딥러닝(Deep Learning, DL)은 여러 층의 신경망(2장)을 쓰는 머신러닝이다.

인공지능 (AI) 규칙 기반 전문가 시스템, 탐색(체스 α-β), 계획 머신러닝 (ML) 선형·로지스틱 회귀, 결정 트리, SVM, k-means 딥러닝 (DL) MLP, CNN, RNN, BERT(인코더) 생성 모델 / 생성형 AI GAN, VAE, 확산 모델 LLM 고전(딥러닝 아님): GMM, 나이브 베이즈, n-gram
그림 0-1. 포함관계. AI ⊃ ML ⊃ DL은 깔끔한 부분집합 관계지만, '생성 모델'(점선)은 학습 방식이 아니라 무엇을 모델링하느냐에 따른 다른 축의 분류라서 ML과 DL의 경계를 가로지른다. 오늘날 '생성형 AI'라 부르는 것의 대부분(확산 모델, LLM)은 딥러닝 안에 있고, LLM은 딥러닝 ∩ 생성 모델에 속한다.

규칙 기반 vs 학습 기반

전통적인 프로그래밍은 규칙 + 데이터 → 답이다. 머신러닝은 방향을 뒤집어 데이터 + 답 → 규칙을 만든다. 예를 들어 스팸 필터를 규칙으로 만들면 "제목에 '무료'가 있고 링크가 3개 이상이면 스팸" 같은 조건을 사람이 계속 추가해야 한다. 스팸 발송자가 '무.료'라고 쓰면 규칙은 바로 무력해진다. 학습 기반이라면 '스팸/정상' 표시가 붙은 메일 수만 통에서 단어별 가중치를 자동으로 찾고, 새 수법이 나오면 새 데이터로 다시 학습하면 된다.

규칙 기반 (전통적 프로그래밍)학습 기반 (머신러닝)
입력 → 출력규칙 + 데이터 → 답데이터 + 답(또는 신호) → 규칙(모델)
지식의 출처전문가가 명시적으로 작성예시 데이터에서 통계적으로 추출
강점설명 가능, 데이터 불필요, 동작 보장규칙으로 쓰기 어려운 패턴(이미지·음성·언어) 처리, 변화에 재학습으로 대응
약점예외가 폭발, 유지보수 비용, 애매한 경계데이터 품질에 종속, 오류를 확률적으로 냄, 설명 어려움
좋은 예세금 계산, 주민번호 형식 검사얼굴 인식, 번역, 추천, 사기 탐지

실무에서는 둘을 섞는다. 예를 들어 LLM 서비스도 출력 형식 검사, 금지어 필터, 권한 확인은 규칙으로 처리한다. "머신러닝이 필요한가?"의 첫 판단 기준은 사람이 규칙을 적을 수 있는가이다. 적을 수 있고 규칙이 잘 바뀌지 않는다면 규칙이 더 싸고 안전하다.

판별 모델과 생성 모델

모델이 무엇을 학습하느냐에 따라 두 부류로 나눌 수 있다. 판별 모델(discriminative model)은 입력 \(x\)가 주어졌을 때 답 \(y\)의 확률 \(p(y\mid x)\), 또는 그냥 경계선만 배운다. "이 사진이 고양이일 확률 0.93"처럼. 생성 모델(generative model)은 데이터 자체의 분포 \(p(x)\) 또는 \(p(x, y)\)를 배운다. 분포를 알면 그 분포에서 새 샘플을 뽑을 수 있다. 그래서 "생성"이다.

판별 모델생성 모델
학습 대상\(p(y\mid x)\) 또는 결정 경계\(p(x)\), \(p(x,y)\), 또는 \(p(x\mid \text{조건})\)
할 수 있는 일분류·회귀 (주어진 x에 라벨 붙이기)새 데이터 샘플링, 확률 평가, (베이즈 규칙으로) 분류도 가능
고전적 예로지스틱 회귀, SVM, 결정 트리나이브 베이즈, 가우스 혼합(GMM), 은닉 마르코프 모델, n-gram 언어 모델
딥러닝 예이미지 분류 CNN, BERT 감성 분류기GAN, VAE, 확산 모델, GPT류 LLM
난이도 (같은 데이터)상대적으로 쉬움: 경계만 알면 됨어려움: 데이터의 모든 구조를 알아야 함
흔한 오해: "생성 모델 = 생성형 AI"

통계적 의미의 생성 모델(나이브 베이즈처럼 \(p(x,y)\)를 모델링)은 1990년대부터 스팸 필터에 쓰였지만 아무도 '생성형 AI'라 부르지 않았다. 오늘날 '생성형 AI'(Generative AI)는 텍스트·이미지·음성처럼 사람이 쓸 만한 고차원 콘텐츠를 만들어 내는 대형 딥러닝 생성 모델을 가리키는 제품/산업 용어에 가깝다. 반대로, 생성형 AI 모델로도 판별 작업(감성 분류 등)을 할 수 있다. 프롬프트에 "긍정/부정 중 하나로 답하라"고 시키면 된다.

LLM은 어디에 속하나

대형 언어 모델(LLM, 7장)은 다음 토큰의 확률 \(p(x_t\mid x_{<t})\)를 배우는 자기회귀 생성 모델이고, 트랜스포머(6장)라는 심층 신경망으로 구현된다. 따라서 AI ⊃ ML ⊃ DL ⊃ (DL ∩ 생성 모델) ∋ LLM이다. 학습 방식으로 보면 한 가지가 아니다. 사전학습은 자기지도학습, 지시 따르기 미세조정(SFT)은 지도학습, 사람 선호나 검증 가능한 보상으로 다듬는 단계는 강화학습이다(7장). 바로 다음 절에서 이 세 가지를 구분한다.

학습 방식: 지도·비지도·강화·자기지도

머신러닝 방법은 "학습 신호가 어디서 오는가"로 나누는 것이 가장 기본이다. 같은 신경망이라도 어떤 신호로 학습하느냐에 따라 전혀 다른 일을 하게 된다.

지도학습 (Supervised Learning)

입력 \(x\)와 정답 \(y\)의 쌍 \(\{(x_i, y_i)\}_{i=1}^{N}\)이 주어지고, \(f(x)\approx y\)가 되게 하는 함수 \(f\)를 찾는다. 정답을 라벨(label) 또는 타깃이라 한다. 메일 → 스팸 여부, 집 정보 → 가격, 이미지 → 고양이/개. 학습 신호가 가장 명확하고 성능 측정도 쉽지만, 라벨을 붙이는 비용이 병목이다. 의료 영상 1장에 전문의 판독 수 분이 걸린다면 10만 장이면 수천 시간이다.

비지도학습 (Unsupervised Learning)

라벨 없이 \(\{x_i\}\)만 있다. 데이터 안의 구조를 찾는다. 비슷한 고객끼리 묶기(군집화), 고차원 데이터를 2차원으로 줄여 보기(차원 축소, PCA), 평소와 다른 거래 찾기(이상 탐지), 데이터 분포 자체를 추정하기(밀도 추정)가 대표적이다. "정답"이 없으므로 결과의 좋고 나쁨을 판단하기가 어렵다는 것이 근본적 한계다.

강화학습 (Reinforcement Learning, RL)

에이전트가 환경에서 행동 \(a\)를 하고, 그 결과로 보상(reward) \(r\)이라는 스칼라 점수를 받는다. 정답 행동은 알려 주지 않고 "얼마나 좋았는지"만 알려 준다. 게다가 보상은 늦게 온다. 바둑에서 100수 뒤에 이겼다면 어느 수가 좋았던 걸까(신용 할당 문제)? 그래서 지도학습보다 학습이 훨씬 비효율적이고 불안정하지만, 정답을 모르는 문제(게임, 로봇 제어)에서 사람보다 나은 전략을 찾을 수 있다. LLM에서는 사람 선호 점수(RLHF)나 정답 검증기(RLVR, 7장)를 보상으로 써서 모델을 다듬는다. 에이전트 학습의 GRPO는 11장에서 다룬다.

자기지도학습 (Self-Supervised Learning)

라벨을 사람이 붙이지 않고 데이터 자체에서 만들어 내는 지도학습이다. 형식상으로는 \((x, y)\) 쌍으로 학습하니 지도학습이지만, \(y\)가 원본 데이터의 일부라서 라벨 비용이 0이다. 그래서 인터넷 규모의 데이터를 쓸 수 있다.

흔한 오해: "LLM 사전학습은 비지도학습이다"

예전 문헌에서는 사람이 붙인 라벨이 없다는 이유로 '비지도 사전학습'이라 부르기도 했다. 하지만 학습 과정은 명확한 정답 토큰에 대한 교차 엔트로피 최소화(3장)로, 지도학습과 수식이 똑같다. 달라진 것은 정답의 출처뿐이다. 그래서 오늘날에는 자기지도학습이라는 이름이 표준이다.

방식데이터 형태학습 신호대표 예주된 어려움
지도\((x, y)\) 쌍정답 라벨과의 오차스팸 분류, 집값 예측, 이미지 분류, LLM의 SFT라벨 비용, 라벨 오류
비지도\(x\)만데이터 구조 자체(거리, 밀도, 재구성 오차)고객 군집화, PCA, 이상 탐지"좋은 결과"의 기준이 모호
강화상태·행동·보상의 궤적스칼라 보상 (지연·희소)게임 AI, 로봇 제어, RLHF/RLVR신용 할당, 탐색, 불안정성, 보상 해킹
자기지도\(x\)만 (라벨을 \(x\)에서 생성)가린/다음 부분 예측, 대조LLM 사전학습, BERT, CLIP거대한 계산량, 데이터 품질

중간 형태도 많다. 소수의 라벨과 다량의 무라벨 데이터를 함께 쓰는 준지도학습(semi-supervised), 큰 모델이 붙인 라벨로 작은 모델을 학습시키는 지식 증류(distillation)가 그 예다.

분류, 회귀, 군집화

학습 방식이 "신호가 어디서 오나"라면, 태스크는 "무엇을 출력하나"다. 가장 기본적인 세 가지를 보자.

분류 (Classification)

출력이 정해진 범주 중 하나다. 스팸/정상(이진 분류), 숫자 0~9(다중 분류), 한 영화에 여러 장르 태그(다중 라벨 분류). 대부분의 분류 모델은 사실 각 클래스의 점수나 확률을 출력하고, 그 위에 임계값(threshold)이나 argmax를 적용해 최종 클래스를 정한다. 예를 들어 스팸 확률 0.73이 나왔을 때 임계값이 0.5면 스팸, 0.9면 정상으로 판정한다. 이 임계값을 어떻게 고르느냐가 뒤의 평가 지표 절의 핵심 주제다. LLM의 다음 토큰 예측도 어휘 크기(예: 약 128,000개)만큼의 클래스를 가진 분류 문제다.

회귀 (Regression)

출력이 연속적인 수다. 집값, 내일 기온, 배송 소요 시간. 평가도 "맞았다/틀렸다"가 아니라 "얼마나 차이 나는가"로 한다(회귀 지표). 이름 때문에 헷갈리기 쉬운 점: 로지스틱 회귀는 분류 모델이다. 확률이라는 연속값을 회귀하듯 출력하고, 임계값으로 클래스를 정하기 때문에 붙은 역사적 이름이다.

군집화 (Clustering)와 k-means

라벨 없이 비슷한 데이터끼리 묶는 비지도 태스크다. 가장 유명한 알고리즘인 k-means는 \(k\)개의 중심(centroid)을 두고 두 단계를 반복한다.

  1. 할당 단계: 각 점을 가장 가까운(유클리드 거리) 중심의 군집에 넣는다.
  2. 갱신 단계: 각 중심을 자기 군집에 속한 점들의 평균 위치로 옮긴다.

할당이 더 이상 바뀌지 않으면 멈춘다. 이 과정은 다음 군집 내 제곱합(WCSS, inertia)을 매 단계 줄이거나 그대로 둔다. 할당 단계는 각 점에 더 가까운 중심을 고르니 줄어들고, 갱신 단계는 평균이 제곱 거리 합을 최소화하는 점이니 줄어든다. 값이 0 이상이고 할당 조합이 유한하므로 반드시 수렴한다.

$$J = \sum_{j=1}^{k}\sum_{x_i \in C_j} \lVert x_i - \mu_j \rVert^2$$
\(C_j\)는 \(j\)번째 군집, \(\mu_j\)는 그 중심(평균). 1장의 유클리드 거리 제곱이다.

손 계산 예: 1차원 점 {1, 2, 3, 10, 11, 12}, k = 2, 초기 중심 \(\mu_1=1,\ \mu_2=3\). 할당: 1→\(\mu_1\); 2는 두 중심에서 같은 거리 1이라 낮은 번호 \(\mu_1\)로(동점 규칙); 3, 10, 11, 12→\(\mu_2\). 갱신: \(\mu_1 = (1+2)/2 = 1.5\), \(\mu_2=(3+10+11+12)/4=9\). 다시 할당: 3은 \(|3-1.5|=1.5 < |3-9|=6\)이므로 \(\mu_1\)으로 이동. 갱신: \(\mu_1=2,\ \mu_2=11\). 다음 할당은 바뀌지 않아 수렴, \(J = (1+0+1)+(1+0+1) = 4\).

SIMULATOR

k-means를 한 단계씩

점·중심(◆)을 끌어 옮기기 · 빈 곳 클릭 = 점 추가
한 단계
반복
데이터

초기 중심은 무작위 데이터 점에서 뽑는다(시드 고정, '다시 뽑기'마다 바뀜).

WCSS J—
반복 횟수0
다음에 할 단계—
상태—
해볼 것: ① '① 할당'과 '② 중심 갱신'을 번갈아 눌러 J가 절대 늘지 않음을 확인하자. ② '중심 다시 뽑기'를 여러 번 누르면 같은 데이터에서도 수렴한 J가 달라진다. k-means는 지역 최적에 빠질 수 있어 실무에서는 초기화를 여러 번(예: 10번) 해서 J가 가장 낮은 결과를 쓴다(scikit-learn의 기본값은 k-means++ 초기화). ③ k를 1→6으로 올리면 J는 계속 줄어든다. k = 점 개수면 J = 0이다. 그러니 J만 보고 k를 고를 수 없다. 꺾이는 지점(엘보)을 보거나 실루엣 점수 같은 다른 기준을 쓴다. ④ '고리 모양'에서는 k-means가 안쪽 원과 바깥 고리를 나누지 못한다. 중심과의 거리만 보므로 군집이 대략 둥근 덩어리라고 가정하기 때문이다.
태스크출력예대표 지표학습 방식
분류범주 (또는 클래스별 확률)스팸, 질병 유무, 다음 토큰정확도, 정밀도/재현율, F1, AUC지도
회귀연속 실수집값, 수요, 소요 시간MAE, RMSE, R²지도
군집화군집 번호 (의미는 사후 해석)고객 세분화, 문서 묶기WCSS, 실루엣 (정답이 있으면 ARI)비지도
흔한 오해: 군집화와 분류는 같다

둘 다 데이터를 그룹으로 나누지만 분류는 미리 정해진 이름표(스팸/정상)를 맞히는 지도학습이고, 군집화는 이름표 없이 그룹을 발견하는 비지도학습이다. k-means가 낸 "군집 2"가 무엇을 뜻하는지는 사람이 나중에 해석해야 하며, 다시 실행하면 번호가 바뀔 수도 있다.

학습 / 검증 / 테스트 분할

모델의 진짜 목표는 이미 본 데이터를 잘 맞히는 것이 아니라 처음 보는 데이터에서 잘하는 것, 곧 일반화(generalization)다. 이를 측정하려면 학습에 쓰지 않은 데이터가 필요하다. 그래서 데이터를 세 덩어리로 나눈다.

전체 데이터 · 분할은 가장 먼저 (전처리보다도 먼저) 학습 70% 검증 15% 테스트 15% 학습: 파라미터(가중치)를 맞춘다 · 매 스텝 검증: 모델·하이퍼파라미터 선택 · 여러 번 테스트: 최종 성능 보고만 · 딱 한 번 비유: 학습 = 연습문제, 검증 = 모의고사, 테스트 = 수능
그림 0-2. 세 분할의 역할. 비율은 데이터 양에 따라 다르다. 수천 개 규모면 60/20/20이나 70/15/15, 수백만 개면 98/1/1이어도 검증·테스트 각각 수만 개라 충분하다.
분할누가 보나무엇을 결정하나몇 번 쓰나
학습 (training)최적화 알고리즘가중치, 회귀 계수, 트리 분기매 스텝
검증 (validation, dev)사람(또는 튜닝 알고리즘)모델 종류, 차수, 학습률, 규제 강도, 조기 종료 시점, 임계값여러 번
테스트 (test, held-out)아무도 (마지막에만)아무것도 결정하지 않음: 성능을 보고만 함한 번

"테스트 세트는 한 번만" 원칙

검증 세트 점수를 보고 모델을 고르는 순간, 그 점수는 낙관적으로 편향된다. 우연히 그 세트에 잘 맞은 모델이 뽑히기 때문이다. 극단적인 예로, 동전 던지기로 예측하는 쓸모없는 분류기 100개를 테스트 샘플 100개로 각각 평가하면 각 정확도는 평균 50%, 표준편차 \(\sqrt{0.5\cdot0.5/100}=5\%\)다. 그런데 그중 최고를 고르면 그 점수의 기댓값은 약 62.5%다(시뮬레이션으로 확인한 값). 아무것도 배우지 않은 모델이 "12.5%p 더 낫다"고 보고되는 것이다.

그래서 선택은 검증 세트로 하고, 테스트 세트는 모든 결정이 끝난 뒤 한 번만 열어 본다. 테스트 점수를 보고 다시 모델을 고친다면, 그 테스트 세트는 이제 검증 세트가 된 것이며 새 테스트 세트가 필요하다. 공개 벤치마크에서 수많은 논문이 같은 테스트 세트로 경쟁하는 것도 사회 전체가 테스트 세트에 과적합하는 효과를 낳는다. LLM은 여기에 더해 벤치마크 문제가 학습 데이터에 섞여 들어가는 오염(누수) 문제까지 있다.

테스트 점수의 오차 막대

테스트 샘플 \(n\)개에서 정확도 \(\hat p\)를 얻었다면 표준오차는 약 \(\sqrt{\hat p(1-\hat p)/n}\)다. \(n=1{,}000\), \(\hat p = 0.90\)이면 \(\sqrt{0.09/1000}\approx 0.0095\), 95% 신뢰구간은 약 ±1.9%p다. 이 테스트 세트에서 두 모델이 90.3% 대 90.8%로 갈렸다면 그 차이는 잡음 수준이다(같은 샘플을 쓴 짝비교라면 구간이 다소 좁아지지만, 여전히 0.5%p는 의미 있다고 하기 어렵다).

흔한 오해: "검증 세트와 테스트 세트는 같은 말이다"

일상적으로 섞어 쓰는 경우가 많고, 데이터가 적은 연구에서는 '검증 = 테스트'처럼 쓰기도 한다. 하지만 역할은 분명히 다르다. 검증은 선택에 쓰여서 점수가 오염되고, 테스트는 선택에 전혀 쓰이지 않아야 편향 없는 추정치가 된다. 논문이나 보고서에서 "테스트 성능"이 사실 튜닝에 쓴 세트의 점수라면 과대평가된 수치다.

분할 방법에도 주의가 필요하다. 클래스가 불균형하면 각 분할의 클래스 비율이 같도록 층화(stratified) 분할을 쓰고, 시간 순서가 있는 데이터는 무작위가 아니라 시간으로 자르며, 같은 사람·같은 문서에서 나온 여러 샘플은 같은 쪽에 몰아 넣는다. 이 세 가지는 교차 검증과 데이터 누수에서 다시 다룬다.

과적합과 과소적합

과소적합(Underfitting)은 모델이 너무 단순해 데이터의 패턴조차 못 잡는 상태로, 학습 오차와 검증 오차가 둘 다 높다. 과적합(Overfitting)은 모델이 너무 유연해서 패턴뿐 아니라 그 학습 세트에만 있는 우연한 노이즈까지 외운 상태로, 학습 오차는 낮은데 검증 오차가 높다(격차가 크다). 다항식 차수에 따른 모습과 L2 정규화·드롭아웃·조기 종료 같은 처방은 3장 과적합과 일반화에서 이미 실험했다. 여기서는 실무에서 더 자주 쓰는 진단 도구 두 가지에 집중한다.

SIMULATOR

다항 회귀: 복잡도 곡선과 학습 곡선으로 진단하기

● 학습 점 · 점선 = 참 함수 · 실선 = 적합 결과
차수별 MSE
오른쪽 그래프
학습 MSE—
검증 MSE (200점)—
노이즈 바닥 σ²—
검증 최적 차수—
진단—
참 함수는 \(f(x)=\sin 2.5x + 0.3x^2\) (\(x\in[-1,1]\)), 관측은 \(y=f(x)+\varepsilon,\ \varepsilon\sim\mathcal N(0,\sigma^2)\). 계산은 르장드르 다항식 기저의 최소제곱(아주 작은 릿지 10⁻⁸로 수치 안정화). 학습 곡선은 각 n마다 학습 세트를 25번 새로 뽑아 평균한 값이다. 해볼 것: ① d = 1, '학습 곡선'을 보면 두 곡선이 n이 커질수록 σ²보다 한참 위에서 만난다. 데이터를 아무리 늘려도 안 낫는 과소적합의 전형이다. 처방은 데이터가 아니라 더 복잡한 모델이다. ② d = 12, n = 20이면 두 곡선 사이 격차가 크다(과적합). n을 끝까지 늘리면 격차가 줄어든다. 이 경우엔 데이터 추가가 효과적인 처방이다. ③ 진단 칸의 규칙(교육용 휴리스틱): 학습 MSE가 σ²의 1.5배 이상이면 과소적합, 검증 MSE가 학습 MSE의 1.5배 이상이면 과적합.
증상학습 오차검증 오차학습 곡선 모양효과 있는 처방효과 없는 처방
과소적합 (높은 편향)높음높음, 학습 오차와 비슷두 곡선이 높은 곳에서 일찍 수렴모델 키우기, 특성 추가, 규제 줄이기, 더 오래 학습데이터 더 모으기
과적합 (높은 분산)낮음높음 (격차 큼)격차가 크고 n이 늘면 천천히 좁아짐데이터 추가, 규제·드롭아웃, 조기 종료, 모델 줄이기, 앙상블모델 더 키우기 (고전적 영역에서)
적정σ² 근처σ² 근처둘 다 노이즈 바닥 근처(더 좋아지려면 노이즈 자체를 줄이는 데이터 품질 개선)—
흔한 오해: "학습 오차가 0이면 최고의 모델"

노이즈가 있는 데이터에서 학습 오차 0은 노이즈까지 외웠다는 신호다. 관측 노이즈의 분산이 σ²라면 참 함수 그 자체도 새 데이터에서 MSE ≈ σ²를 낸다. 어떤 모델도 기댓값으로 이 바닥보다 낮을 수 없다(다음 절의 \(\sigma^2\) 항). 반대로 "과적합이니까 무조건 작은 모델"도 아니다. 데이터가 충분하다면 큰 모델이 이긴다. 판단은 언제나 검증 오차로 한다.

편향-분산 트레이드오프

과소적합과 과적합을 하나의 식으로 설명하는 것이 편향-분산 분해(Bias-Variance Decomposition)다. 사고 실험을 해 보자. 같은 분포에서 학습 세트를 여러 번 새로 뽑아 같은 방식으로 모델을 학습시키면, 매번 조금씩 다른 모델 \(\hat f\)가 나온다. 이 모델들의 집합을 보면 두 가지를 물을 수 있다.

$$\underbrace{\mathbb E\big[(y-\hat f(x))^2\big]}_{\text{기대 테스트 오차}} = \underbrace{\big(f(x)-\bar f(x)\big)^2}_{\text{편향}^2} + \underbrace{\mathbb E\big[(\hat f(x)-\bar f(x))^2\big]}_{\text{분산}} + \underbrace{\sigma^2}_{\text{줄일 수 없는 노이즈}}$$
기댓값은 학습 세트(와 새 관측 노이즈)에 대해 취한다. \(y=f(x)+\varepsilon\), \(\mathbb E[\varepsilon]=0\), \(\mathrm{Var}(\varepsilon)=\sigma^2\)인 제곱 오차일 때 정확히 성립한다(교차항이 기댓값 0이 되어 사라진다). 위 식은 한 점 \(x\)에서의 분해이고, 아래 시뮬레이터는 \(x\)에 대해 평균한다.

수치 예: 어떤 점 \(x_0\)에서 참값 \(f(x_0)=2.0\), 노이즈 \(\sigma=0.3\). 학습 세트를 5번 뽑아 만든 모델의 예측이 1.6, 1.7, 1.5, 1.8, 1.4라면 평균 \(\bar f = 1.6\), 편향² \(=(2.0-1.6)^2=0.16\), 분산 \(=\frac{1}{5}(0^2+0.1^2+0.1^2+0.2^2+0.2^2)=0.02\), 노이즈 \(0.09\) → 기대 오차 \(0.27\). 편향이 지배적이니 모델을 더 유연하게 만들 차례다. 반대로 예측이 2.6, 1.3, 2.4, 1.5, 2.2였다면 평균은 2.0으로 편향 0이지만 분산이 \(\frac{1}{5}(0.36+0.49+0.16+0.25+0.04)=0.26\)으로 크다.

SIMULATOR

곡선 다발로 보는 편향² + 분산

가는 선 = 각 학습 세트로 적합 · 굵은 선 = 평균 f̄ · 점선 = 참 f
차수별 분해 (로그 축)
학습 세트 만드는 법 (B = 40개)
편향²—
분산—
노이즈 σ²—
합 (이론)—
실측 테스트 MSE—
B = 40개의 학습 세트로 각각 최소제곱 적합한 뒤, \([-1,1]\)에서 균등하게 뽑은 테스트 위치 400곳에서 \(\bar f\), 편향², 분산을 계산한다(왼쪽 그림은 격자 위의 곡선). '실측 테스트 MSE'는 40개 모델 각각을 그 400곳의 노이즈 섞인 새 관측값으로 평가한 평균으로, 이론 합과 거의 같아야 한다(분해가 맞다는 수치 확인. 차이는 노이즈 표본의 우연 오차 정도). '부트스트랩'은 데이터 하나(n개)에서 복원 추출로 B개 세트를 만든다. 실제로는 분포에서 새 데이터를 뽑을 수 없으므로 이렇게 분산을 근사한다(배깅·랜덤 포레스트의 원리). 해볼 것: ① d를 0→12로 올리며 오른쪽 그래프에서 편향²(내려감)과 분산(올라감)이 교차하는 지점을 찾자. 합이 가장 낮은 차수가 최적이다. ② d = 10에서 n을 10→100으로 늘리면 분산이 극적으로 줄고 최적 차수가 오른쪽으로 이동한다. 데이터가 많을수록 복잡한 모델을 감당할 수 있다. ③ σ를 키우면 분산도 같이 커진다. 노이즈는 바닥(σ²)을 올릴 뿐 아니라 모델을 흔든다.
딥러닝 시대의 편향-분산

"용량을 늘리면 분산이 커진다"는 고전적 U자 그림은 파라미터 수가 데이터 수를 크게 넘는 현대 신경망에서는 그대로 성립하지 않는다(이중 하강, 3장). 그래도 분해식 자체는 언제나 참이다. 거대 모델에서는 SGD의 암묵적 규제 등으로 분산이 생각보다 작게 유지된다는 것이 현재의 대략적 이해다. 또 앙상블(여러 모델의 평균)이 거의 항상 성능을 올리는 이유가 바로 분산 항을 줄이기 때문이다. 서로 독립적인 오차를 가진 모델 \(M\)개를 평균하면 분산은 약 \(1/M\)로 준다.

데이터 누수

데이터 누수(Data Leakage)는 실제 예측 시점에는 알 수 없는 정보, 또는 평가 데이터의 정보가 학습 과정에 새어 들어가는 것이다. 증상은 언제나 같다. 검증 점수는 놀랍게 좋은데 배포하면 성능이 무너진다. 과적합은 검증 점수가 나쁘게 나와서 스스로 드러나지만, 누수는 검증 점수 자체를 부풀리기 때문에 평가로는 잡히지 않는다. 그래서 더 위험하다. 경험 법칙 하나: 너무 좋아서 믿기 힘든 결과는 대개 누수다.

① 타깃 누수 (target leakage)

정답과 같은 정보, 또는 정답이 정해진 뒤에야 생기는 정보가 특성에 들어간 경우다.

판별 질문: "예측을 하는 바로 그 순간, 이 값을 정말로 알 수 있는가?" 특성마다 '언제 기록되는 값인가'를 확인해야 한다.

② 전처리 누수 (train-test contamination)

분할 전에 전체 데이터로 전처리 통계를 계산하는 경우다. 대표적으로 전체 데이터의 평균·표준편차로 정규화한 뒤 나누면, 검증 세트의 정보(평균·분산)가 학습 쪽 변환에 섞인다. 단순 정규화는 보통 점수를 아주 조금만 바꾸지만, 같은 실수를 아래 작업에서 하면 피해가 크다.

원칙은 하나다. 모든 '학습 가능한' 전처리(평균, 분산, 어휘, 선택된 특성 목록, 결측 대체값)는 학습 분할에서만 fit하고, 검증·테스트에는 transform만 한다. 교차 검증이라면 fold마다 다시 fit해야 한다. scikit-learn의 Pipeline이 존재하는 이유다.

③ 시간 누수 (temporal leakage)

시간 순서가 있는 데이터를 무작위로 나누면 "미래로 과거를 예측"하는 꼴이 된다. 2024년 6월 데이터로 학습해 2024년 3월을 맞히는 것은 실제로는 불가능한 일이다. 주가·수요 예측에서 무작위 분할을 하면 검증 점수가 크게 부풀려진다. 더 교묘한 형태도 있다. 중심 이동평균(앞뒤 3일)을 특성으로 쓰면 미래 3일이 들어가고, '월말 기준 고객 등급' 같은 스냅숏 테이블을 월중 예측에 붙이면 그달 말의 정보가 섞인다. 처방은 시간 기준 분할(과거로 학습, 미래로 평가)과 특성마다 기준 시점을 정해 그 이전 데이터만 쓰는 것이다.

④ 중복·그룹 누수 (duplicate / group leakage)

같은 개체에서 나온 여러 샘플이 학습과 평가에 나뉘어 들어가는 경우다. 환자 1명당 X선 사진 10장이 있는데 사진 단위로 무작위 분할하면, 모델은 '폐렴'이 아니라 '이 환자의 갈비뼈 모양'을 외워 점수를 낼 수 있다. 같은 문서의 문장들, 같은 화자의 음성, 웹 크롤링의 거의 같은 페이지도 마찬가지다. LLM 평가에서는 벤치마크 문제가 사전학습 데이터에 섞여 들어가는 벤치마크 오염(contamination)이 같은 문제다. 처방은 그룹 단위 분할(같은 환자는 한쪽에만)과 중복 제거다.

SIMULATOR

순수한 잡음에서 90% 정확도 만들기: 특성 선택 누수

누수 CV 정확도—
올바른 CV 정확도—
새 데이터 실제 정확도—
부풀려진 정도—
설정: 특성 p개가 모두 \(\mathcal N(0,1)\) 잡음이고 라벨은 동전 던지기(50:50)다. 즉 맞힐 수 있는 정보가 전혀 없다. 분류기는 최근접 중심(클래스별 평균에 더 가까운 쪽), 평가는 5-fold 교차 검증. 누수: 전체 n개로 라벨과 상관이 가장 큰 특성 m개를 고른 뒤 CV. 올바름: fold마다 학습 부분에서만 특성을 골라 CV. '새 데이터'는 전체로 고른 모델을 독립된 2,000개 샘플로 평가한 값이다. 해볼 것: ① 기본값(n = 50, p = 1000, m = 10)에서 누수 CV가 대개 80~95%로 나온다. 같은 데이터에서 새 데이터 정확도는 50% 근처이고, 올바른 CV도 50% 언저리에서 흔들린다(n이 작아 대략 30~65%). ② p를 줄이면 부풀림이 줄어든다. 후보가 많을수록 우연히 라벨과 상관된 잡음 특성을 찾기 쉬워진다. ③ '진짜 신호'를 켜면 올바른 CV가 새 데이터 정확도를 잘 따라가는 반면, 누수 CV는 여전히 그보다 높다.

이 실험은 Hastie, Tibshirani, Friedman의 The Elements of Statistical Learning(7.10.2절, "교차 검증을 하는 잘못된 방법과 올바른 방법")에 나오는 고전적 예를 축소해 재현한 것이다. 유전자 수만 개 중 몇 개를 고르는 생물정보학 연구에서 실제로 반복된 실수다.

누수 탐지 체크리스트

유형무엇이 새나예처방
타깃 누수정답 또는 정답 이후의 정보항생제 처방 → 폐렴특성별 기록 시점 검토, 의심 특성 제거
전처리 누수검증 데이터의 통계전체로 정규화·특성 선택·SMOTE 후 분할분할 먼저, 파이프라인을 fold 안에서 fit
시간 누수미래 정보주가 무작위 분할, 중심 이동평균시간 기준 분할, 기준 시점 이전 데이터만
중복/그룹 누수같은 개체의 다른 샘플환자별 여러 장 사진, 벤치마크 오염그룹 단위 분할, 중복 제거

특성 공학

모델은 숫자 벡터만 먹는다. 원시 데이터(날짜, 도시 이름, 소득, 빈칸)를 모델이 쓰기 좋은 숫자 벡터로 바꾸는 작업이 특성 공학(Feature Engineering)이다. 표 형태의 데이터(엑셀 같은 데이터)를 다루는 고전 머신러닝에서는 성능의 대부분이 여기서 결정된다는 말이 있을 정도다.

스케일링

특성마다 단위와 범위가 다르면 거리나 경사에 기반한 모델이 큰 값의 특성에 휘둘린다. 예: 고객 A(30세, 연소득 5,000만 원), B(60세, 5,100만 원), C(31세, 6,000만 원)가 있다. 소득을 만 원 단위로 두고 유클리드 거리를 재면 \(d(A,B)=\sqrt{30^2+100^2}\approx 104\), \(d(A,C)=\sqrt{1^2+1000^2}\approx 1000\)이라 A는 서른 살 많은 B와 "닮았다". 나이의 표준편차를 12세, 소득의 표준편차를 2,000만 원이라 하고 표준화하면 \(d(A,B)=\sqrt{2.5^2+0.05^2}\approx 2.50\), \(d(A,C)=\sqrt{0.083^2+0.5^2}\approx 0.51\)로 순위가 뒤집힌다.

$$\text{표준화: } z=\frac{x-\mu}{\sigma}\qquad\qquad \text{min-max: } x'=\frac{x-x_{\min}}{x_{\max}-x_{\min}}\in[0,1]$$
\(\mu,\sigma,x_{\min},x_{\max}\)는 학습 분할에서만 계산한다(전처리 누수). 경사하강에서도 스케일이 제각각이면 손실 지형이 길쭉해져 학습이 느려진다(3장). 결정 트리 계열은 값의 순서만 보므로 스케일링이 필요 없다.

범주형 인코딩: 원핫

도시 {서울, 부산, 대구}를 0, 1, 2로 바꾸면 모델은 "대구 = 서울의 2배", "부산은 서울과 대구의 중간"이라는 있지도 않은 순서와 거리를 배운다. 원핫 인코딩(one-hot)은 범주마다 차원을 하나씩 만들어 서울 = (1,0,0), 부산 = (0,1,0), 대구 = (0,0,1)로 바꾼다. 모든 범주가 서로 같은 거리 \(\sqrt2\)가 된다. 범주가 수만 개(상품 ID, 단어)면 벡터가 너무 커지고 희소해진다. 이때 쓰는 것이 학습되는 밀집 벡터, 곧 4장의 임베딩이다. 실제로 임베딩 층은 원핫 벡터에 가중치 행렬을 곱하는 것과 수학적으로 같다.

로그 변환

소득, 조회 수, 거래액처럼 오른쪽 꼬리가 긴 분포는 소수의 거대한 값이 모델(특히 MSE 손실과 선형 모델)을 좌우한다. \(\log\)를 취하면 곱셈적 차이가 덧셈적 차이가 된다. 연소득 1,000만, 1억, 10억 원은 원래 값으로는 간격이 9,000만 대 9억이지만 \(\log_{10}\)으로는 7, 8, 9로 등간격이다. 0이 있으면 \(\log(1+x)\)를 쓴다. 타깃에 적용하면 '상대 오차'를 줄이도록 학습하는 효과가 있다.

교차 특성 (interaction features)

두 특성의 조합이 중요할 때 곱이나 비율을 새 특성으로 만든다. 키와 몸무게 각각보다 BMI = 몸무게/키²가 건강 지표로 낫고, 면적과 평당 가격의 곱이 매매가다. 2장의 XOR은 \(x_1\)과 \(x_2\) 각각으로는 직선 하나로 나눌 수 없지만, 교차 특성 \(x_1x_2\)를 추가하면 (부호를 ±1로 쓸 때) \(x_1x_2>0\)인지 하나만 보면 되는 선형 문제가 된다. 은닉층이 하는 일을 사람이 손으로 해 준 것이다.

결측치

빈칸을 그냥 지우면(행 삭제) 데이터가 줄고, 빈칸이 무작위가 아니라면 편향이 생긴다(예: 소득 응답을 거부하는 사람은 고소득층에 몰려 있을 수 있다). 흔한 처리는 학습 분할의 평균·중앙값·최빈값으로 채우고(대체, imputation), "결측이었음" 표시 특성을 함께 추가하는 것이다. 결측 여부 자체가 정보인 경우가 많기 때문이다(혈액검사 결과가 없다 = 의사가 검사할 필요를 못 느꼈다). 그래디언트 부스팅 트리 라이브러리 다수는 결측을 직접 처리한다.

딥러닝: 특성을 사람이 아니라 모델이 만든다

이미지에서 "귀 모양", "털 질감" 같은 특성을 사람이 설계하던 시대(SIFT, HOG 등)는 2012년 무렵 CNN이 원시 픽셀에서 특성을 직접 학습하면서 끝났다. 딥러닝의 핵심은 표현 학습(representation learning)이다. 은닉층이 데이터에서 유용한 특성을 스스로 만들어 내고, 마지막 층은 그 특성 위의 단순한 선형 분류기일 뿐이다. 텍스트에서는 단어·토큰의 임베딩(4장)과 문맥에 따라 바뀌는 표현(5장)이 학습된 특성이다.

수작업 특성 + 고전 ML표현 학습 (딥러닝)
특성을 만드는 주체도메인 전문가신경망 (경사하강)
잘 맞는 데이터표 형태(행 = 샘플, 열 = 의미 있는 변수)이미지·음성·텍스트 같은 원시 고차원 데이터
필요한 데이터 양수백~수만 개로도 가능많을수록 좋음 (사전학습 모델로 완화)
해석특성 의미가 명확내부 표현 해석이 어려움
대표 도구그래디언트 부스팅(XGBoost, LightGBM)CNN, 트랜스포머
흔한 오해: "딥러닝 시대에 특성 공학은 필요 없다"

원시 데이터에 대해서는 대체로 맞지만, 표 형태 데이터에서는 2020년대에도 잘 만든 특성 + 그래디언트 부스팅 트리가 딥러닝과 대등하거나 더 나은 경우가 많다고 여러 벤치마크 연구가 보고한다. 또 딥러닝에서도 입력 정규화, 결측 처리, 누수 없는 특성 설계는 여전히 사람의 몫이다. LLM 애플리케이션에서 프롬프트에 어떤 정보를 어떤 형식으로 넣을지 고르는 것도 넓게 보면 특성 공학이다.

교차 검증

데이터가 1,000개뿐인데 검증용으로 200개를 떼면 두 가지 문제가 생긴다. 학습 데이터가 줄고, 검증 점수가 그 200개가 무엇이었는지에 크게 좌우된다. k-겹 교차 검증(k-fold Cross Validation)은 데이터를 \(k\)개 덩어리(fold)로 나누고, 각 덩어리를 한 번씩 검증으로, 나머지 \(k-1\)개를 학습으로 써서 \(k\)번 학습·평가한다. 모든 샘플이 정확히 한 번 검증에 쓰인다.

$$\text{CV 점수} = \frac{1}{k}\sum_{i=1}^{k} s_i,\qquad \text{표준편차} = \sqrt{\frac{1}{k-1}\sum_{i=1}^{k}(s_i-\bar s)^2}$$
\(s_i\)는 \(i\)번째 fold의 검증 점수. 예: 5-fold 정확도가 0.82, 0.85, 0.79, 0.88, 0.81이면 평균 0.830, 표본 표준편차 약 0.035. 두 모델의 CV 평균 차이가 이 표준편차보다 훨씬 작다면 우열을 단정하기 어렵다.

비용은 학습 \(k\)번이다. 흔히 \(k=5\) 또는 10을 쓴다. 극단인 \(k=n\)은 LOOCV(leave-one-out)로, 학습 데이터를 최대로 쓰지만 \(n\)번 학습해야 한다. 거대 신경망은 한 번 학습도 비싸서 교차 검증 대신 고정된 검증 세트를 쓰는 것이 보통이다. 교차 검증은 데이터가 적고 학습이 싼 고전 ML에서 특히 중요하다.

어떻게 fold를 나누느냐는 데이터 구조에 따라 달라야 한다.

SIMULATOR

fold 나누기와 점수: 무작위 vs 층화 vs 그룹 vs 시계열

분할 방법
분류기

데이터: 환자 20명 × 측정 3회 = 60개, 양성 30%. 같은 환자의 측정값은 서로 매우 비슷하다. 가로 순서 = 측정 시간.

—

CV 평균 정확도—
표준편차—
검증 fold 양성 비율 범위—
새 환자 200명 실제 정확도—
격자의 각 행이 한 번의 학습·평가(fold)이고 각 칸이 샘플이다. 진한 칸 = 검증, 옅은 칸 = 학습, 빈 칸 = 사용 안 함. 맨 위 띠는 환자(그룹) 색, 그 아래 띠는 라벨(진한 = 양성). 분류기는 k-최근접 이웃(가장 가까운 학습 샘플 k개의 다수결)이다. 해볼 것: ① 1-NN에서 'k-fold'(무작위)와 '그룹'을 비교하자. 무작위 분할은 같은 환자의 다른 측정값이 학습 쪽에 있어 그 라벨을 그대로 베끼므로 점수가 높게 나온다. '새 환자' 실제 정확도에 가까운 쪽은 그룹 분할이다. ② '층화'에서는 검증 fold마다 양성 비율이 거의 같다. 'k-fold'의 양성 비율 범위와 비교해 보자. ③ '시계열'에서는 첫 구간이 학습에만 쓰이고, 학습 구간이 점점 길어진다. 그런데 점수는 여전히 높다. 한 환자의 측정이 여러 시점에 흩어져 있어 과거 구간에 같은 환자가 이미 있기 때문이다. 시간 분할이 그룹 누수까지 막아 주지는 않는다. 둘 다 필요하면 '그룹 + 시간'을 함께 고려해 나눈다.
방법나누는 기준언제 쓰나잘못 쓰면
k-fold (무작위)샘플을 섞어 k등분샘플이 서로 독립(i.i.d.)이고 클래스가 균형그룹·시간 구조가 있으면 낙관적 편향
층화 k-fold각 fold의 클래스 비율 유지불균형 분류 (사실상 분류의 기본값)—
시계열 분할시간 순서, 과거 → 미래예측(forecasting), 로그·거래 데이터무작위 분할 시 미래 누수
그룹 k-fold그룹 단위로 fold 배정환자·사용자·문서별 다중 샘플샘플 단위 분할 시 개체를 외워서 점수 상승
LOOCV샘플 1개씩데이터가 아주 적을 때계산량 n배, 추정 분산이 클 수 있음
흔한 오해: "교차 검증을 했으니 테스트 세트는 필요 없다"

CV로 하이퍼파라미터를 고르면 CV 점수도 선택에 쓰인 점수, 곧 검증 점수가 된다(앞의 원칙). 최종 성능 보고에는 여전히 따로 떼어 둔 테스트 세트가 필요하다. 데이터가 너무 적어 테스트 세트를 떼기 어렵다면 바깥 CV가 평가, 안쪽 CV가 튜닝을 맡는 중첩 교차 검증(nested CV)을 쓴다. 또 CV는 모델 선택 도구다. 설정을 정한 뒤에는 보통 전체 학습 데이터로 한 번 더 학습해 최종 모델을 만든다.

분류 평가 지표: 혼동 행렬에서 F1까지

"정확도 95%"라는 말만으로는 모델이 좋은지 알 수 없다. 무엇을 어떻게 틀렸는지를 봐야 한다. 이진 분류의 모든 지표는 하나의 2×2 표에서 나온다.

혼동 행렬 (Confusion Matrix)

예측: 양성 (Positive)예측: 음성 (Negative)
실제: 양성TP참 양성 · 제대로 찾음FN거짓 음성 · 놓침 (2종 오류)
실제: 음성FP거짓 양성 · 헛경보 (1종 오류)TN참 음성 · 제대로 넘김

이름 읽는 법: 뒤 글자(P/N)는 모델의 예측, 앞 글자(T/F)는 그 예측이 맞았는지다. FP는 "양성이라고 했는데(P) 틀렸다(F)", 즉 실제로는 음성이다. 어느 쪽을 '양성'이라 부를지는 관심 대상(질병, 사기, 스팸)으로 정하는 관례일 뿐이고 좋다/나쁘다의 뜻이 없다. 다중 클래스면 \(C\times C\) 표가 되고, 대각선이 정답, 비대각 칸은 "어떤 클래스를 무엇으로 착각했는지"를 보여 준다.

정확도, 정밀도, 재현율, F1

$$\text{Accuracy}=\frac{TP+TN}{TP+FP+FN+TN}\qquad \text{Precision}=\frac{TP}{TP+FP}\qquad \text{Recall}=\frac{TP}{TP+FN}$$ $$F_1 = \frac{2\cdot \text{Precision}\cdot\text{Recall}}{\text{Precision}+\text{Recall}} = \frac{2TP}{2TP+FP+FN}$$
정밀도(Precision): 모델이 "양성"이라 한 것 중 진짜 양성의 비율. 경보를 믿어도 되는가? 재현율(Recall, 민감도·TPR): 실제 양성 중 모델이 찾아낸 비율. 놓치지 않는가? 특이도(Specificity) \(=TN/(TN+FP)\)는 음성 쪽의 재현율이고, \(1-\)특이도 = FPR(거짓 양성률)이다.

F1은 정밀도와 재현율의 조화 평균이다. 산술 평균이 아닌 이유는 한쪽이 형편없으면 점수도 형편없어야 하기 때문이다. 정밀도 1.0, 재현율 0.1인 모델(확실한 것 하나만 양성이라 말하는 겁쟁이 모델)의 산술 평균은 0.55지만 F1은 \(2\cdot1\cdot0.1/1.1\approx0.18\)이다. 재현율을 더 중시하면 \(F_\beta\)(\(\beta=2\)면 재현율에 4배 가중)를 쓴다.

계산 예: 스팸 필터가 메일 1,000통 중 100통을 스팸으로 판정했고, 그중 90통이 진짜 스팸이었다. 실제 스팸은 모두 120통이다. TP = 90, FP = 10, FN = 30, TN = 1000 − 90 − 10 − 30 = 870. 정확도 = 960/1000 = 96.0%, 정밀도 = 90/100 = 0.90, 재현율 = 90/120 = 0.75, F1 = 180/(180+10+30) ≈ 0.818.

상황더 비싼 오류중시할 지표임계값 방향
암 1차 검진FN (환자를 놓침)재현율 (정밀도는 2차 검사가 보완)낮춤
스팸 필터FP (중요 메일이 스팸함으로)정밀도높임
카드 사기 탐지둘 다 비쌈 (손실 vs 고객 불편)비용 가중 지표, PR 곡선비용 비율로 결정
검색·RAG 후보 단계FN (관련 문서 누락)Recall@k (10장)후보를 넉넉히

불균형 데이터에서 정확도의 함정

유병률 1%인 암을 10,000명에게 검진한다고 하자. 실제 환자는 100명, 건강한 사람은 9,900명이다.

B가 A보다 훨씬 유용한데도 정확도로는 진다. 또 B에서 양성 판정을 받은 사람 중 실제 환자는 약 11명 중 1명뿐이다. 이것이 기저율 무시(base rate fallacy)다. 검사가 "90% 정확"해도 병이 드물면 양성 판정의 대부분은 헛경보다. 그래서 실제 검진은 민감한 1차 검사로 넓게 거른 뒤 정밀한 2차 검사로 확진하는 두 단계로 운영한다.

흔한 오해: "정밀도와 재현율은 모델의 고정된 성질이다"

둘 다 임계값을 바꾸면 바뀐다. 임계값을 낮추면 양성 판정이 늘어 재현율↑ 정밀도↓, 높이면 반대다. 게다가 정밀도는 유병률에도 의존한다. 같은 모델(같은 민감도·특이도)이라도 양성 비율이 50%인 병원 데이터에서는 정밀도가 높고, 1%인 일반 인구에서는 낮다. 반면 재현율(TPR)과 FPR은 각 클래스 안에서의 비율이라 유병률과 무관하다. 아래 시뮬레이터에서 직접 확인해 보자.

SIMULATOR

임계값 하나로 움직이는 혼동 행렬, 정밀도·재현율, ROC·PR 곡선

점수 분포 · 세로선(임계값)을 끌어 보자
ROC 곡선
왼쪽 세로축
오른쪽 곡선
프리셋
정확도—
"모두 음성" 정확도—
정밀도—
재현율 (TPR)—
FPR—
F1—
ROC-AUC (사다리꼴)—
AP (PR 곡선 아래)—
모델 점수는 음성 \(\sim\mathcal N(0,1)\), 양성 \(\sim\mathcal N(d',1)\)에서 시드 고정으로 뽑은 10,000명분 실제 샘플이고, 점수 ≥ t면 양성으로 판정한다. 혼동 행렬, 곡선, AUC는 모두 이 샘플에서 직접 센 값이다(왼쪽 그래프의 매끈한 곡선만 이론 밀도). '암 검진 예'는 본문의 민감도 90%·특이도 91%·유병률 1%에 맞춘 설정이다. 해볼 것: ① 프리셋 '암 검진 예'에서 정확도가 "모두 음성"보다 낮음을 확인하자. ② 유병률 슬라이더만 50% → 0.1%로 움직이면 재현율·FPR·ROC 곡선·AUC는 거의 그대로인데 정밀도·F1·PR 곡선·AP는 무너진다. ③ 'F1 최대 임계값'은 모든 임계값을 훑어 F1이 가장 큰 곳으로 옮긴다. 유병률이 낮을수록 그 임계값이 오른쪽(보수적)으로 간다. ④ d′ = 0이면 점수가 아무 정보도 없어 ROC는 대각선, AUC ≈ 0.5다.

ROC 곡선과 AUC, 그리고 PR 곡선

임계값마다 혼동 행렬이 하나씩 나오니, 임계값 하나에 묶이지 않고 모델 자체의 순위 매기기 능력을 평가하고 싶다. ROC 곡선(Receiver Operating Characteristic)은 임계값을 +∞에서 −∞로 내리며 (FPR, TPR) 점을 이은 것이다. 임계값이 +∞면 아무도 양성이 아니라 (0, 0), −∞면 모두 양성이라 (1, 1)이다. 완벽한 모델은 (0, 1) 모서리를 지나고, 동전 던지기는 대각선 위에 있다.

AUC(Area Under the ROC Curve)는 이 곡선 아래 넓이로, 0.5(무작위) ~ 1(완벽)이다. 아름다운 해석이 있다. AUC = 무작위로 뽑은 양성 하나의 점수가 무작위로 뽑은 음성 하나보다 높을 확률이다.

손 계산 예: 양성 점수 {0.9, 0.6}, 음성 점수 {0.7, 0.3, 0.2}. 양성-음성 쌍 2 × 3 = 6개 중 양성이 이기는 쌍은 0.9가 셋 모두를 이겨 3개, 0.6이 0.3과 0.2를 이겨 2개, 합 5개 → AUC = 5/6 ≈ 0.833. 같은 값을 곡선으로 구해 보자. 점수를 내림차순으로 훑으면 ROC 점은 (0, 0) → 0.9(양성) → (0, 0.5) → 0.7(음성) → (1/3, 0.5) → 0.6(양성) → (1/3, 1) → (2/3, 1) → (1, 1). 사다리꼴(여기서는 직사각형) 넓이 = \(\frac13\times0.5+\frac23\times1=\frac56\). 두 해석이 일치한다.

$$\text{AUC}\approx\sum_{i}\big(\text{FPR}_{i}-\text{FPR}_{i-1}\big)\cdot\frac{\text{TPR}_{i}+\text{TPR}_{i-1}}{2} = P\big(s_{+}>s_{-}\big)$$
시뮬레이터의 AUC 칸이 이 사다리꼴 합이다. 두 클래스 점수가 분산이 같은 정규분포이고 평균 차가 \(d'\)이면 이론값은 \(\Phi(d'/\sqrt2)\)다. \(d'=1\) → 약 0.760, \(d'=2\) → 약 0.921, \(d'=3\) → 약 0.983.

PR 곡선: 불균형 데이터에서 더 정직한 그림

ROC의 두 축 TPR과 FPR은 각각 양성 안, 음성 안에서의 비율이라 유병률이 바뀌어도 변하지 않는다. 장점 같지만 불균형 문제에서는 함정이 된다. 카드 거래 100만 건 중 사기가 0.1%(1,000건)라고 하자. FPR 1%, TPR 80%인 점은 ROC에서 왼쪽 위 모서리에 붙은 훌륭한 점으로 보인다. 그런데 개수로는 TP = 800, FP = 999,000 × 0.01 = 9,990이다. 정밀도 = 800/10,790 ≈ 7.4%. 경보 13~14건 중 1건만 진짜 사기다. FPR 1%가 작아 보여도 음성이 워낙 많아 절대 개수가 크다.

PR 곡선(Precision-Recall curve)은 가로축 재현율, 세로축 정밀도로 이 문제를 그대로 드러낸다. 무작위 분류기의 PR 곡선은 정밀도 = 유병률인 수평선이라(0.1%면 0.001), 기준선 자체가 유병률을 반영한다. 곡선 아래 넓이를 AP(Average Precision)라 부르며 \(\text{AP}=\sum_k (R_k-R_{k-1})P_k\)로 계산한다.

ROC 곡선 / AUCPR 곡선 / AP
축x = FPR, y = TPR(재현율)x = 재현율, y = 정밀도
무작위 기준선대각선, AUC = 0.5수평선 y = 유병률, AP ≈ 유병률
유병률 변화에불변민감 (정밀도가 유병률에 의존)
해석양성을 음성보다 위에 둘 확률양성을 찾아가며 경보의 순도가 어떻게 변하나
언제클래스가 대략 균형, 유병률이 상황마다 다를 때 모델 비교양성이 드물고 양성 쪽 성능이 관심일 때 (사기, 희귀 질환, 검색)
흔한 오해: "AUC 0.95면 실전에서도 잘 맞힌다"

AUC는 순위 능력일 뿐, 실제로 쓸 임계값에서의 정밀도를 말해 주지 않는다. 유병률 0.1%에서는 AUC 0.95 모델도 정밀도가 한 자릿수 %일 수 있다. 또 AUC는 확률이 얼마나 맞는 값인지(보정, calibration)도 말해 주지 않는다. 점수를 모두 절반으로 줄여도 순위가 같으니 AUC는 같다. 실전 배포 전에는 반드시 실제 유병률에서, 실제로 쓸 임계값의 혼동 행렬을 확인하자.

회귀 지표: MAE, MSE, RMSE, R²

회귀는 오차 \(e_i = y_i - \hat y_i\)의 크기를 요약한다.

$$\text{MAE}=\frac1n\sum|e_i|\qquad \text{MSE}=\frac1n\sum e_i^2\qquad \text{RMSE}=\sqrt{\text{MSE}}\qquad R^2 = 1-\frac{\sum e_i^2}{\sum (y_i-\bar y)^2}$$

계산 예: 실제값 \(y\) = (3, 5, 7, 9, 11), 예측 \(\hat y\) = (2.5, 5.5, 7, 8, 13). 오차 \(e\) = (0.5, −0.5, 0, 1, −2). MAE = (0.5+0.5+0+1+2)/5 = 0.8, MSE = (0.25+0.25+0+1+4)/5 = 1.1, RMSE ≈ 1.049. \(\bar y=7\)이고 \(\sum(y_i-\bar y)^2 = 16+4+0+4+16=40\), \(\sum e_i^2 = 5.5\)이므로 R² = 1 − 5.5/40 = 0.8625. 이제 마지막 예측만 크게 틀려 오차가 −10이 되면 MAE = 2.4(3배)지만 MSE = 20.3, RMSE ≈ 4.51(4.3배)로 더 크게 뛴다. 제곱이 큰 오차를 키우기 때문이다.

지표단위이상치에해석메모
MAE타깃과 같음둔감평균적으로 몇 만큼 틀리나중앙값 예측이 최적
MSE타깃의 제곱민감직관적 단위 아님평균 예측이 최적, 학습 손실로 흔함 (3장)
RMSE타깃과 같음민감큰 오차에 가중한 '전형적 오차'항상 RMSE ≥ MAE
R²없음민감평균만 쓰는 기준선 대비 설명한 분산 비율1이 완벽, 0 = 평균 예측과 같음, 음수 가능
흔한 오해: "R²는 0과 1 사이다"

학습 데이터에서 절편이 있는 선형 회귀를 최소제곱으로 맞추면 그렇지만, 검증·테스트 데이터에서는 모델이 "항상 평균을 말하는 것"보다 못하면 R² < 0이 된다. 과적합한 고차 다항식의 검증 R²가 음수인 것은 흔한 일이다. 또 R²가 높다고 오차가 작은 것도 아니다. 타깃의 분산이 크면 RMSE가 커도 R²는 높을 수 있다.

기준선 모델부터

"정확도 92%"가 좋은지 나쁜지는 비교 대상이 있어야 판단할 수 있다. 본격적인 모델을 만들기 전에 가능한 가장 단순한 기준선(Baseline)을 먼저 계산하자.

문제기준선기준선 점수의 예
분류항상 최빈 클래스유병률 1% → 정확도 99%, 재현율 0
회귀항상 학습 데이터 평균(또는 중앙값)R² ≈ 0 (정의상)
시계열 예측"내일 = 오늘" (지속성 예측), 작년 같은 날날씨·수요 예측에서 의외로 강함
텍스트 분류단어 빈도 + 로지스틱 회귀작은 데이터에서 대형 모델과 차이가 작을 때가 있음
LLM 애플리케이션단순 프롬프트, 키워드 검색(BM25)복잡한 에이전트·RAG 파이프라인의 이득을 재는 출발점

기준선은 세 가지 일을 한다. ① 버그 탐지: 복잡한 모델이 기준선과 비슷하면 학습이 실제로 안 되고 있을 가능성이 크다. ② 누수 탐지: 단순한 모델이 비현실적으로 높으면 특성에 답이 새고 있다. ③ 가치 판단: 기준선 대비 1%p 개선에 GPU 수천 시간과 유지보수 비용을 들일 가치가 있는가? 예를 들어 양성 비율 70%인 이진 분류 벤치마크에서 "정확도 72%"를 달성했다면, 무조건 다수 클래스만 답하는 기준선(70%)보다 겨우 2%p 낫다.

머신러닝 프로젝트의 전체 흐름

실무에서 모델 학습은 전체 일의 일부에 불과하다. 전형적인 흐름은 다음과 같고, 실제로는 여러 번 앞 단계로 되돌아간다.

① 문제 정의 지표·기준선·오류 비용 ② 데이터 수집·라벨·분할 ③ 특성·학습 파이프라인·튜닝(CV) ④ 평가 검증 → 테스트 1회 ⑤ 배포 A/B 테스트·지연 시간 ⑥ 모니터링 드리프트·성능·비용 재학습 반복
그림 0-3. ML 프로젝트의 수명 주기. 배포는 끝이 아니라 모니터링과 재학습이 도는 순환의 시작이다.
  1. 문제 정의: 예측할 것, 예측 시점, 오류 종류별 비용, 성공 지표, 기준선을 정한다. "이탈 예측"이라면 '언제 기준으로 몇 일 안의 이탈'인지까지 정해야 시간 누수를 피할 수 있다.
  2. 데이터: 수집, 라벨링, 품질 점검, 그리고 가장 먼저 분할.
  3. 특성과 학습: 전처리를 파이프라인으로 묶고, 교차 검증으로 모델·하이퍼파라미터를 고른다.
  4. 평가: 실제 유병률·실제 임계값에서의 지표, 하위 그룹별 성능, 오류 사례 분석. 테스트 세트는 마지막에 한 번.
  5. 배포: 지연 시간·비용 제약 안에서 서빙하고, 가능하면 일부 사용자에게만 먼저 적용해(A/B 테스트) 실제 효과를 측정한다.
  6. 모니터링: 세상은 변하고 모델은 학습 시점에 멈춰 있다.

데이터 드리프트

배포 후 입력이나 정답의 분포가 학습 때와 달라지는 것을 드리프트(drift) 또는 분포 이동이라 한다. 성능 저하의 가장 흔한 원인이다.

종류무엇이 바뀌나예탐지
공변량 이동 (covariate shift)\(p(x)\): 입력 분포새 카메라로 바뀐 의료 영상, 신규 연령대 사용자 유입라벨 없이도 입력 통계 비교로 감지 가능
라벨 이동 (label/prior shift)\(p(y)\): 클래스 비율독감 유행기에 양성 비율 급증예측 양성 비율의 변화
개념 이동 (concept drift)\(p(y\mid x)\): 입력과 답의 관계새 스팸 수법, 팬데믹 이후 소비 패턴지연되어 도착하는 실제 라벨로 성능 추적

라벨 이동은 앞의 정확도 함정과 직결된다. 유병률이 바뀌면 같은 모델·같은 임계값이라도 정밀도가 달라진다. LLM도 예외가 아니다. 학습 데이터의 시점 이후에 생긴 사실은 모르고(지식 컷오프), 사용자가 묻는 질문의 분포도 계속 바뀐다. RAG(10장)는 모델을 다시 학습하지 않고 최신 정보를 넣어 주는 방법 중 하나다.

핵심 정리

  1. AI ⊃ ML ⊃ DL. 머신러닝은 규칙을 사람이 쓰는 대신 데이터에서 배우고, 딥러닝은 그중 다층 신경망을 쓰는 방법이다. 생성 모델은 \(p(x)\)를 배우는 다른 축의 분류이며 LLM은 딥러닝 ∩ 생성 모델에 속한다.
  2. 학습 신호로 나누면 지도(정답 라벨), 비지도(구조), 강화(지연된 스칼라 보상), 자기지도(데이터에서 만든 라벨)다. LLM 사전학습은 다음 토큰을 정답으로 쓰는 자기지도학습이다.
  3. 분류는 범주, 회귀는 연속값, 군집화는 라벨 없는 묶음을 출력한다. k-means는 할당과 평균 갱신을 반복하며 WCSS를 단조 감소시키지만 지역 최적에 빠질 수 있다.
  4. 학습 세트는 파라미터, 검증 세트는 선택, 테스트 세트는 최종 보고에 쓴다. 테스트는 한 번만 열어야 하며, 선택에 쓰인 점수는 낙관적으로 편향된다.
  5. 과소적합은 학습·검증 오차가 둘 다 높고, 과적합은 격차가 크다. 학습 곡선으로 "데이터를 더 모으면 나아질까?"를 판단한다.
  6. 기대 테스트 오차 = 편향² + 분산 + σ². 복잡도를 올리면 편향이 줄고 분산이 늘며, 데이터를 늘리면 분산이 준다. σ²는 어떤 모델로도 줄일 수 없다.
  7. 데이터 누수(타깃·전처리·시간·그룹)는 검증 점수를 부풀려 평가로는 잡히지 않는다. 분할을 먼저 하고 모든 학습 가능한 전처리를 학습 분할에서만 fit한다.
  8. 특성 공학(스케일링, 원핫, 로그, 교차 특성, 결측 처리)은 표 데이터에서 여전히 중요하고, 딥러닝은 특성 자체를 학습한다(임베딩).
  9. 교차 검증은 데이터 구조에 맞춰 고른다. 불균형 → 층화, 시간 → 시계열 분할, 개체별 다중 샘플 → 그룹 k-fold.
  10. 정밀도 = TP/(TP+FP), 재현율 = TP/(TP+FN), F1은 조화 평균. 둘 다 임계값에 따라 바뀌고, 정밀도는 유병률에도 의존한다. 불균형 데이터에서 정확도는 "모두 음성" 기준선과 비교해야 의미가 있다.
  11. ROC-AUC는 양성을 음성보다 위에 둘 확률로 유병률에 불변이다. 양성이 드물면 PR 곡선·AP가 실제 경보의 순도를 더 정직하게 보여 준다.
  12. 회귀는 MAE(강건), RMSE(큰 오차에 민감), R²(평균 기준선 대비, 음수 가능)로 평가한다. 어떤 문제든 기준선부터 계산하고, 배포 후에는 드리프트를 모니터링한다.

확인 퀴즈

1. 양성 비율 2%인 데이터 5,000개에서 항상 "음성"이라고 답하는 모델의 정확도와 재현율은?

양성 100개, 음성 4,900개. 모두 음성으로 답하면 TN = 4,900, FN = 100, TP = FP = 0. 정확도 = 4,900/5,000 = 98%, 재현율 = 0/100 = 0%. 불균형 데이터에서 높은 정확도는 아무 의미가 없을 수 있다.

2. TP = 40, FP = 10, FN = 60, TN = 890일 때 F1 점수에 가장 가까운 것은?

정밀도 = 40/50 = 0.8, 재현율 = 40/100 = 0.4. F1 = 2·0.8·0.4/(0.8+0.4) = 0.64/1.2 ≈ 0.533 (= 2TP/(2TP+FP+FN) = 80/150). 0.93은 정확도 (40+890)/1000이다.

3. 다음 중 자기지도학습의 예로 가장 적절한 것은?

정답이 데이터 자체에서 만들어지므로 자기지도학습이다. 두 번째는 사람이 붙인 라벨을 쓰는 지도학습, 세 번째는 강화학습, 네 번째는 비지도 군집화다.

4. 학습 MSE 0.02, 검증 MSE 0.45, 노이즈 분산 σ² ≈ 0.04인 회귀 모델에 가장 적절한 처방은?

학습 오차가 σ²보다도 낮고 검증 오차와의 격차가 매우 크다. 노이즈까지 외운 과적합(높은 분산)이다. 분산을 줄이는 처방(데이터 추가, 규제, 단순한 모델, 앙상블)이 맞다.

5. 다음 중 데이터 누수가 아닌 것은?

학습 분할에서 fit하고 검증에는 transform만 하는 것이 올바른 절차다. 나머지는 각각 전처리 누수, 그룹 누수, 시간(타깃) 누수다.

6. 양성 점수 {0.8, 0.4}, 음성 점수 {0.5, 0.3}일 때 ROC-AUC는?

양성-음성 쌍 4개: (0.8, 0.5) 승, (0.8, 0.3) 승, (0.4, 0.5) 패, (0.4, 0.3) 승. 3/4 = 0.75. AUC = 무작위 양성이 무작위 음성보다 높은 점수를 받을 확률이다.

7. 2020~2024년 일별 전력 수요로 다음 날 수요를 예측하는 모델을 튜닝할 때 알맞은 교차 검증은?

무작위 분할은 미래 데이터로 과거를 맞히게 되어 시간 누수가 생기고 점수가 부풀려진다. 실제 사용 상황(과거 → 미래)을 흉내 내는 시계열 분할을 쓴다.

8. 오차가 (1, −1, 2, −2)인 회귀 모델의 MAE와 RMSE는?

MAE = (1+1+2+2)/4 = 1.5. MSE = (1+1+4+4)/4 = 2.5, RMSE = √2.5 ≈ 1.58. 오차 합이 0이라고 오차가 없는 것이 아니다. 2.5는 MSE이고, 항상 RMSE ≥ MAE다.

9. 거래 100만 건 중 사기가 0.1%다. 어떤 모델이 임계값에서 TPR 80%, FPR 1%라면 정밀도는 약?

사기 1,000건 중 TP = 800, 정상 999,000건 중 FP = 9,990. 정밀도 = 800/10,790 ≈ 7.4%. ROC에서는 훌륭해 보이는 점도 양성이 드물면 경보 대부분이 헛경보다. 이런 경우 PR 곡선을 본다.

10. 연구자가 모델 50개를 학습시키고 테스트 세트 점수가 가장 높은 모델을 골라 그 테스트 점수를 최종 성능으로 보고했다. 이 보고값은?

테스트 세트를 선택에 쓰면 그 세트에 우연히 잘 맞는 모델이 뽑혀 점수가 위로 편향된다(무작위 분류기 100개 중 최고가 약 62.5%가 되는 예). 선택은 검증 세트나 CV로 하고, 테스트는 마지막에 한 번만 쓴다. 테스트 세트가 클수록 점수의 잡음이 줄어 편향은 작아진다.