568

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

请解释一下训练集的作用。我在这里给出一个非常简单的水果示例,例如香蕉

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
4

5 回答 5

1078

接受的答案有许多 k-NN 元素(k近邻),这是一种不同的算法。

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

由于问题是关于朴素贝叶斯的,因此我将如何向某人描述这些想法和步骤。我会尽量用尽可能少的方程式和简单的英语来做这件事。

一、条件概率和贝叶斯法则

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

简单英语中的条件概率:假设其他事情已经发生,某事将发生的概率是多少。

假设有一些结果 O 和一些证据 E。从定义这些概率的方式来看:同时具有结果O 和证据 E 的概率是:(O 发生的概率)乘以(E 的概率)哦发生了)

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

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

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

(民主党和女参议员)的概率= Prob(参议员是民主党人)乘以女性的条件概率,因为他们是民主党人。

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

我们可以计算完全相同的东西,相反的方式:

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

了解贝叶斯法则

从概念上讲,这是从 P(Evidence|Known Outcome) 到 P(Outcome|Known Evidence) 的一种方式。通常,在已知结果的情况下,我们知道某些特定证据的观察频率。给定证据,我们必须使用这个已知事实来计算相反的结果,以计算该结果发生的机会。

P(假设我们知道一些证据的结果)= P(假设我们知道结果的证据)乘以概率(结果),由 P(证据)缩放

理解贝叶斯法则的经典例子:

Probability of Disease D given Test-positive = 

               P(Test is positive|Disease) * P(Disease)
     _______________________________________________________________
     (scaled by) P(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。
  • 如果 Prob(一些特定的证据|结果)为 0,则整个概率。变为 0。如果您看到相互矛盾的证据,我们可以排除该结果。
  • 由于我们将所有内容除以 P(Evidence),我们甚至可以不用计算就可以逃脱。
  • 乘以先验背后的直觉是,我们对更常见的结果赋予高概率,而对不太可能的结果赋予低概率。这些也被称为base rates,它们是衡量我们预测概率的一种方式。

如何应用 NaiveBayes 预测结果?

只需为每个可能的结果运行上面的公式。由于我们正在尝试对进行分类,因此每个结果都称为 aclass并且它class label.有 同样,我们采用一种非常简单的方法:概率最高的类被宣布为“获胜者”,并且该类标签被分配给该证据组合。

水果示例

让我们通过一个例子来增加我们的理解: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

给定一个水果,如何分类?

假设我们被赋予了一种未知水果的特性,并要求我们对其进行分类。我们被告知果实长、甜、黄。是香蕉吗?是橙子吗?还是其他水果?

我们可以简单地逐个计算 3 个结果中的每一个的数字。然后我们选择最高概率并将我们的未知水果“分类”为基于我们先前的证据(我们的 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)  ...

分配最大数字的类别标签,您就完成了。

尽管名称如此,朴素贝叶斯在某些应用程序中表现出色。文本分类是它真正大放异彩的一个领域。

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

于 2013-12-12T23:54:43.227 回答
681

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

一般来说,所有机器学习算法都需要针对分类、预测等监督学习任务或聚类等无监督学习任务进行训练。

在训练步骤中,算法使用特定的输入数据集(训练集)进行训练,以便稍后我们可以测试它们的未知输入(他们以前从未见过),它们可以对其进行分类或预测等(在监督的情况下)学习)基于他们的学习。这是大多数机器学习技术(如神经网络、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的可能性小于给定的可能性XRED因为圆圈包含1 GREEN对象和对象3 RED。因此:

在此处输入图像描述

在此处输入图像描述

尽管先验概率表明X可能属于(假设与 相比GREEN有两倍),但可能性表明并非如此;的类成员资格是(假设在 附近有比更多的对象)。在贝叶斯分析中,最终分类是通过结合两种信息源(即先验和可能性)使用所谓的贝叶斯规则(以 Rev. Thomas Bayes 1702-1761 命名)形成后验概率而产生的。GREENREDXREDREDXGREEN

在此处输入图像描述

最后,我们将 X 分类为RED因为它的类成员达到最大的后验概率。

于 2012-04-08T12:13:17.883 回答
20

朴素贝叶斯属于监督机器学习,用于对数据集进行分类。它用于根据其先验知识和独立性假设来预测事物。

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

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

下图显示了朴素贝叶斯的工作原理

在此处输入图像描述

预测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-Examples

于 2017-02-17T04:02:28.103 回答
19

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

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

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
于 2016-03-29T11:15:23.417 回答
14

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

从社会中随机选择的人是吸烟者的机会是多少?

你可以回复 10%,让我们假设这是对的。

现在,如果我说随机的人是一个15男人呢?

你可能会说 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 岁以下....换句话说,它试图根据训练建立每个类别的特征的概率分布数据。

于 2016-03-12T16:13:48.523 回答