朴素贝叶斯分类的简单解释


546

我发现很难理解朴素贝叶斯的过程,而且我想知道是否有人可以用简单的英语逐步过程来解释它。我知道它会将发生的时间进行比较作为概率,但是我不知道训练数据与实际数据集之间的关系。

请给我解释一下培训集扮演的角色。我在这里举一个非常简单的水果示例,例如香蕉

training set---
round-red
round-orange
oblong-yellow
round-red

dataset----
round-red
round-orange
round-red
round-orange
oblong-yellow
round-red
round-orange
oblong-yellow
oblong-yellow
round-red

18
如果您了解贝叶斯定理,这很容易。如果您尚未阅读贝叶斯定理,请尝试以下链接yudkowsky.net/rational/bayes

1
请说明您的示例。对于您的训练集中的第一行:舍入分类为红色,还是同时将舍入和红色变量分类为其他?如果是后者,那么您的训练集中每个条目的分类是什么?
K Mehta

22
注意:以下可接受的答案不是朴素贝叶斯的传统示例。这主要是ak Nearest Neighbor实现。相应地阅读。
chmullig

1
@Jaggerjack:RamNarasimhan的答案比公认的答案要好得多。
Unmesha SreeVeni 2014年

2
好吧,如果您看到一个带有一些点的图形,但这并不意味着它实际上是KNN :)您如何计算概率完全取决于您。朴素贝叶斯(Naive Bayes)使用先验乘以似然来计算它,这就是Yavar在他的答案中所显示的。在这里,如何得出这些概率实际上并不重要。答案是绝对正确的,我认为没有问题。
avinash shah 2014年

Answers:


671

据我了解,您的问题分为两部分,第一部分是您需要更好地了解朴素贝叶斯分类器,第二部分是围绕训练集的困惑。

通常,所有机器学习算法都需要针对监督学习任务(如分类,预测等)或针对无监督学习任务(如聚类)进行培训。

在训练步骤中,将使用特定的输入数据集(训练集)教授算法,以便稍后我们可以测试它们的未知输入(它们从未见过),可以对其进行分类或预测(在监督的情况下)学习)基于他们的学习。这是大多数机器学习技术(如神经网络,SVM,贝叶斯等)所基于的。

因此,在一般的机器学习项目中,基本上,您必须将输入集划分为开发集(训练集+开发测试集)和测试集(或评估集)。请记住,您的基本目标是让系统学习和分类在开发集或测试集中从未见过的新输入。

测试集通常具有与训练集相同的格式。但是,将测试集与训练集区分开是非常重要的:如果我们简单地将训练集重用为测试集,那么仅记住其输入却不学习如何归纳为新示例的模型将产生误导性高分数。

通常,例如,我们的数据的70%可以用作训练集案例。还记得将原始集随机分为训练集和测试集。

现在我来谈谈您关于朴素贝叶斯的其他问题。

为了说明朴素贝叶斯分类的概念,请考虑以下示例:

在此处输入图片说明

如图所示,对象可以分类为GREENRED。我们的任务是在新案例到达时对其进行分类,即根据当前存在的对象确定它们所属的类别标签。

因为有两倍多的GREEN对象为RED,这是有理由相信,新的情况下(这还没有被发现还)是两倍,可能有会员GREEN,而不是RED。在贝叶斯分析中,此信念称为先验概率。先前概率基于先前的经验,在这种情况下,是GREEN和的百分比RED,通常用于在结果实际发生之前进行预测。

因此,我们可以这样写:

的先验概率GREENnumber of GREEN objects / total number of objects

的先验概率REDnumber of RED objects / total number of objects

由于总共有60对象,40其中GREEN和是20个RED,因此我们获得类成员资格的先验概率为:

的先验概率GREEN40 / 60

的先验概率RED20 / 60

在确定了先验概率之后,我们现在就可以对新对象进行分类了(WHITE下图中的圆圈)。由于对象很好地聚集在一起,因此可以合理地假设X附近的对象越多GREEN(或RED),则新案例越有可能属于该特定颜色。为了测量这种可能性,我们在X周围画了一个圆圈,该圆圈包含多个(先验选择)点,而与它们的类别标签无关。然后,我们计算属于每个类标签的圆圈中的点数。由此我们计算出可能性:

