最全面的贝叶斯机器学习入门教程

最全面的贝叶斯机器学习入门教程_第1张图片

在我深入探讨该主题之前,这儿有一个问题–机器学习的全部内容是什么,为什么它突然成为流行语? 从根本上说,机器学习是“预测的艺术”。 这一切都是基于过去来预测未来。 成为流行语的原因实际上与数据,技术,计算能力或任何这些东西无关。 这只是关于人类的心理! 是的,我们人类总是对未来充满好奇,不是吗? 而且,这是数据的时代,我们可以做出以数据为依据的良好预测,这是机器学习的本质。 预测的有效性基于两个因素:预测的准确性和进行的时间。 您也许可以以99%的准确度预测降雨,但是如果您只能在下毛毛雨之前就知道,那就没有用了! 另一方面,如果您要预测未来一周会下雨,但是您的预测得以实现的机会仅为10%,嗯,那也不好!

因此,预测的技巧就是在时间和准确性之间达到最佳平衡。通常,正确地进行早期预测需要大量的直觉,因为早期预测没有特权,即“历史数据”。早期的预测实际上不是数据驱动的。想象一下一种情况,您试图预测下一周是否会下雨,并获得与过去两年中实际“雨天”之前7天的天气状况有关的信息。现在有了您身边的这些数据,如果您要做出预测并且正确地做出了70%的预测,那么突然会发生什么变化?是的,这是历史数据。您将尝试评估上一次出了什么问题,考虑影响天气状况的关键因素,并尝试在下一次给出更好的预测。这种方法称为贝叶斯方法,其中,如果提供其他信息,则过去的概率可以逆转。我们将在接下来的部分中详细介绍这一点。
在此之前,推荐大家可以多在FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

概率论-随机性 vs.可能性


重要的不仅是过去发生的事情,而且将来还会重复发生的可能性也很重要。 概率论全是关于随机性与可能性的关系(我希望以上内容是直观的,只是在开玩笑!)。 它基本上量化了事件在随机空间中发生的可能性。 例如,如果我掷硬币并期望“正面”,则有50%或1⁄2的机会,只要“掷硬币的行为”是公正的(公正的或无偏差的硬币获得正面或反面的可能性相同)。 这种公平的假设归因于随机性,满足期望的机会是概率。

让我们再举一个掷骰子的经典例子。 如果我掷骰子并期望得到“ 4”,几率是多少? 它通过(预期结果/结果总数)的1/6进行量化,即在总共6个可能结果中,我们期望数字4的一个特定结果。样本空间包含或保存所有可能的事件。 概率总是以百分比或0到1之间的数字来量化。概率可以是离散变量,也可以是连续变量。

上面的示例如下图。

参考文件:https://www.mathsisfun.com
最全面的贝叶斯机器学习入门教程_第2张图片
概率所在-参考:mathisfun

那么数学是什么? –贝叶斯定理

在讨论贝叶斯定理之前,我们需要了解一些(更多!)概率的基本概念。 首先,在上述示例中,我们计算硬币出现正面而骰子出现4的概率。这称为联合概率。 还有两种其他类型的概率。 一种叫做条件概率,在骰子出现4的基础上硬币出现正面的概率。最后,如果您想要特定结果的概率,即仅硬币或仅骰子的概率,我们称其为边际概率。

现在,贝叶斯定理(以托马斯·贝叶斯牧师1702-1761命名)就是基于此定理的。 让我们看看是如何的:

对于两个事件A和B,如果已知给定A的B条件概率和B的概率,则可以计算给定A的B的条件概率。
最全面的贝叶斯机器学习入门教程_第3张图片

以下是解释贝叶斯规则的一种简单方法。 任务是识别新观察到的点的颜色。
最全面的贝叶斯机器学习入门教程_第4张图片
绿色点的数量是红色点的两倍,因此有理由相信,待预测的点(尚未观察到颜色)是绿色的可能性是红色的两倍。 在贝叶斯分析中,此信息称为先验概率。 先验概率基于先前的经验,在本例中为绿色和红色点的百分比,通常用于在实际观察到结果前预测结果。
由于总共有60个对象,其中40个是绿色和20个是红色,因此两个类别的先验概率可以写为:

