베이즈 정리부터 나이브 베이즈 텍스트 분류까지, 직접 구현하며 배우는 머신러닝 기초
머신러닝이니 인공지능이니 거창한 용어보다, '내가 코딩으로 직접 만들어볼 수 있을까?'가 더 궁금했던 분들을 위한 이야기입니다. 베이즈 정리의 기본 원리부터 "나이브 베이즈 분류기"를 손수 자바스크립트로 구현하며, 실제로 텍스트를 긍정/부정/중립으로 분류하는 과정을 따라갑니다. 최신 AI와 비교해도 뒤처지지 않는 기본 알고리즘의 원리를 흥미롭게 파헤쳐 볼까요?
베이즈 정리는 확률적 추론의 핵심! 도서관 예시로 쉽게 이해하기
어느 거대한 도서관을 떠올려 볼까요? 그 중 단 1%만이 SF 소설입니다. 그런데, 'galaxy'란 단어가 등장하는 책을 뽑았을 때, SF일 확률은 얼마일까요? 직관적으로 'galaxy'가 들어가면 SF일 확률이 높다고 생각할 수 있지만, 실제로는 13.9%에 불과합니다!
왜일까요? 80%의 SF 책에는 'galaxy'가 있지만, 방대한 비 SF 서적(99%) 중에서도 5%에 'galaxy'가 등장하기 때문입니다. 즉, 전체에서 'galaxy'가 등장하는 빈도를 고려해야 정확한 확률을 계산할 수 있습니다. 이것이 바로 베이즈 정리! 단지 조건부 확률을 뒤집는 것만이 아니라, 현실에서 희소한 분류(여기선 SF)가 있으며, 특정 단어가 그 분류 외에도 흔하게 쓰일 때 '오버추정'의 위험을 막아주는 강력한 도구입니다.
베이즈 정리 수식, 직접 대입해보기
실제 계산에 들어갑니다. 베이즈 정리의 핵심 수식은 P(A|B) = [P(B|A) * P(A)] / P(B) 입니다.
여기서 P(A|B)는 'galaxy'가 있는 책이 SF 소설일 확률
P(B|A)는 SF 소설 중 'galaxy'가 포함된 비율(80%)
P(A)는 도서관 전체 중 SF 소설의 비율(1%)
P(B)는 전체 중 'galaxy'가 등장하는 책의 비율(6%)
실제로 수치 대입을 반복하며 계산해보면, 직관과 달리 확률이 낮아지는 이유를 명확히 볼 수 있습니다. 이처럼 베이즈 정리는 조건과 사전 확률(프라이어)까지 고려하여 현실적 분류를 가능하게 해줍니다.
최신 AI와 달리 나이브 베이즈는 왜 여전히 중요한가?
요즘은 GPT, 딥러닝, 트랜스포머 같이 복잡한 모델이 대세로 떠오르고 있죠. 하지만 나이브 베이즈는 텍스트 분류의 가장 기본이자, 최신 기술을 이해하는 데 필수적인 출발점입니다.
GPU 없이도, 브라우저에서, 순수 JS 코드로 손수 구현 가능!
데이터가 적어도 원리를 체험할 수 있음
분류의 기초 원리(사전 확률, 조건부 확률, 오버피팅 방지 등)를 직관적으로 실험 가능
이러한 장점 덕분에 베이즈 알고리즘은 여전히 자연어처리와 스팸필터 같은 다양한 실전 분야에서 빛을 발하고 있습니다.
나이브 베이즈의 '순진함'과 효과 : bag-of-words 모델의 가정
'나이브'라는 이름은 모든 단어가 서로 독립적이라고(서로 영향을 주지 않는다고) 간주하는 대담한 가정에서 유래합니다. 그래서 긴 문장도 단어별로 확률을 곱해서 최종 분류 확률을 계산하죠. 현실에선 단어들끼리 상관관계가 있지만, 이렇게 단순화하면 계산이 빠르고, 구현 난이도가 확 줄어듭니다. 예를 들어 "long ago in a galaxy"라는 문장이 주어지면 'long', 'ago', 'in', 'a', 'galaxy' 각각의 등장 확률을 다 곱하여 'SF일 확률'을 산출합니다. 이 덕분에 bag-of-words(단어 주머니) 방식으로 손쉽게 구현이 가능합니다.
실전 코드: 자바스크립트로 직접 나이브 베이즈 텍스트 분류기 만들기
이론만 늘어놓는 대신, 실제로 p5.js(브라우저용 자바스크립트 프레임워크)를 사용하여 텍스트 분류기를 만드는 과정을 따라갑니다.
데이터 구조 설계: 각 카테고리별로 단어 등장 횟수, 문서 수, 전체 단어 수도 저장
학습 함수: 입력된 문장(분류가 정해진 데이터)을 단어별로 나누고, 등장 횟수와 분류별 카운트를 갱신
분류 함수: 새로 입력된 문장을 단어 단위로 쪼개어, 각 단어의 등장 확률(카테고리별/전체)을 가지고 베이즈 정리로 카테고리 확률 계산
결과 출력: 입력한 텍스트가 긍정/부정/중립 중 어디에 가장 가까운지, 확률로 보여줌
직접 만들다 보면, 데이터 구조 설계의 시행착오, 카운트 방식의 조정, smoothing(렐라시안 스무딩, 즉 등장한 적 없는 단어에 1을 추가하는 방식) 적용 등 현실적인 고민들을 마주하게 됩니다.
Additive Smoothing(렐라시안 스무딩)으로 0의 함정 해결하기
베이즈 분류의 최대 난관 중 하나는 훈련 데이터에 등장하지 않은 단어가 새로 나올 때입니다. 등장 횟수가 0이 되면 확률 곱셈에서 전체가 0으로 떨어져 버리죠. 이를 막기 위해 '모든 단어는 각 분류에서 한 번은 등장한다고 가정'하여 각 카테고리별 단어 총합에 전체 단어 종류 수(보케뷸러리 사이즈)를 더합니다. 이렇게 사소한 수정 하나로 분류기가 훨씬 견고해집니다.
확률값 정규화로 100%에 가깝게 결과 보여주기
베이즈 수식에서 분모(P(텍스트))는 모든 분류에 대해 동일하므로, 결과값(분자)들을 더해서 이를 전체 합으로 나누어 정규화합니다. 덕분에 각 분류 확률의 총합이 100%가 되어, 사용자에게 명확하게 분류 확률을 보여줄 수 있습니다.
오픈소스 코드와 리팩토링, 그리고 확장 가능성
영상의 막바지에서는 더 깔끔한 구조의 코드(깃허브 공개 배열)를 소개합니다.
word의 등장확률/카테고리 확률을 함수로 분리
모든 데이터 구조를 체계적으로 설계
나중에는 Node.js 라이브러리로 재탄생 가능
실제 예제 코드와 함께, 누구나 자신의 프로젝트에 손쉽게 적용할 수 있도록 리소스를 제공합니다.
마무리: 직접 구현하며 배운 베이즈 분류, 기본을 꼭 잡자!
이 글(그리고 영상)은 복잡한 수식 대신, 작은 예제 데이터와 직접 만드는 코드로 베이즈 분류의 모든 원리를 손에 잡히게 보여줍니다. 요약하자면
베이즈 정리의 직관: 조건부 확률과 사전 확률의 중요성
나이브 베이즈의 bag-of-words 가정과 현실적 효용
실전 코드로 직접 학습/분류/스무딩/정규화를 적용해봄
최신 AI 모델 전에, 강력한 알고리즘의 핵심을 내 손으로 경험
개인적인 팁을 드리자면, 배운 원리를 꼭 한번 직접 구현해 보세요. 손으로 짜는 과정에서 확률적 사고가 확실히 자리 잡힙니다. 그리고, 여러분만의 텍스트 분류기를 입맛에 맞게 확장해 보는 것도 추천합니다. 머신러닝의 시작, 베이즈와 나이브 베이즈에서 꼭 잡고 출발하세요!
출처 및 참고 :
이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