在此处输入图片说明

在此处输入图片说明

从上面的插图中可以清楚地看出,X给定的GREEN可能性小于X给定的可能性RED,因为圆圈包含1 GREEN对象和对象3 RED。从而:

在此处输入图片说明

在此处输入图片说明

尽管先验概率表明X可能属于GREEN(假设GREEN与相比,是的两倍RED),但可能性表明并非如此;的类成员资格XRED(假设RED在附近的对象X比个更多GREEN)。在贝叶斯分析中,通过使用所谓的贝叶斯规则(以托马斯·贝叶斯(Bayes)1702-1761牧师命名),将信息的两个来源(即先验概率和可能性)组合在一起形成后验概率,从而产生最终分类。

在此处输入图片说明

最后,RED由于X 的类成员资格具有最大的后验概率,因此我们将其分类。


39
上面的算法不是更像k最近邻居吗?
Renaud

251
这个答案令人困惑-它混合了KNN(k个最近的邻居)和朴素的贝叶斯。
Michal Illich 2013年

7
答案很好,直到可能性出现。因此,@ Yavar使用K最近邻来计算可能性。那有多正确?如果是这样,还有什么其他方法可以计算可能性?
wrahool 2014年

1
您使用一个圆圈作为可能性的示例。我读到了高斯朴素贝叶斯的可能性,那里的可能性是高斯。怎么解释呢?
umair durrani

1
实际上,knn的答案是正确的。如果您不知道分布,因此不知道这种分布的概率密度,则必须以某种方式找到它。这可以通过kNN或Kernels完成。我认为有些东西不见了。您可以查看此演示文稿
CS

1052

我意识到这是一个古老的问题,已经有了确定的答案。我发布的原因是,可接受的答案包含k-NN(k个最近邻居)的许多元素,这是一种不同的算法。

k-NN和NaiveBayes都是分类算法。从概念上讲,k-NN使用“附近”的概念对新实体进行分类。在k-NN中,“近距离”以欧几里得距离或余弦距离等思想建模。相比之下,在NaiveBayes中,“概率”的概念用于对新实体进行分类。

由于问题是关于朴素贝叶斯的,所以这就是我如何向某人描述想法和步骤。我将尝试使用尽可能少的方程式和尽可能简单的英语来实现。

首先,条件概率与贝叶斯规则

