机器学习概率速成课程。
7天掌握机器学习中使用的概率知识。
概率论是数学的一个分支,被公认为机器学习的基石。
虽然概率论是一个庞大的领域,有许多深奥的理论和发现,但机器学习从业者必须掌握该领域的基本工具、方法和符号。只要对概率论是什么有一个坚实的基础,就可以只专注于其中有用或相关的部分。
在本速成课程中,您将发现在七天内如何入门并自信地理解和实现机器学习中使用的 Python 概率方法。
这是一篇内容丰富且重要的文章。您可能想把它加入书签。
用我的新书《机器学习概率》来**启动您的项目**,书中包含所有示例的*分步教程*和 *Python 源代码*文件。
让我们开始吧。
- **2020年1月更新**:已针对 scikit-learn v0.22 API 的变更进行更新。

机器学习概率(7天迷你课程)
照片由 Percita 提供,保留部分权利。
本速成课程适合谁?
在开始之前,让我们确保您来对了地方。
本课程面向可能了解一些应用机器学习的开发人员。也许您知道如何使用流行工具从头到尾解决一个预测建模问题,或者至少了解大部分主要步骤。
本课程的课程假设您具备以下几点:
- 您熟悉基本的Python编程。
- 您可能了解一些基本的NumPy用于数组操作。
- 您想学习概率论,以加深对机器学习的理解和应用。
您不需要是
- 成为数学高手!
- 成为机器学习专家!
本速成课程将带您从一个略懂机器学习的开发者,成长为能够掌握概率方法基础的开发者。
**注意**:本速成课程假定您已有一个可用的 Python3 SciPy 环境,并且至少安装了 NumPy。如果您在环境配置上需要帮助,可以按照这里的分步教程操作:
速成课程概览
本速成课程分为七节课。
您可以每天完成一节课(推荐),或者在一天内完成所有课程(硬核)。这真的取决于您的可用时间和热情程度。
以下是七节课的列表,它们将帮助您入门并高效地使用 Python 进行机器学习概率分析:
- **第01课**:概率与机器学习
- **第02课**:三种类型的概率
- **第03课**:概率分布
- **第04课**:朴素贝叶斯分类器
- **第05课**:熵与交叉熵
- **第06课**:朴素分类器
- **第07课**:概率分数
每节课可能需要60秒到30分钟不等。请慢慢来,按照自己的节奏完成课程。在下面的评论中提问,甚至发布结果。
这些课程希望您能自己去探索如何做事。我会给您一些提示,但每节课的部分目的在于促使您学习去哪里寻求关于统计方法、NumPy API 以及 Python 中一流工具的帮助。(**提示**:我的博客上直接提供了所有答案;请使用搜索框。)
在评论中发布您的结果;我会为您加油!
坚持下去;不要放弃。
**注意**:这只是一个速成课程。要了解更多细节和详尽的教程,请参阅我关于这个主题的书《机器学习概率》。
想学习机器学习概率吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
第01课:概率与机器学习
在本课中,您将了解为什么机器学习从业者应该学习概率论来提升他们的技能和能力。
概率论是量化不确定性的数学领域。
机器学习旨在从不确定的数据中开发预测模型。不确定性意味着处理不完美或不完整的信息。
不确定性是机器学习领域的基础,但它也是给初学者,尤其是那些来自开发者背景的初学者带来最多困难的方面之一。
机器学习中的不确定性主要有三个来源:
- **观测中的噪声**,例如测量误差和随机噪声。
- **对领域的覆盖不完全**,例如您永远无法观测到所有数据。
- **对问题的不完美建模**,例如所有模型都有误差,但有些是有用的。
在应用机器学习中,不确定性是通过概率来管理的。
- 概率和统计帮助我们理解和量化我们从领域中观测到的变量的期望值和变异性。
- 概率帮助理解和量化领域中观测值的期望分布和密度。
- 概率帮助理解和量化我们的预测模型应用于新数据时的期望能力和性能方差。
这是机器学习的基石。除此之外,我们可能需要模型来预测概率,我们可能使用概率来开发预测模型(例如朴素贝叶斯),我们还可能使用概率框架来训练预测模型(例如最大似然估计)。
您的任务
对于这节课,您必须列出三个在机器学习背景下您想要学习概率论的原因。
这些原因可能与上面提到的某些原因有关,也可能是您自己的个人动机。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将了解三种不同类型的概率以及如何计算它们。
第02课:三种类型的概率
在本课中,您将初步了解随机变量之间的联合概率、边缘概率和条件概率。
概率量化了事件发生的可能性。
具体来说,它量化了随机变量(如抛硬币、掷骰子或从一副牌中抽牌)出现特定结果的可能性有多大。
我们可以讨论仅两个事件的概率:变量 *X* 的事件 *A* 和变量 *Y* 的事件 *B*,简写为 *X=A* 和 *Y=B*,并且这两个变量在某种程度上是相关或依赖的。
因此,我们可能需要考虑三种主要类型的概率。
联合概率
我们可能对两个同时发生的事件的概率感兴趣,比如两个不同随机变量的结果。
例如,事件 *A* 和事件 *B* 的联合概率正式写为:
- P(A and B)
事件 *A* 和 *B* 的联合概率计算为:在事件 *B* 发生的条件下事件 *A* 发生的概率乘以事件 *B* 的概率。
这可以正式表述如下:
- P(A and B) = P(A given B) * P(B)
边缘概率
我们可能只对一个随机变量的事件概率感兴趣,而不管另一个随机变量的结果如何。
边缘概率没有特殊的表示法;它就是对于第一个变量的某个固定事件,对第二个变量所有事件的概率求和或取并集。
- P(X=A) = sum P(X=A, Y=yi) for all y
条件概率
我们可能对在另一个事件发生的情况下某个事件发生的概率感兴趣。
例如,事件 *A* 在事件 *B* 发生条件下的条件概率正式写为:
- P(A given B)
事件 *A* 在事件 *B* 发生条件下的条件概率可以使用这些事件的联合概率计算如下:
- P(A | B) = P(A and B) / P(B)
您的任务
对于这节课,您必须练习计算联合概率、边缘概率和条件概率。
例如,如果一个家庭有两个孩子,且年龄较大的一个是男孩,那么这个家庭有两个儿子的概率是多少?这被称为“男孩还是女孩问题”,是众多用于练习概率的经典趣题之一。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将学习随机变量的概率分布。
第03课:概率分布
在本课中,您将初步了解概率分布。
在概率论中,一个随机变量可以取多个可能的值,例如状态空间中的事件。可以为随机变量的某个特定值或一组值赋予一个概率。
随机变量主要分为两类。
- **离散随机变量**。其值从一组有限的状态中抽取。
- **连续随机变量**。其值从一个实数数值范围内抽取。
离散随机变量有一组有限的状态;例如,汽车的颜色。连续随机变量有一个数值范围;例如,人的身高。
概率分布是随机变量取值的概率总结。
离散概率分布
离散概率分布总结了离散随机变量的概率。
一些著名的离散概率分布例子包括:
- 泊松分布。
- 伯努利分布和二项分布。
- 多努利分布和多项分布。
连续概率分布
连续概率分布总结了连续随机变量的概率。
一些著名的连续概率分布例子包括:
- 正态分布或高斯分布。
- 指数分布。
- 帕累托分布。
从高斯分布中随机抽样
我们可以定义一个均值为50、标准差为5的分布,并从中抽样随机数。我们可以使用 NumPy 的 normal() 函数来实现这一点。
下面的示例从该分布中抽样并打印出10个数字。
1 2 3 4 5 6 7 8 9 |
# 从正态分布中抽样 from numpy.random import normal # 定义分布 mu = 50 sigma = 5 n = 10 # 生成样本 sample = normal(mu, sigma, n) print(sample) |
运行该示例会打印出从定义的正态分布中随机抽样的10个数字。
您的任务
对于这节课,您必须开发一个示例,从不同的连续或离散概率分布函数中进行抽样。
作为加分项,您可以将值绘制在x轴上,概率绘制在y轴上,以显示您选择的概率分布函数的密度。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将学习朴素贝叶斯分类器。
第04课:朴素贝叶斯分类器
在本课中,您将学习用于分类预测建模的朴素贝叶斯算法。
在机器学习中,我们经常对预测建模问题感兴趣,即我们希望为给定的观测值预测一个类别标签。
解决这个问题的一种方法是开发一个概率模型。从概率的角度来看,我们感兴趣的是估计在给定观测值的情况下类别标签的条件概率,即给定输入数据 *X* 的情况下类别为 *y* 的概率。
- P(y | X)
贝叶斯定理提供了一种替代的、有原则的方法来计算条件概率,它利用了所需条件概率的反向概率,而后者通常更容易计算。
贝叶斯定理的简单计算形式如下:
- P(A|B) = P(B|A) * P(A) / P(B)
其中,我们感兴趣计算的概率 *P(A|B)* 称为后验概率,而事件 *P(A)* 的边缘概率称为先验概率。
直接将贝叶斯定理应用于分类变得难以处理,特别是随着变量或特征(*n*)数量的增加。相反,我们可以简化计算,并假设每个输入变量都是独立的。尽管这种假设很极端,但这种简化的计算通常能给出非常好的性能,即使输入变量高度相关。
我们可以从头开始实现这个方法,方法是为每个独立的输入变量假设一个概率分布,计算每个特定输入值属于每个类别的概率,然后将这些结果相乘,得到一个分数,用于选择最可能的类别。
- P(yi | x1, x2, …, xn) = P(x1|y1) * P(x2|y1) * … P(xn|y1) * P(yi)
如果我们假设每个输入变量服从高斯分布,scikit-learn 库提供了该算法的高效实现。
要使用 scikit-learn 的朴素贝叶斯模型,首先定义模型,然后在训练数据集上进行拟合。拟合后,可以通过 *predict_proba()* 函数预测概率,也可以通过 *predict()* 函数直接预测类别标签。
下面列出了将高斯朴素贝叶斯模型(GaussianNB)拟合到测试数据集的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 高斯朴素贝叶斯示例 from sklearn.datasets import make_blobs from sklearn.naive_bayes import GaussianNB # 生成二维分类数据集 X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) # 定义模型 model = GaussianNB() # 拟合模型 model.fit(X, y) # 选择单个样本 Xsample, ysample = [X[0]], y[0] # 进行概率性预测 yhat_prob = model.predict_proba(Xsample) print('预测概率: ', yhat_prob) # 进行分类预测 yhat_class = model.predict(Xsample) print('预测类别: ', yhat_class) print('真实值: y=%d' % ysample) |
运行该示例会在训练数据集上拟合模型,然后对我们在前一个示例中使用的同一个第一个样本进行预测。
您的任务
对于这节课,您必须运行该示例并报告结果。
作为加分项,尝试在一个真实的分类数据集上使用该算法,例如基于花卉测量数据对 鸢尾花种类进行分类的经典趣题。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将学习熵和交叉熵分数。
第05课:熵与交叉熵
在本课中,您将学习用于机器学习的交叉熵。
信息论是一个研究通信中信息量化的学科领域。
量化信息的直觉是衡量一个事件中有多大的意外性。那些罕见的事件(低概率)更令人意外,因此比那些常见的事件(高概率)含有更多的信息。
- **低概率事件**:高信息量(令人意外)。
- **高概率事件**:低信息量(不令人意外)。
我们可以使用事件的概率来计算一个事件中包含的信息量。
- 信息量(x) = -log( p(x) )
我们也可以量化一个随机变量中包含多少信息。
这被称为熵,它总结了平均表示事件所需的信息量。
对于一个有 K 个离散状态的随机变量 X,熵可以计算如下:
- 熵(X) = -sum(i=1 to K p(K) * log(p(K)))
交叉熵是衡量给定随机变量或事件集下两个概率分布之间差异的指标。它在优化分类模型时被广泛用作损失函数。
它建立在熵的概念之上,计算了用一个分布来表示或传输另一个分布中的事件平均需要多少比特。
- 交叉熵(P, Q) = – sum x in X P(x) * log(Q(x))
我们可以通过一个小例子来具体说明交叉熵的计算。
考虑一个有三种不同颜色事件的随机变量。我们可能有两种不同的该变量的概率分布。我们可以计算这两种分布之间的交叉熵。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 计算交叉熵的示例 from math import log2 # 计算交叉熵 def cross_entropy(p, q): return -sum([p[i]*log2(q[i]) for i in range(len(p))]) # 定义数据 p = [0.10, 0.40, 0.50] q = [0.80, 0.15, 0.05] # 计算交叉熵 H(P, Q) ce_pq = cross_entropy(p, q) print('H(P, Q): %.3f bits' % ce_pq) # 计算交叉熵 H(Q, P) ce_qp = cross_entropy(q, p) print('H(Q, P): %.3f bits' % ce_qp) |
运行该示例首先计算从 P 到 Q 的交叉熵,然后计算从 Q 到 P 的交叉熵。
您的任务
对于这节课,您必须运行该示例并描述结果及其含义。例如,交叉熵的计算是对称的吗?
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将学习如何开发和评估一个朴素分类器模型。
第06课:朴素分类器
在本课中,您将学习如何为机器学习开发和评估朴素分类策略。
分类预测建模问题涉及根据模型的输入来预测类别标签。
给定一个分类模型,您如何知道该模型是否具备技能?
这是每个分类预测建模项目中常见的问题。答案是将给定分类模型的结果与基线或朴素分类模型进行比较。
考虑一个简单的二分类问题,其中每个类别的观测数量不相等(即不平衡),class-0 有25个样本,class-1 有75个样本。这个问题可以用来考虑不同的朴素分类器模型。
例如,考虑一个以相同概率随机预测 class-0 或 class-1 的模型。它的性能会如何?
我们可以使用一个简单的概率模型来计算期望性能。
- P(yhat = y) = P(yhat = 0) * P(y = 0) + P(yhat = 1) * P(y = 1)
我们可以代入每个类别的出现频率(0.25 和 0.75)以及每个类别的预测概率(0.5 和 0.5),来估计模型的性能。
- P(yhat = y) = 0.5 * 0.25 + 0.5 * 0.75
- P(yhat = y) = 0.5
事实证明,这个分类器相当差。
现在,如果我们考虑每次都预测多数类别(class-1)呢?同样,我们可以代入预测概率(0.0 和 1.0)来估计模型的性能。
- P(yhat = y) = 0.0 * 0.25 + 1.0 * 0.75
- P(yhat = y) = 0.75
事实证明,这个简单的改变产生了一个更好的朴素分类模型,并且在类别不平衡时可能是最好用的朴素分类器。
scikit-learn 机器学习库提供了一个名为 DummyClassifier 的多数类朴素分类算法的实现,您可以在下一个分类预测建模项目中使用它。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# scikit-learn 中多数类朴素分类器的示例 from numpy import asarray from sklearn.dummy import DummyClassifier from sklearn.metrics import accuracy_score # 定义数据集 X = asarray([0 for _ in range(100)]) class0 = [0 for _ in range(25)] class1 = [1 for _ in range(75)] y = asarray(class0 + class1) # 为 sklearn 重塑数据 X = X.reshape((len(X), 1)) # 定义模型 model = DummyClassifier(strategy='most_frequent') # 拟合模型 model.fit(X, y) # 进行预测 yhat = model.predict(X) # 计算准确率 accuracy = accuracy_score(y, yhat) print('准确率: %.3f' % accuracy) |
运行该示例会准备数据集,然后使用多数类策略在数据集上定义并拟合 *DummyClassifier*。
您的任务
对于这节课,您必须运行该示例并报告结果,确认模型的性能是否与我们计算的预期相符。
作为加分项,计算一个朴素分类器模型的期望概率,该模型每次进行预测时都从训练数据集中随机选择一个类别标签。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将学习用于评估预测概率的模型的指标。
第07课:概率分数
在本课中,您将学习两种可用于评估分类预测问题中预测概率的评分方法。
为一个分类问题预测概率而非类别标签,可以为预测提供额外的细微差别和不确定性。
增加的细微差别允许使用更复杂的指标来解释和评估预测的概率。
让我们仔细看看两种用于评估预测概率的流行评分方法。
对数损失分数
逻辑损失(Logistic loss),或简称对数损失(log loss),计算预测概率和观测概率之间的对数似然。
尽管它是为训练二元分类模型(如逻辑回归)而开发的,但它也可以用于评估多类问题,并且在功能上等同于计算源自信息论的交叉熵。
一个技能完美的模型的对数损失分数为 0.0。在 Python 中,可以使用 scikit-learn 的 log_loss() 函数来实现对数损失。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 对数损失示例 from numpy import asarray from sklearn.metrics import log_loss # 定义数据 y_true = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0] y_pred = [0.8, 0.9, 0.9, 0.6, 0.8, 0.1, 0.4, 0.2, 0.1, 0.3] # 按预期定义数据,例如每个事件 {0, 1} 的概率 y_true = asarray([[v, 1-v] for v in y_true]) y_pred = asarray([[v, 1-v] for v in y_pred]) # 计算对数损失 loss = log_loss(y_true, y_pred) print(loss) |
布里尔分数
布里尔分数(Brier score),以 Glenn Brier 的名字命名,计算预测概率与期望值之间的均方误差。
该分数总结了概率预测中误差的大小。
误差分数总是在 0.0 和 1.0 之间,其中技能完美的模型的得分为 0.0。
在 Python 中,可以使用 scikit-learn 的 brier_score_loss() 函数来计算布里尔分数。
例如:
1 2 3 4 5 6 7 8 |
# 布里尔损失示例 from sklearn.metrics import brier_score_loss # 定义数据 y_true = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0] y_pred = [0.8, 0.9, 0.9, 0.6, 0.8, 0.1, 0.4, 0.2, 0.1, 0.3] # 计算布里尔分数 score = brier_score_loss(y_true, y_pred, pos_label=1) print(score) |
您的任务
对于这节课,您必须运行每个示例并报告结果。
作为加分项,更改模拟预测,使其更好或更差,并比较最终的分数。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
这是最后一课。
结束!
(看看您取得了多大的进步)
您做到了。干得好!
花点时间回顾一下您已经走了多远。
您发现了:
- 概率在应用机器学习中的重要性。
- 三种主要类型的概率以及如何计算它们。
- 随机变量的概率分布以及如何从中进行随机抽样。
- 如何使用贝叶斯定理计算条件概率以及如何将其用于分类模型。
- 如何计算信息、熵和交叉熵分数以及它们的含义。
- 如何开发和评估朴素分类模型的预期性能。
- 如何评估预测分类问题概率值的模型的技能。
迈出下一步,查阅我的书《机器学习概率》。
总结
您对这个迷你课程的学习情况如何?
您喜欢这个速成课程吗?
您有任何问题吗?有没有遇到什么难点?
告诉我。在下面留言。
第2课:“对于这节课,您必须练习计算联合概率、边缘概率和条件概率。”
这可能是一个愚蠢的问题,但是“怎么做”呢?我甚至谷歌搜索了计算联合概率等等,看了一些可汗学院的视频,也找到了一些大学准备的课堂PDF,但我无法在脑海中具体化这个概念以便理解它。
也许我不适合这份热情。如果我的问题再次显得愚蠢,我很抱歉。
好问题,这会有帮助
https://machinelearning.org.cn/joint-marginal-and-conditional-probability-for-machine-learning/
哇,谢谢你,我会阅读这篇文章。而且我会在提问前使用搜索功能 :)
谢谢。
联合概率、边缘概率和条件概率的概念对我来说很清楚,但请提供 Python 代码,并用其他例子来帮助理解这个概念。
看这里
https://machinelearning.org.cn/how-to-calculate-joint-marginal-and-conditional-probability/
嗨
请告诉我如何绘制样本图来显示它是否是正态分布的?
(课程的第三天)
请看这个教程
https://machinelearning.org.cn/a-gentle-introduction-to-normality-tests-in-python/
我已经学习了熵和交叉熵。还有很多散度度量,比如如何找到两个概率分布之间的距离?但是你的教程很好,你的工作很了不起。我想学习更多。
看这篇关于KL散度的文章
https://machinelearning.org.cn/divergence-between-probability-distributions/
import pandas as pd
from sklearn.naive_bayes import GaussianNB
iris = pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv',
header = None) # 导入数据集
modelIris = GaussianNB()
modelIris.fit(iris.iloc[:, 0:4], iris.iloc[:, 4]) # 拟合模型
modelIris.predict([[7.2, 4, 5, .5]]) # 模型预测这个数据点是变色鸢尾花
干得好!
学习概率的三个理由。
1. 为了打牢我的基础。
2. 为了理解数学之美。
3. 为了预测未来。
干得好!
我的三大理由
1. 利用概率作为基础,向业务用户用最简单的术语解释机器学习模型的可行性(不确定性)及其解释。
2. 运用应用概率生成有效/可操作的商业洞见。
3. 使用“条件概率”来表示任何现实世界的场景(不知何故感觉生活就是这样运作的)。
干得好!
我学习概率的三大理由
1. 为了更好地理解不同的概率概念,如似然、交叉熵。
2. 我想专攻自然语言处理(NLP),其中很多算法本质上是概率性的,比如LDA,我想更好地理解这些算法。
3. 我想轻松阅读和实现基于机器学习和深度学习的论文。
谢谢!
我是在回复发送到我收件箱的邮件。以下是我认为机器学习从业者应该理解概率的三个原因:
1. 为了进行有效的实验或测试。举个具体的例子,关于什么结果或输出能证明某个理论的陈述应该是合理的。措辞和逻辑必须正确。以一个有点著名的统计数据被滥用的案例为例:
随机选择一个人符合罪犯描述的概率,与一个符合罪犯描述的特定人物有罪的概率是不同的。如果罪犯的外貌非常独特,以至于一个随机的人匹配它的概率是120亿分之一,这并不意味着一个没有任何支持证据将他与犯罪联系起来但确实符合描述的男人是无辜的概率是120亿分之一。
2. 机器学习从业者需要知道,什么使得度量/值的差异(均值、中位数、方差、标准差或适当缩放的度量单位的差异)是“显著的”或足够不同以构成证据。
3. 概率论中的某些课程可以帮助在数据或结果中发现模式,例如“季节性”。
4. 额外加分:概率知识可以在特定情况下帮助优化代码或算法(代码模式)。
干得好!
所以,如果我理解交叉熵,它不是对称的,因为相同的结果对这两个集合没有相同的意义。
例如,如果我有一个加权的骰子,掷出6的几率是95%,其他每个结果的几率是1%,还有一个公平的骰子,掷出每个数字的几率是17%,那么如果我掷出一个6,我只会认为它是加权骰子的可能性大约是6:1,但如果我掷出其他任何数字,我认为它是公平骰子的可能性大约是17:1。(这假设我的先验是我同样可能选择了任何一个,比如说我只有这两个骰子)。
那么如果我选择加权的骰子,我将需要掷几次才能说服自己它是加权的,但如果我选择非加权的骰子,我会在少得多的掷次中说服自己是那个(如果我只需要2西格玛的置信度,可能在1次掷骰中就够了)。
好问题,是的,kl-散度和交叉熵不是对称的。
另外,这可能会有帮助
https://machinelearning.org.cn/cross-entropy-for-machine-learning/
在“第03课:概率分布”中
“离散随机变量有一组有限的状态”。这个描述不准确。
它应该改为“离散随机变量有一组可数的状态”。
例如,如果一个离散随机变量取值于 N* = {1,2,3,4,5…}。
这个集合是可数的,但不是有限的。
感谢您的精确说明,但在实践中,如果它不是有限的,我们就必须用不同的方式来建模。
三个理由
1. 职业发展
2. 个人兴趣
3. 更好地理解机器学习算法
谢谢!
用于绘制抛掷有偏硬币(p=0.7)100次二项分布的代码。
from numpy import random
import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot (random.binomial(n=1, p=0.7, size=100), hist=True, kde=False)
干得好!
第1课
– 在地下学科(地球物理学)工作,我收到的数据经过了长期的处理和解释。数据很少带有不确定性,通常只有“最佳估计”。我希望与其他学科的同事合作,也能传递不确定性,然后我需要将这一点纳入我自己的分析中。
– 即使在大学里学过统计学并在机器学习课程中复习过,我发现你需要定期接触概率估计才能掌握它。它不能被重复太多次。
– 现在Python中有很多有用的工具,像这样的速成课程是了解最有用工具的好方法。
干得好!
第二课
一个类似的经典案例是三选一问题,其中只有一个选项有奖。你选择一个选项,但不揭示其内容。然后,向你展示剩下的一个选项没有奖,并给你机会从你最初的选择换到最后一个。你应该换吗?答案是肯定的。当你做最初的选择时,P(正确) = 1/3。当揭示另一个选项是错误的之后,最后一个选项的 P(正确) = 1/2,但你最初的选择仍然锁定在 P(正确) = 1/3。这显示了边缘概率(第一次选择)和条件概率(第二次选择)之间的区别。
干得好!
学习概率的原因
1- 预测的数学形式始于概率。
2- 以图形形式排列数据可以提供数据的洞察,如均值、标准差。
3- 概率有助于定义样本数据和总体。
干得好!
我们想在机器学习背景下学习概率的三个原因。
1. 从数学上评估我们的机器学习模型性能(即,用大型数据集训练机器学习模型是一个相当复杂的过程,作为一名机器学习工程师,我们不知道我们的模型如何从大型数据集中学习模式,所以我们可以使用概率参数来评估模型的学习性能)。
2. 在将数据提供给机器学习模型之前进行预处理(即,机器学习模型需要干净准确的数据来学习,如果数据不好,那么机器学习的结果也不好,所以我们需要在教机器学习模型之前对数据集进行评估,我们可以使用概率技术来进行数据评估)。
3. 解释机器学习模型的学习参数(即,我们可以调整机器学习模型的参数来制作一个好的可学习模型,而这个模型的调整过程需要数学和概率知识)。
干得好!
非常好的教程,我有一个问题,如果我注册了,我会收到关于
机器学习概率的免费电子书吗?
谢谢!
是的,如果您注册了电子邮件课程,您将通过电子邮件收到该课程的 PDF 版本。
1) 加强和掌握我的概率基础知识将提高我解决问题的能力
2) 之后掌握模糊逻辑,我理解它包含了经典概率论
3) 掌握机器学习算法的理解和编码
干得好。
第3课
# 抽样指数分布
from numpy.random import exponential
import matplotlib.pyplot as plt
n=10
# 生成样本
sample_e=[]
for i in range(n)
sample_e.append(exponential(scale=1.0))
print(sample_e)
plt.hist(sample_e)
plt.xlim(0,10)
干得好!
https://colab.research.google.com/drive/1C0pgkMAKhmSf9duK0Vw9dk6W-a0FPYtG?usp=sharing
H(P, Q): 3.323 比特
H(Q, P): 5.232 比特
交叉熵是不对称的。
干得好!
第6天:朴素分类器。该模型表现如预期,因为它以75%的准确率预测了类别,这是可能达到的最高准确率。这是在 DummyClassifier 中将策略设置为“most_frequent”的结果。
每次进行预测时,一个朴素分类器模型从训练数据集中随机选择一个类别标签的期望概率是62.5%。这个计算可以通过在DummyClassifier中设置“stratified”策略来实现。
干得好。
我尝试了另外两种概率分布:多项分布和二项分布
from numpy.random import default_rng
rng = default_rng()
n=10
pvals = [0.1] * n
vals = rng.multinomial(n,pvals)
print(vals)
[1 1 0 2 0 0 3 0 2 1]
from numpy.random import default_rng
rng = default_rng()
n=10
pvals = [0.1] * n
vals = rng.binomial(n,pvals)
print(vals)
[4 2 0 1 2 2 0 0 0 1]
干得好!继续努力。
任务1:我为什么想在机器学习的背景下学习概率
1. 为了更好地理解技术论文和博客。
2. 为了增强我在不确定性估计领域的知识,为手头的问题建模不确定性。
加深我对现有机器学习概念的理解,如KL散度、最大似然估计、分布等。
感谢你的反馈,Anuj!如果你有任何问题需要我帮助,请告诉我。
此致,
任务2:男孩女孩问题
在第一个孩子是男孩的情况下,两个孩子都是儿子的概率是0.5。
所以,让我们假设我们有两个随机变量,F代表第一个孩子,S代表第二个孩子。
F可以是男孩或女孩,概率都是0.5,S也可以是男孩或女孩,概率也都是0.5。
现在我们的样本空间有以下组合:BB, BG, GB, GG
如果我们不知道第一个孩子的情况,两个孩子都是儿子的概率是1/4=0.25
现在既然我们知道第一个孩子是男孩,这就变成了一个条件概率问题,我们的样本空间缩小到BB, BG。所以现在两个孩子都是儿子的概率是1/2=0.5。
很好。继续努力!
任务第一天
我学习概率的原因
1. 概率对于分类预测建模至关重要。
2. 许多机器学习模型都是使用概率进行训练的。
3. 概率是统计学的核心,而统计学与机器学习密不可分。
第2课
两种可能的事件:都是男孩,或者大的是男孩小的是女孩
所以都是男孩的概率是:1/2
第3课
#二项分布
from numpy.random import binomial
#p: 成功概率
p=0.2
# k: 试验次数
k=50
#模拟
success = binomial(k, p)
print( ' 总成功次数: %d ' % success)
第四天
代码
# 高斯朴素贝叶斯示例
from sklearn.datasets import make_blobs
from sklearn.naive_bayes import GaussianNB
# 生成二维分类数据集
X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)
# 定义模型
model = GaussianNB()
# 拟合模型
model.fit(X, y)
# 选择单个样本
Xsample, ysample = [X[0]], y[0]
# 进行概率性预测
yhat_prob = model.predict_proba(Xsample)
print('预测概率: ', yhat_prob)
# 进行分类预测
yhat_class = model.predict(Xsample)
print('预测类别: ', yhat_class)
print('真实值: y=%d' % ysample)
输出
预测概率: [[1.00000000e+00 5.52387327e-30]]
预测类别: [0]
真实值: y=0
第6课
通过将分类器从“most_frequent”更改为“stratified”,模型现在成功地估计了62.5%的预期准确率。同样的原理也可以通过手动计算预期准确率来解释。
方法A)分类器不考虑多数类:(0.5 * 0.25 + 0.5 * 0.75)
方法B)分类器考虑多数类:(0.0 * 0.25 + 1.0 * 0.75)
P(yhat = y) = (方法A) * 0.5 + (方法B) * 0.5
P(yhat = y) = (0.5 * 0.25 + 0.5 * 0.75) * 0.5 + (0.0 * 0.25 + 1.0 * 0.75) * 0.5 = 0.625 = 62.5%
谢谢你的反馈,Paul!继续加油!
1. 我想开发一种关于人类美德和性格优势的新分类方法
2. 我想成为一名出色的数据科学家
3. 我有兴趣了解合并不同类别会如何影响我目前正在做的项目的概率
4. 我热爱数学,尤其是统计学
5. 我非常有动力去广泛了解不同的机器学习算法,而且我知道深入理解概率是理解它们的基础
第04课:NB(朴素贝叶斯)
鸢尾花数据集(附加练习)
如果在进行多项式分类时,在分割训练集和测试集时使用 random_state,我们总是得到相同的结果(准确率、精确率、召回率、f1分数),这与例如神经网络(NN)不同。
经过多次运行,我们可以看到所有指标都非常相似,介于0.95和1之间。–> 我们为这个特定的数据集开发了一个强大的机器学习算法。
如果这个数据集对整个种群具有代表性,我们就可以基于花萼长度、花萼宽度、花瓣长度和花瓣宽度,以高置信度地使用多项式朴素贝叶斯(NB)来预测这3种花卉的种类。
有趣的是,可以增加一个代表所有其他具有相似花萼和花瓣尺寸花卉的类别,然后看看我们的算法表现如何。
第06课:朴素分类器(虚拟分类器)
我或许可以写出更优雅的代码,但我希望我的代码和思路对其他学生有用。如果我犯了什么错误,请评论指出。
附加任务
# 原始代码
# scikit-learn 中多数类朴素分类器的示例
from numpy import asarray
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score
# 定义数据集
X = asarray([0 for _ in range(100)])
class0 = [0 for _ in range(25)]
class1 = [1 for _ in range(75)]
y = asarray(class0 + class1)
# 为 sklearn 重塑数据
X = X.reshape((len(X), 1))
# 定义模型
model = DummyClassifier(strategy=’most_frequent’)
# 拟合模型
model.fit(X, y)
# 进行预测
yhat = model.predict(X)
# 计算准确率
accuracy = accuracy_score(y, yhat)
print(‘Accuracy: %.3f’ % accuracy)
# 我的代码
print(y)
print(x)
# 用于检查y中数字数量的计数器
def counter(variable)
zeros = []
ones = []
other = []
for x in variable
if x == 0
zeros.append(x)
elif x == 1
ones.append(x)
else
other.append(x)
return len(zeros), len(ones), len(other)
counter(y)
# 随机预测
uniform = DummyClassifier(strategy='uniform')
# 拟合模型
uniform.fit(X, y)
# 进行预测
ypred = uniform.predict(X)
# 计算准确率
accuracy_rand = accuracy_score(y, ypred)
print('Accuracy: %.3f' % accuracy_rand)
# 100次试验,附带均值和标准差
trials = []
for a in range (0,100)
uniform = DummyClassifier(strategy='uniform')
# 拟合模型
uniform.fit(X, y)
# 进行预测
ypred = uniform.predict(X)
# 计算准确率
accuracy_rand = accuracy_score(y, ypred)
print(f'Accuracy in trial {a+1} is {accuracy_rand}')
trials.append(accuracy_rand)
import statistics as s
print(round(s.mean(trials),2), round(s.stdev(trials),2))
"""
总结 --> 如果我们运行足够多次的随机试验,统计学就会起作用(M=0.5)。
知道标准差(sd)也很有用(0.05)。
尝试多次运行代码,看看你是否得到相同的均值(M)和标准差(sd):)
"""
希望这个评论里的代码缩进不会乱掉
import statistics as s
def counter(variable)
zeros = []
ones = []
other = []
for x in variable
if x == 0
zeros.append(x)
elif x == 1
ones.append(x)
else
other.append(x)
return len(zeros), len(ones), len(other)
counter(y)
trials = []
for a in range (0,100)
uniform = DummyClassifier(strategy='uniform')
# 拟合模型
uniform.fit(X, y)
# 进行预测
ypred = uniform.predict(X)
# 计算准确率
accuracy_rand = accuracy_score(y, ypred)
print(f'Accuracy in trial {a+1} is {accuracy_rand}')
trials.append(accuracy_rand)
print(round(s.mean(trials),2), round(s.stdev(trials),2))
第1课 – 这是我的理由
在某些情况下,你可能需要基于概率为分类问题建立自己的评估指标
在定义问题之前,基于概率测试可行性可以避免浪费时间。
理解基于概率的评估指标和算法的逻辑,有助于为问题做出正确的选择
很棒的反馈,Nurgul!我们很感激!
第01课:学习概率的3个理由
(1)我想学习如何更好地思考现象发生的可能性。
(2)我想更好地理解计算准确概率所需的各个组成部分。
(3)我想开始用概率的方式思考解决方案,并了解如何使用概率模型来得出这些解决方案。
谢谢你的反馈,Sara!继续加油,如果你在学习课程中遇到任何问题需要我们帮助解答,请告诉我们!
第02课:男孩还是女孩悖论
我相信答案是0.5,因为剩下的选项只有“男孩+男孩”或“男孩+女孩”,所以“男孩+男孩”的概率是1/2。
第03课:概率分布
import numpy as np
import matplotlib.pyplot as plt
# 对帕累托分布进行采样
# 生成样本
shape, mode = 10, 5
sample = np.random.pareto(shape, 1000)
print(sample)
s = (np.random.pareto(shape, 1000) + 1) * mode
count, bins, _ = plt.hist(s, 100, density=True)
fit = shape*mode**shape / bins**(shape+1)
plt.plot(bins, max(count)*fit/max(fit), linewidth=2, color='r')
plt.show()
第04课:朴素贝叶斯分类器
预测概率: [[1.00000000e+00 5.52387327e-30]]
预测类别: [0]
真实值: y=0
Jason
我想学习概率的三个原因是
1. 自从我本科时教我的那位讲师以来,概率论一直是我的心头刺
他从未把它讲到我能理解的水平。
2. 您以一种有趣的方式介绍了这个主题,我希望我能理解并在机器学习中使用概率
3. 我已经和您一起完成了其他速成课程,它们在实际应用中帮助很大。
第01课
我参加这门课程的原因
1) 希望理解概率的思维方式
2) 对机器学习感兴趣
3) 希望能有不那么抽象的解释
谢谢你的反馈,Hein!我们很感激!
关于第2课的任务
total_outcomes = 2 * 2 # 两个孩子,每个孩子有两种可能(男孩或女孩)
# 定义事件
event_BB = 1
event_B = 3
# 计算概率
probability_BB = event_BB / total_outcomes
probability_B = event_B / total_outcomes
probability_BB_given_B = probability_BB / probability_B
# 打印结果
print(f”联合概率 P(BB): {probability_BB}”)
print(f”边缘概率 P(B): {probability_B}”)
print(f”条件概率 P(BB | 年长的孩子是男孩): {probability_BB_given_B}”)
输出
联合概率 P(BB): 0.25
边缘概率 P(B): 0.75
条件概率 P(BB | 年长的孩子是男孩): 0.3333333333333333
请告诉我这是否正确。谢谢
第4课:使用鸢尾花数据集。
输出:预测概率:[[1.00000000e+00 2.72754528e-18 1.38410356e-24]]
预测类别: [0]
真实值: y=0
第5课:不,交叉熵的计算不是对称的。交叉熵是衡量一个概率分布(q)预测另一个分布(p)的好坏程度。从p到q的交叉熵不同于从q到p的交叉熵。
从分布P到分布Q的交叉熵是3.288比特,而从分布Q到分布P的交叉熵是2.906比特。这两个值是不同的,表明在交叉熵计算中分布的顺序很重要。
第7课:对数损失(Log Loss)分数为0.2469并不是一个完美的分数。在对数损失中,理想的分数是0。布里尔分数(Brier Score)为0.057通常被认为是一个好结果。布里尔分数范围从0到1,值越低表示预测性能越好。