贝叶斯决策论

贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

假设有贝叶斯分类器 - 图1种可能的类别标记,即贝叶斯分类器 - 图2贝叶斯分类器 - 图3是将一个真实标记为贝叶斯分类器 - 图4的样本误分类为贝叶斯分类器 - 图5所产生的损失,基于后验概率贝叶斯分类器 - 图6可获得将样本贝叶斯分类器 - 图7分类为贝叶斯分类器 - 图8所产生的期望损失,即在样本贝叶斯分类器 - 图9上的“条件风险”:

贝叶斯分类器 - 图10

我们的任务是寻找一个判定准则贝叶斯分类器 - 图11以最小化总体风险

贝叶斯分类器 - 图12

显然,对每个样本贝叶斯分类器 - 图13,若贝叶斯分类器 - 图14能最小化条件风险贝叶斯分类器 - 图15,则总体风险贝叶斯分类器 - 图16也将被最小化。这就产生了贝叶斯判定准则:为最小化总体风险,只需在每个样本上选择那个能使条件风险贝叶斯分类器 - 图17最小的类型标记,即

贝叶斯分类器 - 图18

此时,贝叶斯分类器 - 图19称为贝叶斯最优分类器,与之对应的总体风险贝叶斯分类器 - 图20称为贝叶斯风险。贝叶斯分类器 - 图21反映了分类器所能达到的最好性能,即通过机器学习所能产生的模型精度的上限。具体来说,若目标是最小化分类错误率,则误判损失贝叶斯分类器 - 图22可写为

贝叶斯分类器 - 图23

此时条件风险

贝叶斯分类器 - 图24

于是,最小化分类错误率的贝叶斯最优分类器为

贝叶斯分类器 - 图25

即对每个样本贝叶斯分类器 - 图26,选择能使后验概率贝叶斯分类器 - 图27最大的类别标记。

不难看出,欲使用贝叶斯判定准则来最小化决策风险,首先要获得后验概率贝叶斯分类器 - 图28。然而,在现实任务中这通常难以直接获得。从这个角度来看,机器学习所要实现的是基于有限的训练样本集尽可能准确地估计出后验概率贝叶斯分类器 - 图29。大体来说,主要有两种策略:

  1. 给定贝叶斯分类器 - 图30,可通过直接建模贝叶斯分类器 - 图31来预测贝叶斯分类器 - 图32,这样就得到的是“判别式模型”
  2. 先对联合概率分布贝叶斯分类器 - 图33建模,然后再由此获得贝叶斯分类器 - 图34,这样得到的是“生成模型”

显然决策树,支持向量机等都可归入判别模型范畴。对生成模型来说,必然考虑

贝叶斯分类器 - 图35

基于贝叶斯定理,贝叶斯分类器 - 图36可写为

贝叶斯分类器 - 图37

其中,贝叶斯分类器 - 图38是类“先验”概率;贝叶斯分类器 - 图39是样本贝叶斯分类器 - 图40相对于标记贝叶斯分类器 - 图41的类条件概率,或称为“似然”;贝叶斯分类器 - 图42是用于归一化的“证据”因子。对给定样本贝叶斯分类器 - 图43,证据因子贝叶斯分类器 - 图44与类标记无关,因此估计贝叶斯分类器 - 图45的问题就转化为如何基于训练数据贝叶斯分类器 - 图46来估计先验概率贝叶斯分类器 - 图47和似然贝叶斯分类器 - 图48

类先验概率贝叶斯分类器 - 图49表达了样本空间中各样本所占的比例,根据大数定律,当训练集包含充足的独立同分布样本时,贝叶斯分类器 - 图50可通过各类样本出现的频率来进行估计。

对类条件概率贝叶斯分类器 - 图51来说,由于它涉及关于贝叶斯分类器 - 图52所有属性的联合概率,直接根据样本出现的频率来估计将会遇到严重的困难。例如,假设样本贝叶斯分类器 - 图53个属性值都是二值的,则样本空间将有贝叶斯分类器 - 图54种可能的取值,在现实应用中,这个值往往远大于训练样本数贝叶斯分类器 - 图55,也就是说,很多样本取值在训练集中根本没出现,直接用频率来估计贝叶斯分类器 - 图56显然不可行,因为“未被观测到”与“出现概率为零”通常是不同的。估计类条件概率的一种常用策略是先假定其具有某种确定的概率分布形式,再基于训练样本对概率分布的参数进行估计。具体地,记关于类别贝叶斯分类器 - 图57的类条件概率为贝叶斯分类器 - 图58,假设贝叶斯分类器 - 图59具有确定的形式并且被参数向量贝叶斯分类器 - 图60唯一确定,则我们的任务就是利用训练集贝叶斯分类器 - 图61估计参数贝叶斯分类器 - 图62。为明确起见,我们将贝叶斯分类器 - 图63记为贝叶斯分类器 - 图64。事实上,概率模型的训练过程就是参数估计的过程,可用极大似然估计来确定估计概率分布参数。

朴素贝叶斯分类器

不难发现,基于贝叶斯公式贝叶斯分类器 - 图65来估计后验概率贝叶斯分类器 - 图66的主要困难在于:类条件概率贝叶斯分类器 - 图67是所有属性上的联合概率,难以从有限的训练样本直接估计而得。为避开这个障碍,朴素贝叶斯分类器采用了“属性条件独立性假设”:对已知类别,假设所有属性独立。换言之,假设每个属性独立地对分类结果发生影响。基于属性条件独立性假设:

贝叶斯分类器 - 图68

其中贝叶斯分类器 - 图69为属性数目,贝叶斯分类器 - 图70贝叶斯分类器 - 图71在第贝叶斯分类器 - 图72个属性上的取值。

