ADP/실기
나이브베이즈 분류
hyerimir
2024. 2. 3. 22:51
# 나이브베이즈 분류
# 베이즈 정리
# 두 확률 변수의 사전 확률과 사후 확률 사이의 관계를 나타내는 정리
# 정규분포 나이브베이즈 : 독립변수가 연속형일때
# 베르누이분포 나이브베이즈 : 독립변수가 이산형일때
# 다항분포 나이브베이즈 : 독립변수가 이산형이 아닌 범주형 변수일때
# 나이브베이즈 분류는 하나의 속성 값을 기준으로 다른 속성이 독립적이라 전제했을 때,
# 해당 속성 값이 클래스 분류에 미치는 영향을 측정
# 베이지안 접근을 선택할 수 있는 두 가지 경우
# 1. 과거의 빈도를 보여주는 데이터가 많지 않거나 자주 일어나지 않는 사건이어서
# 빈도주의적 추론의 사용이 마땅치 않을 때
# 2. 추정의 목적이 모수 자체의 추정보다는 미래의 예측에 있는 경우
# 베이지안 접근은 하나의 추정치를 고집하는 것이 아니라 계속해서 값을 수정하면서 현실적인
# 추정치를 찾아나가기 때문에 예측의 목적에 맞는 방법, 예를 들어 스팸 분류
# GaussianNB
import pandas as pd
from sklearn.model_selection import train_test_split
credit = pd.read_csv('../data/credit_final.csv')
X = credit[credit.columns.difference(['credit.rating'])]
y = credit['credit.rating']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, stratify = y, random_state = 48)
X_train.head()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)
y_pred = gnb.predict(X_test)
gnb.score(X_test, y_test)
gnb.class_prior_ # 사전확률값
from sklearn.metrics import confusion_matrix
from sklearn.metrics import precision_score, recall_score, f1_score
confusion_Naive = pd.DataFrame(confusion_matrix(y_test, y_pred))
import matplotlib.pyplot as plt
form sklearn.netrics import plot_roc_curve, roc_auc_score
plot_roc_curve(gnb, X_test, y_test)
plt.show()
roc_auc_score(y_test, gnb.predict_proba(X_test)[:,1])
# BernoulliNB naive bayes
df_t = pd.read_csv('../data/titanic.csv')
# 이산형 변수들만
X = pd.get_dummies(data = df_t[['class', 'sex', 'embark_town']], columns = ['class', 'sex', 'embark_town'])
y = df_t['survived']
from sklearn.naive_bayes import BernoulliNB
bernoulli = BernoulliNB()
bernoulli.fit(X, y)
bernoulli.class_log_prior_
import numpy as np
np.exp(bernoulli.class_log_prior_)
# 1등석, 여성, 셰르부르인 사람의 생존율 예측
X_test = [[1, 0, 0, 0, 1, 1, 0, 0]]
bernoulli.predict_proba(X_test)
# Multinomial naive bayes
from sklearn.naive_bayes import MultinomialNB
import numpy as np
X = np.random.randint(5, size = (6, 100))
y = np.array([1,2,3,4,5,6])
clf = MultinomialNB()
clf.fit(X, y)
np.exp(clf.class_log_prior_)
clf.predict_proba((X[3]])