개요
지난 글의 결론은 “처음 보는 데이터에서 잘해야 한다”였다. 그런데 여기서 아주 곤란한 질문이 하나 남는다.
처음 보는 데이터에서의 성능을, 어떻게 미리 알 수 있는가?
말이 안 되는 것 같다. 안 본 데이터로 시험을 볼 순 없으니까. 이번 글의 앞부분은 이 모순을 푸는 방법이고, 뒷부분은 아예 정답이 없는 세계인 비지도학습이다.
1. 훈련 오류와 테스트 오류
먼저 두 오류를 구분해야 한다.
| 훈련 오류 | 테스트 오류 | |
|---|---|---|
| 어떤 데이터로? | 학습에 썼던 데이터 | 학습에 안 쓴 새 데이터 |
| 비유 | 풀어본 문제집 점수 | 실제 시험 점수 |
| 신뢰도 | 낮음 | 이게 진짜 실력 |
문제집을 잘 푼다고 시험을 잘 본다고 장담할 수 없다.
그리고 보통 훈련 오류는 테스트 오류를 심하게 과소평가한다. 즉 “실제보다 훨씬 잘하는 것처럼” 보이게 만든다. 암기와 응용의 차이라고 생각하면 편하다.
두 오류를 모델 복잡도에 따라 그리면 이런 모양이 나온다.
이 그림이 지난 글의 오버피팅·언더피팅을 한 장으로 요약한다.
- 훈련 오류(파랑)는 계속 내려간다. 모델이 복잡해질수록 훈련 데이터는 더 잘 외우니까. 끝까지 가면 0에 수렴할 수도 있다.
- 테스트 오류(주황)는 U자를 그린다. 처음엔 같이 내려가다가, 어느 순간부터 다시 올라간다.
그래서 우리의 목표는 명확하다. U자의 바닥 지점에 해당하는 모델을 찾는 것.
더 쉬운 비유로. 너무 대충 공부해도 안 되고, 답만 통째로 외워도 안 된다. 딱 적당히 이해했을 때 시험 점수가 제일 잘 나온다.
여기서 재밌는 함정이 하나 있다. 훈련 오류가 0에 가깝다면 그건 좋은 신호가 아니라 위험 신호다. 문제집을 하나도 안 틀린다면, 실력이 좋은 게 아니라 답을 외웠을 가능성이 크다.
2. 이상적인 방법과 현실의 벽
가장 이상적인 건 충분히 큰 별도의 테스트 데이터를 따로 두는 것이다. 근데 현실은?
- 데이터 자체가 부족하다
- 테스트용으로 떼어놓으면 학습에 쓸 데이터가 줄어든다
데이터가 1000개뿐인데 300개를 시험용으로 빼두면, 700개로만 배워야 한다. 시험을 잘 보려고 공부량을 줄이는 꼴이다.
그래서 나온 대안이 재표본화(resampling)다. 아이디어는 단순하다.
시험지가 따로 없다면? 가지고 있는 문제집을 쪼개서 모의고사를 만들면 된다.
방법은 두 가지다. 검증셋(hold-out)과 K-겹 교차검증.
3. 검증셋(hold-out) 방식
가장 간단한 방법이다.
- 가진 데이터를 무작위로 섞는다
- 훈련셋과 검증셋 두 덩어리로 자른다
- 훈련셋으로만 학습한다
- 검증셋으로 성능을 잰다
3번이 핵심이다. 검증셋은 학습 과정에서 절대 보면 안 된다. 보는 순간 그건 더 이상 “처음 보는 데이터”가 아니다.
문제집의 문제를 학습용과 모의고사용으로 나누고, 모의고사는 딱 한 번만 보는 것이다.
그런데 두 가지 문제가 있다
① 결과가 출렁인다
어디서 자르느냐에 따라 성능 추정치가 크게 달라진다. 운 좋게 쉬운 문제만 모의고사에 들어가면 점수가 높게 나오고, 어려운 것만 들어가면 낮게 나온다. “내 모델 성능은 몇 점”이라고 말할 수가 없게 된다.
② 성능을 낮게 보는 편향이 생긴다
이건 처음에 이해가 안 됐던 부분이긴한데, 검증셋 방식은 전체 데이터의 일부만으로 학습한다. 절반만 쓴다면, 당연히 전체 데이터로 학습했을 때보다 실력이 절대평가로썬 떨어진다는 것 이었다.
즉 “데이터를 다 썼다면 나왔을 성능”보다 나쁘게 측정된다. 시험 점수를 재려고 공부 시간을 절반으로 깎은 셈이라, 그 점수는 실제 실력보다 낮다.
4. K-겹 교차검증
두 문제를 한 번에 해결하는 방법이다. 발상이 아주 깔끔하다.
한 번만 자르니까 문제가 생긴다면, 여러 번 자르고 평균 내면 되지 않을까?
절차는 이렇다.
- 데이터를 무작위로 섞는다
- 겹치지 않는 K개의 묶음(폴드)으로 나눈다
- 1번 폴드를 검증에 쓰고 나머지 K−1개로 학습 → 오류 측정
- 2번 폴드를 검증에 쓰고 나머지로 학습 → 오류 측정
- … K번 반복
- K개의 오류를 평균낸다
문제집을 5등분해서, 서로 다른 모의고사를 5번 보는 것이다.
뭐가 좋아졌나
| 검증셋 (hold-out) | K-겹 교차검증 | |
|---|---|---|
| 검증에 쓰는 데이터 | 한 덩어리만 | 결국 전부 한 번씩 |
| 학습에 쓰는 비율 | 예: 50% | 예: K=5면 80% |
| 결과 안정성 | 자를 때마다 출렁 | 평균이라 안정적 |
| 계산량 | 1번 학습 | K번 학습 |
핵심은 모든 데이터가 한 번씩은 검증에 쓰이고, 동시에 대부분이 학습에도 쓰인다는 점이다. 한 덩어리를 통째로 희생하지 않아도 된다.
대가는 계산량이다. K번 학습하니 시간도 K배다. 공짜는 없다.
LOOCV — 극단까지 밀어붙이면
K를 데이터 개수만큼 늘리면 어떻게 될까? 즉 데이터가 100개면 K=100.
- 검증셋 크기 = 딱 1개
- 99개로 학습하고 1개로 시험 보기를 100번 반복
이걸 LOOCV(Leave-One-Out Cross Validation)라고 한다. 데이터를 가장 알뜰하게 쓰는 방법이다.
- 장점 — 학습에 거의 모든 데이터를 쓰니 편향이 가장 작다
- 단점 — 100번 학습해야 한다. 데이터가 1만 개면 1만 번이다
강의에서 나온 실험 결과가 인상적이었다. LOOCV와 10-겹 교차검증의 결과가 거의 비슷하게 나온다. 100번 돌린 것과 10번 돌린 것의 결론이 같다면, 굳이 100번 돌릴 이유가 없다.
그래서 실무에서는 보통 K = 5 또는 10을 쓴다. 성능은 거의 같은데 계산은 10~20배 싸다.
여기서 배운 태도가 하나 있다. “이론적으로 가장 정확한 방법”과 “실제로 쓸 만한 방법”은 다르다. 매번 DB를 조회해야 가장 정확하지만 캐시를 두는 것, 완벽한 정규화 대신 조인 비용을 줄이려고 일부를 비정규화하는 것과 같은 종류의 판단이다. 정확도를 조금 내주고 비용을 크게 아끼는 거래다.
주의할 점 하나
폴드끼리 데이터가 겹치면 안 된다. 겹치는 순간 “학습에 쓴 문제로 시험 보는” 상황이 되어서, 교차검증을 하는 의미 자체가 사라진다.
5. 비지도학습
지금까지는 전부 정답(Label)이 있는 세계였다. 그런데 현실에서는 정답이 없는 데이터가 훨씬 많다.
비지도학습(Unsupervised Learning) = 정답 없이, 데이터 안의 구조·패턴·숨은 집단을 찾아내는 학습
| 지도학습 | 비지도학습 | |
|---|---|---|
| 데이터 | 입력 + 정답 | 입력만 |
| 하는 일 | 정답 맞추기 | 구조 찾기 |
| 예시 | 집값 예측, 스팸 분류 | 고객 세분화, 이상치 탐지, 차원 축소 |
| 채점 | 가능 (정답이 있으니) | 애매하다 |
마지막 줄이 중요하다. 비지도학습은 “정답”이 없어서 채점 기준도 명확하지 않다. 지도학습에서 MSE니 정확도니 하던 게 여기선 안 통한다.
더 쉬운 비유로. 지도학습은 답지가 있는 문제집이고, 비지도학습은 “이 사진들을 비슷한 것끼리 묶어봐”라는 숙제다. 정해진 답이 없다. 색으로 묶어도 되고, 크기로 묶어도 된다.
바로 이 지점에서 비지도학습의 핵심 질문이 나온다.
- 무엇을 “비슷하다”고 볼 것인가? (거리·유사도를 어떻게 정의할 것인가)
- 전처리를 어떻게 할 것인가?
6. 클러스터링
비지도학습의 대표 과제다.
클러스터링 = 데이터 안에서 비슷한 것끼리 묶어 하위 집단(클러스터)을 찾는 기법
좋은 묶음의 조건은 두 가지다.
- 묶음 안은 서로 비슷하게
- 묶음끼리는 확실히 다르게
가장 흔한 활용처는 마케팅 세그먼테이션이다. 고객의 소득·직업·거주지·구매 이력 같은 지표를 가지고, “비슷한 성향의 고객 무리”를 찾아내는 것. 여기엔 정답표가 없다. “이 사람은 A그룹”이라고 적힌 데이터가 애초에 없기 때문에 지도학습으로는 풀 수 없는 문제다.
대표 기법 두 가지를 배웠다.
| 기법 | 특징 |
|---|---|
| K-평균 (K-means) | 묶음 개수 K를 미리 정하고 나눈다 |
| 계층적 군집 (Hierarchical) | K를 미리 안 정한다. 전체 구조를 나무로 보여준다 |
7. K-means 클러스터링
절차가 놀랄 만큼 단순하다.
- 초기화 — 각 데이터에 1~K번 묶음을 아무렇게나 배정한다
- 아래를 배정이 더 이상 안 바뀔 때까지 반복
- 2a. 각 묶음의 중심점을 계산한다 (그 묶음에 속한 점들의 평균 위치)
- 2b. 각 데이터를 가장 가까운 중심의 묶음으로 다시 배정한다
이게 전부다. “평균 내기 → 가까운 쪽으로 다시 줄 서기”를 계속 반복하는 것.
더 쉬운 비유로. 운동장에 아이들이 흩어져 있다. 반을 3개로 나눈다고 하자. ① 처음엔 아무렇게나 1반, 2반, 3반을 붙인다 ② 각 반 아이들의 한가운데 자리를 찾는다 ③ 모든 아이가 자기한테 가장 가까운 한가운데로 반을 옮긴다 ②③을 반복하면 어느 순간 아무도 반을 안 옮기게 된다. 거기서 끝.
두 가지 성질
① 매 반복마다 결과가 좋아진다
중심과의 평균 거리가 계속 줄어들기 때문에 절대 나빠지지 않는다. 그래서 언젠가는 반드시 멈춘다.
② 하지만 항상 최선은 아니다
처음에 어떻게 배정했느냐에 따라 최종 결과가 달라진다. 어중간한 답에 갇혀서 더는 못 나아가는 상태가 될 수 있는데, 이걸 지역 최솟값(local minimum) 문제라고 한다.
산에서 내려올 때 웅덩이에 빠지는 것과 같다. 주변보다는 낮으니 더 내려갈 곳이 없어 보이지만, 사실 저 아래 진짜 골짜기가 따로 있다.
그래서 실무 규칙은 이렇다. 초기값을 바꿔가며 여러 번 돌리고, 그중 제일 좋은 결과를 쓴다. 한 번 돌린 결과를 믿으면 안 된다.
이 개념이 나중에 경사 하강법에서 또 나온다. 이름만 다르고 문제 구조가 똑같다.
8. 계층적 군집
K-means에는 불편한 점이 있다. K를 미리 정해야 한다. 그런데 몇 개로 나눠야 좋은지 우리가 어떻게 아나?
계층적 군집은 이 문제를 우회한다. K를 정하지 않고, 대신 전체 구조를 나무 그림으로 보여준다.
방식은 아래에서 위로(상향식) 합쳐 올라간다.
- 처음엔 데이터 하나하나가 각각 하나의 묶음이다
- 모든 묶음 쌍의 거리를 재서, 가장 가까운 두 묶음을 합친다
- 하나가 될 때까지 반복한다
결과로 나오는 나무 그림을 덴드로그램(Dendrogram)이라 한다. 그리고 여기가 핵심인데, 원하는 높이에서 가로로 자르면 그 개수만큼의 묶음이 나온다. 위쪽에서 자르면 크게 2묶음, 아래쪽에서 자르면 4묶음.
K-means는 몇 반으로 나눌지 먼저 정하고 시작하지만, 계층적 군집은 가족 관계도를 통째로 그려놓고 나중에 가위질한다.
무엇을 “가깝다”고 할 것인가 — 링크
여기서 새로운 문제가 생긴다. 점과 점의 거리는 잴 수 있는데, 묶음과 묶음의 거리는 어떻게 재나?
세 가지 방식이 있다.
| 링크 | 정의 | 성격 |
|---|---|---|
| Single (최소 거리) | 두 묶음의 점들 중 가장 가까운 한 쌍의 거리 | 길게 늘어진 모양이 잘 생김 |
| Complete (최대 거리) | 가장 먼 한 쌍의 거리 | 동글동글한 묶음이 나옴 |
| Average (평균 거리) | 모든 쌍 거리의 평균 | 중간 성격 |
두 반이 얼마나 친한지를 잴 때, 제일 친한 두 명 기준으로 볼 건지, 제일 어색한 두 명 기준으로 볼 건지, 전체 평균으로 볼 건지의 차이다.
중요한 건 링크를 바꾸면 결과 나무 모양이 달라진다는 것이다. 그래서 하나만 시도하지 말고 여러 링크를 다 해보라고 권한다.
계산량 문제
계층적 군집은 매 단계에서 모든 묶음 쌍의 거리를 다시 계산한다. 데이터가 많아지면 K-means보다 훨씬 무거워진다. 데이터가 크면 K-means, 구조를 눈으로 보고 싶으면 계층적 군집 — 이렇게 나뉜다.
9. 클러스터링 체크리스트
강의 마지막에 나온 실무 주의사항이 짧지만 알찼다.
① 스케일링은 거의 필수다
변수의 단위 차이가 결과를 지배한다. 나이(20~60)와 연봉(3000~10000)을 같이 쓰면, 거리 계산에서 연봉이 나이를 완전히 압도한다. 나이는 있으나 마나 한 변수가 된다.
그래서 보통 평균 0, 표준편차 1로 맞추는 표준화를 먼저 한다.
키를 밀리미터로, 몸무게를 킬로그램으로 재놓고 “가장 비슷한 사람”을 찾으면 키만 보고 판단하게 된다. 숫자가 훨씬 크니까.
② 클러스터 개수에 정답은 없다
K-means든 계층적 군집이든 “몇 개가 맞다”는 합의된 정답이 없다. 이건 알고리즘이 아니라 문제를 아는 사람이 판단할 영역이다.
③ 한 번 시도로 끝내지 말 것
초기값·링크·K를 바꿔가며 여러 번 돌려보고, 결과가 말이 되는지 사람이 봐야 한다. 클러스터링은 “돌리면 답이 나오는” 도구가 아니다.
정리
- 훈련 오류는 문제집 점수, 테스트 오류가 진짜 실력. 훈련 오류는 실력을 과대평가한다
- 모델이 복잡해질수록 훈련 오류는 계속 내려가지만 테스트 오류는 U자를 그린다. 그 바닥이 목표
- 데이터가 부족해서 시험지를 따로 못 만들면 → 가진 데이터를 쪼개 모의고사를 만든다
- 검증셋(hold-out)은 간단하지만 결과가 출렁이고, 성능을 낮게 본다
- K-겹 교차검증은 K번 나눠 평균 → 안정적. 대가는 계산량 K배. 보통 K = 5 또는 10
- 비지도학습은 정답 없이 구조를 찾는다. 채점 기준 자체가 모호하다
- K-means는 K를 미리 정하고 “중심 계산 ↔ 재배정”을 반복. 초기값에 따라 결과가 달라진다
- 계층적 군집은 나무를 다 그려놓고 원하는 높이에서 자른다. 링크 방식에 따라 결과가 달라진다
- 클러스터링 전엔 스케일링, 그리고 여러 번 시도
다음 글에서
여기까지가 기초 편이다. 다음 글부터는 방법론으로 넘어가서 실제 모델을 하나씩 뜯어본다. 첫 타자는 선형회귀다.
한줄 평
- 좋았던 시대는 막을 내리지만, 학습의 흥미는 더 올라갈 것 입니다.. 화이팅!