sklearn中的朴素貝葉斯分類器
之前理解朴素貝葉斯中的結尾對sklearn中的朴素貝葉斯進行了簡單的介紹.
此處對sklearn中的則對sklearn中的朴素貝葉斯算法進行比較詳細介紹.不過手下還是對朴素貝葉斯本身進行一些補充.
朴素貝葉斯算法
朴素貝葉斯算法的數學基礎都是圍繞貝葉斯定理展開的,因此這一類算法都被稱為朴素貝葉斯算法.
朴素貝葉斯的分類原理是通過對象的先驗概率,利用貝葉斯公式計算出后驗概率.即對象屬於某一類的概率.
選擇具有后驗概率最大的類作為該對象所屬的類.同時朴素–’特征為獨同分布’,
同時因為先驗概率需要我們先假設一個事件分布的概率分布方式(三種),因此也就有了我們在sklearn中對應的三種朴素貝葉斯算法
- 高斯朴素貝葉斯分類器(默認條件概率分布概率符合高斯分布)
- 多項式朴素貝葉斯分類器(條件概率符合多項式分布)
- 伯努利朴素貝葉斯分類器(條件概率符合二項分布)
盡管其假設過於簡單,但是在很多實際情況下,朴素貝葉斯工作得很好,特別是文檔分類和垃圾郵件過濾。
這些工作都要求一個小的訓練集來估計必需參數。
同時相比於其他更復雜的方法,朴素貝葉斯學習器和分類器非常快。
分類條件分布的解耦意味着可以獨立單獨地把每個特征視為一維分布來估計。這樣反過來有助於緩解維度災難帶來的問題。
* 最后總結其特點有以下幾個 *
- 屬性可以離散可以連續
- 數學基礎扎實,分類效率穩定
- 對噪音數據與缺失數據不太敏感
- 屬性如果不相關,分類效果很好;如果相關,則不低於決策樹
- 假設簡單,但是在很多實際情況下表現很好
- 速度較快,一定程度上緩解了維度災難
%matplotlib inline
from sklearn import datasets, model_selection, naive_bayes
import matplotlib.pyplot as plt
import numpy as np
def load_data(datasets_name='iris'):
if datasets_name == 'iris':
data = datasets.load_iris() # 加載 scikit-learn 自帶的 iris 鳶尾花數據集-分類
elif datasets_name == 'wine': # 0.18.2 沒有
data = datasets.load_wine() # 加載 scikit-learn 自帶的 wine 紅酒起源數據集-分類
elif datasets_name == 'cancer':
data = datasets.load_breast_cancer() # 加載 scikit-learn 自帶的 乳腺癌數據集-分類
elif datasets_name == 'digits':
data = datasets.load_digits() # 加載 scikit-learn 自帶的 digits 糖尿病數據集-回歸
elif datasets_name == 'boston':
data = datasets.load_boston() # 加載 scikit-learn 自帶的 boston 波士頓房價數據集-回歸
else:
pass
return model_selection.train_test_split(data.data, data.target,test_size=0.25, random_state=0,stratify=data.target)
# 分層采樣拆分成訓練集和測試集,測試集大小為原始數據集大小的 1/4
測試sklearn中的朴素貝葉斯算法,sklearn中朴素貝葉斯算法比較簡單,只有三種
也正是因為朴素貝葉斯算法比較簡單,下面的代碼已經基本給出了sklearn中朴素貝葉斯算法的所以有關內容.
你可以運行下面的代碼進行測試,同時下面也包括一定的可視化內容.
朴素貝葉斯模型可以解決整個訓練集不能導入內存的大規模分類問題。 為了解決這個問題, MultinomialNB, BernoulliNB, 和 GaussianNB 實現了 partial_fit 方法,可以動態的增加數據,使用方法與其他分類器的一樣,使用示例見 Out-of-core classification of text documents 。所有的朴素貝葉斯分類器都支持樣本權重。
與 fit 方法不同,首次調用 partial_fit 方法需要傳遞一個所有期望的類標簽的列表,之后只需要調用數據即可.
def test_GaussianNB(*data, show=False):
X_train, X_test, y_train, y_test = data
cls = naive_bayes.GaussianNB()
cls.fit(X_train, y_train)
# print('GaussianNB Training Score: %.2f' % cls.score(X_train, y_train))
print('GaussianNB Testing Score: %.2f' % cls.score(X_test, y_test))
def test_MultinomialNB(*data, show=False):
X_train, X_test, y_train, y_test = data
cls = naive_bayes.MultinomialNB()
cls.fit(X_train, y_train)
# print('MultinomialNB Training Score: %.2f' % cls.score(X_train, y_train))
print('MultinomialNB Testing Score: %.2f' % cls.score(X_test, y_test))
def test_MultinomialNB_alpha(*data, show=False):
X_train, X_test, y_train, y_test = data
alphas = np.logspace(-2, 5, num=200)
train_scores = []
test_scores = []
for alpha in alphas:
cls = naive_bayes.MultinomialNB(alpha=alpha)
cls.fit(X_train, y_train)
train_scores.append(cls.score(X_train, y_train))
test_scores.append(cls.score(X_test, y_test))
if show:
## 繪圖:MultinomialNB 的預測性能隨 alpha 參數的影響
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(alphas, train_scores, label='Training Score')
ax.plot(alphas, test_scores, label='Testing Score')
ax.set_xlabel(r'$\alpha$')
ax.set_ylabel('score')
ax.set_ylim(0, 1.0)
ax.set_title('MultinomialNB')
ax.set_xscale('log')
plt.show()
# print('MultinomialNB_alpha best train_scores %.2f' % (max(train_scores)))
print('MultinomialNB_alpha best test_scores %.2f' % (max(test_scores)))
def test_BernoulliNB(*data, show=False):
X_train, X_test, y_train, y_test = data
cls = naive_bayes.BernoulliNB()
cls.fit(X_train, y_train)
# print('BernoulliNB Training Score: %.2f' % cls.score(X_train, y_train))
print('BernoulliNB Testing Score: %.2f' % cls.score(X_test, y_test))
def test_BernoulliNB_alpha(*data, show=False):
X_train, X_test, y_train, y_test = data
alphas = np.logspace(-2, 5, num=200)
train_scores = []
test_scores = []
for alpha in alphas:
cls = naive_bayes.BernoulliNB(alpha=alpha)
cls.fit(X_train, y_train)
train_scores.append(cls.score(X_train, y_train))
test_scores.append(cls.score(X_test, y_test))
if show:
## 繪圖-展示BernoulliNB 的預測性能隨 alpha 參數的影響
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(alphas, train_scores, label='Training Score')
ax.plot(alphas, test_scores, label='Testing Score')
ax.set_xlabel(r'$\alpha$')
ax.set_ylabel('score')
ax.set_ylim(0, 1.0)
ax.set_title('BernoulliNB')
ax.set_xscale('log')
ax.legend(loc='best')
plt.show()
# print('BernoulliNB_alpha best train_scores %.2f' % (max(train_scores)))
print('BernoulliNB_alpha best test_scores %.2f' % (max(test_scores)))
def test_BernoulliNB_binarize(*data, show=False):
X_train, X_test, y_train, y_test = data
min_x = min(np.min(X_train.ravel()), np.min(X_test.ravel())) - 0.1
max_x = max(np.max(X_train.ravel()), np.max(X_test.ravel())) + 0.1
binarizes = np.linspace(min_x, max_x, endpoint=True, num=100)
train_scores = []
test_scores = []
for binarize in binarizes:
cls = naive_bayes.BernoulliNB(binarize=binarize)
cls.fit(X_train, y_train)
train_scores.append(cls.score(X_train, y_train))
test_scores.append(cls.score(X_test, y_test))
if show:
## 繪圖-展示BernoulliNB 的預測性能隨 binarize 參數的影響
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(binarizes, train_scores, label='Training Score')
ax.plot(binarizes, test_scores, label='Testing Score')
ax.set_xlabel('binarize')
ax.set_ylabel('score')
ax.set_ylim(0, 1.0)
ax.set_xlim(min_x - 1, max_x + 1)
ax.set_title('BernoulliNB')
ax.legend(loc='best')
plt.show()
# print('BernoulliNB_binarize best train_scores %.2f' % (max(train_scores)))
print('BernoulliNB_binarize best test_scores %.2f' % (max(test_scores)))
def testFuc(fuc,show = False,no_all = True):
for i in ['iris', 'wine', 'cancer', 'digits', ]:
print('\n====== %s ======\n' % i)
X_train, X_test, y_train, y_test = load_data(datasets_name=i) # 產生用於分類問題的數據集
if no_all:
fuc(X_train, X_test, y_train, y_test,show = show)
else:
test_GaussianNB(X_train, X_test, y_train, y_test,show = show) # 調用 test_GaussianNB
test_MultinomialNB(X_train,X_test,y_train,y_test,show = show) # 調用 test_MultinomialNB
test_MultinomialNB_alpha(X_train, X_test, y_train, y_test,show = show) # 調用 test_MultinomialNB_alpha
test_BernoulliNB(X_train,X_test,y_train,y_test,show = show) # 調用 test_BernoulliNB
test_BernoulliNB_alpha(X_train, X_test, y_train, y_test,show = show) # 調用 test_BernoulliNB_alpha
test_BernoulliNB_binarize(X_train, X_test, y_train, y_test,show = show) # 調用 test_BernoulliNB_binarize
* 下面是前面我們定義的用來測試的函數*
test_GaussianNB(X_train, X_test, y_train, y_test) # 調用 test_GaussianNB
test_MultinomialNB(X_train,X_test,y_train,y_test) # 調用 test_MultinomialNB
test_MultinomialNB_alpha(X_train, X_test, y_train, y_test) # 調用 test_MultinomialNB_alpha
test_BernoulliNB(X_train,X_test,y_train,y_test) # 調用 test_BernoulliNB
test_BernoulliNB_alpha(X_train, X_test, y_train, y_test) # 調用 test_BernoulliNB_alpha
test_BernoulliNB_binarize(X_train, X_test, y_train, y_test) # 調用 test_BernoulliNB_binarize
testFuc(test_GaussianNB)
====== iris ======
GaussianNB Testing Score: 0.97
====== wine ======
GaussianNB Testing Score: 0.96
====== cancer ======
GaussianNB Testing Score: 0.92
====== digits ======
GaussianNB Testing Score: 0.84
testFuc(test_MultinomialNB,no_all = False)
====== iris ======
GaussianNB Testing Score: 0.97
MultinomialNB Testing Score: 1.00
MultinomialNB_alpha best test_scores 1.00
BernoulliNB Testing Score: 0.32
BernoulliNB_alpha best test_scores 0.32
BernoulliNB_binarize best test_scores 0.92
====== wine ======
GaussianNB Testing Score: 0.96
MultinomialNB Testing Score: 0.82
MultinomialNB_alpha best test_scores 0.84
BernoulliNB Testing Score: 0.40
BernoulliNB_alpha best test_scores 0.40
BernoulliNB_binarize best test_scores 0.69
====== cancer ======
GaussianNB Testing Score: 0.92
MultinomialNB Testing Score: 0.90
MultinomialNB_alpha best test_scores 0.91
BernoulliNB Testing Score: 0.63
BernoulliNB_alpha best test_scores 0.63
BernoulliNB_binarize best test_scores 0.91
====== digits ======
GaussianNB Testing Score: 0.84
MultinomialNB Testing Score: 0.90
MultinomialNB_alpha best test_scores 0.91
BernoulliNB Testing Score: 0.87
BernoulliNB_alpha best test_scores 0.87
BernoulliNB_binarize best test_scores 0.91
不同的朴素貝葉斯算法的差異在於其假設的先驗概率的不同
數據的先驗概率越貼近我們假設的先驗概率的時候,我們的模型結果也就越准確
* 對於同一個算法,不同的超參數也有一定的影響,這個你可以通過改變我寫的test_fun中的超參數show來進行繪圖操作,查看不同超參數的區別 *
參考資料
對於朴素貝葉斯原理性的理解可以參考
- 理解朴素貝葉斯
- sklearn中文文檔-朴素貝葉斯
- 《python大戰機器學習 數據科學家的一個小目標》 華校專,王正林編著