Haste makes waste

Uda-DataAnalysis-32-机器学习-朴素贝叶斯(Naive Bayesian)

Posted on By lijun

3. 练习:监督分类示例

image

  • 监督分类

又称训练场地法、训练分类法,是以建立统计识别函数为理论基础、依据典型样本训练方法进行分类的技术,即根据已知训练区提供的样本,通过选择特征参数,求出特征参数作为决策规则,建立判别函数以对各待分类影像进行的图像分类,是模式识别的一种方法。

  • 非监督分类

指人们事先对分类过程不施加任何的先验知识,而仅凭数据(遥感影像地物的光谱特征的分布规律),即自然聚类的特性,进行“盲目”的分类。

银行数据中寻找欺诈,以及学生分组属于分监督分类。

7. 地形数据分类:坡度和颠簸度

image

地形数据常用来进行速度的控制。

13. 从散点图到决策面

image

本课就是希望通过朴素贝叶斯方法,找到这个决策面。

18. GaussianNB使用示例

>>> 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]

19. 有关地形数据的GaussianNB 部署

def classify(features_train, labels_train):   
    ### import the sklearn module for GaussianNB
    ### create classifier
    ### fit the classifier on the training features and labels
    ### return the fit classifier
    
    ### your code goes here!
    
    from sklearn.naive_bayes import GaussianNB
    clf = GaussianNB()
    clf.fit(features_train,labels_train)
    return clf

运行测试程序后得到结果:

image

20. 计算 GaussianNB 准确性

def NBAccuracy(features_train, labels_train, features_test, labels_test):
    """ compute the accuracy of your Naive Bayes classifier """
    ### import the sklearn module for GaussianNB
    from sklearn.naive_bayes import GaussianNB

    ### create classifier
    clf = GaussianNB()

    ### fit the classifier on the training features and labels
    clf.fit(features_train,labels_train)

    ### use the trained classifier to predict labels for the test features
    pred = clf.predict(features_test)

    ### calculate and return the accuracy on the test data
    ### this is slightly different than the example, 
    ### where we just print the accuracy
    ### you might need to import an sklearn module
    
    from sklearn.metrics import accuracy_score
    
    accuracy = accuracy_score(labels_test, pred)
    return accuracy

计算结果为:

Good job! Your output matches our solution.
Here's your output:
0.884

23. 贝叶斯定理

image

即如上的公式,推导过程参考贝叶斯推断及其互联网应用(一):定理简介

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

24. 练习: 癌症测试

image

示例: 得癌症的几率是0.01,另外癌症的情况下阳性的概率是0.9,如果不是癌症是阴性的概率是0.9. 某个人的测试结果是阳性,请问其为癌症的概率是多少?

  • 贝叶斯规则

image

先验概率 * 测试得到的结论 => 后验概率

image

小圆圈表示癌症,大圆圈表示阳性,中间重叠部分表示阳性且癌症,所以在阳性下得癌症的几率是 0.009 / (0.009 + 0.099) = 0.0833

如果根据贝叶斯定理进行计算的话:

# 已知
P(C) = 0.01
P(P|C) = 0.9
P(N|not C) = 0.9

# 贝叶斯定理
P(P|C) = P(C|P)*P(P) / P(C)

# 要计算P(C|P),需要先求解P(P),即阳性的概率,其计算依据下图的公式
P(P) = P(C)*P(P|C) + P(not C)*P(P|not C) = 0.01*0.9 + 0.99*(1-0.9) = 0.09 + 0.099 = 0.108

# 将已知概率和求解出来的概率代入,得到阳性下癌症的概率
0.9 = P(C|P) * 0.108 /0.01

P(C|P) = 0.009/0.108 = 0.0833

image

28. 规范化

image

同样根据贝叶斯原理计算:

  • 0.009 / 0.108 = 0.0833
  • 0.099 / 0.108 = 0.9167

30. 贝叶斯规则图

image

31. 用于分类的贝叶斯规则

image

计算概率:

CHRIS = 0.1 * 0.1 * 0.5 = 0.005
SARA = 0.3 * 0.3 * 0.5 = 0.03

33. 后验概率

image

根据贝叶斯定理计算:

P(CHRIS | "LIFE DEAL") = P("LIFE DEAL" | CHRIS)*P(CHRIS) / P("LIFE DEAL")

= P("LIFE DEAL" | CHRIS)*P(CHRIS) / P("LIFE DEAL" | CHRIS)*P(CHRIS) + P("LIFE DEAL" | SARA)*P(SARA)

= 0.08*0.5 / (0.08*0.5 + 0.06*0.5)

= 0.04 / 0.07 =  0.57

类似,

image

P(CHRIS |"LOVE DEAL") = P("LOVE DEAL" | CHRIS)*P(CHRIS) / P("LOVE DEAL")

= P("LOVE DEAL" | CHRIS)*P(CHRIS) / P("LOVE DEAL" | CHRIS)*P(CHRIS) + P("LOVE DEAL" | SARA)*P(SARA)

= 0.08*0.5 / (0.08*0.5 + 0.1*0.5)

= 0.04 / 0.09 =  0.44

35. 为什么叫做朴素贝叶斯

image

Label A和Lable B中,有每个词出现的频率,给定一段文字,计算各个单词出现的概率,比较大小。 在这个概率的计算中,没有考虑单词的顺序,所以叫做朴素贝叶斯。

41. 迷你项目 - 准备工作

  1. cmd中安装 pip install scikit-learnpip install nltk
  2. C:\python2.7中打开python2.7,使用import sklearnimport nltk确定是否import成功
  3. 下载https://github.com/udacity/ud120-projects.git,基础代码包含所有迷你项目的初始代码。
  4. 进入 tools/ 目录,运行 startup.py。(cmd中操作,需要将python2.7设定为默认python环境,如果要将python环境还原为python3,在环境变量的Path中将python2.7的路径删除),运行比较耗时。
E:\udacity\32-ML\ud120-projects-master\tools>python startup.py

checking for nltk
checking for numpy
checking for scipy
checking for sklearn
...

42. 作者身份准确率

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

#########################################################
### your code goes here ###
from sklearn.naive_bayes import GaussianNB

# 创建分类器
clf = GaussianNB()

t0 = time()
# 训练分类器
clf.fit(features_train,labels_train)
print "fit training time:", round(time()-t0, 3), "s"

t0 = time()
# 使用分类器预测
pred = clf.predict(features_test)
print "predict training time:", round(time()-t0, 3), "s"

from sklearn.metrics import accuracy_score

# 计算精度
accuracy = accuracy_score(labels_test, pred)

print accuracy

#########################################################
  • 得到结果为:
no. of Chris training emails: 7936
no. of Sara training emails: 7884
fit training time: 1.151 s
predict training time: 0.157 s
0.973265073948

98. 参考

  1. 贝叶斯推断及其互联网应用(一):定理简介
  2. 贝叶斯推断及其互联网应用(二):过滤垃圾邮件

99. 术语

  • supervised classification: 监督分类
  • emulate:模仿