BASEMENT
Naive Bayes (나이브 베이즈) 본문
나이브 베이즈
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 |