朴素贝叶斯分类的简单解释
classification
machine-learning
12
0

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

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

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
参考资料:
Stack Overflow
收藏
这是机器翻译的吧,都读不通
77880
2020-05-27 10:02:05
不是培训集,是训练集 training set
77880
2020-05-27 10:01:20
评论
共 5 个回答
高赞 时间 活跃

朴素贝叶斯(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-示例

收藏
评论

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

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

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

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

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

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

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

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

在此处输入图片说明

如图所示,对象可以分类为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 ,因此我们获得类成员资格的先验概率为:

事先概率GREEN40 / 60

RED先验概率20 / 60

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

在此处输入图片说明

在此处输入图片说明

从上面的插图中可以明显看出,给定GREENX似然性小于给定REDX似然性,因为圆包含1 GREEN对象和3 RED对象。从而:

在此处输入图片说明

在此处输入图片说明

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

在此处输入图片说明

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

收藏
评论

我意识到这是一个古老的问题,已经有了确定的答案。我发布的原因是,可接受的答案包含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预测结果?

只需对每个可能的结果运行上面的公式。由于我们尝试分类 ,因此每个结果都称为一个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)  ...

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

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

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

收藏
评论

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

假设您知道10%的人是吸烟者。

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

 P(smoker | he is a man and under 20) 

由于您知道10%的人是吸烟者,因此您最初的猜测是10%( 先验概率 ,对这个人一无所知),但是其他证据 (他是一个男人,他是15岁)可以影响这个猜测。

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

我们可以用另一种方式显示这种贡献。对于每个功能,您需要将给定条件下该功能的共性(概率)与其单独的共性进行比较。 ( 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))

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

在分类器中使用此公式

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

收藏
评论

Ram Narasimhan很好地解释了这个概念,下面是Naive Bayes的代码示例的替代解释
它使用本书第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

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

和平

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号