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来预测结果?
只需为每个可能的结果运行上面的公式。由于我们试图分类,每个结果都被称为
让我们在一个例子中进行尝试,以增加我们的理解: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 ___________________________________________________________________ |
我们可以预先计算很多关于水果收集的事情。好的。
所谓的"先验"概率。(如果我们不知道任何水果属性,这就是我们的猜测。)这些是我们的
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) |
根据压倒性的优势(
看看它最终会变成什么。只是一些计数和乘法。我们可以预先计算所有这些术语,因此分类变得简单、快速和有效。好的。
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分类,考虑下面给出的示例:好的。
好的。
如图所示,对象可分为
由于
因此,我们可以写:好的。
由于共有
在制定了我们先前的概率之后,我们现在准备对一个新的对象进行分类(下图中的
好的。
好的。
从上面的例子可以清楚地看出,给定
好的。
好的。
虽然先前的概率表明,
好的。
最后,我们将x分类为
Naive Bayes:NaiveBayes受到机器学习的监督,机器学习用于对数据集进行分类。它用于根据先前的知识和独立性假设来预测事物。
他们称之为幼稚,因为它的假设(它假设数据集中的所有特性都同样重要和独立)是非常乐观的,在大多数实际应用程序中很少如此。
对未知数据集进行决策的是分类算法。它基于贝叶斯定理,该定理基于事件的先验知识描述事件的概率。
下图显示了NaiveBayes的工作原理
预测Nb的公式:
如何使用朴素贝叶斯算法?
让我们举个例子说明一下N.B是如何工作的
第一步:首先,我们找出表的可能性,该表在下图中显示了是或否的概率。第二步:找出每个类的后验概率。
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页的一个示例问题这是我们将使用的数据集在上述数据集中,如果我们假设=
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)的共性(概率)单独与给定条件下的共性进行比较。(
所以我们有:
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岁以下有多少人……