나이브 베이즈 추천 알고리즘 - naibeu beijeu chucheon algolijeum

장중호 서울과학종합대학원 교수

기계학습 알고리즘 두 번째는 나이브 베이즈 분류기(Naive Bayes Classifier)다.

이 알고리즘은 그림 1에서 표현된 베이즈 정리에 기반을 둔다. 이것은 각각의 사건들이 일어날 확률들을 측정하는 것인데 P(A ¦ B) = (P(A ∩ B)) / (P(B))를 설명한다면 다음과 같다.

1. 전제: 두 사건 A, B가 있고, 사건 B가 발생한 이후에 사건 A가 발생한다고 가정한다.

2. 정의: 사건 B가 일어난 후 사건 A가 일어날 확률이다.

3. P(A): 사건 A가 일어날 확률

4. P(B): 사건 B가 일어날 확률 = 사건 A가 발생하기 전 사건 B가 일어날 확률 = 사전확률

5. P(A¦B): 사건 B가 일어난 후 사건 A가 일어날 확률 = 조건부 확률

6. P(B¦A): 사건 A가 일어났을 때 사건 B가 앞서 일어났을 확률 = 사후확률

나이브 베이즈 추천 알고리즘 - naibeu beijeu chucheon algolijeum
그림1. 나이브 베이즈 분류기

이렇게 정리를 한 상태에서 복잡하게 섞여 있는 문제를 비슷한 성격을 가진 특성(feature)으로 분류하는 것이다.

이 알고리즘을 사용하는 가장 대표적인 예는 넷플릭스에서 비슷한 성향을 보인 사람들에게 영화를 추천해줄 때 사용한다.

특정한 영화를 보고 A라는 사람이 좋아요를 누르고, B라는 사람도 좋아요를 눌렀다면 A와 B는 비슷한 성향을 가진 사람이라고 일차적으로 볼 수 있다. 하지만 다른 영화를 보고는 서로 다른 결론들을 보였다면, 복잡해진다.

확률적으로 A와 B가 좋아한다고 표현한 영화들, 별로라고 표현한 영화들의 데이터와 단순 영화 리스트뿐 아니라, 그 영화들에 출연한 배우들, 영화 장르, 스타일 등의 다양한 분석 데이터들을 감안하게 되면, 각각 A라는 사람과 B라는 사람이 특정 영화를 좋아할 만한 확률을 구하는 것은 매우 복잡한 다차원의 문제가 된다.

이것을 나이브 베이즈 분류기 알고리즘을 써서 각각의 영화, 배우, 장르, 스타일 등의 각 요소들에 대해 A, B 뿐 아니라 수많은 사람들이 지속적인 좋아할 확률값을 계산하고, 비슷한 성향의 사람들을 분류한다.

결론적으로 새로운 C라는 사람이 넷플릭스에 가입해 새로운 영화를 추천 받을 때, 기존에 가장 가까운 성향을 보이는 사람에게 좋은 평가를 받았던 영화를 제공하면 성공할 확률이 가장 높을 것이란 계산이 나온다.

이러한 방식으로 콘텐츠나 상품추천에 쓰이거나 기타 이메일 스팸 분류, 보안 분야에서의 이상징후 탐지, 암이나 심장병 등 의학데이터를 통한 질병진단, 문서 분류 등에 아주 다양하게 쓰인다.

세번째는 선형회귀(Linear Regression)이다. 이 알고리즘은 어쩌면 인공지능의 영역이라고 불리기 훨씬 전부터 전통적인 통계를 통한 알고리즘으로 이미 널리 사용되었다. 한국어로 번역하면, 선형회귀분석이라고 불리는데 이것은 우리가 중학교때부터 배우던 1차 방정식 y= aX + b를 학습을 통해 구현해 내는 것이라고 이해하면 된다.

나이브 베이즈 추천 알고리즘 - naibeu beijeu chucheon algolijeum
그림2. 선형 회귀

그림 2.에서 보듯이 X축과 Y축에 정해진 데이터 포인트들이 있고, 이 것들의 값을 학습하여, 새로운 input X나 Y가 들어왔을 때, 추정된 선형회귀 선과 가장 가까운 근사치 값으로 결론을 낸다. 이 알고리즘은 다양한 예측 모델에 활용되는데, 주가예측, 주택가격 예측, 날씨분석 및 예측, 판매 및 수요예측 등 다양한 업종에서의 예측에 활용된다.

