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




贝叶斯分类器知乎 (4)

Ram Narasimhan在下面很好地解释了这个概念,这是通过朴素贝叶斯的行为代码示例的另一种解释
它使用本书第351页中的示例问题
这是我们将要使用的数据集

在上述数据集中,如果我们给出假设= {"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

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

和平

我发现很难理解朴素贝叶斯的过程,并且我想知道是否有人能够用简单的一步一步的过程用英语解释它。 我知道这需要按时间进行比较,但我不知道训练数据如何与实际数据集相关。

请给我一个解释训练集扮演的角色。 我在这里给出了一个非常简单的例子,比如香蕉

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

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

他们称之为天真,因为它是假设(假定数据集中的所有特征都是同等重要且独立的)在大多数现实世界的应用程序中都非常乐观且很少真实。

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

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

预测NB的公式:

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

让我们举一个NB如何炒作的例子

步骤1:首先我们找出在下图中显示是或否的概率的表的可能性。 第二步:找出每个班级的后验概率。

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.

有关更多参考,请参阅这些blog.

参考GitHub Repository Naive-Bayes-Examples


我意识到这是一个古老的问题,并有一个确定的答案。 我发布的原因是,接受的答案有许多k-NN( k -nearest neighbors)元素,一种不同的算法。

k-NN和NaiveBayes都是分类算法。 概念上,k-NN使用“接近度”的概念来分类新的实体。 在k-NN'nearness'中用欧几里德距离或余弦距离等概念来建模。 相比之下,在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(证据|结果)是1,那么我们就乘以1。
  • 如果Prob(某些特定的证据)为0,那么整个概率。 如果你看到矛盾的证据,我们可以排除这一结果。
  • 既然我们按P(证据)划分所有事物,我们甚至可以不计算它就离开。
  • 先验相乘的直觉是,我们给出更普遍的结果的可能性很高,对不可能的结果的可能性低。 这些也被称为base rates ,它们是一种缩放预测概率的方法。

如何应用NaiveBayes预测结果?

只需运行上面的公式以获得每个可能的结果。 由于我们试图分类 ,每个结果都称为一个class并且它有一个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)  ...

指定最高号码的类别标签,然后完成。

尽管有这个名字,朴素贝叶斯在某些应用中表现出色。 文本分类是它真正闪耀的一个领域。

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


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

一般来说,所有的机器学习算法都需要为监督学习任务(如分类,预测等)或无监督学习任务(如群集)进行训练。

通过训练它意味着对他们进行特定的输入训练,以便稍后我们可以测试他们未知的输入(他们以前从未见过),根据他们的学习,他们可以对其进行分类或预测等(在监督学习的情况下)。 这是大多数机器学习技术,如神经网络,支持向量机,贝叶斯等所基于的。

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

测试集通常与训练集具有相同的格式。 然而,测试集与训练语料不同的地方是非常重要的:如果我们简单地重复使用训练集作为测试集,那么仅仅记忆其输入而不学习如何推广到新示例的模型将会误导性地高分数。

一般来说,举个例子,70%可以是训练案例。 还要记住将原始集合随机分成训练集和测试集。

现在我来谈谈朴素贝叶斯的另一个问题。

来源例如下面http://www.statsoft.com/textbook/naive-bayes-classifier : http://www.statsoft.com/textbook/naive-bayes-classifier

为了演示朴素贝叶斯分类的概念,考虑下面给出的例子:

如上所述,对象可以被分类为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个是GREEN和20个RED ,我们之前的类别成员的概率是:

GREEN先验概率GREEN

RED先验概率20 / 60

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

从上面的例子可以看出,由于圆包含1 GREEN物体和3 RED物体,所以给定GREENX可能性小于给定REDX可能性。 从而:

尽管先验概率表明X可能属于GREEN (假设GREENRED两倍),但可能性指示了其他情况; X的类成员资格是RED (假定X附近的RED对象比GREEN )。 在贝叶斯分析中,最后的分类是通过结合两种信息源,即先验和可能性,使用所谓的贝叶斯规则(以托马斯贝叶斯1702-1761命名)形成后验概率而产生的。

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





naivebayes