Python으로 Naive Bayes 분류자를 개발하는 방법

분류는 주어진 입력 데이터 샘플에 레이블을 할당하는 것과 관련된 예측 모델링 문제입니다.

분류 예측 모델링의 문제는 데이터 샘플이 주어진 클래스 레이블의 조건부 확률을 계산하는 것으로 구성될 수 있습니다. Bayes 정리는 이 조건부 확률을 계산하는 원칙적인 방법을 제공하지만 실제로는 엄청난 수의 샘플(매우 큰 크기의 데이터 세트)이 필요하고 계산 비용이 많이 듭니다.

대신, Bayes 정리의 계산은 각 입력 변수가 다른 모든 입력 변수와 독립적이라는 몇 가지 가정을 통해 단순화할 수 있습니다. 극적이고 비현실적인 가정이지만, 이는 조건부 확률의 계산을 다루기 쉽게 만드는 효과가 있으며 Naive Bayes라고 하는 효과적인 분류 모델을 만듭니다.

이 자습서에서는 분류 예측 모델링을 위한 Naive Bayes 알고리즘을 알아봅니다.

이 자습서를 완료하면 다음을 알 수 있습니다.

  • 분류 예측 모델링을 조건부 확률 모델로 구성하는 방법.
  • Bayes 정리를 사용하여 분류의 조건부 확률 모델을 푸는 방법.
  • Naive Bayes 알고리즘이라고 하는 분류를 위해 단순화된 Bayes 정리를 구현하는 방법.

튜토리얼 개요

이 자습서는 다음과 같이 다섯 부분으로 나뉩니다.

  1. 분류의 조건부 확률 모델
  2. 단순화 또는 Naive Bayes
  3. 사전 및 조건부 확률을 계산하는 방법
  4. Naive Bayes의 작업 예
  5. Naive Bayes를 사용할 때의 5가지 팁

분류의 조건부 확률 모델

머신러닝에서 우리는 종종 주어진 관측치에 대한 클래스 레이블을 예측하려는 예측 모델링 문제에 관심이 있습니다. 예를 들어, 꽃의 측정에 따라 식물의 종을 분류합니다.

이러한 유형의 문제는 숫자 값 예측을 포함하는 회귀 문제와 달리 분류 예측 모델링 문제라고 합니다. 모델에 대한 관측값 또는 입력값을 X라고 하고 모델의 클래스 레이블 또는 출력을 y라고 합니다.

X와 y는 도메인에서 수집된 관측값, 즉 모델을 적합시키는 데 사용되는 학습 데이터의 테이블 또는 행렬(열과 행 또는 특징과 샘플)을 나타냅니다. 모델은 특정 예제를 클래스 레이블 또는 y = f(X)에 매핑하여 오분류 오류를 최소화하는 방법을 학습해야 합니다.

이 문제를 해결하는 한 가지 방법은 확률론적 모델을 개발하는 것입니다. 확률론적 관점에서, 우리는 관측치가 주어지면 클래스 레이블의 조건부 확률을 추정하는 데 관심이 있습니다.

예를 들어, 분류 문제에는 k 클래스 레이블 y1, y2, …,yk 및 n개의 입력 변수 X1, X2, …, Xn이 있을 수 있습니다. 다음과 같이 각 열x1, x2, …, xn에 대해 주어진 인스턴스 또는 입력 값 집합이 있는 클래스 레이블에 대한 조건부 확률을 계산할 수 있습니다.

  • P(yi | x1, x2, …, xn)

그런 다음 문제의 각 클래스 레이블에 대해 조건부 확률을 계산할 수 있으며 확률이 가장 높은 레이블을 가장 가능성이 높은 분류로 반환할 수 있습니다.

조건부 확률은 결합 확률을 사용하여 계산할 수 있지만 다루기 어렵습니다. Bayes 정리는 조건부 확률을 계산하는 원칙적인 방법을 제공합니다.

Bayes 정리에 대한 계산의 간단한 형태는 다음과 같습니다.

  • P(A| B) = P (B| A) * P (A) / P (B)

