朴素贝叶斯Naive Bayes

1.朴素贝叶斯Naive Bayes

Bayes是一个宗教信徒,他试图证明神的存在,他本身不naive,然而他的算法很naive

1.1GaussianNB算法使用示例

>>> import numpy as np

>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])

>>> Y = np.array([1, 1, 1, 2, 2, 2])

>>> from sklearn.naive_bayes import GaussianNB

>>> clf = GaussianNB()

>>> clf.fit(X, Y)

GaussianNB(priors=None)

>>> print(clf.predict([[-0.8, -1]]))

[1]

>>> clf_pf = GaussianNB()

>>> clf_pf.partial_fit(X, Y, np.unique(Y))

GaussianNB(priors=None)

>>> print(clf_pf.predict([[-0.8, -1]]))

[1]

 

1.2算法过程

1.引入包:从sklearn.naive_bayes包中引入GaussianNB算法

from sklearn.naive_bayes import GaussianNB

2.创建分类器clf

clf = GaussianNB()

3.分类器clf调用训练函数fit,将X和Y参数传递给fit函数,X是特征参数,Y是标签参数。

clf.fit(features_train, labels_train)

4.然后使用训练完的分类器对新数据做预测:

print(clf.predict(features_test))

5.评估分类器的准确性:

准确性被定义为正确分类的测试点数目除以测试点总数

  方法1:分类器调用clf调用score函数

print clf.score(features_test, labels_test)

  方法2:引入sklearn的accuracy_score模块

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(pred, labels_test)

  方法3:自定义函数:思路(正确分类的测试点数目除以测试点总数)

 

注:可以保留10%的训练数据作为测试数据,如果测试数据恒为训练数据子集,那么准确率将为100%,所以确保客观正确的准确率。

 

1.3朴素贝叶斯示例

假如癌症发生概率为1%,患病且被检查出阳性的概率为90%,试问检查出阳性的患病几率有多大?

解:P(阳|患病)=1%*90%

         P(阳|没病)=(1-1%)%*(1-90%)

         P= P(阳|没病)/[ P(阳|没病)+ P(阳|患病)]

得出答案为8%

 

贝叶斯公式我从来都记不住,每次都根据逻辑生推,脑子不好使没办法。。。

 

1.4朴素贝叶斯相关理论

区分先验概率、后验概率:

先验概率为题干已知的1%,90%。

后验概率为由已知先验概率得出的概率,如P(阳|患病)、P(阳|没病)等。

 

1.5朴素贝叶斯的优势

优势:1.易于执行

2.特征空间非常大,在2-20万英文单词内

3. 朴素贝叶斯这种算法非常适合文本分类

 

1.6练习: 作者身份准确率

介绍:有一组邮件,分别由同一家公司的两个人撰写其中半数的邮件。项目的目标是仅根据邮件正文区分每个人写的邮件。在这个迷你项目一开始,将使用朴素贝叶斯,并在之后的项目中扩展至其他算法。

要求: 在 naive_bayes/nb_author_id.py 中创建和训练朴素贝叶斯分类器,用其为测试集进行预测。准确率是多少?

1.此过程需要安装sklearn:pip install scikit-learn

2.安装自然语言工具包:pip install nltk

相应代码(naive_bayes_cnblogs)都已经提供,可下载试运行(但需要我们编写的只有naive_bayes相关的代码。)

代码部分:

from sklearn.naive_bayes import GaussianNB

clf=GaussianNB()

clf.fit(features_train,labels_train)

pred=clf.predict(features_test)

sco=clf.score(features_test,labels_test)

print sco

运行代码后可得出naive_bayes对此项目的预测准确度有0.973265073948

 

1.7对分类器计时

比较训练和预测特征的用时长短。我们可以猜测认为训练特征花费份额时间更多。

我们可以在需要计时的代码上下文添加计时代码。

t0 = time()
< 要计时的代码行 >
print "training time:", round(time()-t0, 3), "s"

得到的结果为:training time: 1.22 s

predicting time: 0.168 s

所以我们得出的结论是,训练特征比预测特征所需时间更长,符合我们的认知和猜测。

posted @ 2017-10-13 14:46  Fly_lulu  阅读(773)  评论(0编辑  收藏  举报