关于算法:朴素贝叶斯分类的简单解释

A simple explanation of Naive Bayes Classification

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

请给我解释一下训练集扮演什么角色。我举了一个很简单的水果例子,比如香蕉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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


我意识到这是一个古老的问题,有一个确定的答案。我之所以发帖是因为接受的答案包含了k-nn(k-最近邻)的许多元素,这是一种不同的算法。好的。

k-nn和naivebayes都是分类算法。从概念上讲,k-nn使用"近邻"的概念对新实体进行分类。在k-nn中,"接近度"是用欧几里得距离或余弦距离等概念建模的。相比之下,在NaiveBayes中,"概率"的概念用于对新实体进行分类。好的。

既然问题是关于朴素的贝叶斯,下面我将介绍如何向某人描述这些想法和步骤。我会尽量少用方程式,尽量用简单的英语。好的。第一,条件概率与贝叶斯规则

在人们能够理解和理解朴素贝叶斯的细微差别之前,他们首先需要知道一些相关的概念,即条件概率的概念和贝叶斯规则。(如果您熟悉这些概念,请跳到标题为"开始使用NaiveBayes"的部分)好的。

条件概率:假设已经发生了其他事情,那么事情发生的概率是多少?好的。

假设从定义这些概率的方式来看,有一些结果o和一些证据e:同时拥有结果o和证据e的概率是:(O发生的概率)乘以(假设O发生,e的概率)好的。

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

假设我们有一批参议员。参议员可以是民主党人或共和党人。他们也可以是男性或女性。好的。

如果我们完全随机选择一位参议员,这个人是女性民主党人的可能性有多大?条件概率可以帮助我们回答这个问题。好的。

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

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

我们可以用相反的方法计算同样的东西:好的。

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

了解贝叶斯规则

从概念上讲,这是一种从P(证据已知结果)到P(结果已知证据)的方法。通常,我们知道在已知结果的情况下,观察某些特定证据的频率。我们必须利用这个已知的事实来计算相反的结果,根据证据来计算结果发生的可能性。好的。

p(我们知道一些证据的结果)=p(我们知道结果的证据)乘以prob(结果),按p(证据)比例缩放好的。

理解贝叶斯规则的经典例子:好的。

1
2
3
4
5
Probability of Disease D given Test-positive =

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

现在,所有这一切只是序言,以达到天真的拜斯。好的。去天真的Bayes's'

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

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

许多人选择记住这一点:好的。

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

注意一些关于这个方程的事情:好的。

  • 如果prob(证据结果)是1,那么我们只是乘以1。
  • 如果prob(某些特定的证据结果)是0,那么整个prob。变成0。如果你看到有矛盾的证据,我们可以排除这种结果。
  • 因为我们把所有的东西都除以P(证据),我们甚至可以不经过计算就逃走。
  • 乘先验的直觉是,我们给更常见的结果高概率,给不可能的结果低概率。这些也被称为base rates,它们是衡量我们预测概率的一种方法。

如何应用NaiveBayes来预测结果?

只需为每个可能的结果运行上面的公式。由于我们试图分类,每个结果都被称为class,它有一个class label.,我们的工作是查看证据,考虑它有多可能是这个类或那个类,并为每个实体分配一个标签。同样,我们采用一种非常简单的方法:概率最高的类被声明为"赢家",并且类标签被分配给证据的组合。好的。水果实例