여기서 P(A) 계산에 관심이 있을 확률| B)를 사후 확률이라고 하고 사건 P(A)의 주변 확률을 사전 확률이라고 합니다.

다음과 같이 Bayes 정리를 사용하여 조건부 분류 문제로 분류를 구성할 수 있습니다.

  • P(yi | x1, x2, …, xn) = P(x1, x2, …, xn | yi) * P(yi) / P(x1, x2, …, xn)

이전 P(yi)는 데이터 세트에서 쉽게 추정할 수 있지만, 클래스P(x1, x2, …, xn | yi)를 기반으로 한 관측치의 조건부 확률은 예제의 수가 매우 크지 않는 한(예: 가능한 모든 값 조합에 대한 확률 분포를 효과적으로 추정할 수 있을 만큼 충분히 크지 않는 한) 실현 가능하지 않습니다.

따라서 Bayes 정리의 직접 적용은 특히 변수 또는 기능 (n)의 수가 증가함에 따라 다루기 어려워집니다.


단순화 또는 Naive Bayes

조건부 확률 분류 모델에 Bayes 정리를 사용하는 솔루션은 계산을 단순화하는 것입니다.

Bayes 정리는 각 입력 변수가 다른 모든 변수에 종속된다고 가정합니다. 이것은 계산의 복잡성의 원인입니다. 이 가정을 제거하고 각 입력 변수를 서로 독립적인 것으로 간주 할 수 있습니다.

이렇게 하면 모델이 종속 조건부 확률 모델에서 독립적인 조건부 확률 모델로 변경되고 계산이 크게 단순화됩니다.

첫째, 분모는 주어진 인스턴스에 대한 각 클래스의 조건부 확률을 계산하는 데 사용되는 상수이며 결과를 정규화 하는 효과가 있기 때문에 계산 P(x1, x2, …, xn)에서 제거됩니다.

  • P(yi | x1, x2, …, xn) = P(x1, x2, …, xn | yi) * P(yi)

다음으로, 클래스 레이블이 주어진 모든 변수의 조건부 확률은 클래스 레이블이 주어진 각 변수 값의 개별 조건부 확률로 변경됩니다. 그런 다음 이러한 독립 조건부 변수를 곱합니다. 예를 들어:

  • P(yi | x1, x2, …, xn) = P(x1|yi) * P(x2|yi) * … P(xn|yi) * P(yi)

이 계산은 각 클래스 레이블에 대해 수행할 수 있으며 확률이 가장 큰 레이블을 지정된 인스턴스에 대한 분류로 선택할 수 있습니다. 이 결정 규칙을 최대 사후 결정규칙 또는 MAP 결정 규칙이라고 합니다.

이러한 Bayes 정리의 단순화는 일반적이며 분류 예측 모델링 문제에 널리 사용되며 일반적으로 Naive Bayes라고 합니다.

Naive“이라는 단어는 프랑스어이며 일반적으로 단순화를 위해 일반적으로 생략되는 “i”위에 diaeresis (umlaut)가 있으며 “Bayes”는 Thomas Bayes 목사의 이름을 따서 대문자로 표시됩니다.

 

사전 및 조건부 확률을 계산하는 방법

이제 Naive Bayes가 무엇인지 알았으므로 방정식의 요소를 계산하는 방법을 자세히 살펴볼 수 있습니다.

이전 P(yi)의 계산은 간단합니다. 클래스 레이블이 있는 학습 데이터 세트의 관측 빈도를 학습 데이터 세트의 총 예제(행) 수로 나누어 추정할 수 있습니다. 예를 들어:

  • P(yi) = yi가 있는 예 / 전체 예

클래스 레이블이 주어진 특징 값에 대한 조건부 확률도 데이터로부터 추정할 수 있습니다. 특히, 주어진 클래스에 속하는 데이터 예제와 변수당 하나의 데이터 분포. 즉, 클래스와 n개의 변수가 있는 경우 k * n개의 다른 확률 분포를 만들고 유지해야 합니다.

각 기능의 데이터 형식에 따라 다른 접근 방식이 필요합니다. 특히, 데이터는 세 가지 표준 확률 분포 중 하나의 모수를 추정하는 데 사용됩니다.

