朴素贝叶斯分类的简单解释
我发现很难理解朴素贝叶斯的过程,我想知道如果有人能用简单的一步一步的过程用英语解释它。 我知道需要把时间作为概率进行比较,但我不知道训练数据是如何与实际数据集相关的。
请给我一个关于训练集扮演的angular色的解释。 我在这里给出一个非常简单的例子,比如香蕉
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
我所了解的你的问题分为两部分。 一个是你需要更多的理解朴素贝叶斯分类器,其次是围绕训练集的困惑。
一般来说,所有的机器学习algorithm都需要被训练用于监督学习任务,如分类,预测等,或者用于无监督的学习任务,如聚类。
通过训练意味着对特定的input进行训练,以便以后我们可以根据他们的学习对他们进行未知input(他们以前从未见过)对其进行分类或预测等(在监督学习的情况下)进行testing。 这是大多数机器学习技术,如neural network,支持向量机,贝叶斯等基于。
因此,在一般的机器学习项目中,您必须将input集分为开发集(培训集+开发testing集)和testing集(或评估集)。 记住你的基本目标是你的系统在开发集或testing集中学习和分类他们从未见过的新input。
testing集通常具有与训练集相同的格式。 但是,testing集与训练语料不同的地方是非常重要的:如果我们简单地重用训练集作为testing集,那么只是简单地记住它的input而不学习如何推广到新例子的模型将会误导性地高分数。
一般来说,举个例子,70%可以是训练案例。 还要记得将原始集合随机分成训练集和testing集。
现在我来谈谈朴素贝叶斯的另一个问题。
来源例如下面 : http : //www.statsoft.com/textbook/naive-bayes-classifier
为了演示朴素贝叶斯分类的概念,考虑下面的例子:
如上所述,对象可以被分类为GREEN
或RED
。 我们的任务是根据当前存在的对象对新的案例进行分类,即根据它们属于哪个类别标签来决定。
由于GREEN
物体的数量是RED
两倍,所以有理由相信,一个新的情况(尚未观察到)的可能性是GREEN
而不是RED
两倍。 在贝叶斯分析中,这种信念被称为先验概率。 先前的概率是基于以前的经验,在这种情况下是GREEN
和RED
物体的百分比,并且常常用于在实际发生之前预测结果。
因此,我们可以写:
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画一个圆圈,它包含一个数字(被select的先验),而不考虑它们的类别标签。 然后我们计算属于每个类标签的圆的点数。 由此我们计算可能性:
从上面的例子可以看出,由于圆包含1
GREEN
物体和3
RED
物体,所以给定GREEN
的X
可能性小于给定RED
的X
可能性。 从而:
虽然先验概率表明X
可能属于GREEN
(假定有两倍于GREEN
),但是可能性是另外的; X
的类成员是RED
(假定X
附近的RED
对象比GREEN
)。 在贝叶斯分析中,最后的分类是通过结合两种信息来源,即先验和可能性,使用所谓的贝叶斯规则(以托马斯贝叶斯(Thomas Bayes)1702-1761命名)形成后验概率而产生的。
最后,我们把X归类为RED
因为它的类成员达到了最大的后验概率。
我意识到这是一个老问题,有一个确定的答案。 我发布的原因是接受的答案有许多k-NN( k -nearest neighbors)元素,一个不同的algorithm。
k-NN和NaiveBayes都是分类algorithm。 从概念上说,k-NN使用“接近”的概念来分类新的实体。 在k-NN'nearness'中用欧几里德距离或余弦距离等概念来build模。 相比之下,在NaiveBayes中,“概率”的概念被用来分类新的实体。
既然这个问题是关于朴素贝叶斯的,那么我将如何描述对某人的想法和步骤。 我会尽量用尽可能less的等式和简单的英语来做。
首先,条件概率和贝叶斯规则
在有人能够理解和领会朴素贝叶斯的细微差别之前,他们首先需要了解一些相关的概念,即条件概率的概念和贝叶斯规则。 (如果您熟悉这些概念,请跳至“ 获取朴素贝叶斯”一节 )
简单英语的条件概率 : 考虑到其他事情已经发生,什么事情将会发生。
假设存在一些结果O和一些证据E.从这些概率的定义方式来看: 同时具有结果O和证据E的概率是:(发生概率O)乘以(E的概率)发生了)
理解条件概率的一个例子:
假设我们有一批美国参议员。 参议员可以是民主党人或共和党人。 他们也是男性或女性。
如果我们select一个完全随机的参议员,这个人是女性民主党人的概率是多less? 条件概率可以帮助我们回答这个问题。
(民主党和女参议员)的概率=议员(参议员是民主党人)乘以有条件的女性可能性,因为他们是民主党人。
P(Democrat & Female) = P(Democrat) * P(Female | Democrat)
我们可以计算完全相同的东西,相反的方式:
P(Democrat & Female) = P(Female) * P(Democrat | Female)
了解贝叶斯规则
从概念上讲,这是从P(证据|已知结果)到P(结果|已知证据)的一种方式。 通常,我们知道有多less特定的证据被观察, 给出一个已知的结果 。 鉴于证据,我们必须用这个已知的事实来计算相反的结果,以计算结果发生的可能性。
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)
现在,这只是序言,去朴素贝叶斯。
去朴素贝叶斯的“
到目前为止,我们只谈到了一个证据。 事实上,我们必须预测多重证据的结果。 在这种情况下,math变得非常复杂。 为了避免这种复杂性,一种方法是将多个证据“分离”,并将每个证据都视为独立的。 这就是为什么这被称为朴素贝叶斯。
P(Outcome|Multiple Evidence) = P(Evidence1|Outcome) * P(Evidence2|outcome) * ... * P(EvidenceN|outcome) * P(Outcome) scaled by P(Multiple Evidence)
许多人select记住这个:
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.
我们的工作是查看证据,考虑成为这个class级或那个class级的可能性,并为每个实体分配一个标签。 再次,我们采取一个非常简单的方法:具有最高可能性的类被声明为“胜利者”,并且类标签被分配给该组合证据。
水果的例子
让我们通过一个例子来加强我们的理解:OP要求一个“水果”识别的例子。
假设我们有1000块水果的数据。 他们碰巧是香蕉 , 橙子或其他一些水果 。 我们知道每种水果的3个特征:
- 是否长
- 无论是甜蜜还是甜蜜
- 如果它的颜色是黄色的。
这是我们的“训练集”。 我们将用它来预测我们遇到的任何新的水果的types。
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
鉴于水果,如何分类?
假设我们被赋予一种未知的水果属性,并要求对其进行分类。 我们被告知,水果是长,甜,黄。 这是香蕉吗? 这是一个橙色? 还是一些其他的水果?
我们可以简单地将这三个结果中的每一个的数字逐一进行分析。 然后,我们select最高的概率,根据我们以前的证据(我们的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) ...
指定最高号码的类别标签,然后完成。
尽pipe有这个名字,朴素贝叶斯在某些应用程序中performance出色。 文本分类是真正闪耀的一个领域。
希望有助于理解朴素贝叶斯algorithm背后的概念。
Ram Narasimhan在下面很好地解释了这个概念,是通过朴素贝叶斯代码实例的一个替代解释
它使用了本书第351页上的示例问题
这是我们将要使用的数据集
在上面的数据集中,如果我们给出假设= {"Age":'<=30', "Income":"medium", "Student":'yes' , "Creadit_Rating":'fair'}
那么什么概率他会买或不会买电脑。
下面的代码完全回答了这个问题。
只需创build一个名为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
希望有助于更好地理解问题
和平
朴素贝叶斯:朴素贝叶斯监督机器学习,用于做数据集的分类。 它用于基于事先知识和独立性假设来预测事物。
他们称之为天真,因为它是假设(假定数据集中的所有特征都是同等重要和独立的)在大多数现实世界的应用程序中确实是乐观的,而且很less真实。
是对未知数据集进行决策的分类algorithm。 它基于贝叶斯定理 ,它基于事件的先验知识来描述事件的概率。
下图显示朴素贝叶斯是如何工作的
预测NB的公式:
如何使用朴素贝叶斯algorithm?
让我们来看一个NB如何炒作的例子
第一步:首先我们找出在下图中显示是或否的概率的表的可能性。 第二步:找出每个class级的后验概率。
Problem : Find out the possibility of whether player play 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 match played is low.
更多参考请参考这些博客。
我试着用一个例子来解释贝叶斯规则。
假设你知道有10%的人是吸烟者。 你也知道, 90%的吸烟者是男性,其中80%是20岁以上的。
现在你看到一个男人和15岁的人。 你想知道他是一个吸烟者的机会:
X = smoker | he is a man and under 20
如你所知,10%的人是吸烟者,你最初的猜测是10%( 先验概率 ,不知道任何人),但其他证据 (他是男人,他是15)可以贡献这个概率。
每个证据都可能增加或减less这个机会。 例如,他是一个男人的事实可能会增加他是一个吸烟者的机会,只要不吸烟者中的这个百分比(是男性)比例较低,例如40%。 换句话说,作为一个男人必须是一个吸烟者而不是非吸烟者的好指标。
我们可以用另一种方式来展示这个贡献。 对于每个特征,您需要将特征(f)的共同性(概率)独立地与在给定条件下的概率进行比较。 ( P(f) vs. P(f | x)
例如,如果我们知道在一个社会中成为男人的概率是90%,而且90%的吸烟者也是男人,那么知道某个人是男人(10% * (90% / 90%) = 10%)
,但是如果男性贡献了40%的社会,而90%的吸烟者,那么作为一个男人会增加吸烟者的机会(10% * (90% / 40%) = 22.5% )
同样,如果一个人的概率是95%,那么无论吸烟者中男性的比例高%)!,作为一个男人的证据减less了成为吸烟者的机会! (10% * (90% / 95%) = 9.5%)
。
所以我们有:
P(X) = P(smoker)* (P(being a man | smoker)/P(being a man))* (P(under 20 | smoker)/ P(under 20))
注意在这个公式中,我们假定当一个男人和20岁以下 的人是独立的特征,所以我们乘以他们,这意味着知道20岁以下的人不会猜测他是男人还是女人。 但是,这也许并不是真的,例如,一个社会中的大多数青less年可能都是男性。
在分类器中使用此公式
分类器具有一些特征(男人和20岁以下),并且必须决定他是否是吸烟者。 它使用上面的公式来发现。 为了获得所需的概率(90%,10%,80%…),它使用训练集。 例如,对训练集中的吸烟者进行统计,发现他们贡献了10%的样本。 那么对于吸烟者来说,他们中有多less人是男人或女人……有多less人是20岁以下或20岁以下的…