Machine Learning/Model

[ML] 나이브 베이즈(Naive bayes) 개념, 실습

파송송 2023. 3. 21. 16:31
728x90

베이즈 정리

  • 조건부 확률을 계산하는 방법 중 하나
  • 새로운 정보를 토대로 어떠한 사건이 발생했다는 주장의 신뢰도를 갱신하는 방법

수식

\( P(B|A) \)를 쉽게 구할 수 있을 때 아래의 식을 통해 \( P(A|B) \)를 구할 수 있음

$$ P(A|B) =  \frac{P(B|A)P(A)}{P(B)}  $$


Day Outlook Humidity Play Tennis
1 Sunny High No
2 Sunny High No
3 Overcast High Yes
4 Rain High Yes
5 Rain Normal Yes
6 Rain Normal Yes
7 Overcast Normal No
8 Sunny High Yes
9 Sunny Normal No
10 Rain Normal Yes
11 Sunny Normal Yes
12 Overcast High Yes
13 Overcast Normal Yes
14 Rain High No
  • Sunny와 Normal일 때 Play Tennis의 확률을 구하기
  • \( P(Yes|Sunny,Normal) =  \frac{P(sunny,Normal|Yes)P(Yes)}{P(Sunny,Normal|Yes)+P(Sunny,Normal|No)} = \frac{P(sunny.Normal|Yes)P(Yes)}{P(Sunny, Normal)}  \)
    • \( P(Yes)=\frac{9}{14}  \)
    • \( P(Sunny,Normal|Yes)= \frac{2}{9}  \)
    • \( P(Sunny,Normal|Yes)P(Yes)= \frac{9}{14}* \frac{2}{9}  = \frac{2}{14}  \)
    • \( P(sunny,Normal) =  \frac{2}{14}  \)

나이브 베이즈

조건부 독립을 활용한 분류 기법

 

수식

독립변수가 정해져있을 때, c의 likelihood

$$ P(y=c|X_{1}=x_{1}, \ldots ,X_{j}=x_{J})= \frac{P(X_{1}=x_{1},  \ldots,X_{j}=x_{J}|y=c)P(y=c)}{P(X_{1}=x_{1}, \ldots ,X_{j}=x_{J})}  $$

 

c가 변해도 분모는 늘 같기 때문에 아래의 식으로 변환 가능

각 변수들은 서로 독립이기 때문에 곱으로 나타낼 수 있음

$$ P(X_{1}=x_{1},  \ldots,X_{j}=x_{J}|y=c)P(y=c)  =  \prod_{j=1}^J P(X_{j}=x_{j}|y=c)P(y=c)  $$

 

$$ \hat{y}= argmax_{c \in {1, \ldots ,C}}[ \prod_{j=1}^J P(X_{j}=x_{j}|y=c)P(y=c) ] $$

 


Day Outlook Humidity Play Tennis
1 Sunny High No
2 Sunny High No
3 Overcast High Yes
4 Rain High Yes
5 Rain Normal Yes
6 Rain Normal Yes
7 Overcast Normal No
8 Sunny High Yes
9 Sunny Normal No
10 Rain Normal Yes
11 Sunny Normal Yes
12 Overcast High Yes
13 Overcast Normal Yes
14 Rain High No

조건부 확률

  • \( P(Yes|Sunny, Normal) = \frac{2}{2} \)

 

베이즈 정리

  • \( P(Yes|Sunny, Normal)=\frac{P(Yes,Sunny,Normal)}{P(Sunny,Normal)} = \frac{P(Yes,Sunny,Normal)}{P(Yes, Sunny,Normal)+P(No,Sunny,Normal)} = \frac{\frac{2}{14}}{\frac{2}{14}} \)

 

사전확률

  • \( P(Yes|Sunny,Normal)=\frac{P(Sunny,Normal|Yes)P(Yes)}{P(Sunny,Normal)} \)
    • \( P(Yes)=\frac{9}{14} \), \( P(Sunny, Normal|Yes)=\frac{2}{9} \)
    • \( P(Sunny, Normal|Yes)P(Yes)=\frac{9}{14}*\frac{2}{9}=\frac{2}{14} \)
    • \( P(Sunny, Normal)=\frac{2}{14} \)

조건부 독립 적용

  • \( P(Yes|Sunny,Normal) =  \frac{P(Sunny,Normal|Yes)P(Yes)}{P(Sunny, Normal)}=\frac{P(Sunny|Yes)P(Normal|Yes)P(Yes)}{P(Sunny, Normal)}  \)

Sunny, Normal일 때 Play Tennis 예측

  • \( P(Yes|Sunny,Normal) =  \frac{P(Sunny,Normal|Yes)P(Yes)}{P(Sunny, Normal)}=\frac{P(Sunny|Yes)P(Normal|Yes)P(Yes)}{P(Sunny, Normal)}  \)
  • \( P(No|Sunny,Normal) =  \frac{P(Sunny,Normal|No)P(No)}{P(Sunny, Normal)}=\frac{P(Sunny|No)P(Normal|No)P(No)}{P(Sunny, Normal)} \)

분모는 같기 때문에 분자를 비교하여 확률을 구함

  • \( P(Sunny|Yes)P(Normal|Yes)P(Yes) \) = 0.095
  • \( P(Sunny|No)P(Normal|No)P(No) \)= 0.043

 Yes일 확률이 더 높기 때문에 Sunny, Normal 일 때 play Tennis는 Yes이다.


실습

Skleran의 GaussianNB 사용, data는 iris 데이터셋 사용

Dataset

iris = datasets.load_iris()
print(iris)
df_X=pd.DataFrame(iris.data)
df_Y=pd.DataFrame(iris.target)
{'data': array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
  		...
       [6.3, 2.5, 5. , 1.9],
       [6.5, 3. , 5.2, 2. ],
       [6.2, 3.4, 5.4, 2.3],
       [5.9, 3. , 5.1, 1.8]]), 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

model

gnb=GaussianNB()
fitted = gnb.fit(iris.data,iris.target)
y_pred=fitted.predict(iris.data)

확률로 예측값 확인하기

fitted.predict_proba(iris.data)[[1,48,51,100]]
array([[1.00000000e+000, 1.51480769e-017, 2.34820051e-025],
       [1.00000000e+000, 2.63876217e-018, 2.79566024e-025],
       [7.27347795e-102, 9.45169639e-001, 5.48303606e-002],
       [3.23245181e-254, 6.35381031e-011, 1.00000000e+000]])

argmax로 예측값 확인하기

fitted.predict(iris.data)[[1,48,51,100]]
array([0, 0, 1, 2])
728x90