개수 또는 레이블과 같은 범주형 변수의 경우 다항 분포를 사용할 수 있습니다. 변수가 예/아니요 또는 참/거짓과 같은 이항이면 이항 분포를 사용할 수 있습니다. 변수가 측정과 같이 숫자인 경우 종종 가우스 분포가 사용됩니다.

  • 이진수: 이항 분포
  • 범주형: 다항 분포
  • 숫자: 가우스 분포

이 세 가지 배포판은 매우 일반적이어서 Naive Bayes 구현은 종종 배포판의 이름을 따서 명명됩니다. 예를 들어:

  • 이항 Naive Bayes: 이항 분포를 사용하는 Naive Bayes.
  • 다항 Naive Bayes: 다항 분포를 사용하는 Naive Bayes.
  • 가우스 Naive Bayes: 가우스 분포를 사용하는 Naive Bayes.

입력 변수에 대해 혼합 데이터 유형이 있는 데이터 집합에서는 각 변수에 대해 서로 다른 유형의 데이터 분포를 선택해야 할 수 있습니다.

세 가지 공통 분포 중 하나를 사용하는 것은 필수가 아닙니다. 예를 들어, 실수 값 변수가 지수와 같은 다른 특정 분포를 갖는 것으로 알려진 경우 해당 특정 분포를 대신 사용할 수 있습니다. 실수 값 변수에 바이모달 또는 멀티모달과 같이 잘 정의된 분포가 없는 경우 커널 밀도 추정기를 사용하여 확률 분포를 추정할 수 있습니다.

Naive Bayes 알고리즘은 효과적인 것으로 입증되었으므로 텍스트 분류 작업에 널리 사용됩니다. 문서의 단어는 각각 사용되는 이진수(단어 존재), 개수(단어 발생) 또는 빈도(tf/idf) 입력 벡터와 이진, 다항 또는 가우스 확률 분포로 인코딩될 수 있습니다.



Naive Bayes의 작업 예

이 섹션에서는 머신러닝 데이터 세트에 대한 작은 예제를 사용하여 Naive Bayes 계산을 구체화합니다.

scikit-learn API의 make_blobs()함수를 사용하여 작은 인위적인 바이너리 (2 클래스) 분류 문제를 생성할 수 있습니다.

아래 예제에서는 각각 두 클래스 중 하나가 할당된 두 개의 숫자 입력 변수가 있는 100개의 예제를 생성합니다.

예제를 실행하면 데이터 집합이 생성되고 크기가 요약되어 데이터 집합이 예상대로 생성되었음을 확인합니다.

random_state” 인수는 1로 설정되어 코드가 실행될 때마다 동일한 무작위 관측치 샘플이 생성됩니다.

처음 5개 예제의 입력 및 출력 요소도 인쇄되어 실제로 두 입력 변수가 숫자이고 클래스 레이블이 각 예제에 대해 0 또는 1임을 보여 줍니다.

가우스 확률 분포를 사용하여 수치 입력 변수를 모델링합니다.

이것은 표준 SciPy API를 사용하여 달성할 수 있습니다. 먼저, 분포의 매개 변수 (예 : 평균 및 표준 편차)를 지정하여 분포를 구성할 수 있으며, norm.pdf() 함수를 사용하여 특정 값에 대해 확률 밀도 함수를 샘플링 할 수 있습니다.

mean() 및 std()NumPy 함수를 사용하여 데이터 세트에서 분포의 매개 변수를 추정할 수 있습니다.

아래의 fit_distribution() 함수는 하나의 변수에 대한 데이터 샘플을 가져와 데이터 분포를 피팅합니다.

각 입력 변수의 조건부 확률에 관심이 있음을 상기하십시오. 즉, 각 입력 변수에 대해 하나의 분포가 필요하고 각 클래스 레이블에 대해 하나의 분포 집합 또는 총 4개의 분포가 필요합니다.

먼저 데이터를 각 클래스 레이블에 대한 샘플 그룹으로 분할해야 합니다.