由于对所有类别来说贝叶斯分类器 - 图73相同,因此基于贝叶斯分类器 - 图74的贝叶斯判定准则:

贝叶斯分类器 - 图75

这就是朴素贝叶斯分类器的表达式。显然,朴素贝叶斯分类器的训练过程就是基于训练集贝叶斯分类器 - 图76来估计类先验概率贝叶斯分类器 - 图77,并为每个属性估计条件概率贝叶斯分类器 - 图78

贝叶斯分类器 - 图79表示训练集贝叶斯分类器 - 图80中第贝叶斯分类器 - 图81类样本的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率

贝叶斯分类器 - 图82

对离散属性而言,令贝叶斯分类器 - 图83表示贝叶斯分类器 - 图84中在第贝叶斯分类器 - 图85个属性上取值为贝叶斯分类器 - 图86的样本组成的集合,则条件概率贝叶斯分类器 - 图87可估计为

贝叶斯分类器 - 图88

对连续属性可考虑概率密度,假定贝叶斯分类器 - 图89,其中贝叶斯分类器 - 图90贝叶斯分类器 - 图91分别是第贝叶斯分类器 - 图92类样本在第贝叶斯分类器 - 图93个属性上取值的均值和方差,则有

贝叶斯分类器 - 图94

举例说明

贝叶斯.jpg

假设我们对编号1进行分类(假设不知道其是否好瓜)

1、首先估计类先验概率贝叶斯分类器 - 图96,显然有:

贝叶斯分类器 - 图97 贝叶斯分类器 - 图98

2、然后,为每个属性估计条件概率贝叶斯分类器 - 图99

贝叶斯分类器 - 图100

于是,有

贝叶斯分类器 - 图101

贝叶斯分类器 - 图102

由于贝叶斯分类器 - 图103,因此,朴素贝叶斯分类器将样本1判别为“好瓜”。

需注意,若某个属性值在训练集中没有与某个类同时出现过,则直接用上述方法进行概率估计会出现问题,假设对一个“敲声=清脆”的测试例,有贝叶斯分类器 - 图104。所以无论其他属性是什么,连乘计算出概率为零。为避免这种情况,在估计概率值时通常进行“平滑”,常用“拉普拉斯修正”。

Code实现

基于贝叶斯定理与特征条件独立假设的分类方法。模型:高斯模型、多项式模型、伯努利模型

数据

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. %matplotlib inline
  5. from sklearn.datasets import load_iris
  6. from sklearn.model_selection import train_test_split
  7. from collections import Counter
  8. import math
  9. # data
  10. def create_data():
  11. iris = load_iris()
  12. df = pd.DataFrame(iris.data, columns=iris.feature_names)
  13. df['label'] = iris.target
  14. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
  15. data = np.array(df.iloc[:100, :])
  16. # print(data)
  17. return data[:,:-1], data[:,-1]
  18. X, y = create_data()
  19. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

手写实现

  1. class NaiveBayes:
  2. def __init__(self):
  3. self.model = None
  4. # 数学期望
  5. @staticmethod
  6. def mean(X):
  7. return sum(X) / float(len(X))
  8. # 标准差(方差)
  9. def stdev(self, X):
  10. avg = self.mean(X)
  11. return math.sqrt(sum([pow(x-avg, 2) for x in X]) / float(len(X)))
  12. # 概率密度函数
  13. def gaussian_probability(self, x, mean, stdev):
  14. exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
  15. return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent
  16. # 处理X_train
  17. def summarize(self, train_data):
  18. summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)]
  19. return summaries
  20. # 分类别求出数学期望和标准差
  21. def fit(self, X, y):
  22. labels = list(set(y))
  23. data = {label:[] for label in labels}
  24. for f, label in zip(X, y):
  25. data[label].append(f)
  26. self.model = {label: self.summarize(value) for label, value in data.items()}
  27. return 'gaussianNB train done!'
  28. # 计算概率
  29. def calculate_probabilities(self, input_data):
  30. # summaries:{0.0: [(5.0, 0.37),(3.42, 0.40)], 1.0: [(5.8, 0.449),(2.7, 0.27)]}
  31. # input_data:[1.1, 2.2]
  32. probabilities = {}
  33. for label, value in self.model.items():
  34. probabilities[label] = 1
  35. for i in range(len(value)):
  36. mean, stdev = value[i]
  37. probabilities[label] *= self.gaussian_probability(input_data[i], mean, stdev)
  38. return probabilities
  39. # 类别
  40. def predict(self, X_test):
  41. # {0.0: 2.9680340789325763e-27, 1.0: 3.5749783019849535e-26}
  42. label = sorted(self.calculate_probabilities(X_test).items(), key=lambda x: x[-1])[-1][0]
  43. return label
  44. def score(self, X_test, y_test):
  45. right = 0
  46. for X, y in zip(X_test, y_test):
  47. label = self.predict(X)
  48. if label == y:
  49. right += 1
  50. return right / float(len(X_test))
  51. model = NaiveBayes()
  52. model.fit(X_train, y_train)
  53. print(model.predict([4.4, 3.2, 1.3, 0.2]))
  54. model.score(X_test, y_test)

sklearn实现

https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html

  1. from sklearn.naive_bayes import GaussianNB
  2. from sklearn.naive_bayes import BernoulliNB, MultinomialNB # 伯努利模型和多项式模型
  3. clf = GaussianNB()
  4. clf.fit(X_train, y_train)
  5. clf.score(X_test, y_test)
  6. clf.predict([[4.4, 3.2, 1.3, 0.2]])