在处理预测相关的建模问题时你会发现朴素贝叶斯是一个简单而又强大的算法。
在本文中,我们会讨论分类问题中的朴素贝叶斯算法。本文主要介绍了:
这篇文章的主要受众是没有统计概率基础的开发者,当然有些统计概率基础会更好。
让我们开始吧。
在机器学习中,我们通常感兴趣的是给定的数据(d)以及在给定数据上建立的建设(p)。
在分类问题中,我们的假设(h)通常是为新的数据实例(d)分配的类别标签。
选择最合理假设的最简单的方法之一就是利用我们从之前的数据中获得的先验知识。而贝叶斯定理就为我们提供了一种利用先验知识计算假设成立的概率的方法。
贝叶斯定理可以表述为以下形式:
P(h | d)=(P(d | h)* P(h))/ P(d)
上述公式中:
此时,我们上面感兴趣的问题就可以转化为利用P(d),P(d|h)和先验概率p(h)计算后验概率P(h|d)。
在计算了多种假设的后验概率之后,通常选取概率最大的假设作为最终的假设。概率最大的假设又被称为最大后验(MAP)假设。
上述内容可以写成数学形式:
MAP(h)= max(P(h | d))
等价于
MAP(h)= max((P(d | h)* P(h))/ P(d))
P(d)为常数,有
MAP(h)= max(P(d | h)* P(h))
P(d)从数学上来看是为了计算得到的概率和为1而施加的归一化系数。给定数据情况下,当我们只对最大后验假设感兴趣时可以暂时忽略归一化常数P(d)的计算。
回到分类问题上,假设我们的训练数据集中每个类下的实例数目是相同的,即不知道给定数据的情况下该数据属于任何一个类的概率是相同的。此时P(h)也为常数,上式从而可以进一步变换为:
MAP(h)= max(P(d | h))
这几个等价形式在我们下面的教程中都会得到体现。
朴素贝叶斯是适用于二分类和多分类问题的很经典的分类算法。当输入值类型为二进制输入或者标签输入时,从上面的数学表达式可以轻松地理解这个算法的分类原理。
之所以它被称为朴素贝叶斯(naive Bayes,idiot Bayes)是因为它可以将复杂的假设对应的概率的计算简化为多个简单假设概率的组合结果。举例来说,如果你要计算P(d1,d2,d3,...|h)
的值,在各个条件相互独立时,你可以通过上面的数学表达式将P(d1,d2,d3,...|h)
简化为类似A*P(d1|h)\*P(d2|h)\*...
的形式。
上面提到的各个条件相互独立其实是一个很强的条件约束,意味着数据中的各个属性不存在相互作用或者相互作用对属性值没有影响,而真实的数据中往往是不满足这样的强约束的。不过在应用的时候发现在数据不满足相互独立的条件时贝叶斯算法也有着很出色的性能。
朴素贝叶斯模型就是一系列的条件概率的组合。
所以,如果要将训练得到的朴素贝叶斯模型存储到文件中只需要把一系列的概率值有序存储起来即可,这些概率值可以划分为两类:
从训练集中训练得到一个朴素贝叶斯模型时很便捷快速的。
朴素贝叶斯模型训练的速度得益于模型只需要各个类别的概率和给定类别时各个输入值的条件概率即可,不需要任何需要手动或者编码优化的模型参数。
将每个类实例各自出现的频率除以实例的总数就可以得到类概率。
在最简单的分类问题即二分类问题中,可以将两个类别分别编码为0和1,此时类别编码为1的概率为:
P(class = 1)= count(class = 1)/(count(class = 0)+ count(class = 1))
假设测试训练集中两个类别中的实例数相同,那么两个类的概率均为0.5。
将给定类别下各个属性值的出现实例数/频率除以该类别下的所有实例数/频率即可得到条件概率值。
拿一个生活中的例子来说明这个概念:假设训练数据集中“天气”属性有两种,为“晴天”和“雨天”,每个实例还有着你当天的活动(类标签),有“出门”和“宅在家”两种,这个例子中在给定类别(出门/宅在家)的情况下,每个类别的条件概率为:
在得到贝叶斯模型之后,就可以利用模型中包含的类概率和条件概率结合贝叶斯定理预测新样本更可能对应哪一个类标签。
MAP(h)= max(P(d | h)* P(h))
继续用上面的例子讨论,如果我们得到了一个新的样本,样本中天气的属性值为“晴天”,我们可以预测你当天的出门和宅在家里的概率:
出门的类标签得分 = P(天气=晴天|活动=出门) * P(活动=出门)
宅在家的类标签得分 = P(天气=晴天|活动=宅在家)* P(活动=宅在家)
如果至需要预测这一天的活动而不需要输出概率,那么我们只需要选取标签得分最高的类别即可,上面两个等式中的条件概率可以通过上一节的计算方法得到:
P(出门|天气=晴天)= 出门次数 /(出门次数 + 宅在家次数),天气=晴天
P(宅在家|天气=晴天)= 宅在家次数 /(出门次数 + 宅在家次数),天气=晴天
如果我们的数据集中每个实例中的属性值有更多,那么我们可以进一步扩展现在的模型,假设每个实例中还有一个“汽车限号情况”,可能的属性值为“被限号”和“未被限号”两种,此时我们可以在上面的等式上再乘上一个条件概率来扩展我们的贝叶斯模型。
下面列出天气为“晴天”且汽车“未被限号”时“出门”的类标签得分:
出门的类标签得分 = P(天气=晴天|活动=出门) P(汽车限号情况=未被限号|活动=出门) P(活动=出门)
朴素贝叶斯也可以应用于连续实值的属性上,对连续值分布的属性最常见的假设为高斯分布。
基于这个假设的贝叶斯模型的扩展模型被称为Gaussian Naive Bayes。当然也可以用其他的函数来代表数据的分布(比如说多项式分布,伯努利分布等),但是高斯分布(正态分布)是最容易使用的,因为高斯分布的特征参数只有两个:均值和标准差。
在二值属性的朴素贝叶斯模型中,我们利用训练数据集中样本的出现频次计算得到了各个类别下的条件概率。在连续值的情况下,我们需要使用连续输入属性x的均值和标准差来代表其分布。
这意味着在存储模型数据的时候,除了类概率之外,我们还需要存储每个类实例中输入变量的平均值和标准差。
要计算模型所需的高斯分布,只需要计算每个类下样本属性的均值和标准差即可。
mean(x)= 1 / n * sum(x)
n为实例的数量,x为训练数据中输入变量的值。
我们可以用下面的公式计算标准偏差:
standard deviation(x) = sqrt(1 / n * sum(xi-mean(x)^ 2))
这是所有实例属性值与均值的偏差的平方和的平方根,n为实例的数量,sqrt()为平方根函数,sum()为求和函数,xi为第i个实例的属性值,mean(x)为均值,^2代表平方符号。
新的x值对各个的类别的概率可以通过高斯概率密度分布函数(PDF)计算得到。
在进行预测时,可以将变量对应的高斯分布的特征参数和输入变量一并作为高斯概率密度分布函数的输入,而高斯密度分布函数的输出则提供了当前输入下实例属于各个类别的概率。
pdf(x,mean,sd)=(1/(sqrt(2 * PI)* sd)) exp(-((x-mean^ 2) / (2 sd ^ 2)))
pdf代表高斯概率密度分布函数,sqrt()为平方根,mean和sd分别代表高斯分布的均值和方差,PI为常数,exp()为自然数e为底的指数函数。
根据这个公式,我们就可以对实值输入属性进行类别预测。
还以上面举的天气,限号和出行关系的例子来进行计算(天气和限号属性改为对应的实值属性):
出门的类标签得分 = P(pdf(天气指数)|活动=出门) P(pdf(限号)|活动=出门) P(活动=出门)
这里还有两篇与朴素贝叶斯相关的文章供读者参考:
下面是一些涉及到朴素贝叶斯的面向开发者的机器学习参考书:
在这篇文章中,我们探究了朴素贝叶斯在分类问题上的原理和应用。读完本文,你应当掌握了以下知识: