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

Jag*_*ack 538 algorithm classification machine-learning dataset naivebayes

我发现很难理解Naive Bayes的过程,我想知道是否有人可以用英语简单的一步一步解释它.我理解它需要按时间比较概率,但我不知道训练数据如何与实际数据集相关.

请给我一个关于训练集扮演什么角色的解释.我在这里给出一个非常简单的水果例子,例如香蕉

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
Run Code Online (Sandbox Code Playgroud)

Ram*_*han 1040

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

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

既然问题是关于朴素贝叶斯,那么我就是如何向某人描述想法和步骤的.我会尝试用尽可能少的方程式和简单的英语来做.

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

在有人能够理解和欣赏朴素贝叶斯的细微差别之前,他们首先需要了解一些相关概念,即条件概率和贝叶斯规则.(如果您熟悉这些概念,请跳至标题为" 获取朴素贝叶斯"一节)

普通英语中的条件概率:鉴于其他事情已经发生,事情发生的可能性是多少.

让我们说有一些结果O.和一些证据E.从这些概率的定义方式:同时具有结果O和证据E的概率是:( O发生的概率)乘以(E的问题,给出发生了哦)

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

假设我们收集了美国参议员.参议员可以是民主党人或共和党人.他们也是男性或女性.

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

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

  P(Democrat & Female) = P(Democrat) * P(Female | Democrat) 
Run Code Online (Sandbox Code Playgroud)

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

  P(Democrat & Female) = P(Female) * P(Democrat | Female) 
Run Code Online (Sandbox Code Playgroud)

理解贝叶斯规则

从概念上讲,这是一种从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)
Run Code Online (Sandbox Code Playgroud)

现在,所有这些只是序言,来到Naive Bayes.

来到朴素贝叶斯'

到目前为止,我们只谈了一件证据.实际上,我们必须根据多种证据预测结果.在那种情况下,数学变得非常复杂.为了解决这种并发症,一种方法是"解开"多个证据,并将每个证据视为独立的.这种方法就是为什么这被称为朴素贝叶斯.

P(Outcome|Multiple Evidence) = 
P(Evidence1|Outcome) * P(Evidence2|outcome) * ... * P(EvidenceN|outcome) * P(Outcome)
scaled by P(Multiple Evidence)
Run Code Online (Sandbox Code Playgroud)

很多人选择记住这个:

                      P(Likelihood of Evidence) * Prior prob of outcome
P(outcome|evidence) = _________________________________________________
                                         P(Evidence)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果Prob(证据|结果)是1,那么我们只是乘以1.
  • 如果Prob(某些特定证据|结果)为0,那么整个概率.如果你看到相反的证据,我们可以排除这种结果.
  • 由于我们用P(证据)来划分所有东西,我们甚至可以在不计算它的情况下逃脱.
  • 先验相乘的直觉是,我们给出了更常见的结果的概率,以及对不太可能的结果的低概率.这些也被称为base rates,它们是一种扩展我们预测概率的方法.

如何应用NaiveBayes预测结果?

只需针对每种可能的结果运行上面的公式.由于我们正在尝试进行分类,因此每个结果都称为a 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
             ___________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

我们可以预先计算很多关于我们水果收集的东西.

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

 P(Banana)      = 0.5 (500/1000)
 P(Orange)      = 0.3
 P(Other Fruit) = 0.2
Run Code Online (Sandbox Code Playgroud)

"证据"的可能性

p(Long)   = 0.5
P(Sweet)  = 0.65
P(Yellow) = 0.8
Run Code Online (Sandbox Code Playgroud)

"可能性"的可能性

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
Run Code Online (Sandbox Code Playgroud)

鉴于水果,如何分类呢?

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

我们可以简单地逐个运行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)
Run Code Online (Sandbox Code Playgroud)

通过压倒性的边缘(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)  ...
Run Code Online (Sandbox Code Playgroud)

分配最高编号中的类别标签,然后就完成了.

