我发现很难理解朴素贝叶斯的过程,我想知道是否有人能用英语简单的一步一步解释它。我理解它需要按时间比较概率,但我不知道训练数据是如何与实际数据集相关的。
请解释一下训练集的作用。我在这里给出一个非常简单的水果例子,例如香蕉
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
答案 0 :(得分:1031)
我意识到这是一个老问题,有一个确定的答案。我发帖的原因是,接受的答案有许多k-NN元素( k - 最近邻居),这是一种不同的算法。
k-NN和NaiveBayes都是分类算法。从概念上讲,k-NN使用" nearness"对新实体进行分类。在k-NN' nearness'用欧几里德距离或余弦距离等思想建模。相比之下,在NaiveBayes中,概率的概念是用于对新实体进行分类。
由于问题是关于朴素贝叶斯,所以我在这里向某人描述想法和步骤。我会尝试用尽可能少的方程式和简单的英语来做到这一点。
在有人能够理解和欣赏Naive Bayes'的细微差别之前,他们首先需要了解一些相关的概念,即条件概率的概念,以及贝叶斯'规则。 (如果您熟悉这些概念,请跳至标题为进入Naive Bayes' )的部分
条件概率用简单的英语:某事发生的概率是多少,假设已发生其他事情。
让我们说有一些结果O.和一些证据E.从这些概率的定义方式:两者结果O和证据E的可能性是: (发生O的可能性)乘以(发生O的情况下的E问题)
了解条件概率的一个示例:
假设我们收集了美国参议员。参议员可以是民主党人或共和党人。他们也是男性或女性。
如果我们完全随机选择一位参议员,这个人是女性民主党人的概率是多少?条件概率可以帮助我们回答这个问题。
(民主党和女参议员)的概率= Prob(参议员是民主党人)乘以有条件的女性概率,因为他们是民主党人。
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)
现在,所有这些只是前言,去了Naive Bayes。
到目前为止,我们只讨论过一项证据。实际上,我们必须预测多重证据的结果。在这种情况下,数学变得非常复杂。为了解决这种并发症,一种方法是解开'多个证据,并将每一个证据视为独立的。这种方法之所以被称为 naive 贝叶斯。
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)
注意这个等式的一些事项:
base rates
,它们是一种扩展我们预测概率的方法。 只需针对每种可能的结果运行上面的公式。由于我们正在尝试分类,因此每个结果都称为class
并且它有一个class label.
我们的工作是查看证据,考虑它的可能性此类或该类,并为每个实体分配标签。
同样,我们采用一种非常简单的方法:具有最高概率的类被声明为"胜利者"并且该类标签被分配给该证据组合。
让我们尝试一个例子来增加我们的理解:OP要求一个水果'识别示例。
我们说我们有1000块水果的数据。他们碰巧是香蕉,橙色或某些其他水果。 我们知道每种水果的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) ...
分配最高编号中的类别标签,然后就完成了。
尽管有这个名字,但Naive Bayes在某些应用中表现出色。文本分类是它真正发光的一个领域。
希望有助于理解朴素贝叶斯算法背后的概念。
答案 1 :(得分:660)
我理解的问题分为两部分,第一部分是你需要更好地理解朴素贝叶斯分类器&第二部分是围绕训练集的混乱。
一般而言,所有机器学习算法都需要针对监督学习任务(如分类,预测等)或无人监督学习任务(如聚类)进行培训。
在训练步骤中,算法会使用特定的输入数据集(训练集)进行教学,以便稍后我们可以测试它们的未知输入(他们以前从未见过),他们可以对其进行分类或预测等(在基于学习的监督学习案例。这就是神经网络,SVM,贝叶斯等大多数机器学习技术的基础。
因此,在一般的机器学习项目中,您必须将输入集划分为开发集(Training Set + Dev-Test Set)&测试集(或评估集)。请记住,您的基本目标是您的系统在Dev set或test set中学习和分类他们以前从未见过的新输入。
测试集通常具有与训练集相同的格式。但是,测试集与训练语料库不同是非常重要的:如果我们简单的话 重新使用训练集作为测试集,然后一个简单记忆其输入的模型,而不学习如何推广到新的例子,会得到误导性的高分。
一般而言,例如,我们70%的数据可用作训练集案例。还记得将原始集分区为训练和测试集随机。
现在我谈谈你关于Naive Bayes的另一个问题。
为了证明朴素贝叶斯分类的概念,请考虑下面给出的例子:
如上所述,对象可以归类为GREEN
或RED
。我们的任务是在新案件到达时对其进行分类,即根据当前存在的对象决定它们属于哪个类别标签。
由于GREEN
个RED
个对象的数量是GREEN
的两倍,因此有理由认为新案例(尚未观察到)的成员资格是{{1}的两倍而不是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
的先前概率:40 / 60
RED
的先前概率:20 / 60
在制定了我们的先验概率后,我们现在准备对新对象进行分类(下图中的WHITE
圈)。由于对象被很好地聚类,因此可以合理地假设X附近的GREEN
(或RED
}个对象越多,新案例就越有可能属于该特定颜色。为了测量这种可能性,我们在X周围绘制一个圆圈,其中包含一个点(可以先验地选择),而不管它们的类别标签。然后我们计算属于每个类标签的圆中的点数。由此我们计算可能性:
从上图可以看出,X
给定GREEN
的可能性小于给定X
RED
的可能性,因为该圈包含1
} GREEN
对象和3
RED
个。因此:
虽然之前的概率表明X
可能属于GREEN
(假设GREEN
与RED
相比有两倍),则可能性表示不然; X
的班级成员资格为RED
(假设RED
附近的X
个对象多于GREEN
。在贝叶斯分析中,通过组合两个信息源(即先验和可能性)来产生最终分类,以使用所谓的贝叶斯规则(以Rev.Thomas Bayes 1702-1761命名)形成后验概率。
最后,我们将X归类为RED
,因为它的类成员资格实现了最大的后验概率。
答案 2 :(得分:17)
Ram Narasimhan非常好地解释了这个概念,下面是通过Naive Bayes在行动中的代码示例的替代解释
它使用了此book on page 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
希望它有助于更好地理解问题
和平
答案 3 :(得分:17)
朴素贝叶斯: Naive Bayes受到监督机器学习,用于对数据集进行分类。 它用于根据事先知识和独立性假设来预测事物。
他们称之为天真,因为它的假设(它假设数据集中的所有功能同样重要且独立)非常乐观,在大多数实际应用中很少见。
分类算法决定未知数据集。它基于Bayes Theorem,基于其先验知识描述事件的概率。
下图显示了朴素的贝叶斯如何工作
预测NB的公式:
如何使用朴素贝叶斯算法?
让我们举一个N.B woks
的例子步骤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.
有关更多参考,请参阅这些blog.
请参阅GitHub存储库Naive-Bayes-Examples
答案 4 :(得分:13)
我尝试用一个例子来解释贝叶斯规则。
假设您知道 10%的人是吸烟者。您还知道 90%的吸烟者是男性, 80%的吸烟者年龄超过20岁。
现在你看到的是一个男人和 15 岁的人。你想知道他是吸烟者的可能性:
X = smoker | he is a man and under 20
由于您知道10%的人是吸烟者,因此您的初步猜测是10%(先前概率,不知道该人的任何事情),但其他证据 (他是一个男人,他是15岁)可以影响这个猜测。
每个证据都可能增加或减少这种机会。例如,如果非吸烟者中这个百分比(男性)较低,例如40%,那么他是的男性可能增加了这个机会。换句话说,作为一个男人必须是吸烟者而不是非吸烟者的良好指标。
我们可以用另一种方式展示这种贡献。对于每个特征,您需要将该特征(f)的共性(概率)与给定条件下的共性进行比较。 (P(f) vs. P(f | x)
。例如,如果我们知道作为一个男人的概率在一个社会中是90%,而90%的吸烟者也是男人,那么知道某人是男人并不能帮助我们{{1}但是,如果男性贡献了40%的社会,但90%的吸烟者,那么知道某人是男性会增加吸烟者的机会(10% * (90% / 90%) = 10%)
。同样,如果作为一个男人,在社会中占95%,那么不管吸烟者中男性的百分比高(90%)!有人是男人的证据减少了他成为吸烟者的机会!(10% * (90% / 40%) = 22.5% )
所以我们有:
(10% * (90% / 95%) = 9.5%)
请注意,在此公式中,我们假设是一个人而低于20 是独立的功能,所以我们将它们相乘,这意味着知道有人不到20岁了对猜测他是男人还是女人没有影响。但这可能不是真的,例如,社会中的大多数青春期都可能是男性......
在分类器中使用此公式
分类器具有一些特征(男性和20岁以下)并且必须决定他是否是吸烟者。它使用上面的公式来找到它。为了提供所需的概率(90%,10%,80%......),它使用训练集。例如,它将训练集中的人员计为吸烟者,并发现他们贡献了10%的样本。然后对于吸烟者来说,检查其中有多少是男性或女性......有多少是20岁以下或20岁以下....