绿色的先验概率= 绿色对象总数/总的对象数目= 40/60
红色的先验概率= 红色对象总数/总的对象数目= 20/60

在确定了先验概率之后,就可以对新对象X进行分类了(下图中的白色圆圈)。由于点聚集在一起,因此可以合理地假设X附近的绿色(或红色)点越多,则新对象属于该特定颜色的可能性就越大。为了度量这种可能性,在X周围画了一个圆,该圆包含与点的类别标签无关的多个点(它们将被优先考虑)。然后,我们计算圆圈中每个类别的点数。由此我们计算出可能性:
最全面的贝叶斯机器学习入门教程_第5张图片
从上图中可以清楚地看到,X是绿色的可能性小于X是红色的可能性,因为该圆圈包含1个绿色对象和3个红色对象。

尽管先验概率表明X可能属于绿色(绿色的数量是红色的两倍),但可能性表明并非如此; X更可能是红色(附近的红色点比绿色多)。 在贝叶斯分析中,通过结合两个信息源,即先验概率和似然度,使用贝叶斯定律形成后验概率,从而产生最终分类。

绿色的后验概率= 绿色的先验概率×绿色的概率= 40/60×1/4=1/6

红色的后验概率= 红色的先验概率×红色的似然度= 20/60×3/4=1/4

最后,由于X是红色的后验概率更大,因此将其分类为红色。

贝叶斯主义- 可能性隧道尽头的希望之光!

贝叶斯定理不仅限于基于条件概率的定理。 贝叶斯定理的大多数例子都是基于临床测试的(下面的图片给出了很好的解释,所以尝试一个不同的例子!)
最全面的贝叶斯机器学习入门教程_第6张图片
memecenter.com

以银行欺诈/贷款违约为例。 想象一下,您是一家银行的基金经理,并且对某个客户的信用度表示怀疑,该客户从银行那里借了很多钱。 现在您想知道客户是否会拖欠这笔贷款。 因此,作为本金检查,您可以查看客户的信用评分,以了解违约概率(PD)。 您会看到客户的PD为0.99。 因此,您得出结论,客户有99%的可能性拖欠贷款,哇,您感到震惊! 放松……这还不是故事的结局,因为您需要从贝叶斯视角来看!
最全面的贝叶斯机器学习入门教程_第7张图片
现在,如果仔细观察,在当前情况下拖欠贷款的可能性与绿色突出显示的问题密切相关。 是的,他之前有多少次违约,违约的频率是多少? 这也是该空间中要收集的最重要的数据。

假设客户拥有良好的跟踪记录,并且由于某种原因,您的银行系统对他而言显示出很高的PD。 客户的背景调查显示,他拖欠贷款的可能性只有0.1%,即千分之一的机会。 因此,如果您减少数字,实际上将获得9%的违约机会!! 哇,那还不错!
最全面的贝叶斯机器学习入门教程_第8张图片
但是,只要没有足够的数据作为支持,“贝叶斯”就存在偏差。 现在,试想一下,随着客户端上收集的更多数据,绿色的数量是否增加。 然后出现违约的可能性自然增加了,不是吗?

因此,原则上,贝叶斯“陷阱”就是这样! 所有闪光的不都是金子。 提出三个基本问题以获得正确的观点:

1.黄金多久闪一次光?

2.如果有闪光,那么金属变成黄金的机会是什么?

3.尽管金属是黄金,仍然没有出现闪闪发光的机会?

希望你掌握了它! 如果您提供更多历史数据,则预测将发生变化!

机器学习–朴素贝叶斯分类器

这是一种基于贝叶斯定理的分类技术,假设预测变量之间具有独立性。

