朴素贝叶斯

原理

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。

贝叶斯定理

P(AB)P(A|B) 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:
P(AB)=P(AB)P(B)P(A|B)=\frac{P(AB)}{P(B)}
贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路:
P(BA)=P(AB)P(B)P(A)P(B|A)=\frac{P(A|B)P(B)}{P(A)}

朴素贝叶斯算法包含多种方法,主要有贝努力朴素贝叶斯、高斯朴素贝叶斯、多项式朴素贝叶斯。

贝努力朴素贝叶斯

该模型适用于符合贝努力分布的数据集,贝努力分布也被成为“二项分布”或者“0-1 分布”。

import numpy as np
from sklearn.naive_bayes import BernoulliNB
  
  
def bayes1():
   # 分别表示:[刮北风、闷热、多云、天气预报有雨]
   X = np.array([[0, 1, 0, 1],
                 [1, 1, 1, 0],
                 [0, 1, 1, 0],
                 [0, 0, 0, 1],
                 [0, 1, 1, 0],
                 [0, 1, 0, 1],
                 [1, 0, 0, 1]])
   # 实际的 7 天中,是否有雨,0-没雨,1-有雨
   y = np.array([0, 1, 1, 0, 1, 0, 0])
   counts = {}
   for label in np.unique(y):
       counts[label] = X[y == label].sum(axis=0)
   print('feature counts:\n{}'.format(counts))
   clf = BernoulliNB()
   clf.fit(X, y)
   Next_day = [[0, 0, 1, 0]]
   pre = clf.predict(Next_day)
   print('------------')
   if pre == [1]:
       print('要下雨了')
   else:
       print('晴天')
   print('--------------')
   # 朴素贝叶斯对于预测具体的数值并不擅长,给出的概率仅供参考
   print('模型预测分类的概率:{}'.format(clf.predict_proba(Next_day)))
   print('--------------')

运行结果

feature counts:
{0: array([1, 2, 0, 4]), 1: array([1, 3, 3, 0])}
------------
要下雨了
--------------
模型预测分类的概率:[[0.13848881 0.86151119]]
--------------
高斯朴素贝叶斯

改模型适用于符合高斯分布的数据集,或者说符合正态分布。

from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
import numpy as np


def guassian1():
    X, y = make_blobs(n_samples=500, centers=5, random_state=8)
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
    gnb = GaussianNB()
    gnb.fit(X_train, y_train)
    print('--------------')
    print('模型得分:{:.3f}'.format(gnb.score(X_test, y_test)))
    print('-----------')
    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
    # 用不同的色块表示不同的分类
    xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                         np.arange(y_min, y_max, .02))
    z = gnb.predict(np.c_[(xx.ravel(), yy.ravel())]).reshape(xx.shape)
    plt.pcolormesh(xx, yy, z)
    # 用散点图画出训练集和测试数据集
    plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k')
    plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, marker='*', edgecolors='k')
    # 设定横轴纵轴的范围
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    # 设定图题
    plt.title('gaussianNB')
    plt.show()

运行结果

--------------
模型得分:0.968
-----------
高斯分布
多项式朴素贝叶斯

该模型适用于符合多项式分布的数据集,输入的 X 必须是非负的。

from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split


def multinomial1():
    X, y = make_blobs(n_samples=500, centers=5, random_state=8)
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
    scaler = MinMaxScaler()
    scaler.fit(X_train)
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    mnb = MultinomialNB()
    mnb.fit(X_train_scaled, y_train)
    print('------')
    print('模型得分:{:.3f}'.format(mnb.score(X_test_scaled, y_test)))
    print('------') 

运行结果

------
模型得分:0.320
------
预测肿瘤
# 导入威斯康星乳腺肿瘤数据集
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
    

def example1():
    cancer = load_breast_cancer()
    print('--------------')
    print(cancer.keys())
    print('---------------------')
    print('肿瘤的分类:', cancer['target_names'])
    print('肿瘤的特征:', cancer['feature_names'])
    X, y = cancer.data, cancer.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=38)
    print('------------------')
    print('训练集数据形态:', X_train.shape)
    print('测试集数据形态:', X_test.shape)
    print('------------------')
    gnb = GaussianNB()
    gnb.fit(X_train, y_train)
    print('----------------')
    print('训练集得分:{:.3f}'.format(gnb.score(X_train, y_train)))
    print('测试集得分:{:.3f}'.format(gnb.score(X_test, y_test)))
    print('----------------')

运行结果

--------------
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
---------------------
肿瘤的分类: ['malignant' 'benign']
肿瘤的特征: ['mean radius' 'mean texture' 'mean perimeter' 'mean area'
 'mean smoothness' 'mean compactness' 'mean concavity'
 'mean concave points' 'mean symmetry' 'mean fractal dimension'
 'radius error' 'texture error' 'perimeter error' 'area error'
 'smoothness error' 'compactness error' 'concavity error'
 'concave points error' 'symmetry error' 'fractal dimension error'
 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
 'worst smoothness' 'worst compactness' 'worst concavity'
 'worst concave points' 'worst symmetry' 'worst fractal dimension']
------------------
训练集数据形态: (426, 30)
测试集数据形态: (143, 30)
------------------
----------------
训练集得分:0.948
测试集得分:0.944
----------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章