메일함 앞에 선 작은 문지기
집값 예측 모델에서는 방 개수, 면적, 위치처럼 이미 숫자나 범주로 정리된 데이터를 다루었다. 그런데 실제 세상에는 그렇게 얌전하게 표에 들어와 주지 않는 데이터가 훨씬 많다. 메일, 댓글, 리뷰, 문의 글, 채팅 기록처럼 사람이 쓴 문장이 대표적이다.
이번 장에서는 텍스트 데이터를 머신러닝 모델이 이해할 수 있는 숫자 특징으로 바꾸고, 그 특징을 이용해 메일이 스팸인지 아닌지를 분류하는 모델을 만들어 본다.
스팸 메일 분류는 자연어 데이터를 처음 다루기에 아주 좋은 문제다. 목표가 분명하기 때문이다. 모델에게 메일을 보여 주고 이렇게 묻는다.
"이 메일은 정상 메일일까, 스팸 메일일까?"
겉으로 보면 단순한 질문이지만, 안쪽에는 머신러닝의 거의 모든 기본 흐름이 들어 있다. 데이터를 준비하고, 특징을 만들고, 모델을 학습시키고, 예측값을 실제 라벨과 비교하고, 오탐과 미탐의 비용을 따져 본다. 지금까지 배운 내용을 텍스트라는 새로운 재료 위에서 다시 조립하는 셈이다.