简而言之,朴素贝叶斯分类器假定类中某个特征的存在与任何其他特征的存在无关。 是的,这真的很朴素。
最全面的贝叶斯机器学习入门教程_第9张图片
该算法首先创建所有类别的频率表(类似于先验概率),然后创建似然表。 最后,计算后验概率。

让我们看一下问题描述:

鸢尾花数据集由三种花的物理参数组成:Versicolor,Setosa和Virginica。 数据集包含的数字参数是“萼片宽度”,“萼片长度”,“花瓣宽度”和“花瓣长度”。 利用这些数据,我们将基于这些参数预测花朵的类别。 数据由描述各个特征尺寸的连续数值组成。 即使这些特征相互依赖或取决于其他特征的存在,朴素贝叶斯分类器也会考虑所有这些特征,以独立地促成花朵属于特定物种的概率。
最全面的贝叶斯机器学习入门教程_第10张图片
对关键变量进行了大量的探索性数据分析,下面显示了这样的输出。 该图显示,在所有变量中,花瓣长度是关键的区别因素,重叠最小。
最全面的贝叶斯机器学习入门教程_第11张图片

朴素假设

现在,分类器将假定花瓣长度是该分类的独立且同等贡献的特征,并按如下所示构建分类器。
最全面的贝叶斯机器学习入门教程_第12张图片
注意:通过分配概率来确定分类,例如,分类器将向自己提出一个问题-如果花瓣长度为5cm,则该物种为杂色的概率是多少? 根据上面显示的图,但是对于一条紫色线落在绿色区域(如下所示)的情况,分类正确的可能性很高(> 90%)。 因此,分类器做出决定。
最全面的贝叶斯机器学习入门教程_第13张图片
朴素贝叶斯模型易于构建,对中小型数据集特别有用(本文中使用的模型就是证明!)。 除了简单之外,朴素的贝叶斯(Naive Bayes)还胜过非常复杂的分类方法。 为此,该分类器用于各种关键领域,例如疾病诊断,情感分析和构建电子邮件垃圾邮件分类器。

让我们为著名的Iris数据集分类问题建立一个朴素的贝叶斯分类器。只需单击以下按钮,即可在FloydHub上轻松运行此代码。

https://floydhub.com/run?template=https://github.com/sixteenpython/Naive-Bayes
步骤1:读取机器学习模型的库
from sklearn.metrics import confusion_matrixfrom sklearn.metrics import classification_reportfrom sklearn.model_selection import train_test_split
步骤2:将数据分为因变量和自变量
X = iris.iloc[:, :-1].values
y = iris.iloc[:, -1].values
步骤3:将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
步骤4:构建分类器并测试输出。
Naive Bayesfrom sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
Summary of the predictions made by the classifierprint(classification_report(y_test, y_pred))print(confusion_matrix(y_test, y_pred))# Accuracy scorefrom sklearn.metrics import accuracy_scoreprint(‘accuracy is’,accuracy_score(y_pred,y_test))
运行上面的代码片段将为您提供分类器的输出。 此链接中提供了完整的详细信息。

优点

需要更快的预测时。 在多类预测中也很有效

如果朴素的假设成立,则分类器的性能优于Logistic回归等其他模型,并且您需要的训练数据也更少。

缺点

在“零频率”的情况下,如果在训练集中未观察到分类变量,则分类器将无法以“零”概率的假设进行预测。

朴素贝叶斯的另一个局限性是独立预测变量的假设。 在现实生活中,我们几乎不可能获得一组完全独立的预测变量。

超越朴素贝叶斯

内在的数学-回归与分类

分类问题的基本思想是分类的。 它根据定义的标准对变量进行“分类”并预测分类。 如果您对分类不感兴趣,但对估计感兴趣,即您不希望类别是“好”还是“坏”,而是想知道特定的数字,那么问题就是回归问题。 最常用的回归技术是线性回归(到达最佳拟合线)。 现在,要将其转换为分类问题,我们需要将所有可能性分类为两类(二进制分类), 这就是逻辑回归,。由于估计值现在根据二进制变量(0到1,其中零和一个为概率)进行分类,因此称为逻辑回归。 现在,就到了朴素贝叶斯,因为它尝试根据向量或数字进行分类。 (方法类似于逻辑回归)

