주의: 복잡한 공식이나 용어에 겁먹지 말자. 사용한 후 바로 설명할 것이다. 또한 이 내용을 이해하는 데 필요한 수학 지식은 매우 기본적이다.
분류기의 목표는 이전에 입력된 데이터와 그 특성들을 기반으로 주어진 데이터 항목의 클래스를 예측하는 것이다.
그렇다면 클래스나 특성이란 무엇인가? 가장 좋은 설명은 표를 사용하는 것이다. 다음은 사람의 키, 몸무게, 발 크기를 사용해 이러한 값과 성별 간의 관계를 보여주는 데이터셋이다.
성별 | 키 (피트) | 몸무게(파운드) | 발 크기 (인치) |
---|---|---|---|
남성 | 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)는 다음과 같이 해석할 수 있다: 특성에 의존하는 데이터가 주어졌을 때, 해당 클래스의 확률.
이것이 베이즈 정리에 대해 알아야 할 전부다. 이제 중요한 것은 이 변수들을 어떻게 계산하고, 이 공식에 대입하여 데이터를 분류할 준비를 하는 것이다.
이것은 클래스의 확률을 의미한다. 이전에 제시한 예제로 돌아가보자. 다음과 같은 데이터 항목을 분류하려고 한다고 가정하자:
키 (피트) | 몸무게 (파운드) | 발 크기 (인치) |
---|---|---|
6 | 130 | 8 |
나이브 베이즈 분류기는 가능한 모든 클래스의 확률을 계산한다. 이 예제에서는 남성 또는 여성 두 가지 클래스가 있다. 원본 테이블을 다시 보고 남성과 여성 항목의 수를 센다. 그리고 전체 데이터 항목 수로 나눈다.
P(남성) = 4 / 8 = 0.5
P(여성) = 4 / 8 = 0.5
이 작업은 매우 간단하다. 기본적으로 모든 클래스의 확률을 계산하는 것이다.
이 변수는 나이브 베이즈 분류기에서 필요하지 않다. 데이터의 확률을 나타내는 값으로, 항상 일정하다. 상수는 어떻게 처리할 수 있을까? 바로 제거하는 것이다. 이렇게 하면 시간과 코드를 절약할 수 있다.
이것은 클래스가 주어졌을 때 데이터의 확률을 의미한다. 이를 계산하려면 나이브 베이즈(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이 작성