Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

Naive Bayes (나이브 베이즈) 본문

Programming/Machine Learning

Naive Bayes (나이브 베이즈)

2_34 2020. 10. 5. 17:12

나이브 베이즈

 

 

1. 정의

 

- 속성들 사이의 독립을 가정하는 베이즈정리(조건부 확률)를 적용한 확률적 분류기법

- 지도학습 알고리즘으로, 주로 분류(classification)의 목적으로 사용됨

- 나이브베이즈의 독립변수(x)는 범주형 변수

- ex) 스팸 이메일 필터링 (텍스트 분류)

 

 

 

2. 베이즈정리

 

- 두 확률변수의 사전확률과 사후확률 사이의 관계를 나타내는 정리

- 사전확률 : 가지고 있는 정보를 기초로 정한 초기확률

- 사후확률 : 결과가 발생했다는 조건에서 어떤 원인이 발생했을 확률

- 우도(Likelihodd) : 원인이 발생했다는 조건에서 결과가 발생했을 확률

 

 

 

3. 조건부확률

 

- 사건 A가 일어났을 때 사건 B가 일어날 확률

 

 

 

4. 나이브베이즈 장점&단점

 

장점

- 우도 테이블 하나만 있으면 분류 가능

- 계산 복잡성이 낮음, 간단하고 빠르며 정확함

- 자연어처리 기법(스팸메일 필터링 등)에 유용하여 범주형 데이터에서 성능이 좋음

 

단점

- feautre 간의 독립성이 잘못된 경우 -> 카이제곱검정 필요

- 수치 특징이 많은 데이터셋에서는 이상적이지 않음

- 추정된 확률이 예측된 클래스보다 덜 신뢰 -> cutoff 지정 필요

 

 

 

5. 나이브베이즈 사용

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

clf = GaussianNB()
clf.fit(X_train, y_trian)

pred = model.predict(X_test)
accuracy = accuracy_score(y_pred, y_test)

 

 

 

6. 나이브베이즈 예제

 

1) play_tennis.csv 데이터

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder		# LabelEncoder : 범주형데이터로 전처리
from sklearn.model_selection import train_test_split

play_tennis = pd.read_csv("PlayTennis.csv")

play_tennis.head()
# 날씨 데이터를 범주형 데이터로 전처리

from IPython.display import display

number = LabelEncoder()

play_tennis['Outlook'] = number.fit_transform(play_tennis['Outlook'])
play_tennis['Temperature'] = number.fit_transform(play_tennis['Temperature'])
play_tennis['Humidity'] = number.fit_transform(play_tennis['Humidity'])
play_tennis['Wind'] = number.fit_transform(play_tennis['Wind'])
play_tennis['Play Tennis'] = number.fit_transform(play_tennis['Play Tennis'])

display(play_tennis)
features = ["Outlook", "Temperature", "Humidity", "Wind"]
target = "Play Tennis"

X = play_tennis[features]
y = play_tennis[target]
X_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = GaussianNB()
model.fit(X_train, y_train)
pred = model.predict(x_test)
accuracy = accuracy_score(y_test, pred)

print("acc : ", accuracy)

 

2) iris 데이터

from sklearn import datasets
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import StandardScaler

iris = datasets.load_iris()
print(type(iris))

print('data shape: ', iris.data.shape)		# 데이터 형태 확인
print('iris target: ', iris.target_names)	# 분류 클래스명 확인
print('iris features: ', iris.feature_names)	# 데이터(변수)명 확인

X = iris.data	# 데이터(변수)
print('type X: ', type(X))
print(X[:5])
y = iris.target	# 분류 클래스(label)
print('type y: ', type(y))
print(y[:5])
# train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# StandardScaler 적용
scaler = StandardScaler()
scaler.fit(X_train, y_train)
X_train_scale = scaler.transform(X_train)
X_test_scale = scaler.transform(X_test)
# Naive Bayes

gnb = GaussianNB()
gnb.fit(X_train_scale, y_train)     # 모델 학습
y_pred = gnb.predict(X_test_scale)  # 예측

# 성능 측정
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

 

3) wine 데이터

from sklearn import datasets

wine = datasets.load_wine()

print("Feature: ", wine.feature_names)
print("Labels: ", wine.target_names)
# train_test_split

X = wine.data
y = wine.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Naive Bayes
gnb = GaussianNB()
gnb.fit(X_train, y_train)
y_pred = gnb.predict(X_test)

# 성능측정
from sklearn import metrics

print("Accuracy: ", metrics.accuracy_score(y_test, y_pred))

-> cross-validation을 통해 평균값을 구한 후 정확도를 결정함

# cross validation
from sklearn.model_selection import cross_val_score

scores = cross_val_score(gnb, X, y, cv=5, scoring='accuracy')
print(scores)
print(scores.mean())

# 평균값이 96% => 와인데이터 96%의 정확도

 

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

의사결정트리  (0) 2020.10.10
SVM, SVR  (0) 2020.10.05
KNN 알고리즘  (0) 2020.09.27
모델 성능 평가 척도, ROC 커브  (0) 2020.09.27
로지스틱 회귀분석  (0) 2020.09.27
Comments