안녕하세요 '코딩 오페라'블로그를 운영하고 있는 저는 'Conducter'입니다.
오늘 알아볼 내용은 나이브 베이즈 분류 알고리즘(Naive Bayes Classifier Algorithm)입니다.
나이브 베이즈 분류 알고리즘(Naive Bayes Classifier Algorithm) : 특성들 사이의 독립을 가정하는 베이즈 정리를 적용한 확률 분류기의 일종
베이즈 정리(Bayes’ theorem) : 두 확률 변수의 사전 확률과 사후 확률 사이의 관계를 나타내는 정리다. 베이즈 확률론 해석에 따르면 베이즈 정리는 사전 확률로부터 사후 확률을 구할 수 있다.
위의 베이즈정리는 인공지능 분야에서 필수인 정리입니다. 이 정리는 사건이 일어나기 전의 확률인 사전 확률과 사건이 일어난 이후 확률인 사후 확률의 관계를 나타내는 공식입니다.
예를 들어
P(H) : 자기 자신이 부자인 확률
P(E) : 부모가 부자일 확률
P(E|H) : 자기 자신이 부자인 사람 중에서 부모가 부자인 확률
위 3가지 사전 확률을 알고 있으면 사후 확률 <P(H|E) : 부모가 부자인 사람 중 자기 자신이 부자인 확률>을 베이즈 정리를 통해 알 수 있습니다.(위 공식 참고)
그러면 지금부터는 간단한 예시를 통해 나이브 베이즈 분류 알고리즘(Naive Bayes Classifier Algorithm) 알아보도록 하겠습니다. 이번 예시는 Kaggle에서 가장 유명한 문제인 tiianic문제를 풀어보도록 하겠습니다. 이는 Pclass, Sex, Age, Fare 등의 변수를 통해 각 사람들의 생존 여부를 예측하는 문제입니다.
우선 기본적인 라이브러리를 불러와줍니다. 여기서 train_test_split는 train, test data를 분리해주는 함수이고 GaussianNB은 가우시안 함수를 통해 분류를 해주는 함수입니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
# train data와 test data를 분리해주는 함수
from sklearn.naive_bayes import GaussianNB
# 가우시안 함수를 통해 분류하는 함수
그 다음 train.csv data를 불러와줍니다. 우리는 Pclass, Sex, Age, Fare data만을 사용할 것이므로 나머지는 drop 함수를 통해 제거해줍니다. 참고로 train.csv파일은 아래 첨부해 드렸습니다.
df = pd.read_csv('train.csv')
df.drop(['PassengerId', 'Name', 'SibSp', 'Parch', 'Ticket', 'Cabin', 'Embarked']
, axis = 'columns', inplace=True)
# 데이터 프레임에서 필요없는 부분을 제거해준다.
# inplace = True (저장함)
target과 inputs을 지정해 줍니다.
target = df.Survived
inputs = df.drop('Survived', axis = 'columns')
# target = Survived, inputs = 나머지로 구성해준다.
Sex 열에는 male과 female이 있는데 이를 이진 데이터로 만들어주기 위해 pandas의 get_dummies함수를 이용해 male = 1, female = 0으로 이진화시켜줍니다. 이를 데이터 프레임에 붙여줍니다.
dummies = pd.get_dummies(inputs.Sex)
# Sex columns의 dummies를 만들어준다. male, female을 숫자로 나타냄.
inputs = pd.concat([inputs, dummies], axis = 'columns')
# concat: 두 개의 배열을 하나의 배열로 만들어주는 역활도 하는 함수
inputs.drop('Sex', axis='columns', inplace=True)
데이터 중에 NaN이 있는 지를 검사해줍니다. 결과적으로 Age열에 NaN data가 존재하는 것을 확인할 수 있습니다.
inputs.columns[inputs.isna().any()]
# isna().any(): 데이터프래임에 NaN이 있는지 알려준다.
print(inputs.isna().any())
Pclass False
Age True
Fare False
female False
male False
dtype: bool
그런 다음 Age열의 평균값을 NaN 데이터에 넣어줍니다. 이떄 fillna 함수를 통해 넣어줍니다.
inputs.Age = inputs.Age.fillna(inputs.Age.mean())
# fillna: 데이터프래임에 NaN을 특정값으로 채워준다.
train_test_split를 이용하여 train data와 test data를 나눠줍니다.
X = inputs; y = target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
GaussianNB 함수를 통해 학습을 시키고 잘 학습이 되었나를 확인하기 위해 테스트 데이터의 점수룰 확인해줍니다. 저의 경우 0.77로 비교적 학습이 잘 됨을 확인할 수 있었습니다.
model = GaussianNB()
model.fit(X_train, y_train)
model.score(X_test, y_test)
실제 데이터의 생존 여부를 예측하고 싶다면 predict 함수를 통해 예측을 해주면 됩니다. 추가적으로 생존 확률을 알고 싶다면 predict_proba함수를 통해 구해주면 됩니다.
model.predict(X_test[:10]
array([1, 0, 1, 0, 0, 1, 0, 0, 0, 0], dtype=int64)
model.predict_proba(X_test[:10])
# model의 확률적 예측
array([[0.00204152, 0.99795848],
[0.99041493, 0.00958507],
[0.04801992, 0.95198008],
[0.99142667, 0.00857333],
[0.99114112, 0.00885888],
[0.04043746, 0.95956254],
[0.99206324, 0.00793676],
[0.98378195, 0.01621805],
[0.98234972, 0.01765028],
[0.99124263, 0.00875737]])
오늘은 나이브 베이즈 분류 알고리즘(Naive Bayes Classifier Algorithm), 타이타닉 생존자 예측에 대해 알아보았습니다. 도움이 되셨나요? 만약 되셨다면 구독 및 좋아요로 표현해 주시면 정말 많은 힘이 됩니다. 궁금한 사항 혹은 앞으로 다루어 주었으면 좋을 주제가 있으시면 댓글 남겨주시면 감사하겠습니다. 저는 '코딩 오페라'의 'Conductor'였습니다. 감사합니다.
<출처 및 참고 : 위키백과, code basics>
'머신러닝' 카테고리의 다른 글
강화학습 DQN으로 CartPole게임 학습시키기 (0) | 2022.02.16 |
---|---|
나이브 베이즈 분류 알고리즘(Naive Bayes Classifier Algorithm), 스팸메일 예측(Spam Mail) (0) | 2022.01.27 |
K-평균 알고리즘(K-means clustering algorithm) (0) | 2022.01.20 |
Support Vector Machine(SVM) (0) | 2022.01.20 |
로지스틱 회귀(Logistic Regression) (2) | 2022.01.12 |