Machine Learning

나이브베이즈 (Naive_bayes) 분류 모델

with_AI 2022. 5. 27. 01:54

머신러닝 모델


- 수치형 데이터 예측 : 회귀모델 : 지도학습 : target 이 있음
- 범주형 데이터 예측 : 분류모델 : 지도학습 : target 이 있음
    - 나이브베이즈 : 텍스트 데이터 분류
    - SVM : 이미지, 음향
    - 디시전트리(랜덤포레스트) : 그외의 경우
- 군집분석 : 비지도학습 : target 이 없음, 클러스터링

 

 

나이브 베이즈를 알려면 조건부 확률을 알아야 한다.

 

조건부 확률을 활용하여 베이즈 정리를 구할 수 있다.

 

나이브 베이즈 모델을 이해하기 위해서는 베이즈 정리를 알아야 한다.

베이즈 정리는 결과를 알고나서, 그 결과에 대한 어떠한 확률을 구하는 것이다.

 

나이브 베이즈 종류

앞에 나이브 라는 말은 각각 모든 사건들을 독립적으로 가정하여 그렇게 이름이 붙여졌다고 한다.

나이브 : 순진한가정, 독립적 가정

 

- GaussianNB : 정규분포
    - 독립변수가 연속적일때 사용
    - 독립변수가 정규분포일때 사용
- BernoulliNB : 베르누이분포
    - 독립변수가 범주형인경우 사용
    - 종속변수가 0 또는 1의 두가지를 갖는 이산형인 경우 사용
- MultinomialNB : 다항분포
    - 독립변수가 범주형인경우 사용
    - 종속변수가 여러개의 범주를 갖는 이산형인 경우 사용

 

생각보다 성능 좋고, 중요한 특성만 넣는다면 빠르고 좋다고 한다. 
다중공산성을 피하면서 데이터를 넣어주어야 한다.

 

 

가우시안NB 예제

데이터가 가우시안 분포를 따르지 않는다면, 쓰지 않는 것을 추천한다.

from sklearn.naive_bayes import GaussianNB

# 전처리
outlook = pd.get_dummies(tennis["outlook"])
humidity = pd.get_dummies(tennis["humidity"])
feature = pd.concat([outlook, humidity], axis=1)
target = tennis["play"].map({'Yes': 0, 'No': 1})

tennis_df = pd.concat([feature, target], axis=1)
tennis_df.tail(2)

# 모델 학습
model_1 = GaussianNB().fit(feature, target)

# 예측 데이터
pred_1 = model_1.predict(feature)

# 예측 데이터 
pred_1

# 실제 데이터
target.values

# 모델 평가 : 찍어도 50%인데 64.2% 성능이 안좋음
# 독립변수가 범주형 데이터 : BernoulliNB, MultinomialNB 을 사용하는것이 좋다.
len(pred_1[pred_1 == target.values]) / len(target)

 

멀티노미얼NB 예제

지금 이 데이터 셋에서는 멀티노미얼이 성능이 더 좋게 나왔다.

from sklearn.naive_bayes import MultinomialNB

# 모델 학습
model_2 = MultinomialNB().fit(feature, target)

# 예측
pred_2 = model_2.predict(feature)

# 평가 : GaussianNB 보다 성능이 좋다. : 독립변수가 정규분포가 아니기 때문에
len(pred_2[pred_2 == target.values]) / len(target)

# 데이터를 만들어서 예측
# 흐린날 습도가 보통일때 테니스를 칠까?
# Overcast, Rain, Sunny, High, Normal -> [1, 0, 0, 0, 1]

tennis_df.tail(1)

sample = np.array([1, 0, 0, 0, 1])

proba = model_2.predict_proba([sample])[0]
result = model_2.predict([sample])[0]
proba, result

print("안 칠 확률: {}, 칠 확률: {},".format(np.round(proba[0], 2), np.round(proba[1], 2)), end=" ")
print("결과 : {}".format( "테니스 친다." if result else "테니스 안친다."))

 

 

'Machine Learning' 카테고리의 다른 글

머신러닝 프로젝트 전처리 예시 1  (0) 2022.05.30
LightGBM에 대하여  (0) 2022.05.25
XGBoost 기초 설명  (0) 2022.05.25
Lasso 와 Ridge 회귀 (regression)  (0) 2022.05.25
선형회귀와 LGBM 실습  (0) 2022.05.17