逻辑回归的扩展的一点数学方法,如下所述。
最全面的贝叶斯机器学习入门教程_第14张图片
上面显示的是从线性回归到逻辑回归的过渡。 由于概率不能为负,因此左侧的图无效。 现在,如右图所示,S型函数用作我们的分类器,并根据概率进行分类(类似于NB分类器)。 问题是用绿色圈出的区域。 由于本文前面提到的两个问题(朴素假设和零频率),“零”的类概率在正常的NB分类器中将产生错误的结果。

朴素贝叶斯(NB)的变体通常用于提高基准性能,具体取决于模型的变体,使用的功能以及任务或数据集。 一个很好的例子是文本分类问题,该问题主要用于垃圾邮件分类器以及许多其他领域。 这些问题属于NLP(自然语言处理)的范畴。 任何文本分类算法所遵循的基本步骤如下:
最全面的贝叶斯机器学习入门教程_第15张图片
根据词准备term文档矩阵/表。 这被称为词的“词袋”或“向量化”。 例如,如果您的收件箱被与“房屋贷款/汽车贷款/个人贷款”相关的电子邮件轰炸,则分类器会将“贷款”一词标记为分类的关键指标。 在大多数情况下,每个单词都会分配一个数字。

将句子/单词转换为token。 每个token都可以是单词或标点符号。 此过程称为tokenization。

因此,现在您有了token矩阵和向量,必须使用它们运行分类器。
最全面的贝叶斯机器学习入门教程_第16张图片
Source: kdnuggets.com

通常,朴素贝叶斯最适合中小型数据集。 另一方面,文本分类问题通常具有较大的数据集。 因此,有必要查看NB分类器的变体以了解我们如何处理此问题。

例如 如果电影必须根据某些关键情感词语从IMDB评论中归类为“好”或“差” ,“无聊”等,它将对这些单词进行带有否定意义的向量处理,并将电影归类为“不好”。 在二进制逻辑中,它假定所有“负面声音”词都将分配给数字0,并且电影将被分类为“不好”。 因此,如果样本评论中出现“ 0”的可能性更大,那么电影被分类为“不好”的可能性就很高。

现在想像一下,如果评论中没有这些词,那会将一部电影分类为“好”吗?不一定?这就是变体出现的原因。这是通过引入常量“修剪”向量化过程的时候。代替分类器将向量范围指定为(0,1),它将降低误分类的概率,变得更明智,并将向量分配为(0.2,0.8),其中引入的常数为0.2。接下来介绍一种称为NB-SVM算法的新组合。这实际上是具有Naive Bayes特征的SVM(支持向量机)。它创建了一个简单的模型变体,SVM是以NB的log-count比率“ r”作为特征值。对数形式是对NB进行线性化的尝试。因此,在NB-SVM中,SVM的原始向量形式的特征,通过点积被转化为一个标量。(要详细了解此变体的更多信息,请访问fast.ai的MOOC)。这样,我们将略微调整先验概率以适应这种更现实的情况。即使没找到表示否定意义的词块,分类器会在分类之前会采用点积,这样分类就更准确了。该常量表示“即使未找到否定词,电影的分为“不好”的可能性”。

朴素贝叶斯分类器的流行变体

朴素贝叶斯的传统版本是高斯NB,它最适合连续数据类型。高斯NB的基本假设是特征遵循正态分布。本节中讨论的其他变体最适合用于文本分类问题,因为数据特征是离散的。 BernoulliNB是朴素贝叶斯(Naive Bayes)版本,类似于词袋模型,特征转化为二进制向量。

MultinomialNB是BernoulliNB的非二进制版本。顾名思义,多项式的意思是“many counts”。