문제를 먼저 정확히 정의하기
머신러닝 프로젝트는 모델 선택보다 문제 정의가 먼저다. 스팸 분류기에서도 가장 먼저 할 일은 입력과 라벨을 정하는 것이다.
입력은 메일의 제목과 본문이다. 예를 들어 다음과 같은 메일이 있다고 해 보자.
제목: 지금 가입하면 무료 쿠폰 지급
본문: 오늘 안에 링크를 클릭하면 특별 혜택을 받을 수 있습니다.
이 메일을 하나의 데이터 샘플로 보고, 모델이 읽을 입력으로 사용한다. 라벨은 이 메일이 스팸인지 아닌지에 대한 정답이다. 보통은 spam과 ham으로 나눈다. 여기서 ham은 스팸이 아닌 정상 메일을 뜻하는 관용적인 표현이다.
머신러닝 관점에서 정리하면 다음과 같다.
입력: 메일 제목, 메일 본문
라벨: 스팸 여부
예측값: 모델이 판단한 스팸 가능성 또는 스팸/정상 분류 결과
목표: 처음 보는 메일에 대해 스팸 여부를 잘 맞히는 것
여기서 중요한 점은 모델이 메일의 "의미"를 사람처럼 이해하는 것이 아니라는 사실이다. 모델은 처음에는 문장을 읽을 줄 모른다. 모델은 숫자만 계산할 수 있다. 따라서 우리는 텍스트를 숫자 특징으로 바꾸어 주어야 한다.
이 과정이 이번 장의 핵심이다. 문장을 숫자로 바꾸는 순간, 텍스트도 지금까지 다룬 표 형태 데이터처럼 머신러닝 모델의 입력이 될 수 있다.
텍스트는 그대로 모델에 넣을 수 없다
사람은 "무료", "당첨", "긴급", "비밀번호 확인" 같은 단어를 보면 수상한 느낌을 받을 수 있다. 하지만 로지스틱 회귀나 나이브 베이즈 같은 모델은 이런 단어를 직접 읽지 못한다. 모델 입장에서 메일 본문은 아직 계산할 수 없는 문자열 덩어리일 뿐이다.
그래서 텍스트 분류의 첫 단계는 문장을 숫자 벡터로 바꾸는 것이다. 벡터라는 말이 어렵게 느껴진다면, 일단 "여러 개의 숫자를 한 줄로 늘어놓은 것"이라고 생각하면 된다.
예를 들어 전체 메일 데이터에서 자주 등장한 단어가 다음과 같다고 해 보자.
무료, 할인, 회의, 보고서, 당첨, 비밀번호
그러면 어떤 메일 하나를 이 단어 목록 기준으로 숫자로 바꿀 수 있다.
"무료 할인 쿠폰이 도착했습니다"
이 문장은 대략 다음과 같은 특징으로 표현할 수 있다.
| 단어 | 무료 | 할인 | 회의 | 보고서 | 당첨 | 비밀번호 |
|---|---|---|---|---|---|---|
| 등장 횟수 | 1 | 1 | 0 | 0 | 0 | 0 |
이제 모델은 문장이 아니라 숫자를 본다. 무료가 1번, 할인이 1번 등장했고, 회의와 보고서는 등장하지 않았다는 정보를 이용해 예측한다.
물론 실제로는 단어가 수천 개, 수만 개가 될 수 있다. 그래도 원리는 같다. 텍스트를 단어 기준으로 쪼개고, 각 단어가 얼마나 등장했는지를 숫자로 표현한다.
이렇게 텍스트를 숫자 특징으로 바꾸는 과정을 벡터화라고 부른다. 자연어 처리에서는 이 한 단계가 매우 중요하다. 좋은 모델을 써도 텍스트를 엉성하게 숫자로 바꾸면 좋은 결과를 얻기 어렵다.
단어 빈도라는 첫 번째 방법
가장 직관적인 방법은 단어 빈도를 세는 것이다. 어떤 단어가 메일에 몇 번 나왔는지를 특징으로 사용하는 방식이다.
스팸 메일에는 "무료", "당첨", "쿠폰", "긴급", "클릭" 같은 단어가 자주 등장할 수 있다. 업무 메일에는 "회의", "일정", "첨부", "보고서", "검토" 같은 단어가 자주 등장할 수 있다. 물론 단어 하나만으로 항상 판단할 수는 없다. 하지만 많은 메일을 모아 보면 단어 사용 패턴이 조금씩 드러난다.
단어 빈도 방식은 단순하지만 강력하다. 모델은 각 단어에 대해 이런 식의 감각을 배운다.
"이 단어가 나오면 스팸일 가능성이 조금 올라가는구나."
"이 단어가 나오면 정상 메일일 가능성이 조금 올라가는구나."
예를 들어 당첨이라는 단어가 스팸 메일에서 자주 나오고 정상 메일에서는 드물게 나온다면, 모델은 이 단어에 스팸 쪽 가중치를 줄 수 있다. 반대로 회의록이라는 단어가 정상 업무 메일에서 자주 나온다면 정상 쪽 신호로 볼 수 있다.
여기서 조심할 점도 있다. 단어 빈도는 많이 등장한 단어를 크게 반영한다. 그런데 모든 메일에 흔히 등장하는 단어가 있다. "안녕하세요", "확인", "내용", "합니다" 같은 단어는 스팸과 정상 메일을 구분하는 데 별 도움이 안 될 수 있다. 자주 나오기는 하지만, 너무 흔해서 특별한 힌트가 되지 않는 것이다.
그래서 등장하는 개념이 TF-IDF다.
TF-IDF: 흔한 단어보다 구별되는 단어에 주목하기
TF-IDF는 텍스트를 숫자로 바꾸는 대표적인 방법이다. 이름은 조금 딱딱하지만 생각은 단순하다.
어떤 단어가 한 메일 안에서 자주 등장하면 중요할 수 있다. 이것이 TF, 즉 단어 빈도의 생각이다. 그런데 그 단어가 모든 메일에 흔하게 등장한다면 구분력은 떨어진다. 그래서 전체 메일에서 너무 흔한 단어의 중요도는 낮추고, 특정 종류의 메일에서 두드러지는 단어의 중요도는 높인다. 이것이 IDF의 생각이다.
예를 들어 "확인"이라는 단어는 정상 메일에도, 스팸 메일에도 많이 나올 수 있다. 이 단어만 보고 스팸 여부를 판단하기는 어렵다. 반면 "무료배송", "당첨금", "계정정지", "즉시클릭" 같은 표현이 특정 종류의 메일에서 유난히 자주 보인다면 더 강한 힌트가 될 수 있다.
TF-IDF는 단어를 이렇게 바라본다.
한 메일 안에서 자주 나온 단어는 더 중요하게 본다.
모든 메일에 흔하게 나오는 단어는 덜 중요하게 본다.
특정 메일들에서 두드러지는 단어는 더 구별력 있는 특징으로 본다.
스팸 분류에서는 단어 빈도만 써도 꽤 괜찮은 출발점이 될 수 있지만, TF-IDF를 쓰면 불필요하게 흔한 단어의 영향이 줄어드는 경우가 많다. 그래서 텍스트 분류의 기본 실험에서는 단어 빈도 방식과 TF-IDF 방식을 비교해 보는 것이 좋다.
여기서 중요한 감각은 이것이다. 텍스트 특징화는 단어를 "모델이 계산할 수 있는 힌트"로 바꾸는 작업이다. 우리는 문장을 바로 이해시키는 것이 아니라, 문장 속 신호를 숫자로 번역하고 있다.
전체 파이프라인 그려 보기
스팸 분류 모델의 흐름은 지금까지 반복해서 보아 온 머신러닝 구조와 같다. 다만 입력 데이터가 숫자 표가 아니라 텍스트라는 점만 다르다.
먼저 메일 데이터를 준비한다. 각 메일에는 제목, 본문, 스팸 여부 라벨이 있어야 한다. 제목과 본문을 합쳐 하나의 텍스트로 만들 수도 있고, 제목과 본문을 따로 처리한 뒤 합칠 수도 있다. 처음에는 단순하게 제목과 본문을 이어 붙여 하나의 입력 문장으로 만들어도 충분하다.
그다음 데이터를 학습 데이터와 테스트 데이터로 나눈다. 이때 중요한 원칙이 있다. 텍스트를 숫자로 바꾸는 규칙도 학습 데이터에서만 배워야 한다. 전체 데이터에서 단어 목록을 만들고 TF-IDF 값을 계산한 뒤 나누면 테스트 데이터의 정보가 은근히 학습 과정에 새어 들어갈 수 있다. 앞에서 배운 데이터 누수의 한 형태다.
흐름은 다음과 같이 생각하면 된다.
학습 데이터의 텍스트만 보고 단어 목록과 변환 규칙을 만든다.
그 규칙으로 학습 데이터를 숫자 특징으로 바꾼다.
같은 규칙으로 테스트 데이터도 숫자 특징으로 바꾼다.
모델은 학습 데이터의 숫자 특징과 라벨을 이용해 학습한다.
마지막에 테스트 데이터로 처음 보는 메일에 대한 성능을 확인한다.
이 구조를 지키면 평가 결과를 더 믿을 수 있다. 실전 프로젝트에서 좋은 점수보다 중요한 것은 믿을 수 있는 점수다.
로지스틱 회귀로 스팸 가능성 예측하기
스팸 분류는 분류 문제다. 메일 하나를 보고 스팸 또는 정상 중 하나를 고른다. 이때 가장 먼저 시도해 볼 수 있는 모델이 로지스틱 회귀다.
로지스틱 회귀는 이름에 회귀가 들어가지만, 실제로는 분류에 자주 쓰인다. 모델은 입력 특징을 보고 어떤 클래스에 속할 가능성을 계산한다. 스팸 분류라면 "이 메일이 스팸일 확률"을 예측한다고 생각하면 된다.
예를 들어 모델이 어떤 메일에 대해 스팸 확률을 0.87로 예측했다면, 기본적으로는 스팸으로 분류할 수 있다. 반대로 0.12라면 정상 메일로 볼 수 있다. 보통은 기준값을 0.5로 두고, 0.5보다 크면 스팸, 작으면 정상으로 판단한다.
하지만 이 기준값은 고정된 운명이 아니다. 서비스 상황에 따라 조정할 수 있다.
정상 메일을 스팸함으로 보내면 사용자가 중요한 메일을 놓칠 수 있다. 이것은 오탐이다. 반대로 스팸 메일을 정상 메일함에 그대로 두면 사용자가 불편을 겪거나 위험한 링크를 누를 수 있다. 이것은 미탐이다. 어떤 쪽이 더 위험한지는 서비스에 따라 다르다.
회사 업무용 메일에서는 정상 메일을 스팸으로 잘못 보내는 오탐이 매우 큰 문제가 될 수 있다. 고객의 계약서, 면접 안내, 결제 확인 메일이 스팸함에 들어가면 곤란하다. 반면 공개 댓글이나 게시판에서는 스팸을 놓치는 미탐이 더 큰 문제가 될 수 있다. 스팸이 쌓이면 서비스 품질이 빠르게 나빠지기 때문이다.
그래서 로지스틱 회귀가 주는 확률값은 매우 유용하다. 단순히 "스팸이다"라고 끝내지 않고, 얼마나 스팸 같다고 보는지에 따라 기준을 조절할 수 있기 때문이다.
나이브 베이즈라는 가볍고 빠른 선택지
스팸 분류에서 자주 언급되는 또 다른 모델은 나이브 베이즈다. 이름은 낯설지만, 아이디어는 비교적 직관적이다.
나이브 베이즈는 단어들이 등장했을 때 해당 메일이 스팸일 가능성과 정상일 가능성을 비교한다. 예를 들어 무료, 당첨, 클릭이라는 단어가 함께 등장했다면, 과거 데이터에서 이런 단어들이 스팸 메일에 얼마나 자주 나왔는지를 보고 판단한다.
여기서 "나이브"는 순진하다는 뜻이다. 왜 순진할까? 이 모델은 단어들이 서로 독립적으로 등장한다고 단순하게 가정하기 때문이다. 현실의 언어에서는 단어들이 서로 영향을 준다. "계정"과 "정지"가 함께 나오면 의미가 달라질 수 있고, "무료"와 "쿠폰"이 같이 나오면 더 강한 신호가 될 수 있다. 그런데 나이브 베이즈는 이런 복잡한 관계를 많이 단순화한다.
그럼에도 이 모델은 텍스트 분류에서 꽤 쓸모가 있다. 빠르고, 구현이 간단하고, 적은 데이터에서도 출발점으로 삼기 좋다. 특히 단어 빈도 기반 특징과 잘 어울린다.
스팸 분류 실험을 한다면 로지스틱 회귀와 나이브 베이즈를 둘 다 시도해 볼 만하다. 로지스틱 회귀는 단어 특징에 가중치를 주며 스팸 가능성을 계산하고, 나이브 베이즈는 단어 등장 확률을 바탕으로 클래스를 비교한다. 둘의 방식은 다르지만, 둘 다 "텍스트를 숫자 특징으로 바꾼 뒤 분류한다"는 큰 흐름 안에 있다.
간단한 실습 설계
실제 프로젝트처럼 생각해 보자. 우리에게 메일 데이터가 10,000개 있고, 각 메일에는 제목, 본문, 라벨이 들어 있다고 하자.
| 제목 | 본문 | 라벨 |
|---|---|---|
| 회의 일정 확인 | 내일 오전 회의 자료 공유드립니다 | 정상 |
| 무료 쿠폰 지급 | 지금 링크를 클릭하면 혜택을 받을 수 있습니다 | 스팸 |
| 결제 내역 안내 | 이번 달 결제 내역을 확인해 주세요 | 정상 |
| 긴급 계정 확인 | 계정이 정지될 수 있으니 즉시 로그인하세요 | 스팸 |
이제 해야 할 일은 명확하다. 제목과 본문을 합쳐 입력 텍스트를 만들고, 라벨을 0과 1 같은 숫자로 바꾼다. 예를 들어 정상은 0, 스팸은 1로 둘 수 있다.
그다음 학습 데이터와 테스트 데이터로 나눈다. 학습 데이터에서 TF-IDF 변환기를 학습하고, 그 변환기로 학습 데이터와 테스트 데이터를 각각 숫자 행렬로 바꾼다. 여기서 행렬이라는 말은 여러 메일이 행으로 놓이고, 여러 단어 특징이 열로 놓인 표라고 이해하면 된다.
이제 모델을 학습시킨다. 처음에는 로지스틱 회귀를 써도 좋고, 나이브 베이즈를 써도 좋다. 학습이 끝나면 테스트 데이터에 있는 메일들을 모델에게 보여 주고, 예측한 라벨과 실제 라벨을 비교한다.
이 흐름을 말로 쓰면 길지만, 구조는 단순하다.
데이터를 준비한다 → 텍스트를 숫자 특징으로 바꾼다 → 모델이 스팸 가능성을 예측한다 → 실제 라벨과 비교한다 → 오차를 줄인다 → 새로운 메일에 적용한다.
이 책에서 계속 반복해 온 머신러닝의 기본 구조가 그대로 살아 있다.
정확도만 보면 위험한 이유
스팸 분류 모델을 평가할 때 가장 먼저 떠올리기 쉬운 지표는 정확도다. 전체 메일 중 몇 개를 맞혔는지를 보는 지표다. 하지만 스팸 분류에서는 정확도만 보면 위험할 수 있다.
예를 들어 전체 메일 1,000개 중 스팸이 50개뿐이라고 해 보자. 어떤 모델이 모든 메일을 정상이라고 예측한다면 어떻게 될까? 스팸 50개는 모두 놓치지만, 정상 메일 950개는 맞힌다. 정확도는 95%다.
겉으로 보면 훌륭해 보인다. 하지만 이 모델은 스팸을 하나도 잡지 못한다. 스팸 분류기로서는 거의 쓸모가 없다.
그래서 분류 문제에서는 정확도뿐 아니라 정밀도와 재현율을 함께 봐야 한다.
정밀도는 모델이 스팸이라고 잡아낸 메일 중 진짜 스팸이 얼마나 되는지를 본다. 정밀도가 높다는 것은 스팸이라고 판단한 결과를 믿을 수 있다는 뜻이다. 즉, 정상 메일을 스팸으로 잘못 보내는 오탐이 적다.
재현율은 실제 스팸 메일 중 모델이 얼마나 많이 잡아냈는지를 본다. 재현율이 높다는 것은 숨어 있는 스팸을 놓치지 않는다는 뜻이다. 즉, 스팸을 정상 메일로 놓치는 미탐이 적다.
둘은 모두 중요하지만, 항상 동시에 높이기는 어렵다. 기준을 엄격하게 잡으면 정말 수상한 메일만 스팸으로 분류하므로 정밀도는 올라갈 수 있다. 하지만 애매한 스팸을 놓칠 수 있어 재현율은 내려갈 수 있다. 반대로 기준을 느슨하게 잡으면 많은 스팸을 잡아 재현율은 올라가지만, 정상 메일까지 스팸으로 오해해 정밀도가 떨어질 수 있다.
오탐과 미탐의 비용을 따져 보기
스팸 분류에서 가장 현실적인 질문은 이것이다.
"어떤 실수가 더 비싼가?"
오탐은 정상 메일을 스팸으로 잘못 분류하는 것이다. 중요한 고객 문의, 입사 지원 결과, 결제 영수증, 비밀번호 재설정 메일이 스팸함으로 들어가면 사용자는 큰 불편을 겪는다. 서비스 신뢰도도 떨어질 수 있다.
미탐은 스팸 메일을 정상 메일로 잘못 분류하는 것이다. 사용자는 광고성 메일을 봐야 하고, 피싱 링크나 악성 파일에 노출될 수 있다. 보안 관점에서는 미탐의 비용이 매우 클 수 있다.
따라서 좋은 스팸 분류기는 무조건 스팸을 많이 잡는 모델도 아니고, 무조건 조심스럽게 판단하는 모델도 아니다. 서비스의 목적에 맞게 균형을 잡는 모델이다.
예를 들어 개인 메일 서비스에서는 정상 메일을 스팸함에 넣는 일을 최대한 줄이고 싶을 수 있다. 이 경우 정밀도를 더 중요하게 볼 수 있다. 반면 보안 위협이 큰 조직에서는 위험한 메일을 놓치지 않는 것이 더 중요할 수 있다. 이 경우 재현율을 더 중요하게 볼 수 있다.
모델 평가는 숫자 계산으로 끝나지 않는다. 숫자를 보고 비즈니스와 사용자 경험의 언어로 번역해야 한다. 정밀도 98%, 재현율 70%라는 결과가 좋은지 나쁜지는 상황에 따라 달라진다. 중요한 것은 모델이 어떤 종류의 실수를 하는지 이해하는 것이다.
임계값을 조정한다는 감각
로지스틱 회귀 같은 모델은 스팸 여부를 바로 딱 잘라 말하기보다 스팸일 가능성을 숫자로 줄 수 있다. 예를 들어 어떤 메일의 스팸 확률이 0.62라고 해 보자. 기본 기준값 0.5를 사용하면 이 메일은 스팸으로 분류된다.
그런데 정상 메일을 스팸으로 잘못 보내는 일이 너무 자주 발생한다면 어떻게 해야 할까? 기준값을 0.7이나 0.8로 올릴 수 있다. 그러면 모델이 꽤 확신하는 메일만 스팸으로 보낸다. 오탐은 줄어들 가능성이 높지만, 일부 스팸을 놓칠 수 있다.
반대로 스팸이 너무 많이 통과한다면 기준값을 0.4나 0.3으로 낮출 수 있다. 그러면 더 많은 메일을 스팸으로 잡아낸다. 미탐은 줄어들 수 있지만, 정상 메일이 스팸으로 분류될 위험은 커진다.
이것이 임계값 조정이다. 모델을 바꾸지 않아도, 판단 기준을 조절해 정밀도와 재현율의 균형을 바꿀 수 있다.
이 감각은 앞으로도 자주 쓰인다. 고객 이탈 예측에서도 "이탈 가능성이 몇 퍼센트 이상이면 마케팅 메시지를 보낼 것인가"를 정해야 한다. 사기 거래 탐지에서도 "위험 점수가 몇 점 이상이면 결제를 막을 것인가"를 정해야 한다. 머신러닝 모델은 확률이나 점수를 주고, 사람은 그 점수를 어떻게 행동으로 연결할지 결정한다.
모델이 배운 단어 들여다보기
스팸 분류기의 재미있는 점은 모델이 어떤 단어를 중요하게 보았는지 어느 정도 살펴볼 수 있다는 것이다. 특히 로지스틱 회귀처럼 단어 특징에 가중치를 주는 모델은 해석이 비교적 쉽다.
모델이 스팸 쪽으로 강하게 본 단어를 확인하면 무료, 당첨, 클릭, 수익, 긴급, 인증, 한정 같은 단어가 나올 수 있다. 정상 메일 쪽으로 강하게 본 단어에는 회의, 자료, 일정, 첨부, 검토, 문의, 계약 같은 단어가 나올 수 있다.
물론 이것을 맹신해서는 안 된다. 스팸 발송자는 계속 표현을 바꾼다. "무료" 대신 "무 료"처럼 띄어 쓰거나, 이미지에 문구를 넣거나, 교묘한 문장으로 필터를 피하려고 할 수 있다. 또한 정상 메일에도 "무료 세미나 안내"처럼 스팸처럼 보이는 단어가 들어갈 수 있다.
하지만 모델이 어떤 신호를 보고 판단하는지 확인하는 일은 매우 중요하다. 모델이 말도 안 되는 단어에 의존하고 있다면 데이터에 문제가 있을 수 있다. 예를 들어 특정 기간에 수집한 스팸 메일에만 우연히 들어간 문구를 모델이 강한 신호로 배웠다면, 새로운 스팸에는 잘 대응하지 못할 수 있다.
좋은 실험자는 성능 점수만 보지 않는다. 모델이 무엇을 근거로 판단하는지도 함께 살핀다.
텍스트 데이터에서 자주 생기는 함정
스팸 분류는 간단해 보이지만, 실제로는 몇 가지 함정이 있다.
첫 번째는 중복 데이터다. 같은 스팸 메일이 여러 번 들어 있으면 모델이 특정 문구를 외워 버릴 수 있다. 학습 데이터와 테스트 데이터에 거의 같은 메일이 동시에 들어가면 성능이 실제보다 높게 보일 수 있다.
두 번째는 시간의 흐름이다. 스팸 문구는 변한다. 몇 년 전 스팸에서 자주 쓰던 표현과 오늘의 피싱 메일 표현은 다를 수 있다. 따라서 실전에서는 무작위로 데이터를 나누는 것만으로 충분하지 않을 때가 있다. 과거 메일로 학습하고 미래 메일로 평가하는 방식이 더 현실적인 경우도 있다.
세 번째는 라벨 품질이다. 어떤 메일이 스팸인지 정상인지 애매한 경우가 있다. 광고 메일이지만 사용자가 동의한 뉴스레터라면 스팸일까? 은행을 사칭한 피싱 메일은 명백한 스팸이지만, 실제 은행의 보안 안내 메일은 정상이다. 라벨 기준이 흔들리면 모델도 흔들린다.
네 번째는 개인정보다. 메일 본문에는 민감한 정보가 들어 있을 수 있다. 실습용 공개 데이터가 아니라 실제 조직의 메일 데이터를 다룬다면, 개인정보 보호와 접근 권한 관리를 반드시 고려해야 한다.
이런 함정들은 모델 알고리즘만으로 해결되지 않는다. 데이터 수집, 라벨링 기준, 평가 방식, 운영 정책이 함께 맞물려야 한다.
첫 번째 텍스트 분류기를 완성했다는 의미
이번 장에서 만든 스팸 분류기는 단순한 예제가 아니다. 텍스트를 머신러닝 입력으로 바꾸는 첫 번째 문을 연 것이다.
처음에는 메일 제목과 본문을 입력으로 삼았다. 스팸 여부를 라벨로 정의했다. 단어 빈도나 TF-IDF를 이용해 문장을 숫자 특징으로 바꾸었다. 로지스틱 회귀나 나이브 베이즈 같은 분류 모델로 스팸 가능성을 예측했다. 마지막으로 정확도만 보지 않고 정밀도와 재현율을 비교하며 오탐과 미탐의 비용을 생각했다.
이 흐름은 다른 텍스트 분류 문제에도 거의 그대로 적용된다. 상품 리뷰가 긍정인지 부정인지 분류할 때도, 고객 문의가 결제 문제인지 배송 문제인지 나눌 때도, 뉴스 기사가 어떤 주제인지 분류할 때도 기본 구조는 같다.
텍스트는 처음에는 복잡해 보인다. 문장에는 뉘앙스가 있고, 같은 단어도 문맥에 따라 뜻이 달라진다. 하지만 머신러닝의 첫걸음에서는 너무 겁먹을 필요가 없다. 일단 텍스트를 숫자로 바꾸고, 그 숫자 속 패턴을 모델이 학습하게 만들면 된다.
스팸 분류기는 메일함 앞의 작은 문지기다. 완벽하지는 않지만, 데이터를 보며 점점 더 나은 판단 기준을 배운다. 그리고 우리는 그 문지기가 어떤 실수를 하는지, 어떤 기준으로 판단하는지, 어떤 상황에서 더 조심해야 하는지 살펴보며 모델을 개선한다.
다음 장에서는 또 다른 실전 문제로 넘어간다. 이번에는 고객이 서비스를 떠날지 예측하는 고객 이탈 예측 모델을 만들어 볼 것이다. 스팸 분류가 텍스트를 숫자로 바꾸는 문제였다면, 고객 이탈 예측은 사용자의 행동 기록을 읽고 미래의 가능성을 예측하는 문제다. 입력의 모양은 달라지지만, 머신러닝의 기본 흐름은 여전히 같다. 데이터를 준비하고, 특징을 만들고, 모델이 예측하고, 실제 결과와 비교하며 더 나은 판단으로 나아간다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.