<jupyter_start><jupyter_text>Gaussian Naive Bayes는 likelihood를 Gaussian을 이용하여 나타낸다. 즉,$$P(x_i|y)=\frac{1}{\sqrt{2\pi\sigma_{y}^{2}}}exp{(-\frac{(x_i-\mu_y)^2}{2\sigma_{y}^{2}})}$$  1. EDA각 feature의 분포를 시각화해보자.<jupyter_code>import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams['figure.figsize'] = (16, 5)
iris.target
from collections import Counter
# 각 그룹의 수를 확인합니다.
Counter(iris.target)<jupyter_output><empty_output><jupyter_text>> Group 0<jupyter_code>group_0 = iris.data[:50]
# 첫 번째 feature
plt.subplot(1,4,1)
sns.distplot(group_0[:, 0])

# 두 번째 feature
plt.subplot(1,4,2)
sns.distplot(group_0[:, 1])

# 세 번째 feature
plt.subplot(1,4,3)
sns.distplot(group_0[:, 2])

# 네 번째 feature
plt.subplot(1,4,4)
sns.distplot(group_0[:, 3])<jupyter_output><empty_output><jupyter_text>> Group 1<jupyter_code># Group 1
group_1 = iris.data[50:100]

# 첫 번째 feature
plt.subplot(1,4,1)
sns.distplot(group_1[:, 0])

# 두 번째 feature
plt.subplot(1,4,2)
sns.distplot(group_1[:, 1])

# 세 번째 feature
plt.subplot(1,4,3)
sns.distplot(group_1[:, 2])

# 네 번째 feature
plt.subplot(1,4,4)
sns.distplot(group_1[:, 3])<jupyter_output><empty_output><jupyter_text>> Group 2<jupyter_code>group_2 = iris.data[100:]

# 첫 번째 feature
plt.subplot(1,4,1)
sns.distplot(group_2[:, 0])

# 두 번째 feature
plt.subplot(1,4,2)
sns.distplot(group_2[:, 1])

# 세 번째 feature
plt.subplot(1,4,3)
sns.distplot(group_2[:, 2])

# 네 번째 feature
plt.subplot(1,4,4)
sns.distplot(group_2[:, 3])<jupyter_output><empty_output><jupyter_text>중심극한정리에 의하면 결국, 정규분포에 근사하게 된다.  2. 데이터를 학습 데이터와 테스트 데이터로 구분합니다.<jupyter_code># 검증 데이터를 사용하지 않습니다. (사용할 필요성이 없습니다.)
from sklearn.model_selection import train_test_split

train_x, test_x, train_y, test_y = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)
print('Train x', train_x[:1])
print('Train y', train_y[:1])
# 카테고리의 비율이 적절하게, 그리고 원본 데이터와 비교하여 비율이 비슷하게 나누어졌는지 확인해봅니다.
from collections import Counter
print('원본 데이터의 비율 :', Counter(iris.target))
print('학습 데이터의 비율 :', Counter(train_y))
print('테스트 데이터의 비율 :', Counter(test_y))<jupyter_output>원본 데이터의 비율 : Counter({0: 50, 1: 50, 2: 50})
학습 데이터의 비율 : Counter({1: 37, 2: 37, 0: 31})
테스트 데이터의 비율 : Counter({0: 19, 1: 13, 2: 13})<jupyter_text>3. 모델을 학습합니다.<jupyter_code>from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# 학습 셋으로만 scaling을 실시합니다.
scaler = scaler.fit(train_x)
scaled_train_x = scaler.transform(train_x)
# 학습 셋에 이용했던 scaler를 테스트 셋에 이용합니다.
scaled_test_x = scaler.transform(test_x)<jupyter_output><empty_output><jupyter_text>GaussianNB에서 scaling을 하지 않고 모델을 학습하고, 테스트해도 같은 결과가 나옵니다. 왜 그럴까요? Likelihood를 다른 것을 사용하게 하면(가우시안말고) scaling이 필요할 수 있습니다. 하지만 모델을 학습할 때는 GNB말고 다양한 모델을 학습시키기 때문에, 데이터를 scaling 하여 다른 학습모델에서도 테스트할 수 있도록 미리 scaling 작업을 해 주면 좋습니다.<jupyter_code>from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb_model = gnb.fit(scaled_train_x, train_y)<jupyter_output><empty_output><jupyter_text>4. 모델을 테스트합니다.<jupyter_code>pred = gnb_model.predict(scaled_test_x)
print("Accuracy :", (pred == test_y).sum() / len(test_x))<jupyter_output>Accuracy : 0.9777777777777777
{'fraction_non_alphanumeric': 0.15052015604681404, 'fraction_numerical': 0.045513654096228866, 'mean_word_length': 6.361244019138756, 'pattern_counts': {'":': 0, '<': 31, '<?xml version=': 0, '>': 34, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '347549', 'license': 'MIT', 'n_tokens_mistral': 1778, 'n_tokens_neox': 1932, 'n_words': 290, 'path': 'machine-learning-lecture-notes-master/Lecture11_Gaussian_Naive_Bayes.ipynb', 'repo_name': 'm1016m/NN', 'size': '3076'}