도찐개찐
[머신러닝] 11. 나이브베이즈 분석 본문
나이브 베이즈 분석
- 조건부확률이 이용한 확률 기반 머신러닝 분류 알고리즘
- 주사위를 굴려 짝수눈이 나올 확률P은?
- 어떤 사건의 확률P = 원하는 결과수 / 가능한 결과수
- 모든 실험의 결과가 동일한 가능성을 가진다고 가정함
- 이를 고전적확률이라 함
- 상호배타적, 덧셈법칙, 여의법칙,덧셈의 일반법칙,곱셈법칙(독립사건),조건부확률
- 동전을 100회 던졌을때 앞면이 나오는 횟수는?
- 전통적 확률에서는 일어난횟수/전체시도횟수로 계산
- 이를 경험적확률이라 함 - 일정한 확률로 반복시행
- 시행횟수가 충분히 했을때 어떤 사건이 일어나는 상대적 횟수는 일정한 패턴을 보인다는 의미
- 대수의 법칙
- 만일, A 라는 도시에 수지가 태어난 경우, 이 아이가 노벨상을 받을 확률은 얼마나 될까?
- 이것을 경험적 확률로 계산하려면
- 이 아이를 여러 명 살게하고 그 중 몇명이 노벨상을 받는지 평가해보면 됨
- 문제는 동일한 유전자, 환경에 자란 아이를 만들수 있는가 임
- 이러한 상황에서는 베이즈 확률론을 이용한다
- 활용 가능한 정보에 기초해서 어떤 개인이 결정한 특정 사건이 발생할 가능성(확률)
- 일어나지 않은일에 대한 확률을 불확실성이라는 개념으로 이야기 함
- 즉, 이 사건과 관련된 여러가지 확률을 이용해서 새롭게 일어날 수 있는 사건에 대해 추정하는 것
- 이를 주관적확률이라 함
- 베이즈 정리, 사전확률, 사후확률 - 나이브 베이즈
중요 확률 개념
- 조건부 확률
- 어떤 사건 B가 일어났을 때 사건 A가 일어날 확률을 의미
- $ P(A|B) = \frac {P(A \cap B)} {P(B)} $
- 확률의 곱셈법칙
- 두 가지 이상의 사건이 동시에 발생하는 확률
- 사건 A,B가 동시에 일어날 확률은 사건 A 발생 확률과 사건 B 발생 확률을 곱한 것과 같음
- $ P(A ∩ B) = P(A|B)P(B) = P(B|A)P(A) $
- 전체 확률의 법칙
- 나중에 주어지는 사건 X의 확률은 그 사건의 원인을 여러가지로 나누어서,
- 각 원인에 대한 조건부 확률 P(X|Y)과 그 원인이 되는 확률 P(Y)의 곱에 의한
- 가중합으로 구할 수 있음을 말함
- $ P(A) = P(A ∩ B_1) + P(A ∩ B_2) + ... $
베이즈 이론
- 18세기 영국 장로교 목사였던 토마스 베이즈는 신이 실제로 존재하는가에 대한 문제로 고심
- 수학에 관심이 있었기 때문에 지구상의 모든 증거를 이용해서 신이 존재할 확률을 계산하는 공식을 개발하려 함
- 후에 베이즈의 업적을 정리해서 나온 결과물
- 이전의 경험과 현재의 증거를 토대로 어떤 사건의 확률을 추론
- 확률 $P(A|B)$를 알고 있을 때, 관계가 정반대인 확률 $P(B|A)$를 계산
- $ P(A|B) = P(A) \cdot \frac {P(B|A)} {P(B)} $
- $P(A)$ : $A$의 사전확률 - 현재의 증거
- $P(B)$ : $B$의 사전확률 - 과거의 경험
- $P(A|B)$ : 사건 $B$가 주어졌을때 $A$의 조건부 확률
- 알려진 결과에 기초한 어떤 가설에 대한 가능성
- $P(B|A)$ : 사건 $A$라는 증거에 대한 사후 확률
- 사건 $A$가 일어났다는 것을 알고 그것이 사건 $B$로 부터 일어난 것이라고 생각되는 조건부 확률
- $ P(A|B) = \frac {P(B \cap A)} {P(B)} = \frac {P(B|A)P(A)} {P(B)} =
\frac {P(B|A)P(A)} {P(A ∩ B) + P(\sim A ∩ B)} $
베이즈 정리
- experience base prediction
- 이전의 경험과 현재의 증거를 토대로 어떤 사건의 확률을 추론하는 알고리즘
- 따라서, 사건이 일어날 확률을 토대로 의사결정을 하는 경우, 그와 관련된 사전정보를 얼마나
알고 있나에 따라 크게 좌우 - 기하학 : 피타고라스 정리 = 확률학 : 베이즈 정리
베이즈 정리에 대한 예제
- 삼키기 어려울 정도의 목에 통증 유발 - 인후염
- 병원 방문후 검사(정확도 90%) 시행
- 결과 : 양성(폐암)
- 의사 : 이 결과로 폐암일 확률은 10%도 안될 수 있음
- 폐암에 걸린 남성은 성인 남성 1% 정도
- 환자 : 그래도 걱정이 되니 추가 검사 시행 - 음성(!)
- 베이즈 정리에 근거, 실제 검사에서 양성이 나왔을때 진짜 폐암에 걸릴 확률은 ???
- 베이즈 정리 : P(A|B) = P(A)P(B|A)/P(B)
- 조건부확률 : P(A ∩ B) = P(A)P(B|A) = P(B)P(A|B)
- 따라서, P(A|B) = P(A ∩ B)/P(B)로 도출가능
- 결론적으로 P(A|B) = P(B)P(A|B)/P(B)로도 사용가능
- 양성일때 폐암일 확률 =
- P(폐암|양성) = P(폐암∩양성) / P(양성) = P(폐암)P(양성|폐암) / P(양성)
- 폐암일때 양성일 확률
- P(양성|폐암) = P(양성∩폐암) / P(폐암) = P(양성)P(폐암|양성) / P(폐암)
- 정확도 90% 검사로, 양성일때 폐암일 확률은? P(폐암|양성) = 0.9
- 성인 남성이 폐암에 걸릴 확률은? P(폐암) = 0.01
- 양성일 확률은? P(양성)
- 베이즈 정리와 전체 확률의 법칙을 이용
- 폐암이고, 검사로도 진짜 양성일 확률과
- 폐암이 아닌데, 검사로 양성일 확률을 더한 확률
- P(양성|폐암)P(폐암) + P(양성|1-폐암)P(1-폐암)
- = 0.9 0.01 + 0.1 0.99 = 0.10791 = 0.108 = 11%
- 따라서, P(폐암|양성) = P(폐암)P(양성|폐암) / P(양성)
- = (0.01 * 0.9) / 0.108 = 0.083 = 8.3% (별거아님)
나이브베이즈 예제
- 나이브 베이즈에서 '나이브naive'는 단순한 이란 뜻으로 모든 변수가 서로 독립이라고 가정하고 확률을 계산함
- 사후확률값 자체를 아는 것이 중요한 것이 아니고 각각의 사후확률의 크기를 비교하는 것 만으로도 충분하기 때문에 수식의 분모는 상수처럼 취급함
- 각 변수의 상호작용을 고려해서 확률을 구하려면 수식이 상당히 복잡해짐
- 각 변수를 독립사건처럼 단순화함으로써 수식이 단순해지는 효과를 얻을 수 있음
집 없고 결혼했고 회사경력 3년인 밥은 연체할 것인가?
# 집없고 결혼했고 회사경력 3년
# p(A|B) = P(A)P(B|A) / P(B)
# = P(연체|집,결혼,경력)
# = P(연체|집) * P(연체|결혼) * (연체|경력)
# = P(연체)P(집|연체) / P(집) *
# P(연체)P(결혼|연체) / P(결혼) *
# P(연체)P(경력|연체) / P(경력)
# = P(연체)P(집|연체) *
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, f1_score
from sklearn.metrics import recall_score
from sklearn.metrics import precision_score
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn.naive_bayes import BernoulliNB, MultinomialNB
import pydotplus
from sklearn import tree
import matplotlib.image as pltimg
영화마케팅 문제를 나이즈베이즈로 분석
- 영화관객의 성향을 설문조사로 정리
- 관객의 속성으로 영화취향을 파악해 봄
P(B) = 20대, 여, IT, 미혼, 애인없음
P(A) = 장르에 따른 선택 확률
movies = pd.read_csv('../data/movie.csv', encoding='CP949')
movies.head()
나이 | 성별 | 직업 | 결혼여부 | 이성친구 | 장르 | |
---|---|---|---|---|---|---|
0 | 20대 | 여 | 디자이너 | NO | YES | 로맨틱 |
1 | 40대 | 남 | 홍보/마케팅 | NO | NO | 공포 |
2 | 10대 | 여 | 홍보/마케팅 | NO | YES | 로맨틱 |
3 | 20대 | 여 | 디자이너 | YES | NO | 로맨틱 |
4 | 10대 | 남 | 학생 | NO | NO | 액션 |
# 컬럼명 변경, 레이블인코딩 적용
cols = ['나이','성별','직업','결혼여부','이성친구','장르']
ncols = ['ages',' gender','job','married','lover','genre']
for c in cols:
movies[c] = pd.Categorical(movies[c])
movies[c] = movies[c].cat.codes
movies.columns = ncols # 컬럼명 변경
movies.head()
ages | gender | job | married | lover | genre | |
---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 0 | 1 | 2 |
1 | 3 | 0 | 7 | 0 | 0 | 1 |
2 | 0 | 1 | 7 | 0 | 1 | 2 |
3 | 1 | 1 | 1 | 1 | 0 | 2 |
4 | 0 | 0 | 6 | 0 | 0 | 5 |
data = movies.iloc[:, :5]
target = movies.genre
X_train, X_test, y_train, y_test = train_test_split(data, target, train_size=0.7,
stratify=target, random_state=2211181710)
nbclf = MultinomialNB() # 기본값은 gini
nbclf.fit(X_train, y_train)
nbclf.score(X_train, y_train)
0.7777777777777778
pred = nbclf.predict(X_test)
accuracy_score(y_test, pred)
0.6666666666666666
precision_score(y_test, pred, average=None, zero_division=True), \
recall_score(y_test, pred, average=None, zero_division=True)
(array([1. , 0.25, 1. , 1. , 0.5 , 1. , 1. ]),
array([0.5, 1. , 1. , 0. , 1. , 1. , 0. ]))
728x90
'PYTHON > 데이터분석' 카테고리의 다른 글
[머신러닝] 13. SVM (0) | 2023.01.03 |
---|---|
[머신러닝] 12. KNN (0) | 2023.01.03 |
[머신러닝] 10. 엔트로피 (1) | 2023.01.03 |
[머신러닝] 09. 의사결정 나무 (0) | 2023.01.03 |
[머신러닝] 08. 로지스틱 회귀 (0) | 2023.01.03 |
Comments