주식가격에 영향을 미치는 다양한 데이터들, 즉 과거의 특정 주식가격 추이, 주가지수 추이, 경제지표 추이, 금리 및 해외주식 동향 등의 다양한 데이터들을 넣고, 특정 주식가격을 위한 회귀 분석을 해놓고, 최근의 데이터를 입력했을 때 어떻게 주식값이 될 것인가를 예측할 수 있다.

유통에서도 이 분석이 가장 많이 쓰인다. 어떤 프로모션이나 가격할인 등을 했을 때 과거 2년치의 판매데이터를 가지고 선형회귀를 했을 때, 이번의 가격이나 행사 때 얼마나 판매가 일어날 지 예측값을 얻을 수 있다.

마찬가지로 특정 매장의 특정 상품의 정확한 수요예측을 통한 발주 정확도를 높이기 위해 과거 2~3년치의 판매데이터, 날씨데이터, 행사데이터, 경제지표 및 경쟁사 데이터 등을 넣고 분석하여 오늘 혹은 이번주에는 얼마나 발주해야 하는지를 알 수가 있다.

네번째는 로지스틱 회귀(Logistic Regression)다. 이 알고리즘은 위에서 설명한 선형회귀와 연관된 사촌지간이라고 이해하면 쉽다.

선형회귀는 예측값을 제공할 때 연속성의 값으로 제공하는 반면 로지스틱 회귀는 0이냐 1이냐의 값으로만 예측한다. 어떠한 의사결정을 할 수 있는 이분법적인 값으로 회귀하는 것이다.

그림 5에서 보는 바와 같이 X 축의 값의 변화에 따라 그림 4의 선형회귀에서는 다양한 Y값을 가지면서 선형의 연속값을 가지는데 비해 로지스틱회귀 Y값은 0 아니면 1이다. 이러한 값을 가지게 하기위한 시그모이드 함수라는 것으로 X값을 처리하여 특정값 이상이 되면 무조건 0이나 1로만 가지도록 데이터를 만들어 준다.

학습의 방법이나 데이터를 처리하는 방식 등은 선형회귀와 유사하나 그 복잡도는 커진다.

나이브 베이즈 추천 알고리즘 - naibeu beijeu chucheon algolijeum
그림3. 로지스틱 회귀

예를 들면 앞의 주가 예측의 예에서 선형회귀는 연속성의 값으로 이번의 특정 주가가 얼마나 될 것인가에 대한 예측값을 준다면, 로지스틱 회귀에서는 주가예측이 아니라 이 주식을 살 것인가 아닌가, 팔 것인가 아닌가 하는 의사결정의 방향을 제시한다.

과거에 팔았을 때의 성공이나 실패여부 등의 데이터들을 가지고 학습을 하여, 이 번에도 팔아야 할지 사야 할지 등의 의사결정의 데이터를 제공한다. 제조업에서도 많이 활용된다. 제품 품질의 불량 여부를 판단하는데 쓰인다. 품질을 판단하는데 참고하는 다양한 데이터들과 과거의 품질 불량판정 데이터를 가지고 학습을 하면 불량인지 아닌지 이분법적으로 결론을 제공해준다.

공장 현장에서는 불량일 확률이 몇 %이다라는 데이터는 큰 의미가 없다. 명확히 불량여부의 답을 내어주어야 하는 것이다. 이외에도 유통의 CRM 활동에서도 고객의 구매 확률보다는 명확한 구매 여부를 가지고 학습 및 데이터 결론을 내어주어야 할 때도 로지스틱 회귀가 많이 쓰인다.

관련기사

  • [기고] AI 기본 이해하기2022.05.30
  • [기고] AI의 기본 쉽게 이해하기 2-12022.06.13
  • [기고] AI의 기본 쉽게 이해하기 2-22022.06.27
  • [기고] AI 쉽게 이해하기 3-1. 기계학습 알고리즘2022.07.11

이번 글에서 14가지의 인공지능 알고리즘 중에서 먼저 가장 기본이 되는 4가지의 기계학습 알고리즘의 개념과 활용예시에 대해 알아보았다.