尽管如此,Naive Bayes在某些应用中表现出色.文本分类是它真正闪耀的一个领域.

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

  • 感谢非常明确的解释!很容易在网络上漂浮的更好的一个.问题:因为每个P(结果/证据)乘以1/z = p(证据)(在水果案例中,意味着每个基本上都是基于先前证据的概率),说z不是正确的NaïveBayes一点都不重要?因此,如果一个人遇到一个长的/甜的/黄色的水果****不是一个香蕉,它就会被分类错误. (13认同)
  • @ E.Chow是的,你是正确的,因为计算z对朴素贝叶斯无关紧要.(这是一种将概率扩展到0和1之间的方法.)注意,z是手头所有证据的概率的乘积.(它与*priors*不同,这是班级的基本费率.)你是对的:如果你确实找到了不是香蕉的长/甜/黄水果,NB会把它错误地分类为香蕉,基于在这个训练集上.该算法是"基于证据的最佳概率猜测",因此它*偶尔会错误分类. (7认同)
  • 绝对很棒的解释.我从理论论文和书籍中无法理解这个算法.因为,深奥的解释是普遍接受的写作风格.这就是全部,而且很容易.谢谢. (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! (3认同)
  • 谢谢,我比教科书更喜欢这个答案,他们试图使用大量的数学符号来混淆我们而不是真正教我们知识,但是您,先生,您是英雄! (2认同)

Yav*_*var 668

据我所知,你的问题分为两部分.一个是你需要更多地了解Naive Bayes分类器,其次是围绕训练集的混乱.

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

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

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

测试集通常具有与训练集相同的格式.但是,测试集与训练语料库不同是非常重要的:如果我们只是将训练集重新用作测试集,那么只是记住其输入而不学习如何推广到新例子的模型会误导性地接收高分数.

一般而言,例如,70%可以是训练集案例.还记得将原始集合随机分成训练和测试集.

现在我来谈谈你关于Naive Bayes的另一个问题.

来源如下: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其中有GREEN20个RED,我们先前的类成员资格概率是:

先前的概率GREEN:40 / 60

先前的概率RED:20 / 60

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

在此输入图像描述

在此输入图像描述

从上图可以清楚地看出,X给定的GREEN可能性小于X给定的可能性RED,因为圆圈包含1 GREEN物体和物体3 RED.从而:

在此输入图像描述

在此输入图像描述

虽然先验概率表明X可能属于GREEN(假设GREEN相比之下有两倍RED),但可能性表示不然; 那的类别成员XIS RED(假定有更多的RED在其附近的物体XGREEN).在贝叶斯分析中,通过组合两个信息源(即先验和可能性)来产生最终分类,以使用所谓的贝叶斯规则(以Rev.Thomas Bayes 1702-1761命名)形成后验概率.

在此输入图像描述

最后,我们将X分类为RED因为其类成员资格达到最大后验概率.

  • 这个答案令人困惑 - 它混合了KNN(k个最近的邻居)和天真的贝叶斯. (249认同)
  • 上面的算法不是更像k-最近邻居吗? (39认同)
  • 答案很顺利,直到有可能出现.所以@Yavar使用K最近邻来计算可能性.这有多正确?如果是,有哪些其他方法来计算可能性? (7认同)

Say*_*een 18

Ram Narasimhan非常好地解释了这个概念,下面是通过Naive Bayes实际代码示例的另一种解释
它使用了本书第351页的示例问题
这是我们将使用的数据集
在此输入图像描述
在上面的数据集中,如果我们给出假设= {"Age":'<=30', "Income":"medium", "Student":'yes' , "Creadit_Rating":'fair'}那么他将购买或不购买计算机的概率是多少.
下面的代码正好回答了这个问题.
只需创建一个名为named的文件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
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

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

和平


jit*_*555 18

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

他们称之为天真,因为它的假设(假设数据集中的所有特征同样重要且独立)在大多数实际应用中都非常乐观并且很少成立.

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

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

在此输入图像描述

预测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.
Run Code Online (Sandbox Code Playgroud)

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

请参阅GitHub存储库Naive-Bayes-Examples


Ahm*_*mad 14

我试着通过一个例子来解释贝叶斯规则.

假设您知道10%的人是吸烟者.您还知道,90%的吸烟者是男性,80 %的吸烟者年龄超过20岁.

现在你看到一个男人15岁的人.你想知道他是吸烟者的机会:

 P(smoker | he is a man and under 20) 
Run Code Online (Sandbox Code Playgroud)

既然你知道有10%的人是吸烟者,你的初始猜测是10%(先验概率,不知道关于这个人的任何事情),但其他证据(他是一个男人,他是15岁)可以影响这个猜测.

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

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

所以我们有:

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))
Run Code Online (Sandbox Code Playgroud)

请注意,在这个公式中,我们假设作为一个男人并且在20岁以下是独立的特征,所以我们将它们相乘,这意味着知道有人在20岁以下对猜测他是男人或女人没有影响.但这可能不是真的,例如,社会中的大多数青春期都可能是男性......

在分类器中使用此公式

分类器具有一些特征(男性和20岁以下)并且必须决定他是否是吸烟者.它使用上面的公式来找到它.为了提供所需的概率(90%,10%,80%......),它使用训练集.例如,它将训练集中的人员计为吸烟者,并发现他们贡献了10%的样本.然后对吸烟者检查其中有多少是男性或女性......有多少是20岁以下或20岁以下....