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
所以我们得出的结论是,训练特征比预测特征所需时间更长,符合我们的认知和猜测。