머신러닝 기초: 데이터에서 규칙을 배운다
스팸 메일을 거르는 규칙을 사람이 일일이 적는 대신, 스팸과 정상 메일 수만 통을 보여 주고 컴퓨터가 규칙을 스스로 찾게 할 수 있을까? 이것이 머신러닝이다. 이 책의 나머지 장(벡터, 뉴런, 학습, 트랜스포머, LLM…)은 모두 이 한 가지 아이디어 위에 서 있다. 이 장에서는 수식을 최소화하고, 대신 "모델을 어떻게 평가하고 어떻게 속지 않을 것인가"를 직접 계산해 보며 익힌다. 정확도 99%짜리 암 검진 모델이 실제로는 쓸모없을 수 있는 이유를 설명할 수 있다면 이 장의 목표를 달성한 것이다.
- AI ⊃ 머신러닝 ⊃ 딥러닝의 포함관계와 생성형 AI·LLM의 위치, 판별 모델과 생성 모델의 차이를 설명할 수 있다.
- 지도·비지도·강화·자기지도학습을 데이터 형태와 학습 신호로 구분하고, LLM 사전학습이 왜 자기지도인지 안다.
- 분류·회귀·군집화를 구분하고 k-means를 손으로 몇 단계 돌릴 수 있다.
- 학습/검증/테스트 분할의 역할, 과적합·과소적합, 편향-분산 분해를 수치로 설명할 수 있다.
- 데이터 누수의 네 가지 유형을 알아보고 교차 검증을 데이터 구조(불균형·시간·그룹)에 맞게 고를 수 있다.
- 혼동 행렬에서 정확도·정밀도·재현율·F1·ROC-AUC·PR 곡선을 계산하고, 불균형 데이터에서 어떤 지표를 봐야 하는지 판단할 수 있다.
AI, 머신러닝, 딥러닝, 생성형 AI
뉴스에서는 AI, 머신러닝, 딥러닝, 생성형 AI가 거의 같은 뜻처럼 쓰이지만 범위가 다르다. 가장 넓은 인공지능(Artificial Intelligence, AI)은 "사람이라면 지능이 필요하다고 할 일을 기계가 하게 만드는 모든 기술"이다. 체스 프로그램의 탐색 알고리즘, 사람이 규칙을 적어 넣은 전문가 시스템도 AI다. 그 안의 머신러닝(Machine Learning, ML)은 규칙을 사람이 쓰지 않고 데이터로부터 학습하는 방법들이다. 다시 그 안의 딥러닝(Deep Learning, DL)은 여러 층의 신경망(2장)을 쓰는 머신러닝이다.
규칙 기반 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 |
| 난이도 (같은 데이터) | 상대적으로 쉬움: 경계만 알면 됨 | 어려움: 데이터의 모든 구조를 알아야 함 |
통계적 의미의 생성 모델(나이브 베이즈처럼 \(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이다. 그래서 인터넷 규모의 데이터를 쓸 수 있다.
- 다음 토큰 예측(GPT류, 7장): 문장 "고양이가 매트 위에 앉았다"에서 입력 "고양이가 매트 위에" → 타깃 "앉았다". 문장 하나가 토큰 수만큼의 학습 예제가 된다. 약 15조 토큰으로 사전학습했다면(Llama 3, 2024) 그만큼의 '라벨'이 공짜로 생긴 셈이다.
- 마스크 예측(BERT): 토큰의 약 15%를 가리고 원래 토큰을 맞힌다.
- 대조 학습(CLIP 등): 같은 이미지의 두 변형, 또는 짝인 이미지-캡션은 가깝게, 짝이 아닌 것은 멀게 임베딩한다(4장).
예전 문헌에서는 사람이 붙인 라벨이 없다는 이유로 '비지도 사전학습'이라 부르기도 했다. 하지만 학습 과정은 명확한 정답 토큰에 대한 교차 엔트로피 최소화(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)을 두고 두 단계를 반복한다.
- 할당 단계: 각 점을 가장 가까운(유클리드 거리) 중심의 군집에 넣는다.
- 갱신 단계: 각 중심을 자기 군집에 속한 점들의 평균 위치로 옮긴다.
할당이 더 이상 바뀌지 않으면 멈춘다. 이 과정은 다음 군집 내 제곱합(WCSS, inertia)을 매 단계 줄이거나 그대로 둔다. 할당 단계는 각 점에 더 가까운 중심을 고르니 줄어들고, 갱신 단계는 평균이 제곱 거리 합을 최소화하는 점이니 줄어든다. 값이 0 이상이고 할당 조합이 유한하므로 반드시 수렴한다.
손 계산 예: 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\).
k-means를 한 단계씩
초기 중심은 무작위 데이터 점에서 뽑는다(시드 고정, '다시 뽑기'마다 바뀜).
| 태스크 | 출력 | 예 | 대표 지표 | 학습 방식 |
|---|---|---|---|---|
| 분류 | 범주 (또는 클래스별 확률) | 스팸, 질병 유무, 다음 토큰 | 정확도, 정밀도/재현율, F1, AUC | 지도 |
| 회귀 | 연속 실수 | 집값, 수요, 소요 시간 | MAE, RMSE, R² | 지도 |
| 군집화 | 군집 번호 (의미는 사후 해석) | 고객 세분화, 문서 묶기 | WCSS, 실루엣 (정답이 있으면 ARI) | 비지도 |
둘 다 데이터를 그룹으로 나누지만 분류는 미리 정해진 이름표(스팸/정상)를 맞히는 지도학습이고, 군집화는 이름표 없이 그룹을 발견하는 비지도학습이다. k-means가 낸 "군집 2"가 무엇을 뜻하는지는 사람이 나중에 해석해야 하며, 다시 실행하면 번호가 바뀔 수도 있다.
학습 / 검증 / 테스트 분할
모델의 진짜 목표는 이미 본 데이터를 잘 맞히는 것이 아니라 처음 보는 데이터에서 잘하는 것, 곧 일반화(generalization)다. 이를 측정하려면 학습에 쓰지 않은 데이터가 필요하다. 그래서 데이터를 세 덩어리로 나눈다.
| 분할 | 누가 보나 | 무엇을 결정하나 | 몇 번 쓰나 |
|---|---|---|---|
| 학습 (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장 과적합과 일반화에서 이미 실험했다. 여기서는 실무에서 더 자주 쓰는 진단 도구 두 가지에 집중한다.
- 복잡도 곡선(validation curve): 가로축 = 모델 복잡도(차수, 트리 깊이 등), 세로축 = 학습·검증 오차. 검증 오차가 U자를 그리고 그 바닥이 최적 복잡도다.
- 학습 곡선(learning curve): 복잡도는 고정하고 가로축 = 학습 데이터 수. "데이터를 더 모으면 나아질까?"에 답한다.
다항 회귀: 복잡도 곡선과 학습 곡선으로 진단하기
| 증상 | 학습 오차 | 검증 오차 | 학습 곡선 모양 | 효과 있는 처방 | 효과 없는 처방 |
|---|---|---|---|---|---|
| 과소적합 (높은 편향) | 높음 | 높음, 학습 오차와 비슷 | 두 곡선이 높은 곳에서 일찍 수렴 | 모델 키우기, 특성 추가, 규제 줄이기, 더 오래 학습 | 데이터 더 모으기 |
| 과적합 (높은 분산) | 낮음 | 높음 (격차 큼) | 격차가 크고 n이 늘면 천천히 좁아짐 | 데이터 추가, 규제·드롭아웃, 조기 종료, 모델 줄이기, 앙상블 | 모델 더 키우기 (고전적 영역에서) |
| 적정 | σ² 근처 | σ² 근처 | 둘 다 노이즈 바닥 근처 | (더 좋아지려면 노이즈 자체를 줄이는 데이터 품질 개선) | — |
노이즈가 있는 데이터에서 학습 오차 0은 노이즈까지 외웠다는 신호다. 관측 노이즈의 분산이 σ²라면 참 함수 그 자체도 새 데이터에서 MSE ≈ σ²를 낸다. 어떤 모델도 기댓값으로 이 바닥보다 낮을 수 없다(다음 절의 \(\sigma^2\) 항). 반대로 "과적합이니까 무조건 작은 모델"도 아니다. 데이터가 충분하다면 큰 모델이 이긴다. 판단은 언제나 검증 오차로 한다.
편향-분산 트레이드오프
과소적합과 과적합을 하나의 식으로 설명하는 것이 편향-분산 분해(Bias-Variance Decomposition)다. 사고 실험을 해 보자. 같은 분포에서 학습 세트를 여러 번 새로 뽑아 같은 방식으로 모델을 학습시키면, 매번 조금씩 다른 모델 \(\hat f\)가 나온다. 이 모델들의 집합을 보면 두 가지를 물을 수 있다.
- 편향(bias): 모델들의 평균 \(\bar f(x)=\mathbb E[\hat f(x)]\)이 참 함수 \(f(x)\)에서 얼마나 벗어나 있나? 모델이 너무 단순하면(1차식으로 곡선을 맞추면) 아무리 많이 평균해도 곡선이 안 된다. 체계적 오차다.
- 분산(variance): 모델들이 학습 세트에 따라 서로 얼마나 다른가? 너무 유연한 모델은 학습 세트의 노이즈를 따라가므로 뽑을 때마다 모양이 크게 달라진다. 불안정성이다.
수치 예: 어떤 점 \(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\)으로 크다.
곡선 다발로 보는 편향² + 분산
"용량을 늘리면 분산이 커진다"는 고전적 U자 그림은 파라미터 수가 데이터 수를 크게 넘는 현대 신경망에서는 그대로 성립하지 않는다(이중 하강, 3장). 그래도 분해식 자체는 언제나 참이다. 거대 모델에서는 SGD의 암묵적 규제 등으로 분산이 생각보다 작게 유지된다는 것이 현재의 대략적 이해다. 또 앙상블(여러 모델의 평균)이 거의 항상 성능을 올리는 이유가 바로 분산 항을 줄이기 때문이다. 서로 독립적인 오차를 가진 모델 \(M\)개를 평균하면 분산은 약 \(1/M\)로 준다.
데이터 누수
데이터 누수(Data Leakage)는 실제 예측 시점에는 알 수 없는 정보, 또는 평가 데이터의 정보가 학습 과정에 새어 들어가는 것이다. 증상은 언제나 같다. 검증 점수는 놀랍게 좋은데 배포하면 성능이 무너진다. 과적합은 검증 점수가 나쁘게 나와서 스스로 드러나지만, 누수는 검증 점수 자체를 부풀리기 때문에 평가로는 잡히지 않는다. 그래서 더 위험하다. 경험 법칙 하나: 너무 좋아서 믿기 힘든 결과는 대개 누수다.
① 타깃 누수 (target leakage)
정답과 같은 정보, 또는 정답이 정해진 뒤에야 생기는 정보가 특성에 들어간 경우다.
- 폐렴 여부를 예측하는데 '항생제 처방 여부'가 특성에 있다. 항생제는 폐렴 진단 후에 처방되므로 모델은 진단 결과를 베껴 쓰는 셈이다.
- 고객 이탈 예측에 '해지 위약금 납부액'이 있다. 이미 해지한 사람만 0이 아니다.
- 대출 연체 예측에 '추심 담당자 배정일'이 있다.
판별 질문: "예측을 하는 바로 그 순간, 이 값을 정말로 알 수 있는가?" 특성마다 '언제 기록되는 값인가'를 확인해야 한다.
② 전처리 누수 (train-test contamination)
분할 전에 전체 데이터로 전처리 통계를 계산하는 경우다. 대표적으로 전체 데이터의 평균·표준편차로 정규화한 뒤 나누면, 검증 세트의 정보(평균·분산)가 학습 쪽 변환에 섞인다. 단순 정규화는 보통 점수를 아주 조금만 바꾸지만, 같은 실수를 아래 작업에서 하면 피해가 크다.
- 특성 선택: 전체 데이터에서 타깃과 상관이 큰 특성을 고른 뒤 교차 검증하기 (아래 시뮬레이터).
- 오버샘플링: 소수 클래스를 복제·합성(SMOTE 등)한 뒤 분할하면, 같은 샘플의 복사본이 학습과 검증 양쪽에 들어간다.
- 타깃 인코딩: 범주별 타깃 평균을 특성으로 쓸 때 자기 자신의 타깃이 평균에 포함된다.
원칙은 하나다. 모든 '학습 가능한' 전처리(평균, 분산, 어휘, 선택된 특성 목록, 결측 대체값)는 학습 분할에서만 fit하고, 검증·테스트에는 transform만 한다. 교차 검증이라면 fold마다 다시 fit해야 한다. scikit-learn의 Pipeline이 존재하는 이유다.
③ 시간 누수 (temporal leakage)
시간 순서가 있는 데이터를 무작위로 나누면 "미래로 과거를 예측"하는 꼴이 된다. 2024년 6월 데이터로 학습해 2024년 3월을 맞히는 것은 실제로는 불가능한 일이다. 주가·수요 예측에서 무작위 분할을 하면 검증 점수가 크게 부풀려진다. 더 교묘한 형태도 있다. 중심 이동평균(앞뒤 3일)을 특성으로 쓰면 미래 3일이 들어가고, '월말 기준 고객 등급' 같은 스냅숏 테이블을 월중 예측에 붙이면 그달 말의 정보가 섞인다. 처방은 시간 기준 분할(과거로 학습, 미래로 평가)과 특성마다 기준 시점을 정해 그 이전 데이터만 쓰는 것이다.
④ 중복·그룹 누수 (duplicate / group leakage)
같은 개체에서 나온 여러 샘플이 학습과 평가에 나뉘어 들어가는 경우다. 환자 1명당 X선 사진 10장이 있는데 사진 단위로 무작위 분할하면, 모델은 '폐렴'이 아니라 '이 환자의 갈비뼈 모양'을 외워 점수를 낼 수 있다. 같은 문서의 문장들, 같은 화자의 음성, 웹 크롤링의 거의 같은 페이지도 마찬가지다. LLM 평가에서는 벤치마크 문제가 사전학습 데이터에 섞여 들어가는 벤치마크 오염(contamination)이 같은 문제다. 처방은 그룹 단위 분할(같은 환자는 한쪽에만)과 중복 제거다.
순수한 잡음에서 90% 정확도 만들기: 특성 선택 누수
이 실험은 Hastie, Tibshirani, Friedman의 The Elements of Statistical Learning(7.10.2절, "교차 검증을 하는 잘못된 방법과 올바른 방법")에 나오는 고전적 예를 축소해 재현한 것이다. 유전자 수만 개 중 몇 개를 고르는 생물정보학 연구에서 실제로 반복된 실수다.
누수 탐지 체크리스트
- 특성 중요도 1위가 압도적인가? 그 특성이 예측 시점에 존재하는지 확인한다(타깃 누수의 가장 흔한 신호).
- 검증 점수가 비슷한 문제의 기존 결과나 사람 전문가보다 비현실적으로 높은가?
- 분할을 가장 먼저 했는가? 정규화·결측 대체·특성 선택·오버샘플링·인코딩이 학습 분할에서만 fit되었는가?
- 시간 정보가 있다면 시간 기준으로 분할했는가? 모든 특성의 기준 시점이 예측 시점 이전인가?
- 같은 사람·기기·문서·세션에서 나온 샘플이 양쪽에 걸쳐 있지 않은가? 중복·근사 중복을 제거했는가?
- 무작위 분할 점수와 그룹/시간 분할 점수가 크게 다른가? 크게 다르다면 누수(또는 분포 이동)를 의심한다.
- 라벨을 무작위로 섞어(셔플) 학습해도 점수가 우연 수준보다 높게 나오는가? 높다면 파이프라인 어딘가가 새고 있다.
| 유형 | 무엇이 새나 | 예 | 처방 |
|---|---|---|---|
| 타깃 누수 | 정답 또는 정답 이후의 정보 | 항생제 처방 → 폐렴 | 특성별 기록 시점 검토, 의심 특성 제거 |
| 전처리 누수 | 검증 데이터의 통계 | 전체로 정규화·특성 선택·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\)로 순위가 뒤집힌다.
범주형 인코딩: 원핫
도시 {서울, 부산, 대구}를 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\)번 학습·평가한다. 모든 샘플이 정확히 한 번 검증에 쓰인다.
비용은 학습 \(k\)번이다. 흔히 \(k=5\) 또는 10을 쓴다. 극단인 \(k=n\)은 LOOCV(leave-one-out)로, 학습 데이터를 최대로 쓰지만 \(n\)번 학습해야 한다. 거대 신경망은 한 번 학습도 비싸서 교차 검증 대신 고정된 검증 세트를 쓰는 것이 보통이다. 교차 검증은 데이터가 적고 학습이 싼 고전 ML에서 특히 중요하다.
어떻게 fold를 나누느냐는 데이터 구조에 따라 달라야 한다.
- 층화 k-fold(stratified): 각 fold의 클래스 비율을 전체와 같게 맞춘다. 양성이 5%인 데이터를 5-fold로 무작위 분할하면 어떤 fold는 양성이 2%, 어떤 fold는 8%가 될 수 있어 점수가 출렁인다. 불균형 분류의 기본값이다.
- 시계열 분할(time series split): 항상 과거로 학습하고 바로 다음 구간으로 검증한다. 학습 구간이 점점 길어지는(확장 창) 방식이 흔하다. 미래 정보를 쓰지 않으므로 시간 누수를 막는다.
- 그룹 k-fold(group k-fold): 같은 그룹(환자, 사용자, 문서)의 샘플은 같은 fold에만 넣는다. 배포 후 '새 환자'에서의 성능을 추정하는 올바른 방법이다(그룹 누수).
fold 나누기와 점수: 무작위 vs 층화 vs 그룹 vs 시계열
데이터: 환자 20명 × 측정 3회 = 60개, 양성 30%. 같은 환자의 측정값은 서로 매우 비슷하다. 가로 순서 = 측정 시간.
—
| 방법 | 나누는 기준 | 언제 쓰나 | 잘못 쓰면 |
|---|---|---|---|
| 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
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명이다.
- 모델 A: 무조건 "음성"이라고 답한다. TP = 0, FN = 100, FP = 0, TN = 9,900. 정확도 = 9,900/10,000 = 99.0%. 재현율 = 0. 환자를 단 한 명도 찾지 못하는 모델이 정확도 99%다.
- 모델 B: 민감도 90%, 특이도 91%인 진짜 검사다. TP = 90, FN = 10, FP = 9,900 × 0.09 = 891, TN = 9,009. 정확도 = 9,099/10,000 = 90.99%로 A보다 낮다. 정밀도 = 90/981 ≈ 9.2%, F1 ≈ 0.167.
B가 A보다 훨씬 유용한데도 정확도로는 진다. 또 B에서 양성 판정을 받은 사람 중 실제 환자는 약 11명 중 1명뿐이다. 이것이 기저율 무시(base rate fallacy)다. 검사가 "90% 정확"해도 병이 드물면 양성 판정의 대부분은 헛경보다. 그래서 실제 검진은 민감한 1차 검사로 넓게 거른 뒤 정밀한 2차 검사로 확진하는 두 단계로 운영한다.
둘 다 임계값을 바꾸면 바뀐다. 임계값을 낮추면 양성 판정이 늘어 재현율↑ 정밀도↓, 높이면 반대다. 게다가 정밀도는 유병률에도 의존한다. 같은 모델(같은 민감도·특이도)이라도 양성 비율이 50%인 병원 데이터에서는 정밀도가 높고, 1%인 일반 인구에서는 낮다. 반면 재현율(TPR)과 FPR은 각 클래스 안에서의 비율이라 유병률과 무관하다. 아래 시뮬레이터에서 직접 확인해 보자.
임계값 하나로 움직이는 혼동 행렬, 정밀도·재현율, ROC·PR 곡선
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\). 두 해석이 일치한다.
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 곡선 / AUC | PR 곡선 / AP | |
|---|---|---|
| 축 | x = FPR, y = TPR(재현율) | x = 재현율, y = 정밀도 |
| 무작위 기준선 | 대각선, AUC = 0.5 | 수평선 y = 유병률, AP ≈ 유병률 |
| 유병률 변화에 | 불변 | 민감 (정밀도가 유병률에 의존) |
| 해석 | 양성을 음성보다 위에 둘 확률 | 양성을 찾아가며 경보의 순도가 어떻게 변하나 |
| 언제 | 클래스가 대략 균형, 유병률이 상황마다 다를 때 모델 비교 | 양성이 드물고 양성 쪽 성능이 관심일 때 (사기, 희귀 질환, 검색) |
AUC는 순위 능력일 뿐, 실제로 쓸 임계값에서의 정밀도를 말해 주지 않는다. 유병률 0.1%에서는 AUC 0.95 모델도 정밀도가 한 자릿수 %일 수 있다. 또 AUC는 확률이 얼마나 맞는 값인지(보정, calibration)도 말해 주지 않는다. 점수를 모두 절반으로 줄여도 순위가 같으니 AUC는 같다. 실전 배포 전에는 반드시 실제 유병률에서, 실제로 쓸 임계값의 혼동 행렬을 확인하자.
회귀 지표: MAE, MSE, RMSE, R²
회귀는 오차 \(e_i = y_i - \hat y_i\)의 크기를 요약한다.
계산 예: 실제값 \(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이 된다. 과적합한 고차 다항식의 검증 R²가 음수인 것은 흔한 일이다. 또 R²가 높다고 오차가 작은 것도 아니다. 타깃의 분산이 크면 RMSE가 커도 R²는 높을 수 있다.
기준선 모델부터
"정확도 92%"가 좋은지 나쁜지는 비교 대상이 있어야 판단할 수 있다. 본격적인 모델을 만들기 전에 가능한 가장 단순한 기준선(Baseline)을 먼저 계산하자.
| 문제 | 기준선 | 기준선 점수의 예 |
|---|---|---|
| 분류 | 항상 최빈 클래스 | 유병률 1% → 정확도 99%, 재현율 0 |
| 회귀 | 항상 학습 데이터 평균(또는 중앙값) | R² ≈ 0 (정의상) |
| 시계열 예측 | "내일 = 오늘" (지속성 예측), 작년 같은 날 | 날씨·수요 예측에서 의외로 강함 |
| 텍스트 분류 | 단어 빈도 + 로지스틱 회귀 | 작은 데이터에서 대형 모델과 차이가 작을 때가 있음 |
| LLM 애플리케이션 | 단순 프롬프트, 키워드 검색(BM25) | 복잡한 에이전트·RAG 파이프라인의 이득을 재는 출발점 |
기준선은 세 가지 일을 한다. ① 버그 탐지: 복잡한 모델이 기준선과 비슷하면 학습이 실제로 안 되고 있을 가능성이 크다. ② 누수 탐지: 단순한 모델이 비현실적으로 높으면 특성에 답이 새고 있다. ③ 가치 판단: 기준선 대비 1%p 개선에 GPU 수천 시간과 유지보수 비용을 들일 가치가 있는가? 예를 들어 양성 비율 70%인 이진 분류 벤치마크에서 "정확도 72%"를 달성했다면, 무조건 다수 클래스만 답하는 기준선(70%)보다 겨우 2%p 낫다.
머신러닝 프로젝트의 전체 흐름
실무에서 모델 학습은 전체 일의 일부에 불과하다. 전형적인 흐름은 다음과 같고, 실제로는 여러 번 앞 단계로 되돌아간다.
- 문제 정의: 예측할 것, 예측 시점, 오류 종류별 비용, 성공 지표, 기준선을 정한다. "이탈 예측"이라면 '언제 기준으로 몇 일 안의 이탈'인지까지 정해야 시간 누수를 피할 수 있다.
- 데이터: 수집, 라벨링, 품질 점검, 그리고 가장 먼저 분할.
- 특성과 학습: 전처리를 파이프라인으로 묶고, 교차 검증으로 모델·하이퍼파라미터를 고른다.
- 평가: 실제 유병률·실제 임계값에서의 지표, 하위 그룹별 성능, 오류 사례 분석. 테스트 세트는 마지막에 한 번.
- 배포: 지연 시간·비용 제약 안에서 서빙하고, 가능하면 일부 사용자에게만 먼저 적용해(A/B 테스트) 실제 효과를 측정한다.
- 모니터링: 세상은 변하고 모델은 학습 시점에 멈춰 있다.
데이터 드리프트
배포 후 입력이나 정답의 분포가 학습 때와 달라지는 것을 드리프트(drift) 또는 분포 이동이라 한다. 성능 저하의 가장 흔한 원인이다.
| 종류 | 무엇이 바뀌나 | 예 | 탐지 |
|---|---|---|---|
| 공변량 이동 (covariate shift) | \(p(x)\): 입력 분포 | 새 카메라로 바뀐 의료 영상, 신규 연령대 사용자 유입 | 라벨 없이도 입력 통계 비교로 감지 가능 |
| 라벨 이동 (label/prior shift) | \(p(y)\): 클래스 비율 | 독감 유행기에 양성 비율 급증 | 예측 양성 비율의 변화 |
| 개념 이동 (concept drift) | \(p(y\mid x)\): 입력과 답의 관계 | 새 스팸 수법, 팬데믹 이후 소비 패턴 | 지연되어 도착하는 실제 라벨로 성능 추적 |
라벨 이동은 앞의 정확도 함정과 직결된다. 유병률이 바뀌면 같은 모델·같은 임계값이라도 정밀도가 달라진다. LLM도 예외가 아니다. 학습 데이터의 시점 이후에 생긴 사실은 모르고(지식 컷오프), 사용자가 묻는 질문의 분포도 계속 바뀐다. RAG(10장)는 모델을 다시 학습하지 않고 최신 정보를 넣어 주는 방법 중 하나다.
핵심 정리
- AI ⊃ ML ⊃ DL. 머신러닝은 규칙을 사람이 쓰는 대신 데이터에서 배우고, 딥러닝은 그중 다층 신경망을 쓰는 방법이다. 생성 모델은 \(p(x)\)를 배우는 다른 축의 분류이며 LLM은 딥러닝 ∩ 생성 모델에 속한다.
- 학습 신호로 나누면 지도(정답 라벨), 비지도(구조), 강화(지연된 스칼라 보상), 자기지도(데이터에서 만든 라벨)다. LLM 사전학습은 다음 토큰을 정답으로 쓰는 자기지도학습이다.
- 분류는 범주, 회귀는 연속값, 군집화는 라벨 없는 묶음을 출력한다. k-means는 할당과 평균 갱신을 반복하며 WCSS를 단조 감소시키지만 지역 최적에 빠질 수 있다.
- 학습 세트는 파라미터, 검증 세트는 선택, 테스트 세트는 최종 보고에 쓴다. 테스트는 한 번만 열어야 하며, 선택에 쓰인 점수는 낙관적으로 편향된다.
- 과소적합은 학습·검증 오차가 둘 다 높고, 과적합은 격차가 크다. 학습 곡선으로 "데이터를 더 모으면 나아질까?"를 판단한다.
- 기대 테스트 오차 = 편향² + 분산 + σ². 복잡도를 올리면 편향이 줄고 분산이 늘며, 데이터를 늘리면 분산이 준다. σ²는 어떤 모델로도 줄일 수 없다.
- 데이터 누수(타깃·전처리·시간·그룹)는 검증 점수를 부풀려 평가로는 잡히지 않는다. 분할을 먼저 하고 모든 학습 가능한 전처리를 학습 분할에서만 fit한다.
- 특성 공학(스케일링, 원핫, 로그, 교차 특성, 결측 처리)은 표 데이터에서 여전히 중요하고, 딥러닝은 특성 자체를 학습한다(임베딩).
- 교차 검증은 데이터 구조에 맞춰 고른다. 불균형 → 층화, 시간 → 시계열 분할, 개체별 다중 샘플 → 그룹 k-fold.
- 정밀도 = TP/(TP+FP), 재현율 = TP/(TP+FN), F1은 조화 평균. 둘 다 임계값에 따라 바뀌고, 정밀도는 유병률에도 의존한다. 불균형 데이터에서 정확도는 "모두 음성" 기준선과 비교해야 의미가 있다.
- ROC-AUC는 양성을 음성보다 위에 둘 확률로 유병률에 불변이다. 양성이 드물면 PR 곡선·AP가 실제 경보의 순도를 더 정직하게 보여 준다.
- 회귀는 MAE(강건), RMSE(큰 오차에 민감), R²(평균 기준선 대비, 음수 가능)로 평가한다. 어떤 문제든 기준선부터 계산하고, 배포 후에는 드리프트를 모니터링한다.
확인 퀴즈
1. 양성 비율 2%인 데이터 5,000개에서 항상 "음성"이라고 답하는 모델의 정확도와 재현율은?
2. TP = 40, FP = 10, FN = 60, TN = 890일 때 F1 점수에 가장 가까운 것은?
3. 다음 중 자기지도학습의 예로 가장 적절한 것은?
4. 학습 MSE 0.02, 검증 MSE 0.45, 노이즈 분산 σ² ≈ 0.04인 회귀 모델에 가장 적절한 처방은?
5. 다음 중 데이터 누수가 아닌 것은?
6. 양성 점수 {0.8, 0.4}, 음성 점수 {0.5, 0.3}일 때 ROC-AUC는?
7. 2020~2024년 일별 전력 수요로 다음 날 수요를 예측하는 모델을 튜닝할 때 알맞은 교차 검증은?
8. 오차가 (1, −1, 2, −2)인 회귀 모델의 MAE와 RMSE는?
9. 거래 100만 건 중 사기가 0.1%다. 어떤 모델이 임계값에서 TPR 80%, FPR 1%라면 정밀도는 약?
10. 연구자가 모델 50개를 학습시키고 테스트 세트 점수가 가장 높은 모델을 골라 그 테스트 점수를 최종 성능으로 보고했다. 이 보고값은?