Naive Bayes 樸素貝葉斯
Created: Apr 14, 2020 5:28 PM
概概率的基本概念
條件概率公式
貝葉斯公式
定理: 設A1,A2,...An,是一個完備的事件組,且P(Ai)>0.i=1,2,3,...n,對於任意的事件B,有P(B)>0.有
下面舉例說明,C是類別,X是特徵,一般情況下我們都會忽略掉歸一化因子,因為我們嚴格地說這裡是優化,因此只要比例就夠了
由於聯合概率比較難計算,所以可以假設所有的特徵是相互獨立的,所以就有
這個假設就是樸素概念,根據最大後驗(MAP)規則選擇分類
由於連乘會導致下溢,所以我們轉換為log
例子
根據天氣、溫度、溼度、風速預測小明在sunny、cool、high、strong條件下是否會去打網球
P(Play=Yes) = 9/14 P(Play=no)=5/14
我們可以計算除不同特徵下小明去打網球的概率
我們可以在上表中看到有些概率是0,在這種情況下,我們可以使用拉普拉斯修正,可以在分子分母都加1
- 處理連續值的一種常用技術是使用合併來離散化特徵值,以獲得一組新的伯努利分佈特徵
- 另一種方法:假設(j| C = ci)具有高斯分佈(正態分佈)。
<code># -*- coding: utf-8 -*-
"""
Created on Wed Jan 17 16:49:36 2018
@author: dawa
"""
from __future__ import print_function
from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB
from sklearn.model_selection import cross_val_score
import os
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
data_path = ['D:\\BaiduYunDownload\\Intel\\Intel-ML101-Class6\\data']
# Question1
file_path = os.sep.join(data_path + ['Iris_Data.csv'])
data = pd.read_csv(file_path, sep=',', header=0)
skew = pd.DataFrame(data.skew())
skew.columns = ['skew']
skew['too_skewed'] = skew['skew'] > .75
#skew
sns.pairplot(data, hue='species')
# Question2
X = data[data.columns[:-1]]
y = data.species
GNB = GaussianNB()
cv_N = 4
scores = cross_val_score(GNB, X, y, cv=cv_N)
print(scores)
np.mean(scores)
# Question3
#GaussianNB
#MultinomialNB
#BernoulliNB
X = data[data.columns[:-1]]
y = data.species
nb = {'gaussian': GaussianNB(),
'bernoulli': BernoulliNB(),
'multinomial': MultinomialNB()}
scores = {}
for key, model in nb.items():
s = cross_val_score(model, X, y, cv=cv_N, scoring='accuracy')
scores[key] = np.mean(s)
print(scores)
# Question5
n_copies = [0, 1, 3, 5, 10, 50, 100]
def create_copies_sepal_length(X, n):
X_new = X.copy()
for i in range(n):
X_new['sepal_length_copy%s' % i] = X['sepal_length']
return X_new
cv_N = 4
def get_cross_val_score(n):
X_new = create_copies_sepal_length(X, n)
scores = cross_val_score(GaussianNB(), X_new, y, cv=cv_N)
return np.mean(scores)
plt.figure(2)
avg_scores = pd.Series(
[get_cross_val_score(n) for n in n_copies],
index=n_copies)
ax = avg_scores.plot()
ax.set(
xlabel='number of extra copies of "sepal_length"',
ylabel='average accuracy score',
title='Decline in Naive Bayes performance');
/<code>
閱讀更多 從零單排推薦系統 的文章