물론 이 정도 설명해서는 깊고 복잡한 알고리즘들을 이해할 수는 없겠지만, 멀게만 느껴지던 인공지능 알고리즘이라는 것에 대해 첫 발자국을 띠는 계기가 되었으면 하는 마음이다. 앞으로 몇차례에 걸쳐 남은 머신러닝과 딥러닝 알고리즘의 개념 및 활용에 대해서 공부해보고자 한다.

*본 칼럼 내용은 본지 편집방향과 다를 수 있습니다.

※ 베이즈 정리를 모르는 분들은 나이브 베이즈를 알기에 앞서 베이즈 정리에 대해서 먼저 이해해야 한다.

확률의 함정을 간파, 베이즈 정리(Bayes' Theorem)

확률의 함정을 간파, 베이즈 정리(Bayes' Theorem)

베이즈 정리는 일반인들이 알고 있던 통계의 지식을 무너트리는 역할을 한다. 물리학도가 양자역학의 개념을 배울 때 새로운 신세계가 열리는 것처럼 통계에서 베이즈가 그런 역할을 하는 것

needjarvis.tistory.com

나이브 베이즈 추천 알고리즘 - naibeu beijeu chucheon algolijeum

나이브 베이즈(Naïve Bayes Classification)의 개념

- 데이터가 각 클래스에 속할 특징 확률을 계산하는 조건부 확률 기반의 분류 방법이다.

- 나이브(Naïve) : 예측한 특징이 상호 독립적이라는 가정 하에 확률 계산을 단순화, 나이브라는 의미는 순진하다라는 뜻을 담고 있으며 모든 변수(특징)들이 동등하다는 것을 의미한다.

- 베이즈(Bayes) : 입력 특징이 클래스 전체의 확률 분포 대비 특정 클래스에 속할 확률을 베이즈 정리를 기반으로 계산

말이 거창해보이지만 쉽게 생각해서 사건 B가 주어졌을 때 사건 A가 일어날 확률인 P(A|B), 조건부 확률과 베이즈 정리를 이용한 분류기라 생각하면 된다. 이때 모든 변수는 동등한 값을 가지기 때문에 머신러닝에서 자주 활용되는 특징에 가중치를 주는 행위는 나이브 베이즈 알고리즘을 변형한 다른 알고리즘이라 생각하면 된다.
나이브 베이즈 추천 알고리즘 - naibeu beijeu chucheon algolijeum

나이브 베이즈의 장단점

나이브 베이즈의 장점

- 간단하고 빠르며 효율적인 알고리즘이다.
- 잡음과 누락 데이터를 잘 처리한다.
- 훈련을 할 때 데이터의 크기에 상관 없이 잘 동작한다.
- 예측을 위한 추정 확률을 쉽게 얻을 수 있다.

나이브 베이즈의 단점

- 모든 특징이 동등하게 중요하고, 독립이라는 가정이 잘못된 경우가 자주 있다. (ex: 텍스트의 단어들, 일기예보를 할 때 습도와 같은 중요한 특징을 다른 특징과 동등하다 판단)
- 수치 특징이 많은 데이터셋에는 이상적이지 않다. 
- 추정된 확률이 예측된 클래스보다 덜 신뢰할만하다.

모든 특징이 동등한 것이기 때문에 나이브란 말이 들어갔지만, 요즘에는 이런 약점들을 보완하고자 나이브 베이즈 특징에 가중치를 준 개념들이 나오게 된다. 그러나, 나이브라는 것이 내포한 의미가 동등하다, 독립적이다라는 것을 가지고 있기에 나이브 베이즈에 독립적과 동등하다의 개념을 빼버리고 만든 베이즈 분류기는 "나이브"가 빠진 다른 베이즈 알고리즘 명칭이 되어야 옳을 것이다.

이 말은 마치 손님들에게 "매운 라면"을 내줬는데 손님들이 매운 라면이 왜 안 매워요?라고 물어보니 요리사 왈 "손님들이 매운 라면이 너무 맵다고 해서 매운 라면을 맵지 않게 했습니다"라고 하는 것과 같은 상황이라 생각한다. 그러나, 나이브 베이즈를 대체할만한 베이즈 분류기의 말이 딱히 떠오르지 않고 나이브 베이즈가 마치 대단한 머신러닝인것 마냥 일반인들이 들었을 때 있어 보이기 때문에 대체 용어가 없어 보인다.

- 어디까지나 필자 생각 -

나이브 베이즈의 활용 방안 (사용 예시)

스팸 필터링

- 대중적으로 나이브베이즈의 활용에 가장 많이 알려진 것이 스팸 필터링이다.

- 이진 분류(binary classification)

비정상적인 상황 감지

- 컴퓨터 네트워크 침입이나 비정상 행위 등을 탐지

- 이진 분류(binary classification)

의학적 질병 진단

- 종양의 크기, 환자의 나이 등등을 여부로 암 여부를 진단하는 등의 질병을 진단할 수 있음

- 이진 분류(binary classification)

문서 분류

- 문서 데이터를 읽고, 스포츠, 정치, 연예 등의 문서로 분류

- 다중 분류(multi-class classification)

나이브 베이즈 보정

라플라스 스무딩(Laplace Smoothing)

특징이 무조건 있는 값에는 적용될리 없겠지만, 다중 분류 모델에서 값이 0이 되는 경우가 있다. 문서를 읽고 다중 분류를 한다고 가정을 해보자. 이때 class로 연예, 스포츠, 뉴스, 정치가 있는데 kpop이란 단어가 연예, 뉴스, 스포츠가 등장했지만 정치에 등장하지 않았다 가정해보자.

특히, tf-idf 등을 써서 클래스별 단어의 중요도를 뽑게 되면 이러한 현상이 더욱 발생하게 된다. 그렇다고 클래스별 중요도를 무시하고 뽑는다면 아무런 의미없는 단어가 나올지도 모른다. 

문제는 0이란 수는 모든 곱셈과 나눗셈을 무력화 시키는 값이라는 것이다. 그 전에 아무리 의미있는 값이 도출된다 하더라도 마지막에 0을 곱해버리면 값은 0이 나온다. 이런 경우가 상당히 빈번하기 때문에 값을 0이 아닌 최소값(1회 등장)으로 보정을 하게 되는데 이를 라플라스 스무딩이라 한다.

언더플로우(Underflow) 현상

확률이라는 것은 항상 1보다 작은 값을 갖고 나이브 베이즈는 이 모든 확률들을 곱하기 때문에 조건부 확률이 너무 작아져서 비교가 불가능한 현상이 발생하게 된다.

예시

0.00000000000134 * 0.00000000002341

위와 같은 예시를 곱하게 되면 너무 낮은 숫자가 나오게 된다. 이를 방지하기 위해 값에다 로그를 취한 후 연산을 적용하기도 한다.

즉, 라플라스 스무딩과 언더플로우 현상은 연산이 도저히 안되는 상황에 보정을 하는 것이다.

나이브 베이즈의 알고리즘

- N개의 특징(독립변수)을 나타내는 벡터 x = (x1,...,xn)로 표현되며, 나이브 베이즈 분류기는 이 벡터를 이용해서 k개의 가능한 확률적 결과를 구하는 의미이다. 

대표적인 예제, 날씨별 테니스 가능여부

no outlook temperature humidity windy play tennis
1 sunny hot high False no
2 sunny hot high True no
3 overcast hot high False yes
4 rainy mild high False yes
5 rainy cool normal False yes
6 rainy cool normal True no
7 overcast cool normal True yes
8 sunny mild high False no
9 sunny cool normal False yes
10 rainy mild normal False yes
11 sunny mild normal True yes
12 overcast mild high True yes
13 overcast hot normal False yes
14 rainy mild high True no

위 예시는 머신러닝에서 많이 사용하는 예시로 날씨값에 따라 테니스가 가능한지 구하는 자료이다. 이 자료를 이용해서 테니스 여부를 판별해보자. 우선, 위 raw 데이터를 다음과 같이 통계형태로 압축을 한다.

Temperature 벡터 예시

우선 온도값을 기반으로 아래와 같이 빈도테이블을 만든다.

  Yes No
Cool 3 1
Hot 2 2
Mild 4 2
Total 9 5

온도가 Cool이었지만 테니스를 칠 수 있던 것은 3번이고, Hot일때는 2번, Mild일때는 4번 테니스가 가능했고 각각 1,2,2회로 테니스를 칠 수 없었다. 테니스 시도 여부는 총 14회이었고, 날씨가 Cool이었던 상황은 4번, Hot도 4번 Mild는 6번이다. 

사전 확률 (Temperature 별)

P(Cool) : 4 / 14 = 0.29

P(Hot) : 4 / 14 = 0.29

P(Mild) : 6 / 14 = 0.43

사전 확률 (Yes/No 별)

P(No) : 5 / 14 = 0.36

P(Yes) : 9 / 14 = 0.64

우도 구하기

P(Cool | Yes) : 3 /  9 = 0.33

P(Cool | No) : 1 / 5 = 0.2

P(Hot | Yes) : 2 / 9 = 0.22

P(Hot | No) : 2 / 5 = 0.4

P(Mild | Yes) : 4 / 9 = 0.44

P(Mild | No) : 2 / 5 = 0.4

사후 확률

Cool이 발생했을 때 No가 발생할 사후 확률

P(No | Cool) : P(No) P(Cool | No) / P(Cool)

= (0.36 x 0.2) / 0.29 = 0.25

Hot이 발생했을 때 No가 발생할 사후 확률

P(No | Hot) : P(No) P(Hot | No) / P(Hot)

= (0.36 x 0.4) / 0.29 = 0.5

Mild가 발생했을 때 Yes가 발생할 사후 확률

P(Yes | Mild) : P(Yes) P(Mild | Yes) / P(Mild)

= (0.64 x 0.44) / 0.43 =  0.65

이 포스팅에서는 temperature만 만들어 봤는데 모든 변수에 대해서 이와 같은 통계 테이블이 만들어져야 한다.

문제 풀이

Outlook = Rain, Temperature = Cool, Humidity = Normal인 경우 테니스를 칠 수 있는지 여부를 구하시오.

나이브 베이즈는 분류별 값이 나오고 그 중 가장 높은 확률을 선택해야 한다. 위 3가지의 조건(Condition)들을 X 벡터라 하며 다음과 같이 진행을 한다.

우도 계산

P( X | No ) 

우선 P(Temperature=Cool | No)는 위에 연산한 것처럼 0.2이고, P(Outlook=Rain | No)는 비가 왔을 때 No는 2번이기 때문에 2/5 = 0.4가 되며, P(Humidity=Normal | No)는 Normal일 때 No는 1번이기 때문에 1/5이 된다. 

= P( X | No ) = P(Outlook=Rain | No) x P(Temperature=Cool | No) x P(Humidity=Normal | No)

= P( X | No ) = 0.4 x 0.2 x 0.2 = 0.016

P( X | Yes )

No일때의 우도를 구했으면, Yes일때의 우도도 구해야 한다. P(Temperature=Cool | Yes)는 0.33이고, 비가 왔을 때 Yes는 3번이기 때문에 3/9 = 0.33이 되며, Humidity가 Normal일때 Yes는 6번이기 때문에 6/9 = 0.66이 된다.

= P( X | Yes ) = P(Outlook=Rain | Yes) x P(Temperature=Cool | Yes) x P(Humidity=Normal | Yes)

= P( X | Yes ) = 0.33 x 0.33 x 0.67 = 0.073

사후 확률 계산

사후확률 계산을 위해 우선 연산에 필요한 사전확률들을 구한다.
P(No) = 0.36
P(Yes) = 0.64
P(Rain) = 0.36
P(Cool) = 0.29
P(Normal) = 0.5

P( No | X )

= P(No) P(X | No) / P(X) = 0.36 x 0.016 / (0.36 x 0.29 x 0.5)

= 0.00576 / 0.052 = 0.1107

P( Yes | X )

= P(Yes) P(X | Yes) / P(X) = 0.64 x 0.073 / (0.36 x 0.29 x 0.5)

= 0.04672 / 0.052 = 0.8985

즉, X의 벡터를 나이브 베이즈 분류를 통해 연산을 한다면 테니스를 칠 수 있는 확률이 약 89%이고, 테니스를 칠 수 없는 확률이 약 11%가 되기 때문에 "테니스를 칠 수 있다"라고 말을 할 것이다.

참고자료

https://www.kdnuggets.com/2019/04/naive-bayes-baseline-model-machine-learning-classification-performance.html