그런 다음 이러한 그룹을 사용하여 각 그룹에 속하는 데이터 샘플에 대한 사전 확률을 계산할 수 있습니다.

이것은 두 클래스 각각에서 동일한 수의 예제를 만들었다는 점을 감안할 때 정확히 50%가 될 것입니다. 그럼에도 불구하고 우리는 완전성을 위해 이러한 사전 확률을 계산할 것입니다.

마지막으로 정의한 fit_distribution() 함수를 호출하여 각 변수, 각 클래스 레이블에 대한 확률 분포를 준비할 수 있습니다.

이 모든 것을 하나로 묶으면 데이터 세트의 완전한 확률 모델이 아래에 나열되어 있습니다.


예제를 실행하면 먼저 데이터 세트를 두 클래스 레이블에 대한 두 그룹으로 분할하고 각 그룹의 크기가 균등하고 사전(prior)이 50%인지 확인합니다.

그런 다음 각 클래스 레이블의 각 변수에 대한 확률 분포를 준비하고 각 분포의 평균 및 표준 편차 모수를 보고하여 분포가 다르다는 것을 확인합니다.

다음으로 준비된 확률 모델을 사용하여 예측을 할 수 있습니다.

각 클래스 레이블에 대한 독립 조건부 확률은 클래스에 대한 사전(50%) 및 각 변수에 대한 값의 조건부 확률을 사용하여 계산할 수 있습니다.

아래의 probability() 함수는 각 변수에 대한 사전 및 조건부 확률 분포가 주어진 하나의 입력 예제(두 값의 배열)에 대해 이 계산을 수행합니다. 반환되는 값은 수량이 정규화 되지 않았기 때문에 확률이 아닌 점수이며, 이는 Naive Bayes를 구현할 때 종종 수행되는 단순화입니다.

이 함수를 사용하여 각 클래스에 속하는 예제의 확률을 계산할 수 있습니다.

먼저 분류할 예를 선택할 수 있습니다. 이 경우 데이터 집합의 첫 번째 예제입니다.

다음으로 첫 번째 클래스에 속하는 예제의 점수를 계산한 다음 두 번째 클래스를 계산 한 다음 결과를 보고할 수 있습니다.

점수가 가장 큰 클래스가 결과 분류가 됩니다.

이를 함께 연결하여 Naive Bayes 모델을 피팅하고 이를 사용하여 하나의 예측을 수행하는 전체 예가 아래에 나열되어 있습니다.

예제를 실행하면 먼저 이전과 같이 사전 확률과 조건부 확률을 준비한 다음 이를 사용하여 한 예제에 대한 예측을 수행합니다.

y=0에 속하는 예제의 점수는 약 0.3인 반면(정규화되지 않은 확률임을 상기), y=1에 속하는 예제의 점수는 0.0입니다. 따라서 예제를 y=0에 속하는 것으로 분류합니다.

이 경우 실제 또는 실제 결과는 알려진 y=0으로, Naive Bayes 모델의 예측과 일치합니다.

실제로는 Naive Bayes 알고리즘의 최적화된 구현을 사용하는 것이 좋습니다. scikit-learn 라이브러리는 세 가지 주요 확률 분포 각각에 대해 하나씩 세 가지 구현을 제공합니다. 예를 들어, BernoulliNB, MultinomialNB 및 GaussianNB는 각각 이항, 다항 및 가우스 분산 입력 변수에 대해 사용됩니다.

scikit-learn Naive Bayes 모델을 사용하려면 먼저 모델을 정의한 다음 학습 데이터 세트에 적합하게 합니다. 일단 적합하면 predict_proba() 함수를 통해 확률을 예측할 수 있고 클래스 레이블은 predict() 함수를 통해 직접 예측할 수 있습니다.

가우스 Naive Bayes 모델(GaussianNB)을 동일한 테스트 데이터 세트에 피팅하는 전체 예제는 다음과 같습니다.

예제를 실행하면 학습 데이터 세트의 모델이 적합해진 다음, 이전 예제에서 사용한 것과 동일한 첫 번째 예제에 대한 예측이 수행됩니다.

