기계학습으로 어떤 문제를 해결할까?
문제의 특성에 따라 기계학습이 알맞은 해결 방법인지 검토해 봅시다.
핵심 개념
기계학습은 규칙을 사람이 다 적어 낼 수 없어 데이터에서 패턴을 찾아야 하는 문제를 해결하기에 적합합니다. 그렇다고 모든 문제에 기계학습을 적용하는 것이 좋은 것은 아니며, 문제의 특성에 따라 적합한 해결 방법을 선택해야 합니다. 사람이 적어 준 규칙으로 추론하는 프로그램도 인공지능의 한 갈래이므로, 여기서 구분하는 것은 인공지능인지 아닌지가 아니라 학습이 필요한지입니다.
규칙으로 푸는 문제 해결
- 수식이나 규칙으로 표현 가능
- 데이터가 달라져도 해결 방법이 변하지 않음
- 알고리즘이 명확히 존재
예시
기계학습을 적용한 문제 해결
- 데이터가 많고 규칙이 계속 달라짐
- 사람이 규칙을 적어 내기 어려운 인식 문제
- 수많은 데이터에서 패턴을 자동으로 찾음
예시
5가지 문제, 학습 모델이 필요할까?
| 문제 | 학습 모델 필요 여부 | 이유 |
|---|---|---|
| 미세 먼지 측정과 지수 출력 | 학습 없이 가능 | 측정값에 정해진 공식을 적용하면 해결 가능 |
| 랜덤 뽑기 | 학습 없이 가능 | 무작위 수 생성 함수로 해결 가능 |
| 규칙이 있는 게임 (틱택토) | 학습 없이 가능 | 규칙과 탐색으로 풀리므로 데이터로 학습하는 모델은 필요 없음 |
| 이미지 인식 (손글씨) | 학습 모델 적합 | 사람마다 필체가 달라 규칙화 어려움 |
| 그림을 보고 제목 붙이기 | 학습 모델 적합 | 이미지 이해 + 언어 생성, 규칙화 불가 |
「학생 수에 1인당 급식비를 곱해 이번 달 급식비 총액을 구하는 일」과 「급식판 사진을 보고 남은 음식의 양을 가늠하는 일」 가운데 학습 모델이 필요한 쪽은 어디이고, 왜 그런가요?
기계학습으로 어떻게 문제를 해결할 수 있을까?
문제 정의부터 성능 평가까지 이어지는 여섯 단계를 살펴봅시다.
기계학습 문제 해결 과정은 문제 정의 → 데이터 수집 → 데이터 전처리 → 유형·알고리즘 선정 → 모델 생성 → 성능 평가의 여섯 단계로 이루어집니다. 이 단계는 반드시 순서대로 한 번만 진행하는 것이 아니라, 필요에 따라 이전 단계로 돌아가 수정할 수 있습니다.
문제 정의
해결하고자 하는 문제에 기계학습이 필요한지 확인하고, 문제를 명확히 정의합니다. 필요한 데이터가 무엇인지, 그것을 확보할 수 있는지 검토해야 합니다.
데이터 수집
정의된 문제에 적합한 대표성 있는 데이터를 수집합니다. 데이터의 규모·형태·수집 방법을 고려합니다. 모은 데이터는 모델 생성 단계에서 훈련 데이터와 테스트 데이터로 분리해 씁니다.
훈련 데이터와 테스트 데이터를 왜 나눌까?
모델이 훈련 데이터에만 과도하게 적응하면, 그 데이터에서는 잘 맞지만 새로운 데이터에서는 예측을 잘못하는 과적합(overfitting)이 발생할 수 있습니다. 훈련에 사용하지 않은 테스트 데이터로 성능을 확인해야 모델이 일반화(generalization) 능력을 갖췄는지 올바르게 평가할 수 있습니다. 일반적으로 전체 데이터를 훈련 데이터 7 : 테스트 데이터 3 (또는 8:2) 비율로 나눕니다.
데이터 전처리
수집한 데이터의 핵심 속성을 파악하고, 모델에 넣을 수 있는 모양으로 정리합니다. 수치 데이터는 이상치와 결측치를 처리하고, 이미지·텍스트 데이터는 숫자로 바꾸는 방법을 정합니다.
유형·알고리즘 선정
맞힐 것이 범주이면 분류, 연속적인 수치이면 회귀, 정답 없이 비슷한 것끼리 묶으려면 군집입니다. 유형을 정한 다음 그 유형에 쓰는 알고리즘을 고릅니다.
모델 생성
데이터를 훈련 데이터와 테스트 데이터로 나누고, 훈련 데이터를 입력하여 기계학습 모델을 학습시킵니다.
성능 평가
테스트 데이터로 성능을 평가하여 적합한 모델을 선택합니다. 성능이 모자라면 앞 단계로 돌아가 고칩니다. 평가를 통과한 모델은 새로운 데이터를 넣어 예측·분류에 활용합니다.
과대적합(과적합, Overfitting)
훈련 데이터에만 지나치게 최적화되어 새로운 데이터에 성능이 낮아지는 상태
→ 훈련 데이터 수 늘리기, 모델 복잡도 줄이기
과소적합 (Underfitting)
모델이 너무 단순하여 훈련 데이터에서도 좋은 성능을 보이지 못하는 상태
→ 더 복잡한 모델 선택, 충분히 학습시키기
두 상태는 훈련 데이터 성적과 새 데이터 성적을 나란히 놓아야 구별됩니다. 훈련 데이터 성적만 보고 있으면 과대적합은 오히려 성적이 좋은 것처럼 보입니다. 그래서 훈련에 쓰지 않은 데이터를 따로 남겨 두는 것입니다.
훈련 데이터 (Training Data)
모델의 학습에 사용하는 데이터. 기계학습 모델은 훈련 데이터에서 패턴을 찾아 학습합니다.
테스트 데이터 (Test Data)
학습을 마친 모델의 성능을 평가하기 위해 사용하는 데이터. 훈련에 사용하지 않은 새로운 데이터입니다.
스팸 분류 모델의 성능이 낮게 나오자 한 학생이 메시지를 더 모으러 갔습니다. 여섯 단계 가운데 어느 단계로 되돌아간 것이고, 이렇게 되돌아가도 괜찮을까요?
데이터를 왜 굳이 나누어 둘까?
외운 것을 그대로 물어보면 잘하는 것이 당연하다는 데서 출발합니다.
외운 문제를 다시 내면 점수는 언제나 높다
학생 A가 문제집을 통째로 외웠다고 합시다. 그 문제집에서 그대로 낸 시험은 만점이 나올 것입니다. 하지만 우리가 알고 싶은 것은 문제집을 얼마나 외웠는가가 아니라 처음 보는 문제도 풀 수 있는가입니다. 모델도 똑같습니다. 학습에 쓴 데이터로 성적을 측정하면 그 성적은 실력과 암기를 구별해 주지 못합니다.
일반화(generalization)
학습에 쓴 데이터뿐 아니라 학습할 때 본 적 없는 데이터에서도 제 역할을 하는 성질입니다. 기계학습에서 「성능이 좋다」는 말은 대개 이 성질을 가리킵니다. 그래서 성능은 훈련에 쓰지 않고 남겨 둔 데이터로만 측정합니다.
그런데 테스트 데이터도 닳는다
모델을 한 번 만들고 끝내는 경우는 거의 없습니다. 설정값을 조금씩 바꿔 가며 여러 번 만들어 보고, 그때마다 테스트 데이터로 점수를 측정해 더 나은 쪽을 고르게 됩니다. 문제는 「더 나은 쪽을 고르는 일」 자체가 이미 학습이라는 점입니다. 테스트 데이터의 점수를 보고 사람이 설정을 고쳤다면, 그 데이터의 정보는 이미 모델에 흘러 들어간 것입니다.
테스트 데이터로 모델을 고르지 않는다
테스트 데이터를 여러 번 살펴보며 모델을 고르면, 그 데이터는 더 이상 「본 적 없는 데이터」가 아닙니다. 시험 문제를 미리 보고 공부한 뒤 그 시험으로 실력을 측정하는 셈이라, 점수는 실제보다 높게 나옵니다. 고르는 일에 쓸 데이터는 따로 마련하고, 테스트 데이터는 마지막 채점에 한 번만 씁니다.
전처리 기준값을 학습 데이터에서만 정하는 까닭도 같다
정규화·표준화(값의 범위를 같은 자로 맞추는 일)에서 기준으로 삼는 값(최솟값·최댓값, 평균·표준 편차)은 학습에 쓴 데이터에서 한 번만 정해 새 데이터에도 그대로 씁니다. 그 까닭이 여기에 있습니다. 테스트 데이터까지 합쳐서 평균을 구하면, 테스트 데이터의 값이 이미 전처리 단계에서 모델에 반영되어 채점이 후해집니다. 새 데이터가 한 건씩 들어오는 실제 상황에서는 애초에 평균을 다시 구할 수도 없습니다.
해결책 하나 — 검증 데이터를 따로 떼어 둔다 (홀드아웃 검증)
훈련 데이터에서 일부를 다시 떼어 검증 데이터(validation data)로 삼는 방법입니다. 설정을 바꿔 가며 성능을 비교하는 일은 검증 데이터로 하고, 이제 더 손대지 않겠다고 정한 다음에야 테스트 데이터로 마지막 점수를 냅니다. 이렇게 한 번 나누어 두고 쓰는 방식을 홀드아웃 검증이라고 합니다.
한 번만 나누어 두므로 빠르지만, 어디를 잘라 검증 데이터로 삼았느냐에 따라 점수가 흔들립니다. 특히 데이터가 적을수록 흔들림이 큽니다.
해결책 둘 — 검증에 쓸 덩어리를 바꿔 가며 여러 번 측정한다 (k-폴드 교차 검증)
데이터를 k개의 덩어리(폴드, fold)로 나눈 뒤, 한 덩어리씩 돌아가며 검증에 쓰고 나머지로 학습하는 방법입니다. k가 5면 이 과정을 다섯 번 반복하고, 다섯 번의 점수를 평균 내어 성능으로 삼습니다. 어느 한 번 나눈 결과에 점수가 휘둘리지 않게 하려는 것입니다.
| 방법 | 이럴 때 쓴다 | 함께 따라오는 조건 |
|---|---|---|
| 홀드아웃 검증 |
데이터가 넉넉하고, 성능을 빠르게 살펴보고 싶을 때 | 어디서 잘랐느냐에 따라 점수가 달라진다. 데이터가 적으면 흔들림이 크다 |
| k-폴드 교차 검증 |
데이터가 적거나, 점수를 좀 더 믿을 만하게 내고 싶을 때 | 학습을 k번 반복하므로 시간이 k배로 든다 |
둘 중 어느 쪽이 더 좋은 방법이라고 정해져 있지 않습니다. 「함께 따라오는 조건」 칸이 곧 대가이므로, 데이터의 양과 쓸 수 있는 시간을 보고 고릅니다. 또 어느 쪽을 쓰든 테스트 데이터를 마지막까지 아껴 둔다는 원칙은 달라지지 않습니다.
설정을 바꿔 가며 테스트 데이터로 여러 번 점수를 측정하면 무엇이 문제가 될까요? 검증 데이터가 하는 일을 떠올려 보세요.
오렌지(Orange) 실습 — 기계학습 모델을 구현해 볼까?
오렌지로 스팸 메시지를 분류하는 모델을 직접 만들어 봅시다.
스팸 메시지를 분류하는 기계학습 모델을 오렌지(Orange)로 구현합니다.
스팸 메시지 분류 — 구현 흐름 한눈에 보기
1
문제 정의
스팸 분류
2
데이터 수집
UCI 데이터셋
3
데이터 전처리
낱말 빈도로 바꾸기
4
유형·알고리즘 선정
분류 · 신경망·로지스틱 회귀
5
모델 생성
훈련·테스트 분리
6
성능 평가
두 모델 비교
문제 정의
스마트폰의 불편함 중 하나인 스팸 메시지를 줄이기 위해, 수신된 메시지를 스팸 메시지와 정상 메시지로 분류하는 인공지능 모델을 만듭니다.
문제 유형
지도학습 > 분류 (이항 분류)
레이블
spam / ham (정상)
데이터 유형
비정형 (텍스트)
데이터 수집
스팸 메시지와 정상 메시지 데이터셋를 수집하기 위해 UCI 기계학습 저장소를 방문합니다.
SMS Spam Collection Data Set
UCI 기계학습 저장소 검색창에서 「SMS Spam Collection Data Set」 검색
SMSSpamCollection.txt
스팸 30개 + 정상(ham) 50개 = 총 80개
레이블(spam/ham) + 메시지 내용
데이터 전처리
(1)데이터 속성 파악하기
SMSSpamCollection.txt 파일은 왼쪽 spam / ham으로 구분된 메시지 목록입니다. 이 데이터는 비정형 텍스트 데이터로 이루어져 있습니다.
| 레이블 | 메시지 내용 (예시) |
|---|---|
| ham | Go until jurong point, crazy.. Available only in bugis n great world... |
| spam | Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005... |
| ham | U dun say so early hor.. U c already then say... |
(2)데이터셋 입력 및 전처리 — 오렌지 위젯 흐름
Import Documents 위젯은 파일 하나가 아니라 폴더를 읽습니다. 폴더 안에 있는 하위 폴더의 이름을 레이블로 삼고, 그 안의 텍스트 파일 하나를 문서 하나로 봅니다. 그래서 먼저 Dataset 폴더 안에 spam 폴더와 ham 폴더를 만듭니다. 원본 파일은 한 줄에 레이블과 메시지가 탭으로 나뉘어 있으므로, 고른 메시지를 레이블에 맞는 폴더에 한 메시지당 텍스트 파일 하나로 저장합니다. 스팸 30개와 정상 50개를 이렇게 담으면 실습 데이터가 준비됩니다.
Bag of Words: 텍스트에서 단어 등장 빈도를 수치로 변환하여 모델이 처리할 수 있는 형태로 만듭니다. Term Frequency: Count 기본 설정.
스팸 메시지 대신 영화 리뷰를 긍정·부정으로 나누는 모델을 만든다면, 「데이터 전처리」 단계에서 리뷰 글에 무엇을 해 두어야 모델에 넣을 수 있을까요?
오렌지(Orange) 실습 — 모델을 만들고 비교해 보기
준비한 데이터로 모델 둘을 만들어 성능을 비교해 봅시다.
유형·알고리즘 선정
맞힐 것이 spam과 ham 두 범주이므로 지도학습의 분류 문제입니다. 분류 알고리즘 가운데 Neural Network(신경망)와 Logistic Regression(로지스틱 회귀) 둘을 골라 비교합니다.
모델 생성
데이터를 훈련 데이터와 테스트 데이터로 나누고, 훈련 데이터로 두 분류 모델을 학습시킵니다.
훈련 데이터와 테스트 데이터 분리하기
설정: Random sampling 선택
Training set size: 70% (전체 80개 중 56개 = 훈련 데이터)
Repeat train/test: 3 (반복 횟수)
일반적으로 훈련:테스트 = 7:3 또는 8:2 비율로 나눕니다.
교차 검증 (Cross Validation)이란?
Random sampling 대신 Cross validation을 고르면 k-폴드 교차 검증으로 성능을 측정합니다. 데이터를 k등분해 한 덩어리씩 돌아가며 검증에 쓰고 나머지로 학습하는 과정을 k번 반복한 뒤, k번의 점수를 평균 내는 방식입니다. 「데이터를 왜 굳이 나누어 둘까?」 절에서 홀드아웃 검증과 나란히 다루었습니다. 데이터가 80개뿐인 이 실습처럼 데이터가 적을 때 특히 도움이 됩니다.
전체 위젯 연결 흐름
성능 평가
학습을 마친 두 모델을 테스트 데이터로 채점해 성능을 비교합니다.
두 모델 성능 비교 (Random sampling 70%, Repeat 3)
Neural Network (신경망)
| 정확도 (CA) | 0.903 |
| 정밀도 (Precision) | 1.000 |
| 재현율 (Recall) | 0.741 |
| AUC | 0.963 |
정확도와 재현율이 모두 앞서므로 이 실습에서는 이쪽을 골랐습니다
Logistic Regression (로지스틱 회귀)
| 정확도 (CA) | 0.708 |
| 정밀도 (Precision) | 1.000 |
| 재현율 (Recall) | 0.222 |
| AUC | 0.990 |
정확도와 재현율은 낮지만 AUC는 오히려 이쪽이 높습니다
AUC는 아직 다루지 않은 지표입니다. 스팸이라고 판정할 문턱을 여러 값으로 옮겨 가며 측정해 본 성적을 하나로 모은 값이라고만 알아 둡시다. 0.5면 찍은 것과 다를 바 없고 1에 가까울수록 좋습니다. 이름까지 외울 필요는 없습니다.
「정확도가 더 높으니 더 좋은 모델」이라고 잘라 말할 수는 없습니다. 위에서도 AUC는 로지스틱 회귀 쪽이 더 높습니다. 어느 지표를 앞에 둘지는 문제가 정합니다. 스팸을 한 통도 놓치고 싶지 않다면 재현율을, 중요한 메시지가 스팸함으로 가는 일을 막고 싶다면 정밀도를 먼저 봅니다. 게다가 이 점수들은 데이터 80개로 세 번 나눠 측정한 결과라, 데이터가 바뀌면 순서도 바뀔 수 있습니다.
그리고 이렇게 여러 모델을 비교해 하나를 고르는 일은 원래 검증 데이터가 맡는 일입니다. 고른 뒤에 남겨 둔 테스트 데이터로 채점해야 그 점수를 믿을 수 있습니다.
평가를 마친 모델 활용하기
성능 평가를 통과한 분류 모델(Neural Network)에 실제 새로운 데이터를 입력하여 예측하고 분류합니다. 쓰다가 성능이 떨어지면 다시 앞 단계로 돌아갑니다.
모델 활용 위젯 흐름
Predictions 위젯을 열면 각 새 메시지에 대해 분류 모델이 판정한 결과(spam/ham)를 확인할 수 있습니다.
훈련 데이터와 테스트 데이터를 나눌 때, 나누기 전에 해도 되는 일과 나눈 뒤에 해야 하는 일은 각각 무엇인가요?
이번에는 값을 예측해 볼까?
같은 여섯 단계를 회귀 문제에 그대로 적용해 봅시다.
이산화탄소 배경 대기 농도 예측하기
기후 변화에 대응하기 위해, 충남 태안 안면도에서 관측한 연도별 평균 이산화탄소(CO₂) 배경 대기 농도(1999~2021, 단위 ppm) 데이터를 이용해 미래의 농도를 예측하는 선형 회귀 모델을 만듭니다. 분류 문제와 달리 예측값이 연속적인 수치이므로 회귀 문제로 정의합니다.
1
문제 정의
CO₂ 농도 예측
2
데이터 수집
기상자료개방포털
3
데이터 전처리
연도·농도 정리
4
유형·알고리즘 선정
선형 회귀(+정규화)
5
모델 생성
Linear Regression
6
성능 평가
오차·결정 계수 확인
스팸 분류와 같은 흐름입니다. 달라지는 것은 유형·알고리즘 선정 단계에서 분류 대신 회귀를 고른다는 것과, 성능 평가 단계에서 쓰는 지표뿐입니다.
안면도 평균 이산화탄소 배경 대기 농도 데이터 (예시)
아래 값은 수업에서 원리를 확인하려고 지어낸 값입니다. 실제 관측 자료는 기상청 기상자료개방포털에서 구할 수 있습니다 — data.kma.go.kr
| 연도 | 1999 | 2000 | 2001 | 2002 |
|---|---|---|---|---|
| CO₂ 농도(ppm) | 371.2 | 373.3 | 375.6 | 377.6 |
연도(독립 변수, feature)가 늘어날수록 CO₂ 농도(종속 변수, target)도 함께 증가하는 경향을 보입니다.
모델 생성 — 훈련/테스트 데이터 분리 및 모델 비교
Test and Score 위젯에서 Cross validation(k-fold 교차 검증, k=5) 또는 7:3 비율로 훈련·테스트 데이터를 나눕니다. 기본 선형 회귀(Linear Regression) 모델과, 과적합을 줄이기 위한 정규화 회귀 모델(릿지·라쏘 등)을 함께 만들어 성능을 비교합니다. 여기서 말하는 정규화(regularization)는 모델이 지나치게 복잡해지지 않도록 누르는 방법으로, 값의 범위를 같은 자로 맞추는 정규화(normalization)와는 이름만 같고 다른 일입니다.
성능 평가 결과
평균제곱오차(MSE)
0.703
평균제곱근오차(RMSE)
0.838
평균절대오차(MAE)
0.673
결정 계수(R²)
0.997
오차 지표(MSE·RMSE·MAE)는 값이 작을수록, 결정 계수는 1에 가까울수록 좋은 모델입니다. CO₂ 농도는 연도에 따라 거의 일정하게 증가하는 뚜렷한 경향을 보이므로 결정 계수가 매우 높게 나타납니다. 성능을 더 개선하려면 농도와 함께 움직이는 다른 독립 변수를 추가하거나, 데이터를 더 수집하거나, 릿지·라쏘 등 정규화 회귀와 옵션값을 시도해 볼 수 있습니다.
0.997이 나왔다고 해서 미래의 농도까지 잘 맞힌다는 뜻은 아닙니다. 이 값은 1999~2021년이라는 관측한 구간 안에서 선이 점들을 얼마나 잘 따라갔는지를 말할 뿐입니다. 2050년처럼 관측한 적 없는 구간까지 선을 늘여 값을 읽는 일에는 위험이 따릅니다. 그 구간에서도 같은 기울기가 이어진다는 보장은 데이터 안에 없습니다.
같은 여섯 단계를 밟았는데 스팸 분류는 「맞혔나 틀렸나」로, 농도 예측은 「얼마나 빗나갔나」로 성능을 평가했습니다. 무엇이 달라서일까요?
분류 모델의 성능 평가
모델이 얼마나 잘 맞혔는지는 무엇을 보고 판단할까?
혼동 행렬에서 출발해 정확도·정밀도·재현율·특이도를 읽어 봅시다.
맞히려는 것이 무엇이냐에 따라 측정하는 방법도 달라집니다. 분류는 갈래를 맞혔는지 틀렸는지 세고, 회귀는 값이 얼마나 빗나갔는지 측정하며, 군집은 정답이 없으므로 묶인 모양이 얼마나 그럴듯한지를 봅니다. 이 절에서는 분류를 먼저 보고, 회귀와 군집은 「회귀와 군집은 무엇으로 평가할까?」 절에서 이어 봅니다.
혼동 행렬 (Confusion Matrix)
기계학습 모델의 예측 오류가 얼마인지, 어떤 유형의 오류가 발생했는지를 한눈에 보여 주는 표입니다.
네 칸의 이름은 두 글자로 읽습니다
- 앞 글자 T/F — 모델의 판정이 실제와 맞았으면 T(True), 어긋났으면 F(False)
- 뒤 글자 P/N — 모델이 양성이라 판정했으면 P(Positive), 음성이라 판정했으면 N(Negative)
여기서 양성(P)은 우리가 찾아내려는 쪽을 가리키는 이름일 뿐, 좋다는 뜻이 아닙니다. 스팸 분류라면 스팸이 양성이고, 불량품 판별이라면 불량이 양성입니다. 무엇을 양성으로 두느냐를 먼저 정해야 아래 지표들이 말이 됩니다.
아래 수치는 지표의 계산 방법을 보여 주기 위해 든 가상의 예시이며, 앞서 제시한 스팸 분류 모델의 실제 성능 수치와는 별개입니다.
(정상 메시지)
TN = 40
진짜 음성
정상→정상 ✓
FP = 2
거짓 양성
정상→스팸 ✗
(스팸 메시지)
FN = 8
거짓 음성
스팸→정상 ✗
TP = 50
진짜 양성
스팸→스팸 ✓
주요 성능 평가 지표
| 지표 | 수식 | 스팸 예시 적용 | 의미 |
|---|---|---|---|
| 정확도 (CA/Accuracy) |
(TP+TN) / (TP+TN+FP+FN) | (50+40) / (50+40+2+8) = 0.9 | 전체 중 올바르게 예측한 비율 |
| 정밀도 (Precision) |
TP / (TP + FP) | 50 / (50+2) ≈ 0.962 | 스팸으로 판정한 것 중 실제 스팸 비율 |
| 재현율 (Recall) |
TP / (TP + FN) | 50 / (50+8) ≈ 0.862 | 실제 스팸 중 스팸으로 올바르게 판정한 비율 |
| 특이도 (Specificity) |
TN / (TN + FP) | 40 / (40+2) ≈ 0.952 | 실제 정상 중 정상으로 올바르게 판정한 비율. 재현율이 양성 쪽을 본다면 특이도는 음성 쪽을 본다 |
| F1-점수 (F1 Score) |
2 × (정밀도×재현율) / (정밀도+재현율) | 정밀도와 재현율의 조화 평균 | 두 지표가 모두 높을 때 F1도 높아짐 |
위 지표들은 모두 0에서 1 사이의 값을 갖고 1에 가까울수록 좋습니다. 다만 어느 값을 먼저 보아야 하는지는 지표가 아니라 문제가 정합니다.
혼동 행렬의 네 칸은 각각 무엇을 센 값인가요? 정확도는 그중 어느 칸들로 계산하나요?
정확도만 보면 안 되는 까닭
숫자 하나로 모델을 판단할 때 생기는 함정을 봅시다.
정확도가 99%인데 쓸모없는 모델
어떤 희귀병이 1,000명 중 3명에게 나타난다고 합시다. 「누가 와도 병이 아니라고 답하는」 모델을 만들어 보면 어떻게 될까요? 1,000명 중 997명을 맞히므로 정확도는 99.7%입니다. 그런데 이 모델은 환자를 단 한 명도 찾아내지 못합니다.
| 지표 | 이 모델의 값 | 무엇을 말하고 있나 |
|---|---|---|
| 정확도 | 997 / 1000 = 0.997 | 거의 다 맞힌 것처럼 보인다 |
| 재현율 | 0 / 3 = 0 | 실제 환자 세 명 중 아무도 찾지 못했다 |
| 정밀도 | 구할 수 없음 | 양성이라 판정한 적이 없어 나눗셈의 분모가 0이 된다 |
한쪽 갈래가 훨씬 많은 데이터를 불균형 데이터라고 합니다. 이런 데이터에서는 정확도만 보아서는 안 됩니다. 많은 쪽으로만 답해도 값이 높게 나오기 때문입니다. 그래서 정밀도·재현율·특이도가 따로 있는 것이고, 혼동 행렬의 네 칸을 직접 살펴보아야 하는 것입니다. 거꾸로 두 갈래의 수가 비슷하다면 정확도는 여전히 읽기 쉽고 쓸모 있는 지표입니다.
정밀도와 재현율은 함께 올리기 어렵다
두 지표는 모두 TP(제대로 찾아낸 양성)를 늘리려 하지만, 줄이려는 실수가 서로 다릅니다. 정밀도는 FP를 줄이는 쪽이고 재현율은 FN을 줄이는 쪽입니다. 의심스러우면 일단 양성이라 판정하도록 문턱을 낮추면 놓치는 것(FN)이 줄어 재현율은 오르지만, 애먼 것까지 양성이라 하게 되어(FP) 정밀도는 떨어집니다. 문턱을 높이면 반대가 됩니다. 한쪽을 올리면 다른 쪽이 내려가기 쉬운 사이라, 어느 실수가 더 아픈지를 보고 균형점을 정합니다.
정밀도를 먼저 보는 경우 — 스팸 분류
스팸을 몇 통 놓치면 지우는 수고로 끝나지만, 합격 통보 메일이 스팸함으로 가면 되돌리기 어렵습니다. 정상을 스팸이라 하는 실수(FP)가 더 아프므로 정밀도를 먼저 봅니다.
재현율을 먼저 보는 경우 — 산불 감지
연기가 아닌 것을 연기라 해서 헛출동하면 인력과 비용이 들지만, 실제 산불을 놓치면 되돌릴 수 없습니다. 양성을 음성이라 하는 실수(FN)가 더 아프므로 재현율을 먼저 봅니다.
둘 중 하나가 더 중요한 지표라고 정해져 있지 않습니다. 같은 지표라도 문제가 바뀌면 순위가 뒤집힙니다. 두 지표를 한 숫자로 함께 보고 싶을 때 F1-점수를 쓰지만, F1은 어느 쪽 실수가 더 아픈지를 대신 판단해 주지는 않습니다.
공항 보안 검색에서 위험물을 찾아내는 모델이라면 정밀도와 재현율 중 어느 쪽을 먼저 보아야 할까요? 어느 실수가 더 아픈지부터 생각해 보세요.
회귀와 군집은 무엇으로 평가할까?
맞았다·틀렸다를 셀 수 없는 문제에는 다른 잣대가 필요합니다.
회귀 — 얼마나 빗나갔는지를 측정한다
회귀는 연속적인 값을 맞히는 문제라 맞았다·틀렸다로 셀 수가 없습니다. 398건을 예측했는데 실제가 401건이라면 틀린 것이지만, 500건이라 예측한 경우와 같은 취급을 할 수는 없습니다. 그래서 회귀는 얼마나 빗나갔는지를 측정하고, 그 빗나간 양을 오차(error)라고 합니다. 점이 여러 개면 오차도 여러 개이므로, 이를 하나의 숫자로 모아야 두 모델을 비교할 수 있습니다.
오차를 하나로 모으는 방식이 여러 가지라 이름도 여럿입니다. 이산화탄소 배경 대기 농도 예측 실습에서 본 지표들이 그것입니다.
| 지표 | 의미 | 좋은 모델의 조건 |
|---|---|---|
| 평균제곱오차 (MSE) |
예측값과 실제값 차이를 제곱하여 평균한 값 | 값이 0에 가까울수록 좋음 |
| 평균제곱근오차 (RMSE) |
MSE의 제곱근. 제곱하며 부풀었던 값을 되돌려, 원래 단위(ppm·건·분)로 읽을 수 있게 한 값 | 값이 작을수록 좋음 |
| 평균절대오차 (MAE) |
예측값과 실제값 차이의 절댓값을 평균한 값 | 값이 작을수록 좋음 |
| 결정 계수 (R²) |
맞히려는 값이 오르내리는 폭 가운데 모델이 설명해 낸 몫. 비율이라 단위가 없다 | 값이 1에 가까울수록 좋음 |
결정 계수가 「언제나 0에서 1 사이」는 아니다
모델을 만들 때 쓴 데이터로 측정하면 0에서 1 사이가 나옵니다. 그런데 본 적 없는 데이터로 채점하면 0보다 작아질 수도 있습니다. 0은 「그냥 평균값으로 답하는 것과 다를 바 없다」는 뜻이고, 음수는 「평균으로 답하느니만 못하다」는 뜻입니다. 테스트 데이터에서 결정 계수가 음수로 나왔다면 계산이 틀린 것이 아니라, 그 모델이 새 데이터에서 제 몫을 못 하고 있다는 신호입니다.
군집 — 정답이 없는데 무엇을 측정하나
군집화는 레이블(정답표) 없이 비슷한 것끼리 묶는 일이라, 맞았는지 비교해 볼 정답 자체가 없습니다. 그래서 묶인 모양을 봅니다. 잘 묶였다면 두 가지가 동시에 성립해야 합니다. 같은 덩어리 안의 것들은 서로 가깝고, 다른 덩어리와는 멀리 떨어져 있어야 합니다.
a — 우리 편과의 거리
어떤 점에서 같은 군집에 있는 다른 점들까지의 평균 거리. 작을수록 좋습니다.
b — 가장 가까운 옆 동네와의 거리
그 점에서 가장 가까운 다른 군집의 점들까지의 평균 거리. 클수록 좋습니다.
실루엣 계수(silhouette coefficient)
(b − a) ÷ (a와 b 중 큰 값)
점 하나하나에게 「지금 있는 군집이 맞느냐」고 묻는 값입니다. 큰 값으로 나누는 것은 결과를 −1에서 1 사이로 가두기 위해서입니다.
| 값 | 그 점이 어떤 상태인가 |
|---|---|
| 1에 가까움 | 우리 편은 가깝고 남은 멀다. 제자리에 잘 들어가 있다 |
| 0 근처 | 양쪽이 비슷하게 멀다. 두 군집의 경계에 걸쳐 있다 |
| −1에 가까움 | 남이 우리 편보다 가깝다. 엉뚱한 군집에 들어가 있다 |
점 하나의 실루엣 계수가 높다고 전체 군집화가 잘된 것은 아닙니다. 보통은 모든 점의 값을 평균 내어 보고, 군집마다의 평균이 전체 평균에서 크게 벗어나지 않는지도 함께 살핍니다. 군집을 몇 개로 나눌지(k)를 정할 때 참고하기도 합니다. 다만 이 값은 데이터 안의 거리만 보고 만들어진 값이라, 나뉜 덩어리가 사람에게 쓸모 있는 구분인지까지 말해 주지는 못합니다. 그 판단은 결국 사람의 몫입니다.
한눈에 비교하기
| 유형 | 무엇을 측정하나 | 대표 지표 | 읽을 때 조심할 것 |
|---|---|---|---|
| 회귀 | 값이 얼마나 빗나갔는지 | MSE·RMSE·MAE, 결정 계수 | 오차 지표는 단위가 붙으므로 다른 데이터끼리는 곧바로 비교할 수 없다 |
| 분류 | 맞혔는지 틀렸는지, 어떤 유형으로 틀렸는지 | 정확도, 정밀도, 재현율, 특이도, F1-점수 | 갈래의 수가 크게 치우쳐 있으면 정확도만으로 판단하지 않는다 |
| 군집 | 묶인 모양이 얼마나 그럴듯한지 | 실루엣 계수 | 정답과 비교한 값이 아니므로, 나뉜 결과가 쓸모 있는지는 사람이 따로 해석한다 |
「내일 강수량 예측」 모델을 평가한 보고서에 「정밀도 0.8」이라고 적혀 있습니다. 무엇이 어색하고, 대신 어떤 지표를 써야 할까요?
핵심 정리
기계학습 문제 해결 과정은 문제 정의 → 데이터 수집 → 데이터 전처리 → 유형·알고리즘 선정 → 모델 생성 → 성능 평가의 여섯 단계로 이루어진다. 각 단계는 반드시 순서대로 한 번에 끝내는 것이 아니라, 성능이 충분하지 않으면 이전 단계로 돌아가 수정할 수 있다. 훈련 데이터와 테스트 데이터를 나누는 것은 과적합이 생겼는지 알아내고 일반화 성능을 확인하기 위해서이다. 설정을 바꿔 가며 모델을 고르는 일은 검증 데이터로 하고, 테스트 데이터는 마지막 채점에 한 번만 쓴다.
핵심 용어
- 훈련 데이터 — 모델 학습에 사용
- 검증 데이터 — 설정을 바꿔 가며 모델을 고를 때 사용
- 테스트 데이터 — 마지막 성능 평가에 한 번만 사용
- 과적합 — 훈련 데이터에서는 잘하는데 새 데이터에서는 못함
- 일반화 — 본 적 없는 데이터에서도 제 역할을 함
분류 성능 지표
- 정확도(CA) — 전체 정답 비율. 갈래가 치우친 데이터에서는 이것만 보지 않음
- 정밀도 — 양성 판정 중 실제 양성
- 재현율 — 실제 양성 중 찾아낸 비율
- 특이도 — 실제 음성 중 음성으로 맞힌 비율
- F1-점수 — 정밀도·재현율 조화 평균. 어느 실수가 더 아픈지는 알려 주지 않음
회귀·군집 성능 지표
- MSE·RMSE·MAE — 오차를 모은 값. 작을수록 좋음
- 결정 계수(R²) — 클수록 좋음. 만들 때 쓴 데이터로 측정하면 0~1, 본 적 없는 데이터로 측정하면 음수도 가능
- 실루엣 계수 — 군집용. −1~1, 클수록 제자리에 잘 들어간 것
오렌지 실습 흐름
- 스팸 분류: Bag of Words → Neural Network → Test and Score → Predictions
- CO₂ 예측: Linear Regression → Test and Score(k-fold) → 오차·결정 계수 확인
확인 퀴즈
배운 내용을 확인해 봅시다.