나이브 베이즈 분류기

주의: 복잡한 공식이나 용어에 겁먹지 말자. 사용한 후 바로 설명할 것이다. 또한 이 내용을 이해하는 데 필요한 수학 지식은 매우 기본적이다.

분류기의 목표는 이전에 입력된 데이터와 그 특성들을 기반으로 주어진 데이터 항목의 클래스를 예측하는 것이다.

그렇다면 클래스나 특성이란 무엇인가? 가장 좋은 설명은 표를 사용하는 것이다. 다음은 사람의 키, 몸무게, 발 크기를 사용해 이러한 값과 성별 간의 관계를 보여주는 데이터셋이다.

성별 키 (피트) 몸무게(파운드) 발 크기 (인치)
남성 6 180 12
남성 5.92 190 11
남성 5.58 170 12
남성 5.92 165 10
여성 5 100 6
여성 5.5 150 8
여성 5.42 130 7
여성 5.75 150 9

이 표에서 클래스는 성별 열의 데이터(남성/여성)이다. 나머지 데이터를 "분류"하여 성별에 연결한다.

이 표의 특성은 다른 열의 레이블(키, 몸무게, 발 크기)과 레이블 아래의 숫자들이다.

이제 분류기가 무엇인지 설명했으니, 나이브 베이즈 분류기가 정확히 무엇인지 말해주겠다. 다른 많은 분류기가 있지만 이 특정 분류기의 장점은 매우 작은 데이터셋으로도 좋은 결과를 얻을 수 있다는 점이다. 랜덤 포레스트 같은 다른 분류기들은 일반적으로 매우 큰 데이터셋이 필요하다.

왜 이 알고리즘이 더 많이 사용되지 않냐고 물을 수도 있다(물론 안 물을 수도 있다). 일반적으로 랜덤 포레스트부스팅 트리에 비해 정확도에서 뒤처지기 때문이다.

이론

Naive Bayes 분류기는 이름에서 알 수 있듯이 ***Bayes Theorem(베이즈 정리)***을 활용한다. 베이즈 정리는 다음과 같다.

여기서 P는 항상 어떤 사건의 확률을 의미한다.

A는 클래스, B는 특성에 의존하는 데이터, 그리고 파이프 기호는 '조건부'를 나타낸다.

따라서 P(A | B)는 다음과 같이 해석할 수 있다: 특성에 의존하는 데이터가 주어졌을 때, 해당 클래스의 확률.

이것이 베이즈 정리에 대해 알아야 할 전부다. 이제 중요한 것은 이 변수들을 어떻게 계산하고, 이 공식에 대입하여 데이터를 분류할 준비를 하는 것이다.

P(A)

이것은 클래스의 확률을 의미한다. 이전에 제시한 예제로 돌아가보자. 다음과 같은 데이터 항목을 분류하려고 한다고 가정하자:

키 (피트) 몸무게 (파운드) 발 크기 (인치)
6 130 8

나이브 베이즈 분류기는 가능한 모든 클래스의 확률을 계산한다. 이 예제에서는 남성 또는 여성 두 가지 클래스가 있다. 원본 테이블을 다시 보고 남성과 여성 항목의 수를 센다. 그리고 전체 데이터 항목 수로 나눈다.

P(남성) = 4 / 8 = 0.5

P(여성) = 4 / 8 = 0.5

이 작업은 매우 간단하다. 기본적으로 모든 클래스의 확률을 계산하는 것이다.

P(B)

이 변수는 나이브 베이즈 분류기에서 필요하지 않다. 데이터의 확률을 나타내는 값으로, 항상 일정하다. 상수는 어떻게 처리할 수 있을까? 바로 제거하는 것이다. 이렇게 하면 시간과 코드를 절약할 수 있다.

P(B | A)

이것은 클래스가 주어졌을 때 데이터의 확률을 의미한다. 이를 계산하려면 나이브 베이즈(NB)의 하위 타입을 알아야 한다. 여러분이 분류하려는 데이터의 특성에 따라 어떤 하위 타입을 사용할지 결정해야 한다.

가우시안 나이브 베이즈

이전에 보여준 것처럼 데이터셋이 연속적인 특성(예: Double 타입)을 가지고 있다면 이 하위 타입을 사용해야 한다. 가우시안 나이브 베이즈에서 P(B | A)를 계산하기 위해 필요한 3가지 공식이 있다.

평균

표준 편차

정규 분포

그리고 **P(x | y) = P(B | A)**이다.

다시 말하지만, 공식이 복잡해 보이지만 실제로는 매우 간단하다. 첫 번째 공식인 µ는 데이터의 평균을 나타낸다(모든 데이터 포인트를 더한 후 개수로 나눈 값). 두 번째 공식인 σ는 표준 편차를 의미한다. 학교에서 한 번쯤 들어봤을 것이다. 이는 모든 값에서 평균을 뺀 후 제곱한 값을 더하고, 데이터 개수에서 1을 뺀 값으로 나눈 후 제곱근을 취한 것이다. 세 번째 공식은 가우시안 또는 정규 분포를 나타낸다. 이에 대해 더 알아보고 싶다면 이 링크를 참고하면 된다.

왜 가우시안 분포를 사용할까? 각 클래스와 연관된 연속적인 값이 가우시안 분포를 따른다고 가정하기 때문이다. 그렇게 간단하다.

다항 나이브 베이즈

다음과 같은 예제 데이터가 있다고 가정해 보자:

테니스 또는 골프

여기서 단순히 sunny, overcast, rainy의 평균을 계산할 수는 없다. 이런 경우에는 범주형 모델인 다항 나이브 베이즈(Multinomial Naive Bayes)가 필요하다. 이제 마지막 공식을 살펴보자.

다항 나이브 베이즈

이 공식에서 분자는 클래스 y에 속하는 샘플 N에서 특성 i가 나타나는 횟수를 의미한다. 분모는 클래스 y에 속하는 샘플의 총 개수다. 여기서 θ는 P(B | A)를 표현하는 간단한 방식이다.

공식에 α가 포함된 것을 눈치챘을 것이다. 이는 "zero-frequency-problem"을 해결하기 위한 것이다. 만약 특성 i와 클래스 y를 가진 샘플이 하나도 없다면 어떻게 될까? 전체 식이 0이 되어버린다(0을 어떤 수로 나누면 항상 0이기 때문). 이는 큰 문제지만, 간단한 해결책이 있다. 모든 샘플의 카운트에 1을 더하면 된다(α = 1).

코드로 보는 실제 활용

이론은 그만! 이제 코드를 직접 확인할 시간이다. 코드가 어떻게 동작하는지 더 자세히 알고 싶다면 제공된 Playground를 참고하면 된다.

코드 예제

Swift Algorithm Club을 위해 Philipp Gabriel이 작성