이 경우 y=0에 속하는 예의 확률은 1.0 또는 확실성입니다. y=1의 확률은 0.0에 가까운 매우 작은 값입니다.

마지막으로 클래스 레이블이 직접 예측되어 예제의 실측 자료와 다시 일치합니다.

 

Naive Bayes를 사용할 때의 5가지 팁

이 섹션에서는 Naive Bayes 모델로 작업할 때의 몇 가지 실용적인 팁을 나열합니다.

1. 복잡한 배포판에 KDE 사용

변수에 대한 확률 분포가 복잡하거나 알 수 없는 경우 커널 밀도 추정기 또는 KDE를 사용하여 데이터 샘플에서 직접 분포를 근사하는 것이 좋습니다.

좋은 예는 가우스 KDE입니다.


2. 변수 의존성 증가로 인한 성능 저하

정의에 따라 Naive Bayes는 입력 변수가 서로 독립적이라고 가정합니다.

이것은 일부 또는 대부분의 변수가 실제로 의존적인 경우에도 대부분의 경우 잘 작동합니다. 그럼에도 불구하고 알고리즘의 성능은 입력 변수가 더 의존적일수록 저하됩니다.​


3. 로그로 수치 언더플로 방지

하나의 클래스 레이블의 한 예에 대한 독립 조건부 확률 계산에는 클래스에 대해 하나씩, 각 입력 변수에 대해 하나씩 많은 확률을 곱하는 작업이 포함됩니다. 따라서 많은 작은 수의 곱셈은 특히 입력 변수의 수가 증가함에 따라 수치적으로 불안정해질 수 있습니다.

이 문제를 극복하기 위해 계산을 확률의 곱에서 로그 확률의 합으로 변경하는 것이 일반적입니다. 예를 들어:

  • P(yi | x1, x2, …, xn) = log(P(x1|y1)) + log(P(x2|y1)) + … log(P(xn|y1)) + log(P(yi))

확률의 자연 로그를 계산하면 더 큰(음수) 숫자가 생성되고 숫자를 더하면 더 큰 확률이 0에 가까워지는 효과가 있습니다. 결과 값을 비교하고 최대화하여 가장 가능성이 높은 클래스 레이블을 제공할 수 있습니다.

이것은 확률을 곱할 때 종종 로그 트릭이라고합니다.


4. 확률 분포 업데이트

새 데이터를 사용할 수 있게 되면 이 새 데이터를 이전 데이터와 함께 사용하여 각 변수의 확률 분포에 대한 모수의 추정치를 업데이트하는 것이 비교적 간단할 수 있습니다.

이를 통해 모델은 새 데이터 또는 시간 경과에 따른 데이터 분포 변경을 쉽게 사용할 수 있습니다.


5. 생성 모델로 사용

확률 분포는 각 클래스 레이블에 대한 각 입력 변수 값의 조건부 확률을 요약합니다.

이러한 확률 분포는 분류 모델에서 사용하는 것 이상으로 일반적으로 유용할 수 있습니다.

예를 들어, 준비된 확률 분포는 새로운 그럴듯한 데이터 인스턴스를 생성하기 위해 무작위로 샘플링 될 수 있습니다. 조건부 독립성 가정은 데이터 세트의 입력 변수 사이에 실제 상호 의존성이 얼마나 존재하는지에 따라 예제가 다소 그럴듯하다는 것을 의미할 수 있습니다.


추가 정보

이 섹션에서는 더 자세히 알아보려는 경우 주제에 대한 더 많은 리소스를 제공합니다.

자습서



요약

이 자습서에서는 분류 예측 모델링을 위한 Naive Bayes 알고리즘을 발견했습니다.

특히 다음 내용을 배웠습니다.

  • 분류 예측 모델링을 조건부 확률 모델로 구성하는 방법.
  • Bayes 정리를 사용하여 분류의 조건부 확률 모델을 푸는 방법.
  • Naive Bayes 알고리즘이라는 분류를 위해 단순화된 Bayes 정리를 구현하는 방법.
네피리티
No Comments

Sorry, the comment form is closed at this time.