在有人理解和欣赏朴素贝叶斯的细微差别之前,他们需要首先了解几个相关概念,即条件概率的概念和贝叶斯规则。(如果您熟悉这些概念,请跳到标题为“ 入门到朴素贝叶斯”的部分

普通英语的条件概率假设已经发生其他事情,则发生某件事的概率是多少?

假设有一个结果O。还有一些证据E。从定义这些概率的方式来看:同时获得结果O和证据E的概率为:(发生O的概率)乘以(给定E的概率)发生了

理解条件概率的一个例子:

可以说,我们有一些美国参议员。参议员可能是民主党人或共和党人。他们也可以是男性或女性。

如果我们完全随机选择一名参议员,那么这个人是女性民主党的可能性是多少?条件概率可以帮助我们回答。

(民主党和女参议员)的概率=概率(参议员是民主党)乘以作为女性的有条件概率,前提是她们是民主党人。

  P(Democrat & Female) = P(Democrat) * P(Female | Democrat) 

我们可以用相反的方法计算出完全相同的东西:

  P(Democrat & Female) = P(Female) * P(Democrat | Female) 

了解贝叶斯规则

从概念上讲,这是从P(证据|已知结果)转到P(结果|已知证据)的方法。通常,我们知道在已知结果的情况下观察到某些特殊证据的频率。给定证据,我们必须使用这个已知事实来计算逆向,计算出发生这种结果的机会。

P(假设我们知道一些证据就得出结果)= P(假设我们知道结果就得出证据)乘以Prob(结果),然后按P(得出结果)进行缩放

了解贝叶斯规则的经典示例:

Probability of Disease D given Test-positive = 

               Prob(Test is positive|Disease) * P(Disease)
     _______________________________________________________________
     (scaled by) Prob(Testing Positive, with or without the disease)

现在,所有这些只是到达朴素贝叶斯的序言。

前往朴素贝叶斯

到目前为止,我们仅讨论了一个证据。实际上,我们必须根据多种证据来预测结果在这种情况下,数学变得非常复杂。为了避免这种复杂性,一种方法是“解耦”多个证据,并将每个证据视为独立的。这种方法就是为什么这被称为朴素贝叶斯。

P(Outcome|Multiple Evidence) = 
P(Evidence1|Outcome) * P(Evidence2|outcome) * ... * P(EvidenceN|outcome) * P(Outcome)
scaled by P(Multiple Evidence)

许多人选择记住这一点:

                      P(Likelihood of Evidence) * Prior prob of outcome
P(outcome|evidence) = _________________________________________________
                                         P(Evidence)

请注意有关此方程式的一些注意事项:

  • 如果Prob(evidence | outcome)为1,那么我们只乘以1。
  • 如果概率(某些特定结果)为0,则整个概率。变为0。如果您看到矛盾的证据,我们可以排除该结果。
  • 由于我们将所有事物都除以P(证据),因此甚至无需计算就可以逃脱。
  • 乘以先验后的直觉是,我们给较常见的结果以高概率,而不太可能的结果以低概率。这些也被称为base rates,它们是一种扩展我们的预测概率的方法。

如何应用NaiveBayes预测结果?

只需对每个可能的结果运行上面的公式。由于我们正在尝试进行分类,因此每个结果都称为a,class并且它具有class label.A。我们的工作是查看证据,考虑成为此类的可能性,然后为每个实体分配标签。同样,我们采用一种非常简单的方法:将具有最高概率的类别声明为“优胜者”,并将类别标签分配给该证据组合。

水果实例

让我们尝试一个例子来加深我们的理解:OP要求一个“水果”识别例子。

假设我们有1000个水果的数据。它们恰好是香蕉橙子其他水果。我们知道每种水果的3个特征:

  1. 是否长
  2. 无论是甜和
  3. 如果它的颜色是黄色。

这是我们的“训练集”。我们将使用它来预测遇到的任何水果的类型。

Type           Long | Not Long || Sweet | Not Sweet || Yellow |Not Yellow|Total
             ___________________________________________________________________
Banana      |  400  |    100   || 350   |    150    ||  450   |  50      |  500
Orange      |    0  |    300   || 150   |    150    ||  300   |   0      |  300
Other Fruit |  100  |    100   || 150   |     50    ||   50   | 150      |  200
            ____________________________________________________________________
Total       |  500  |    500   || 650   |    350    ||  800   | 200      | 1000
             ___________________________________________________________________

我们可以对水果收集进行很多预计算。

所谓“先验”概率。(如果我们不知道任何水果属性,那将是我们的猜测。)这些是我们的base rates.

 P(Banana)      = 0.5 (500/1000)
 P(Orange)      = 0.3
 P(Other Fruit) = 0.2

“证据”的概率

p(Long)   = 0.5
P(Sweet)  = 0.65
P(Yellow) = 0.8

“可能性”的概率

P(Long|Banana) = 0.8
P(Long|Orange) = 0  [Oranges are never long in all the fruit we have seen.]
 ....

P(Yellow|Other Fruit)     =  50/200 = 0.25
P(Not Yellow|Other Fruit) = 0.75

给定水果,如何分类?

假设给了我们未知水果的属性,并要求对其进行分类。我们被告知水果是长,甜和黄色的。是香蕉吗?是橘子吗?还是其他水果?

我们可以简单地对三个结果中的每一个进行数字运算。然后,根据我们的先验证据(我们的1000个水果训练集),我们选择最高概率并将未知水果“分类”为具有最高概率的类别:

P(Banana|Long, Sweet and Yellow) 
      P(Long|Banana) * P(Sweet|Banana) * P(Yellow|Banana) * P(banana)
    = _______________________________________________________________
                      P(Long) * P(Sweet) * P(Yellow)

    = 0.8 * 0.7 * 0.9 * 0.5 / P(evidence)

    = 0.252 / P(evidence)


P(Orange|Long, Sweet and Yellow) = 0


P(Other Fruit|Long, Sweet and Yellow)
      P(Long|Other fruit) * P(Sweet|Other fruit) * P(Yellow|Other fruit) * P(Other Fruit)
    = ____________________________________________________________________________________
                                          P(evidence)

    = (100/200 * 150/200 * 50/200 * 200/1000) / P(evidence)

    = 0.01875 / P(evidence)

通过压倒性优势(0.252 >> 0.01875),我们将这种甜/长/黄水果分类为香蕉。

为什么贝叶斯分类器如此受欢迎?

看看最终会导致什么。只是一些计数和乘法。我们可以预先计算所有这些术语,因此分类变得容易,快速和高效。

Let z = 1 / P(evidence). 现在我们快速计算以下三个量。

P(Banana|evidence) = z * Prob(Banana) * Prob(Evidence1|Banana) * Prob(Evidence2|Banana) ...
P(Orange|Evidence) = z * Prob(Orange) * Prob(Evidence1|Orange) * Prob(Evidence2|Orange) ...
P(Other|Evidence)  = z * Prob(Other)  * Prob(Evidence1|Other)  * Prob(Evidence2|Other)  ...

分配类别标签中最大的一个,即已完成。

尽管名称如此,但朴素贝叶斯在某些应用中却表现出色。文本分类是它真正发挥作用的地方。

希望这有助于理解朴素贝叶斯算法的概念。


14
感谢您的明确解释!轻松地在网上漂浮的更好的之一。问题:由于每个P(结果/证据)乘以1 / z = p(证据)(在实际情况下,意味着每个本质上仅是基于先前证据的概率),因此说z不对于朴素贝叶斯来说根本不重要吗?因此,这意味着,如果遇到一个不是香蕉的长/甜/黄色水果,就会被错误地分类。
covariance 2013年

7
@ E.Chow是的,您是正确的,因为对于朴素贝叶斯来说,计算z并不重要。(这是一种将概率缩放到0到1之间的方法。)请注意,z是所有现有证据的概率的乘积。(这是从不同的先验这是阶级的基准利率。)你是正确的:如果你没有找到一个长/甜/黄色的水果,是不是香蕉,NB将它错误地归类为一个香蕉,在此基础上训练集。该算法是“基于证据的最佳概率猜测”,因此有时错误分类。
Ram Narasimhan

1
@Jasper在表中共有200个“其他水果”,其中50个是黄色。因此,假设该水果为“其他水果”,则宇宙为200。其中50个为黄色。因此为50/200。请注意,黄色水果总数为800。因此,如果我们想要P(其他水果/黄色),我们将按照您的建议进行:50/800。
Ram Narasimhan 2014年

3
绝对很棒的解释。我从学术论文和书籍中都不会理解这种算法。因为,深奥的解释也许是公认的写作风格。就这样,如此简单。谢谢。
Suat Atan PhD 2015年

3
为什么概率之和不等于1?该示例中的证据是0.26(500/100 * 650/1000 * 800/1000),因此最终的P(banana | ...)= 0.252 / 0.26 = 0.969,而P(other | ...) = 0.01875 / 0.26 = 0.072。它们加起来等于1.04!
Mauricio

18

Ram Narasimhan在下面很好地解释了这个概念,下面是通过Naive Bayes的实际代码示例进行的另一种解释。
它使用了本书第351页中的示例问题。
这是我们将 在上面的数据集中使用的数据集,如果假设= 那么他购买或不购买计算机的概率是多少? 下面的代码正好回答了这个问题。 只需创建一个名为named的文件,然后粘贴以下内容。
在此处输入图片说明
{"Age":'<=30', "Income":"medium", "Student":'yes' , "Creadit_Rating":'fair'}

new_dataset.csv

Age,Income,Student,Creadit_Rating,Buys_Computer
<=30,high,no,fair,no
<=30,high,no,excellent,no
31-40,high,no,fair,yes
>40,medium,no,fair,yes
>40,low,yes,fair,yes
>40,low,yes,excellent,no
31-40,low,yes,excellent,yes
<=30,medium,no,fair,no
<=30,low,yes,fair,yes
>40,medium,yes,fair,yes
<=30,medium,yes,excellent,yes
31-40,medium,no,excellent,yes
31-40,high,yes,fair,yes
>40,medium,no,excellent,no

这是注释的代码,解释了我们在这里所做的一切![蟒蛇]

import pandas as pd 
import pprint 

class Classifier():
    data = None
    class_attr = None
    priori = {}
    cp = {}
    hypothesis = None


    def __init__(self,filename=None, class_attr=None ):
        self.data = pd.read_csv(filename, sep=',', header =(0))
        self.class_attr = class_attr

    '''
        probability(class) =    How many  times it appears in cloumn
                             __________________________________________
                                  count of all class attribute
    '''
    def calculate_priori(self):
        class_values = list(set(self.data[self.class_attr]))
        class_data =  list(self.data[self.class_attr])
        for i in class_values:
            self.priori[i]  = class_data.count(i)/float(len(class_data))
        print "Priori Values: ", self.priori

    '''
        Here we calculate the individual probabilites 
        P(outcome|evidence) =   P(Likelihood of Evidence) x Prior prob of outcome
                               ___________________________________________
                                                    P(Evidence)
    '''
    def get_cp(self, attr, attr_type, class_value):
        data_attr = list(self.data[attr])
        class_data = list(self.data[self.class_attr])
        total =1
        for i in range(0, len(data_attr)):
            if class_data[i] == class_value and data_attr[i] == attr_type:
                total+=1
        return total/float(class_data.count(class_value))

    '''
        Here we calculate Likelihood of Evidence and multiple all individual probabilities with priori
        (Outcome|Multiple Evidence) = P(Evidence1|Outcome) x P(Evidence2|outcome) x ... x P(EvidenceN|outcome) x P(Outcome)
        scaled by P(Multiple Evidence)
    '''
    def calculate_conditional_probabilities(self, hypothesis):
        for i in self.priori:
            self.cp[i] = {}
            for j in hypothesis:
                self.cp[i].update({ hypothesis[j]: self.get_cp(j, hypothesis[j], i)})
        print "\nCalculated Conditional Probabilities: \n"
        pprint.pprint(self.cp)

    def classify(self):
        print "Result: "
        for i in self.cp:
            print i, " ==> ", reduce(lambda x, y: x*y, self.cp[i].values())*self.priori[i]

if __name__ == "__main__":
    c = Classifier(filename="new_dataset.csv", class_attr="Buys_Computer" )
    c.calculate_priori()
    c.hypothesis = {"Age":'<=30', "Income":"medium", "Student":'yes' , "Creadit_Rating":'fair'}

    c.calculate_conditional_probabilities(c.hypothesis)
    c.classify()

输出:

Priori Values:  {'yes': 0.6428571428571429, 'no': 0.35714285714285715}

Calculated Conditional Probabilities: 

{
 'no': {
        '<=30': 0.8,
        'fair': 0.6, 
        'medium': 0.6, 
        'yes': 0.4
        },
'yes': {
        '<=30': 0.3333333333333333,
        'fair': 0.7777777777777778,
        'medium': 0.5555555555555556,
        'yes': 0.7777777777777778
      }
}

Result: 
yes  ==>  0.0720164609053
no  ==>  0.0411428571429

希望它有助于更​​好地理解问题

和平


18

朴素贝叶斯(Naive Bayes):朴素贝叶斯( Naive Bayes)受监督机器学习的影响,该机器学习过去曾对数据集进行分类。它用于基于其先验知识和独立性假设来预测事物。

他们之所以称其为“ 天真”,是因为它的假设(假设数据集中的所有特征都同等重要且相互独立)在大多数实际应用中都是非常乐观的,很少是真的。

它是分类算法,可为未知数据集做出决策。它基于贝叶斯定理贝叶斯定理根据事件的先验知识描述事件的概率。

下图显示了朴素贝叶斯的工作方式

在此处输入图片说明

预测NB的公式:

在此处输入图片说明

如何使用朴素贝叶斯算法?

让我们以NB炒锅的方式为例

步骤1:首先,我们找到下表的可能性,该可能性在下图中显示是或否的概率。步骤2:找出每个类别的后验概率。

在此处输入图片说明

Problem: Find out the possibility of whether the player plays in Rainy condition?

P(Yes|Rainy) = P(Rainy|Yes) * P(Yes) / P(Rainy)

P(Rainy|Yes) = 2/9 = 0.222
P(Yes) = 9/14 = 0.64
P(Rainy) = 5/14 = 0.36

Now, P(Yes|Rainy) = 0.222*0.64/0.36 = 0.39 which is lower probability which means chances of the match played is low.

有关更多参考,请参考这些博客。

请参阅GitHub存储库Naive-Bayes-示例


14

我尝试用一​​个例子来解释贝叶斯规则。

从社会中选出一个随机的人吸烟的机会是多少?

您可以回覆10%。

现在,如果这个人是什么以及 15岁了吗?

不能达到60%,而我们知道吸烟者的比例非常低。也不能少于10%。15%或20%是更好的猜测。

实际上,我们尝试用新的证据来更新初始猜测(P(smoker) vs. P(smoker | evidence))。贝叶斯规则是将这两种概率联系起来的一种方法。

P(smoker | evidence) = P(smoker)* p(evidence | smoker)/P(evidence)

每个证据都可能增加或减少这种机会。例如,如果非吸烟者中的这个百分比(是男人)较低,那么他是男人的事实可能会增加机会。换句话说,男人必须是吸烟者而不是不吸烟者的良好标志。

我们也可以用另一种方式显示这种贡献。对于每个功能,您可以将其在给定条件下的通用性(概率)与其单独的通用性进行比较。(P(f | x) vs. P(f))

P(smoker | evidence) / P(smoker) = P(evidence | smoker)/P(evidence)

例如,如果我们知道90%的吸烟者是男性,那么仅仅说一个男人是否是吸烟者的指标还不够。例如,如果在社会上成为男人的可能性也为90%,那么知道某人是男人对我们没有帮助((90% / 90%) = 1。但是,如果男人为社会的40%做出贡献,但为90%的吸烟者做出贡献,则知道某人是男人会增加成为吸烟者的机会(90% / 40%) = 2.25,因此,最初的猜测(10%)增加了2.25,结果是22.5%。

但是,如果在社会上成为男人的可能性为95%,则无论男人在吸烟者中所占的百分比很高(90%)都是事实!某人是男人的证据减少了他成为吸烟者的机会!(90% / 95%) = 0.95)

因此,我们有:

P(smoker | f1, f2, f3,... ) = P(smoker) * contribution of f1* contribution of f2 *... =
P(smoker)* 
(P(being a man | smoker)/P(being a man))*
(P(under 20 | smoker)/ P(under 20))

请注意,在此公式中,我们假设男人20岁以下是独立的特征,因此我们将它们相乘,这意味着知道某人在20岁以下不会影响猜测他是男人还是女人。但这可能不是真实的,例如,一个社会中的大多数青春期可能是男性...

在分类器中使用此公式

分类器具有某些功能(一个男人且年龄在20岁以下),并且必须确定他是否吸烟(这是两个类别)。它使用上述公式来计算证据(特征)下每个类别的概率,并将具有最高概率的类别分配给输入。为了提供所需的概率(90%,10%,80%...),它使用训练集。例如,它计算了训练集中吸烟者的人数,发现他们贡献了样本的10%。然后,针对吸烟者,检查其中有多少是男性或女性.... 20岁以上或20岁以下的有多少....换句话说,它会根据训练尝试为每个类别建立特征的概率分布数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.