此外,ComplementNB实现了Complement Naive Bayes(CNB)算法。 CNB是标准多项式朴素贝叶斯(MNB)算法的改编,特别适合于不平衡数据集。 CNB的发明人表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上通常胜过MNB(通常有相当大的优势)。以下是这些分类器上的测试模拟结果与相应代码的比较。
最全面的贝叶斯机器学习入门教程_第17张图片
推论如下:

Iris数据集的特征在很大程度上是连续的,即分类是基于花瓣维度完成的,因此GaussianNB的准确性最高。 此外,由于数据集很小,因此具有100%的准确性!

二进制向量化对于这种类型的分类是不相关的。 因此,BernoulliNB的准确性得分非常低!

MultinomialNB试图通过离散化特征的假设进行分类。 但是,他们的数据集本身只有150个特征组合。 因此即使将每一个维度都看作是一个独特的离散特征,也能够获得不错的准确性得分。 最后,ComplementNB在这种情况下也非常相关,只是用于比较目的。

只需单击下面的按钮,即可轻松运行此代码。

https://floydhub.com/run?template=https://github.com/sixteenpython/Naive-Bayes

from sklearn.naivebayes import MultinomialNB
classifier = MultinomialNB()classifier.fit(Xtrain, ytrain)
ypred = classifier.predict(X_test)
Summary of the predictions made by the classifierprint(classification_report(y_test, y_pred))print(confusion_matrix(y_test, y_pred))# Accuracy scorefrom sklearn.metrics import accuracy_scoreprint(‘accuracy is’,accuracy_score(y_pred,y_test))# Bernoulli Naive Bayesfrom sklearn.naive_bayes import BernoulliNB
classifier = BernoulliNB()classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
Summary of the predictions made by the classifierprint(classification_report(y_test, y_pred))print(confusion_matrix(y_test, y_pred))# Accuracy scorefrom sklearn.metrics import accuracy_scoreprint(‘accuracy is’,accuracy_score(y_pred,y_test))# Complement Naive Bayesfrom sklearn.naive_bayes import ComplementNB
classifier = ComplementNB()classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
Summary of the predictions made by the classifierprint(classification_report(y_test, y_pred))print(confusion_matrix(y_test, y_pred))# Accuracy scorefrom sklearn.metrics import accuracy_scoreprint(‘accuracy is’,accuracy_score(y_pred,y_test))from sklearn.metrics import accuracy_score, log_loss
classifiers = [
GaussianNB(),
MultinomialNB(),
BernoulliNB(),
ComplementNB(),
]
Logging for Visual Comparisonlog_cols=[“Classifier”, “Accuracy”, “Log Loss”]log = pd.DataFrame(columns=log_cols)
for clf in classifiers:
clf.fit(X_train, y_train)
name = clf.__class
.__name

print(“=”*30)
print(name)

 
  1. print('****Results****')
  2. train_predictions = clf.predict(X_test)
  3. acc = accuracy_score(y_test, train_predictions)
  4. print("Accuracy: {:.4%}".format(acc))
  5.  
  6. log_entry = pd.DataFrame([[name, acc*100, ll]], columns=log_cols)

总结
我希望这是对Naive分类器算一个不错的介绍,强烈建议您使用本文提供的资源来构建自己的分类器。 本文将使您对分类器有一个很好的了解,您可以通过应用新知识来构建分类器。 如果您已经做到这一点,祝贺您,那么您就真正成为了朴素贝叶斯的英雄。 您不再“Naive”!

References

James.G., Witten.D, Hastie.T.,Tibshirani.R.,(2017) An Introduction to Statistical Learning , with Applications in R . 2nd Edition. Springer

Veritasium – YouTube channel

fast.ai (Intro to Machine Learning - MOOC)

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/article/598

更多精彩内容请访问FlyAI-AI竞赛服务平台;为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台;每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

挑战者,都在FlyAI!!!

 

你可能感兴趣的:(机器学习,深度学习,入门,机器学习,人工智能)