让我们在一个例子中进行尝试,以增加我们的理解:OP要求一个"水果"标识示例。好的。

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

  • 是否长
  • 无论是甜的还是
  • 如果它是黄色的。
  • 这是我们的"训练集"。我们将用它来预测我们遇到的任何新水果的类型。好的。

    1
    2
    3
    4
    5
    6
    7
    8
    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.好的。

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

    "证据"概率好的。

    1
    2
    3
    p(Long)   = 0.5
    P(Sweet)  = 0.65
    P(Yellow) = 0.8

    "可能性"概率好的。

    1
    2
    3
    4
    5
    6
    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

    给一个水果,如何分类?

    假设我们得到了一种未知水果的性质,并要求对其进行分类。我们被告知水果长,甜,黄。是香蕉吗?是橙色的吗?还是别的水果?好的。

    我们可以简单地为3个结果中的每一个运行数字,一个接一个。然后我们选择最高的概率,并根据我们先前的证据将我们未知的水果"分类"为属于概率最高的类(我们的1000个水果训练集):好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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).现在我们可以快速计算以下三个量。好的。

    1
    2
    3
    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)  ...

    将类标签指定为最大的数字,即可完成。好的。

    尽管名字如此,NaiveBayes在某些应用中还是非常出色的。文本分类是它真正闪耀的一个领域。好的。

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


    我理解你的问题分为两部分,第一部分是你需要更好地理解朴素的贝叶斯分类器,第二部分是围绕训练集的混乱。好的。

    一般来说,所有机器学习算法都需要经过培训,以完成有监督的学习任务,如分类、预测等,或者完成无监督的学习任务,如聚类。好的。

    在训练步骤中,使用特定的输入数据集(训练集)对算法进行教学,以便稍后我们可以测试它们是否有未知的输入(它们以前从未见过),以便根据它们的学习对这些输入进行分类或预测等(在有监督的学习情况下)。这是大多数机器学习技术(如神经网络、支持向量机、贝叶斯等)的基础。好的。

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

    测试集通常具有与培训集相同的格式。然而,测试集与训练语料库的区别是非常重要的:如果我们只是将训练集重新用作测试集,那么一个简单地记住其输入而不学习如何归纳为新示例的模型将得到错误的高分。好的。

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

    现在我来问你另一个关于朴素的贝叶斯的问题。好的。

    要演示NA的概念吗?Ve Bayes分类,考虑下面给出的示例:好的。

    enter image description here好的。

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

    由于GREEN对象的数量是RED对象的两倍,因此有理由相信新的案例(尚未观察到)拥有GREEN成员的可能性是RED成员的两倍。在贝叶斯分析中,这种信念被称为先验概率。先验概率是基于以前的经验,在这种情况下,GREENRED对象的百分比,通常用于在实际发生之前预测结果。好的。

    因此,我们可以写:好的。

    GREEN的先验概率:number of GREEN objects / total number of objects。好的。

    RED的先验概率:number of RED objects / total number of objects。好的。

    由于共有60个对象,其中40个对象是GREENRED20个,我们的阶级成员先验概率为:好的。

    GREEN的先验概率:40 / 60。好的。

    RED的先验概率:20 / 60。好的。

    在制定了我们先前的概率之后,我们现在准备对一个新的对象进行分类(下图中的WHITE圆)。由于物体很好地聚集在一起,因此可以合理地假设X附近的EDOCX1(或EDOCX1(或EDOCX1)(2))物体越多,新情况就越可能属于该特定颜色。为了测量这个可能性,我们在x周围画一个圆,它包含一个点的数字(先验选择),而不考虑它们的类标签。然后,我们计算属于每个类标签的圆中的点数。由此我们计算出可能性:好的。

    enter image description here好的。

    enter image description here好的。

    从上面的例子可以清楚地看出,给定GREENX的可能性小于给定REDX的可能性,因为圆圈包含1GREEN对象和3RED对象。因此:好的。

    enter image description here好的。

    enter image description here好的。

    虽然先前的概率表明,X可能属于GREEN(假设GREENRED多出两倍),但可能性表明相反;X的阶级成员是RED(假设X附近的RED物体比(1)。在贝叶斯分析中,最终的分类是通过结合信息源(即先验概率和似然概率)来产生的,从而使用所谓的贝叶斯规则(以rev命名)形成后验概率。托马斯·拜斯1702-1761)。好的。

    enter image description here好的。

    最后,我们将x分类为RED,因为它的类成员关系达到了最大的后验概率。好的。好啊。


    Naive Bayes:NaiveBayes受到机器学习的监督,机器学习用于对数据集进行分类。它用于根据先前的知识和独立性假设来预测事物。

    他们称之为幼稚,因为它的假设(它假设数据集中的所有特性都同样重要和独立)是非常乐观的,在大多数实际应用程序中很少如此。

    对未知数据集进行决策的是分类算法。它基于贝叶斯定理,该定理基于事件的先验知识描述事件的概率。

    下图显示了NaiveBayes的工作原理

    enter image description here

    预测Nb的公式:

    enter image description here

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

    让我们举个例子说明一下N.B是如何工作的

    第一步:首先,我们找出表的可能性,该表在下图中显示了是或否的概率。第二步:找出每个类的后验概率。

    enter image description here

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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示例


    RamNarasimhan很好地解释了这个概念,下面是通过naiveBayes的代码示例的另一种解释。它使用了本书第351页的一个示例问题这是我们将使用enter image description here的数据集在上述数据集中,如果我们假设={"Age":'<=30',"Income":"medium","Student":'yes' ,"Creadit_Rating":'fair'},那么他购买或不购买计算机的概率是多少。下面的代码正好回答了这个问题。只需创建一个名为new_dataset.csv的文件并粘贴以下内容。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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

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

    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
    30
    31
    32
    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
    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"
    Calculated Conditional Probabilities:
    "
            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()

    输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

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

    和平


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

    假设你知道10%的人是烟民。你也知道,90%的吸烟者是男性,80%的人是20岁以上。

    现在你看到一个15岁的男人。你想知道他抽烟的机会:

    1
     X = smoker | he is a man and under 20

    既然你知道10%的人是吸烟者,你的初步猜测是10%(先前的概率,对这个人一无所知),但是其他证据(他是一个男人,他是15岁)会影响这个猜测。

    每一个证据都可能增加或减少这个机会。例如,如果不吸烟者中的这一比例(男性)较低(例如40%),那么他是男性的这一事实可能会增加机会。换言之,作为一个男人必须是一个好的指标是一个吸烟,而不是一个不吸烟。

    我们可以用另一种方式展示这种贡献。对于每个特性,您需要将该特性(f)的共性(概率)单独与给定条件下的共性进行比较。(P(f) vs. P(f | x)。例如,如果我们知道在一个社会中成为男人的概率是90%,而90%的吸烟者也是男人,那么知道某人是男人对我们没有帮助。但是,如果男性贡献了40%的社会,但90%的吸烟者,那么知道某人是男性会增加成为吸烟者的机会。同样,如果在社会上成为一个男人的概率是95%,那么不管事实是,男人在吸烟者中的比例是高的(90%)。有人是男人的证据减少了他抽烟的机会!(10% * (90% / 95%) = 9.5%)

    所以我们有:

    1
    2
    3
    4
    P(X) =
    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岁以下有多少人……