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
'Machine Learning > Model' 카테고리의 다른 글
[FNN] numpy를 사용하여 FNN 구현하기 (0) | 2023.06.20 |
---|---|
[ML] KNN(K-Nearest Neighborhood), k-최근접 이웃 (0) | 2023.03.22 |
[ML] 이진 분류 모델 (0) | 2023.01.03 |
[ML] 순방향 신경망(FNN), 신경망의 설계 (0) | 2023.01.03 |
[DATA] Custom Image Data 넣기 (0) | 2022.12.28 |