当前位置:   article > 正文

朴素贝叶斯_采用鸢尾花数据集实现朴素贝叶斯算法计算预测错误率

采用鸢尾花数据集实现朴素贝叶斯算法计算预测错误率

1.关键词

  • 朴素:独立性假设
  • 贝叶斯公式
    贝叶斯公式简单例子

另一个例子,现分别有 A、B 两个容器,在容器 A 里分别有 7 个红球和 3 个白球,在容器 B 里有 1 个红球和 9 个白球,现已知从这两个容器里任意抽出了一个球,且是红球,问这个红球是来自容器 A 的概率是多少?
假设已经抽出红球为事件 B,选中容器 A 为事件 A,则有:P(B) = 8/20,P(A) = 1/2,P(B|A) = 7/10,按照公式,则有:P(A|B) = (7/10)*(1/2) / (8/20) = 0.875
朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下:

贝叶斯公式.jpg

这个公式虽然看上去简单,但它却能总结历史,预知未来:

  • 公式的右边是总结历史
  • 公式的左边是预知未来

2.朴素贝叶斯优缺点

优点:

  • 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率;
  • 对小规模的数据表现很好;
  • 能处理多分类任务,适合增量式训练;
  • 对缺失数据不太敏感,算法也比较简单,常用于文本分类

缺点:

  • 只能用于分类问题
  • 需要计算先验概率;
  • 分类决策存在错误率;
  • 对输入数据的表达形式很敏感

3. 三种贝叶斯模型

导包,导入数据

from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
from sklearn.datasets import load_iris
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

iris = load_iris()
data = iris.data[:,0:2]
target = iris.target
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.1、高斯分布朴素贝叶斯

ga_NB = GaussianNB()
ga_NB.fit(data, target)
ga_NB.score(data, target)
out[]:0.78
  • 1
  • 2
  • 3
  • 4

高斯分布就是正态分布
【用途】用于一般分类问题
使用自带的鸢尾花数据

xmin, xmax = data[:,0].min(),data[:,0].max()
ymin, ymax = data[:,1].min(), data[:,1].max()
x, y = np.linspace(xmin, xmax, 1000), np.linspace(ymin, ymax, 1000)
X,Y = np.meshgrid(x,y)
X_test = np.c_[X.ravel(), Y.ravel()]
  • 1
  • 2
  • 3
  • 4
  • 5
# 预测
y_ = ga_NB.predict(X_test)
  • 1
  • 2
# 画出分类决策线
plt.pcolormesh(X, Y, y_.reshape(1000,1000))
# 画出原始点
plt.scatter(data[:,0], data[:,1],c=target, cmap='rainbow')
  • 1
  • 2
  • 3
  • 4

高斯分布.png

3.2、多项式分布朴素贝叶斯

多项式分布:

多项式分布.jpg

【用途】适用于文本数据(特征表示的是次数,例如某个词语的出现次数)

例:延续上面,使用鸢尾花数据
mu_NB = MultinomialNB()
mu_NB.fit(data, target)
mu_NB.score(data, target)
out:0.6666666666666666
  • 1
  • 2
  • 3
  • 4
# 预测
y_ = mu_NB.predict(X_test)
# 画出分类决策线
plt.pcolormesh(X, Y, y_.reshape(1000,1000))
# 画出原始点
plt.scatter(data[:,0], data[:,1],c=target, cmap='rainbow')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

多项式分布.png

3.3、伯努利分布朴素贝叶斯

伯努利分布:

伯努利分布.png

【用途】适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0)

绝大多数情况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤其是对于小数量级的文本数据

例:继续使用鸢尾花数据集
be_NB = BernoulliNB()
be_NB.fit(data, target)
be_NB.score(data, target)
out:0.3333333333333333
  • 1
  • 2
  • 3
  • 4
# 预测
y_ = be_NB.predict(X_test)
# 画出分类决策线
plt.pcolormesh(X, Y, y_.reshape(1000,1000))
# 画出原始点
plt.scatter(data[:,0], data[:,1],c=target, cmap='rainbow')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

伯努利分布.png

4、文本分类实战

sms = pd.read_csv('../../data/SMSSpamCollection', header=None, sep='\t')
sms
  • 1
  • 2
data = sms[1].values
target = sms[0].values
  • 1
  • 2
data.shape
out:(5572,)
  • 1
  • 2

由于读取出来的data是字符串数据
导入sklearn.feature_extraction.text.TfidfVectorizer用于转换字符串
读取短信数据

from sklearn.feature_extraction.text import TfidfVectorizer
  • 1
# 只转化data会变成sparse.csr.csr_matrix
# fit_transform
tf = TfidfVectorizer()
# 训练和转换一起做
data = tf.fit_transform(data).toarray()
  • 1
  • 2
  • 3
  • 4
  • 5
ga_NB = GaussianNB()
ga_NB.fit(data, target)
ga_NB.score(data, target)
out:0.9414931801866475
  • 1
  • 2
  • 3
  • 4
# 自己生成预测数据
messages = [
    "how are you.I'm fine thank you and you?",
    "nice to meet you ,nice to meet you too.", 
    "fuck off",
    "congratulation, you've won a prize, please call 0086131111111 to get the reward.",
    "Big Surprise, goods are 50% off.",
    "Mark six number is 34, have you won, if want to win ,please follow us",
    "HanMeiMei ,I'm Lilei, I love you.would be my grilfriend.",
    "OK, let's have a dinner together."
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
# 高斯分布预测
y_ = ga_NB.predict(X_test)
y_
out:array(['ham', 'ham', 'ham', 'spam', 'ham', 'ham', 'spam', 'ham'],
      dtype='<U4')
  • 1
  • 2
  • 3
  • 4
  • 5
# 多项式
mu_NB = MultinomialNB()
mu_NB.fit(data, target)
mu_NB.score(data, target)
out:0.9761306532663316
  • 1
  • 2
  • 3
  • 4
  • 5
mu_NB.predict(X_test)
out:array(['ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham'],
      dtype='<U4')
  • 1
  • 2
  • 3
# 伯努利
be_NB = BernoulliNB()
be_NB.fit(data, target)
be_NB.score(data, target)
out:0.9881550610193827
  • 1
  • 2
  • 3
  • 4
  • 5
be_NB.predict(X_test)
out:array(['ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham'],
      dtype='<U4')
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/340815
推荐阅读
相关标签
  

闽ICP备14008679号