概率密度估计的简单介绍
原文:https://machinelearningmastery.com/probability-density-estimation/
最后更新于 2020 年 7 月 24 日
概率密度是观测值和它们的概率之间的关系。
随机变量的一些结果具有低概率密度,而其他结果具有高概率密度。
概率密度的整体形状称为概率分布,随机变量特定结果的概率计算由概率密度函数(简称 PDF)执行。
知道数据样本的概率密度函数是有用的,以便知道给定的观测值是否不太可能,或者不太可能被认为是异常值或异常值,以及是否应该将其删除。为了选择需要输入数据具有特定概率分布的适当学习方法,这也是有帮助的。
随机数据样本的概率密度函数不太可能是已知的。因此,概率密度必须使用称为概率密度估计的过程来近似。
在本教程中,您将发现概率密度估计的温和介绍。
完成本教程后,您将知道:
- 直方图提供了一种快速可靠的方法来可视化数据样本的概率密度。
- 参数概率密度估计包括选择一个公共分布,并从数据样本中估计密度函数的参数。
- 非参数概率密度估计包括使用一种技术来使模型适合数据的任意分布,如核密度估计。
用我的新书机器学习概率启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
概率密度估计简介阿利斯泰尔·帕特森摄,版权所有。
教程概述
本教程分为四个部分;它们是:
- 概率密度
- 用直方图总结密度
- 参数密度估计
- 非参数密度估计
概率密度
随机变量 x 具有概率分布 p(x) 。
随机变量的结果与其概率之间的关系被称为概率密度,或简称为“密度”
如果随机变量是连续的,那么概率可以通过概率密度函数计算,简称 PDF。随机变量的概率密度函数在整个域中的形状称为概率分布,常见的概率分布有一些名称,如均匀分布、正态分布、指数分布等等。
给定一个随机变量,我们对它的概率密度感兴趣。
例如,给定一个变量的随机样本,我们可能想知道概率分布的形状、最可能的值、值的分布以及其他属性。
了解随机变量的概率分布有助于计算分布的矩,如均值和方差,但也有助于其他更一般的考虑,如确定某个观测值是不太可能还是非常不可能,以及可能是异常值或异常值。
问题是,我们可能不知道随机变量的概率分布。我们很少知道分布情况,因为我们无法获得随机变量的所有可能结果。事实上,我们所能得到的只是一个观察样本。因此,我们必须选择一个概率分布。
这个问题被称为概率密度估计,或简称为“密度估计”,因为我们使用随机样本中的观测值来估计概率的一般密度,而不仅仅是我们现有的数据样本。
随机变量的密度估计过程有几个步骤。
第一步是用简单的直方图检查随机样本中的观察密度。从直方图中,我们可能能够识别出一个可以使用的常见且易于理解的概率分布,例如正态分布。如果没有,我们可能需要拟合一个模型来估计分布。
在接下来的几节中,我们将依次仔细研究这些步骤。
为了简单起见,我们将在这篇文章中关注单变量数据,例如一个随机变量。虽然这些步骤适用于多变量数据,但随着变量数量的增加,它们可能会变得更具挑战性。
用直方图总结密度
密度估计的第一步是创建随机样本中观察值的直方图。
直方图是一种绘图,它首先将观察值分组到不同的箱中,并计算落入每个箱中的事件数量。然后将每个面元中的计数或观察频率绘制成条形图,其中面元位于 x 轴,频率位于 y 轴。
面元数量的选择很重要,因为它控制着分布的粗糙度(条形的数量),进而控制着观测值的密度的绘制。对于给定的数据样本,尝试不同的容器大小是一个好主意,这样可以获得同一数据的多个视角或视图。
例如,1 到 100 之间的观测值可以分成 3 个可能太粗糙的面元(1-33,34-66,67-100),或者 10 个面元(1-10,11-20,… 91-100),它们可以更好地捕捉密度。
可以使用 Matplotlib 库和 hist()函数创建直方图。数据作为第一个参数提供,箱的数量通过“箱”参数指定为整数(例如 10)或每个箱的边界序列(例如[1,34,67,100])。
下面的代码片段为一个数据样本创建了一个包含 10 个面元的直方图。
...
# plot a histogram of the sample
pyplot.hist(sample, bins=10)
pyplot.show()
我们可以创建一个从正态分布中抽取的随机样本,假装我们不知道该分布,然后创建一个数据直方图。 normal() NumPy 函数将实现这一点,我们将生成 1000 个样本,平均值为 0,标准偏差为 1,例如标准高斯。
下面列出了完整的示例。
# example of plotting a histogram of a random sample
from matplotlib import pyplot
from numpy.random import normal
# generate a sample
sample = normal(size=1000)
# plot a histogram of the sample
pyplot.hist(sample, bins=10)
pyplot.show()
运行该示例绘制了一个随机观察的样本,并创建了具有 10 个面元的直方图。我们可以清楚地看到正态分布的形状。
请注意,由于数据样本的随机性,您的结果会有所不同。试着运行这个例子几次。
随机数据样本的 10 格直方图
运行将箱设置为 3 的示例会使正态分布不太明显。
随机数据样本的 3 个面元直方图
查看具有一系列不同箱数的数据样本的直方图将有助于识别密度是否看起来像共同的概率分布。
在大多数情况下,您会看到单峰分布,例如常见的正态分布的钟形、均匀分布的扁平形状,或者指数或帕累托分布的下降或上升形状。
您可能还会看到复杂的分布,例如多个峰值不会随着不同的箱数而消失,称为双峰分布,或者多个峰值称为多峰分布。对于给定值或指示异常值的小范围值,您可能还会看到密度的大峰值,通常出现在远离密度其余部分的分布尾部。
参数密度估计
大多数随机样本的直方图形状将与众所周知的概率分布相匹配。
常见的分布是常见的,因为它们一次又一次地出现在不同的、有时是意想不到的领域。
熟悉常见的概率分布,因为它将帮助您从直方图中识别给定的分布。
一旦识别出来,你可以尝试用选择的概率分布来估计随机变量的密度。这可以通过从随机数据样本中估计分布参数来实现。
例如,正态分布有两个参数:平均值和标准差。给定这两个参数,我们现在知道概率分布函数。这些参数可以通过计算样本平均值和样本标准偏差从数据中估计出来。
我们称这个过程为参数密度估计。
原因是我们使用预定义的函数来总结观测值和它们的概率之间的关系,这些概率可以用参数来控制或配置,因此出现了“参数化”。
一旦我们估计了密度,我们就可以检查它是否合适。这可以通过多种方式实现,例如:
- 绘制密度函数并将形状与直方图进行比较。
- 对密度函数进行采样,并将生成的样本与真实样本进行比较。
- 使用统计测试来确认数据符合分布。
我们可以用一个例子来证明。
我们可以从均值为 50、标准差为 5 的正态分布中生成 1000 个观测值的随机样本。
...
# generate a sample
sample = normal(loc=50, scale=5, size=1000)
然后,我们可以假装不知道概率分布,也许看直方图,猜测它是正常的。假设它是正态的,那么我们就可以计算出分布的参数,具体来说就是均值和标准差。
考虑到采样过程中的小样本量和噪声,我们不会期望均值和标准差分别为 50 和 5。
...
# calculate parameters
sample_mean = mean(sample)
sample_std = std(sample)
print('Mean=%.3f, Standard Deviation=%.3f' % (sample_mean, sample_std))
然后用这些参数拟合分布,即我们的数据样本的参数密度估计。
在这种情况下,我们可以使用 norm() SciPy 函数。
...
# define the distribution
dist = norm(sample_mean, sample_std)
然后,我们可以从这个分布中为我们领域中的一系列值采样概率,在本例中为 30 到 70。
...
# sample probabilities for a range of outcomes
values = [value for value in range(30, 70)]
probabilities = [dist.pdf(value) for value in values]
最后,我们可以绘制数据样本的直方图,并覆盖为 PDF 值范围计算的概率线图。
重要的是,我们可以将直方图每个面元中的计数或频率转换为归一化概率,以确保直方图的 y 轴与线图的 y 轴相匹配。这可以通过在对 hist() 的调用中将“密度参数设置为“真来实现。
...
# plot the histogram and pdf
pyplot.hist(sample, bins=10, density=True)
pyplot.plot(values, probabilities)
将这些片段连接在一起,参数密度估计的完整示例如下所示。
# example of parametric probability density estimation
from matplotlib import pyplot
from numpy.random import normal
from numpy import mean
from numpy import std
from scipy.stats import norm
# generate a sample
sample = normal(loc=50, scale=5, size=1000)
# calculate parameters
sample_mean = mean(sample)
sample_std = std(sample)
print('Mean=%.3f, Standard Deviation=%.3f' % (sample_mean, sample_std))
# define the distribution
dist = norm(sample_mean, sample_std)
# sample probabilities for a range of outcomes
values = [value for value in range(30, 70)]
probabilities = [dist.pdf(value) for value in values]
# plot the histogram and pdf
pyplot.hist(sample, bins=10, density=True)
pyplot.plot(values, probabilities)
pyplot.show()
运行该示例首先生成数据样本,然后估计正态概率分布的参数。
请注意,由于数据样本的随机性,您的结果会有所不同。试着运行这个例子几次。
在这种情况下,我们可以看到均值和标准差有一些噪声,分别与期望值 50 和 5 略有不同。噪音很小,分布预计仍然很合适。
Mean=49.852, Standard Deviation=5.023
接下来,使用估计的参数拟合 PDF,并且将具有 10 个面元的数据的直方图与从 PDF 采样的一系列值的概率进行比较。
我们可以看到,PDF 与我们的数据非常匹配。
正态分布的概率密度函数叠加数据样本直方图
有可能数据确实符合常见的概率分布,但需要在参数密度估计之前进行转换。
例如,您可能有远离分布的平均值或质心的异常值。这可能会导致对分布参数的估计不正确,进而导致数据拟合不良。在估计分布参数之前,应该去除这些异常值。
另一个例子是数据可能有偏差或向左或向右移动。在这种情况下,您可能需要在估计参数之前转换数据,例如取对数或平方根,或者更一般地,使用幂变换,如 Box-Cox 变换。
这些类型的数据修改可能并不明显,有效的参数密度估计可能需要以下迭代过程:
- 循环,直到分布与数据的匹配足够好:
- 1.估计分布参数
- 2.对照数据检查生成的 PDF
- 3.转换数据以更好地适应分布
非参数密度估计
在某些情况下,数据样本可能不像常见的概率分布,或者不容易适应该分布。
当数据具有两个峰值(双峰分布)或多个峰值(多峰分布)时,通常会出现这种情况。
在这种情况下,参数密度估计是不可行的,可以使用不使用共同分布的替代方法。取而代之的是,使用一种算法来近似没有预定义分布的数据的概率分布,称为非参数方法。
这些分布仍然会有参数,但不能像简单的概率分布那样直接控制。例如,非参数方法可能使用随机样本中的所有观测值来估计密度,实际上是使样本中的所有观测值成为“参数”
估计连续随机变量概率密度函数的最常见的非参数方法可能被称为核平滑,或简称为 KDE 核密度估计。
- 核密度估计:使用数据集估计新点概率的非参数方法。
在这种情况下,核是一个数学函数,它返回随机变量给定值的概率。内核有效地平滑或插值随机变量结果范围内的概率,使得概率之和等于 1,这是行为良好的概率的要求。
内核函数根据数据样本与请求概率的给定查询样本的关系或距离,对来自数据样本的观测值的贡献进行加权。
称为平滑参数或带宽的参数控制数据样本中有助于估计给定样本概率的观察范围或窗口。因此,内核密度估计有时被称为 Parzen-Rosenblatt 窗口,或简称为 Parzen 窗口,在方法的开发者之后。
- 平滑参数(带宽 ) :控制用于估计新点概率的样本数或样本窗口的参数。
大窗口可能导致粗略的密度和很少的细节,而小窗口可能有太多的细节,并且不够平滑或通用,不能正确地覆盖新的或看不见的示例。可以使用不同的函数,有时称为基函数,例如均匀法线等,来对窗口内样本的贡献进行整形。,对所得密度函数的平滑度有不同的影响。
- 基函数(核 ) :选择的函数用于控制数据集中样本对估计新点概率的贡献。
因此,用不同的窗口大小和不同的贡献函数进行实验并根据数据的直方图评估结果可能是有用的。
我们可以用一个例子来证明。
首先,我们可以通过组合来自两个不同正态分布的样本来构建双峰分布。具体而言,300 个实例的平均值为 20,标准偏差为 5(较小的峰值),700 个实例的平均值为 40,标准偏差为 5(较大的峰值)。平均值选择得很接近,以确保组合样本中的分布重叠。
下面列出了创建具有双峰概率分布的样本并绘制直方图的完整示例。
# example of a bimodal data sample
from matplotlib import pyplot
from numpy.random import normal
from numpy import hstack
# generate a sample
sample1 = normal(loc=20, scale=5, size=300)
sample2 = normal(loc=40, scale=5, size=700)
sample = hstack((sample1, sample2))
# plot the histogram
pyplot.hist(sample, bins=50)
pyplot.show()
运行该示例会创建数据样本并绘制直方图。
请注意,由于数据样本的随机性,您的结果会有所不同。试着运行这个例子几次。
平均值为 20 的样本比平均值为 40 的样本要少,这可以在直方图中看到,40 左右的样本密度大于 20 左右的样本密度。
根据设计,具有这种分布的数据不能很好地符合普通的概率分布。这是使用非参数核密度估计方法的一个很好的例子。
双峰概率分布数据样本的直方图
Sklearn 机器学习库提供了实现内核密度估计的内核密度类。
首先,这个类是用期望的带宽(窗口大小)和内核(基函数)参数构造的。在数据上测试不同的配置是个好主意。在这种情况下,我们将尝试带宽为 2 和高斯核。
然后通过*拟合()*函数将该类拟合到数据样本上。该函数希望数据具有 2D 形状,其形式为[行,列],因此我们可以将数据样本重新整形为 1,000 行 1 列。
...
# fit density
model = KernelDensity(bandwidth=2, kernel='gaussian')
sample = sample.reshape((len(sample), 1))
model.fit(sample)
然后,我们可以通过计算一系列观察值的概率,并将形状与直方图进行比较,来评估密度估计值与我们的数据的匹配程度,就像我们在上一节中对参数情况所做的那样。
核密度上的 score_samples() 函数将计算样本数组的对数概率。我们可以创建一个从 1 到 60 的样本范围,大约是我们的域的范围,计算对数概率,然后通过计算指数或 exp() 来反转对数操作,以将值返回到正常概率的范围 0-1。
...
# sample probabilities for a range of outcomes
values = asarray([value for value in range(1, 60)])
values = values.reshape((len(values), 1))
probabilities = model.score_samples(values)
probabilities = exp(probabilities)
最后,我们可以创建一个归一化频率的直方图和一个估计概率值的覆盖线图。
...
# plot the histogram and pdf
pyplot.hist(sample, bins=50, density=True)
pyplot.plot(values[:], probabilities)
pyplot.show()
将这些联系在一起,下面列出了双峰数据样本的核密度估计的完整示例。
# example of kernel density estimation for a bimodal data sample
from matplotlib import pyplot
from numpy.random import normal
from numpy import hstack
from numpy import asarray
from numpy import exp
from sklearn.neighbors import KernelDensity
# generate a sample
sample1 = normal(loc=20, scale=5, size=300)
sample2 = normal(loc=40, scale=5, size=700)
sample = hstack((sample1, sample2))
# fit density
model = KernelDensity(bandwidth=2, kernel='gaussian')
sample = sample.reshape((len(sample), 1))
model.fit(sample)
# sample probabilities for a range of outcomes
values = asarray([value for value in range(1, 60)])
values = values.reshape((len(values), 1))
probabilities = model.score_samples(values)
probabilities = exp(probabilities)
# plot the histogram and pdf
pyplot.hist(sample, bins=50, density=True)
pyplot.plot(values[:], probabilities)
pyplot.show()
运行该示例创建数据分布,拟合核密度估计模型,然后绘制数据样本的直方图和来自 KDE 模型的 PDF。
请注意,由于数据样本的随机性,您的结果会有所不同。试着运行这个例子几次。
在这种情况下,我们可以看到 PDF 非常适合直方图。它不是很平滑,可以通过将“带宽”参数设置为 3 个样本或更高来使其更加平滑。用不同的带宽值和内核函数进行实验。
通过双峰数据样本的核密度估计估计的直方图和概率密度函数图
KernelDensity 类功能强大,并支持多维数据的 PDF 估计。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 模式识别与机器学习,2006。
- 机器学习:概率视角,2012。
- 统计学习的要素:数据挖掘、推理和预测,2009。
应用程序接口
文章
摘要
在本教程中,您发现了概率密度估计的温和介绍。
具体来说,您了解到:
- 直方图提供了一种快速可靠的方法来可视化数据样本的概率密度。
- 参数概率密度估计包括选择一个公共分布,并从数据样本中估计密度函数的参数。
- 非参数概率密度估计包括使用一种技术来使模型适合数据的任意分布,如核密度估计。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
面向机器学习的概率(7 天迷你课程)
原文:https://machinelearningmastery.com/probability-for-machine-learning-7-day-mini-course/
最后更新于 2020 年 1 月 10 日
机器学习速成班的概率。
7 天内获得机器学习所用概率榜首。
概率是一个数学领域,被普遍认为是机器学习的基础。
虽然概率是一个大领域,有许多深奥的理论和发现,但机器学习从业者需要该领域的具体细节、工具和符号。有了概率是什么的坚实基础,就有可能只关注好的或相关的部分。
在这个速成课程中,您将发现如何在七天内开始并自信地理解和实现 Python 机器学习中使用的概率方法。
这是一个又大又重要的岗位。你可能想把它做成书签。
用我的新书机器学习概率启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
- 2020 年 1 月更新:针对 Sklearn v0.22 API 的变化进行了更新。
机器学习概率(7 天迷你课程)
图片由珀西塔提供,保留部分权利。
这个速成班是给谁的?
在我们开始之前,让我们确保你在正确的地方。
本课程面向可能了解一些应用机器学习的开发人员。也许你知道如何使用流行的工具来端到端地解决预测建模问题,或者至少解决大部分主要步骤。
本课程中的课程假设了您的一些情况,例如:
- 你对编程的基本 Python 很熟悉。
- 您可能知道一些用于数组操作的基本 NumPy。
- 你想学习概率来加深你对机器学习的理解和应用。
你不需要:
- 数学天才!
- 机器学习专家!
这门速成课程将把你从一个懂一点机器学习的开发人员带到一个能掌握概率方法基础知识的开发人员。
注:本速成课假设您有一个至少安装了 NumPy 的 Python3 SciPy 工作环境。如果您需要环境方面的帮助,可以遵循这里的逐步教程:
- 如何用 Anaconda 设置机器学习的 Python 环境
速成班概述
这门速成课分为七节课。
您可以每天完成一节课(推荐)或一天内完成所有课程(硬核)。这真的取决于你有多少时间和你的热情程度。
下面列出了七堂课,这些课将帮助您开始使用 Python 进行机器学习,并提高学习效率:
- 第 01 课:概率与机器学习
- 第 02 课:三种概率
- 第 03 课:概率分布
- 第 04 课:朴素贝叶斯分类器
- 第 05 课:熵和交叉熵
- 第 06 课:幼稚量词
- 第 07 课:概率分数
每节课可能需要你 60 秒或 30 分钟。慢慢来,按照自己的节奏完成课程。提问,甚至在下面的评论中发布结果。
这些课程期望你去发现如何做事。我会给你一些提示,但是每节课的部分要点是迫使你学习去哪里寻找关于统计方法、NumPy API 和 Python 中最好的工具的帮助。(提示:所有答案我都直接在这个博客上了;使用搜索框。)
在评论中发布您的结果;我会为你加油的!
坚持住。不要放弃。
注:这只是速成班。关于更多的细节和充实的教程,请参阅我的书,题目是“机器学习的概率”
第一课:概率和机器学习
在本课中,您将发现为什么机器学习实践者应该学习概率来提高他们的技能和能力。
概率是一个量化不确定性的数学领域。
机器学习是从不确定的数据中开发预测建模。不确定性意味着处理不完善或不完整的信息。
不确定性是机器学习领域的基础,然而它是给初学者造成最大困难的方面之一,尤其是那些来自开发人员背景的人。
机器学习中的不确定性主要有三个来源;它们是:
- 观测中的噪声,如测量误差和随机噪声。
- 域的不完全覆盖,比如你永远不可能观察到所有的数据。
- 问题的模型不完善,比如所有的模型都有错误,有些是有用的。
应用机器学习中的不确定性是用概率来管理的。
- 概率和统计帮助我们理解和量化我们从领域观察到的变量的期望值和可变性。
- 概率有助于理解和量化域中观测值的预期分布和密度。
- 概率有助于理解和量化我们的预测模型在应用于新数据时的预期能力和表现差异。
这是机器学习的基础。除此之外,我们可能需要模型来预测概率,我们可能使用概率来开发预测模型(例如朴素贝叶斯),我们可能使用概率框架来训练预测模型(例如最大似然估计)。
你的任务
在这节课中,你必须列出你想在机器学习的背景下学习概率的三个原因。
这些可能与上面的一些原因有关,也可能是你自己的个人动机。
在下面的评论中发表你的答案。我想看看你有什么想法。
在下一课中,你将发现三种不同类型的概率以及如何计算它们。
第二课:三种概率
在本课中,您将发现随机变量之间的联合概率、边缘概率和条件概率的温和介绍。
概率量化了事件发生的可能性。
具体来说,它量化了一个随机变量出现特定结果的可能性,例如掷硬币、掷骰子或从一副牌中抽一张扑克牌。
我们可以只讨论两个事件的概率:变量 X 的事件 A 的概率和变量 Y 的事件 B 的概率,简写就是 X=A 和 Y=B ,这两个变量在某种程度上是相关或相依的。
因此,我们可能要考虑三种主要类型的概率。
联合概率
我们可能对两个同时发生的事件的概率感兴趣,比如两个不同随机变量的结果。
例如,事件 A 和事件 B 的联合概率正式写成:
- 警队(甲及乙)
事件 A 和 B 的联合概率计算为事件 A 给定事件 B 乘以事件 B 的概率。
这可以正式表述如下:
- P(A 和 B) = P(给定的 B) * P(B)
边缘概率
我们可能对一个随机变量的事件概率感兴趣,而不考虑另一个随机变量的结果。
边缘概率没有特别的符号;它只是第二个变量的所有事件的所有概率与第一个变量的给定固定事件的所有概率的和或并。
- 所有 Y 的和 P(X=A,Y=yi)
条件概率
考虑到另一个事件的发生,我们可能对一个事件的概率感兴趣。
例如,事件 A 给定事件 B 的条件概率正式写成:
- 给定的
事件 A 给定事件 B 的条件概率可以使用事件的联合概率计算如下:
- P(给定的 B) = P(A 和 B) / P(B)
你的任务
在本课中,您必须练习计算联合概率、边缘概率和条件概率。
比如一个家庭有两个孩子,最大的是男孩,这个家庭有两个儿子的概率是多少?这被称为“男孩或女孩问题”,是练习概率的许多常见玩具问题之一。
在下面的评论中发表你的答案。我想看看你有什么想法。
在下一课中,你将发现随机变量的概率分布。
第三课:概率分布
在本课中,您将发现概率分布的温和介绍。
在概率上,随机变量可以采用许多可能值中的一个,例如来自状态空间的事件。随机变量的一个特定值或一组值可以被赋予一个概率。
随机变量主要有两类。
- 离散随机变量。值是从一组有限的状态中得出的。
- 连续随机变量。数值是从一系列实数值中得出的。
离散随机变量有一组有限的状态;例如,汽车的颜色。连续随机变量有一个数值范围;比如人类的身高。
概率分布是随机变量的值的概率的汇总。
离散概率分布
离散概率分布概括了离散随机变量的概率。
众所周知的离散概率分布的一些例子包括:
- 泊松分布。
- 伯努利分布和二项分布。
- 多项式和多项式分布。
连续概率分布
连续概率分布概括了连续随机变量的概率。
众所周知的连续概率分布的一些例子包括:
- 正态或高斯分布。
- 指数分布。
- 帕累托分布。
随机采样高斯分布
我们可以定义一个均值为 50、标准差为 5 的分布,并从这个分布中抽取随机数。我们可以使用正常()NumPy 功能来实现。
下面的示例从这个分布中采样并打印了 10 个数字。
# sample a normal distribution
from numpy.random import normal
# define the distribution
mu = 50
sigma = 5
n = 10
# generate the sample
sample = normal(mu, sigma, n)
print(sample)
运行该示例将打印从定义的正态分布中随机采样的 10 个数字。
你的任务
在本课中,您必须开发一个示例,从不同的连续或离散概率分布函数中进行采样。
对于给定的分布,您可以绘制 x 轴上的值和 y 轴上的概率,以显示您选择的概率分布函数的密度。
在下面的评论中发表你的答案。我想看看你有什么想法。
在下一课中,您将发现朴素贝叶斯分类器。
第 04 课:朴素贝叶斯分类器
在本课中,您将发现用于分类预测建模的朴素贝叶斯算法。
在机器学习中,我们经常对一个预测建模问题感兴趣,在这个问题中,我们希望为给定的观察预测一个类标签。
解决这个问题的一种方法是开发一个概率模型。从概率的角度来看,我们感兴趣的是估计给定观察的类标签的条件概率,或者给定输入数据的类yX 的概率。
- P(y | X)
贝叶斯定理提供了一种替代的和有原则的方法来使用期望的条件概率的逆来计算条件概率,这通常更容易计算。
贝叶斯定理的简单计算形式如下:
- P(A|B) = P(B|A) * P(A) / P(B)
其中我们感兴趣的概率计算 P(A|B) 称为后验概率,事件的边缘概率 P(A) 称为先验概率。
贝叶斯定理在分类中的直接应用变得棘手,尤其是当变量或特征的数量增加时。相反,我们可以简化计算,并假设每个输入变量都是独立的。尽管很引人注目,但这种更简单的计算通常会带来非常好的表现,即使输入变量高度相关。
我们可以从零开始实现这一点,方法是假设每个单独输入变量的概率分布,并计算每个特定输入值属于每个类的概率,然后将结果相乘,得到用于选择最有可能的类的分数。
- P(yi | x1,x2,…,xn)= P(x1 | y1)* P(x2 | y1)…P(xn | y1) P(yi)
如果我们假设每个输入变量都是高斯分布,那么 Sklearn 库就提供了一个高效的算法实现。
为了使用 Sklearn 朴素贝叶斯模型,首先定义模型,然后将其拟合到训练数据集上。一旦拟合,概率可以通过 predict_proba() 函数预测,类标签可以通过 predict() 函数直接预测。
下面列出了将高斯朴素贝叶斯模型(高斯年)拟合到测试数据集的完整示例。
# example of gaussian naive bayes
from sklearn.datasets import make_blobs
from sklearn.naive_bayes import GaussianNB
# generate 2d classification dataset
X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)
# define the model
model = GaussianNB()
# fit the model
model.fit(X, y)
# select a single sample
Xsample, ysample = [X[0]], y[0]
# make a probabilistic prediction
yhat_prob = model.predict_proba(Xsample)
print('Predicted Probabilities: ', yhat_prob)
# make a classification prediction
yhat_class = model.predict(Xsample)
print('Predicted Class: ', yhat_class)
print('Truth: y=%d' % ysample)
运行该示例使模型适合训练数据集,然后对我们在前面示例中使用的第一个示例进行预测。
你的任务
对于本课,您必须运行示例并报告结果。
作为奖励,在真实的类别数据集上尝试该算法,例如流行的玩具分类问题,即基于花的测量来分类鸢尾花种类。
在下面的评论中发表你的答案。我想看看你有什么想法。
在下一课中,你将发现熵和交叉熵分数。
第五课:熵和交叉熵
在本课中,您将发现机器学习的交叉熵。
信息论是一个研究领域,涉及量化信息用于交流。
量化信息背后的直觉是衡量一个事件中有多少惊喜的想法。那些罕见的事件(低概率)更令人惊讶,因此比那些常见的事件(高概率)拥有更多的信息。
- 低概率事件:高信息(惊人)。
- 高概率事件:低信息(不出所料)。
我们可以利用事件发生的概率来计算事件中的信息量。
- 信息(x)=-对数(p(x))
我们也可以量化一个随机变量中有多少信息。
这称为熵,它概括了平均表示事件所需的信息量。
对于具有 K 个离散状态的随机变量 X,熵可以计算如下:
- 熵(X)=-和(i=1 至 K p(K) *对数(p(K)))
交叉熵是给定随机变量或事件集的两个概率分布之间差异的度量。在优化分类模型时,它被广泛用作损失函数。
它建立在熵的基础上,计算一个分布与另一个分布相比,表示或传输一个事件所需的平均位数。
- 交叉熵(P,Q)=–X 中的和 X P(x) *对数(Q(x))
我们可以用一个小例子来具体计算交叉熵。
考虑一个随机变量,它有三个不同颜色的事件。对于这个变量,我们可能有两种不同的概率分布。我们可以计算这两个分布之间的交叉熵。
下面列出了完整的示例。
# example of calculating cross entropy
from math import log2
# calculate cross entropy
def cross_entropy(p, q):
return -sum([p[i]*log2(q[i]) for i in range(len(p))])
# define data
p = [0.10, 0.40, 0.50]
q = [0.80, 0.15, 0.05]
# calculate cross entropy H(P, Q)
ce_pq = cross_entropy(p, q)
print('H(P, Q): %.3f bits' % ce_pq)
# calculate cross entropy H(Q, P)
ce_qp = cross_entropy(q, p)
print('H(Q, P): %.3f bits' % ce_qp)
运行该示例首先从 P 计算 Q 的交叉熵,然后从 Q 计算 P。
你的任务
对于本课,您必须运行示例并描述结果及其含义。比如交叉熵的计算是否对称?
在下面的评论中发表你的答案。我想看看你有什么想法。
在下一课中,您将发现如何开发和评估一个简单的分类器模型。
第 06 课:幼稚分类器
在本课中,您将发现如何为机器学习开发和评估幼稚的分类策略。
分类预测建模问题涉及预测给定模型输入的类别标签。
给定一个分类模型,如何知道模型有没有技巧?
这是每个分类预测建模项目中常见的问题。答案是将给定分类器模型的结果与基线或原始分类器模型进行比较。
考虑一个简单的两类分类问题,其中每个类的观察数不相等(例如不平衡),0 类有 25 个例子,1 类有 75 个例子。这个问题可以用来考虑不同的朴素分类器模型。
例如,考虑一个以相等概率随机预测 0 类或 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
事实证明,这个分类器相当差。
现在,如果我们考虑每次预测多数班(1 班)会怎么样?同样,我们可以插入预测概率(0.0 和 1.0)并估计模型的表现。
- P(yhat = y) = 0.0 * 0.25 + 1.0 * 0.75
- P(yhat = y) = 0.75
事实证明,这一简单的改变产生了一个更好的朴素分类模型,并且可能是当类不平衡时使用的最好的朴素分类器。
Sklearn 机器学习库提供了一种称为 DummyClassifier 的多数类朴素分类算法的实现,您可以在下一个分类预测建模项目中使用该算法。
下面列出了完整的示例。
# example of the majority class naive classifier in Sklearn
from numpy import asarray
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score
# define dataset
X = asarray([0 for _ in range(100)])
class0 = [0 for _ in range(25)]
class1 = [1 for _ in range(75)]
y = asarray(class0 + class1)
# reshape data for sklearn
X = X.reshape((len(X), 1))
# define model
model = DummyClassifier(strategy='most_frequent')
# fit model
model.fit(X, y)
# make predictions
yhat = model.predict(X)
# calculate accuracy
accuracy = accuracy_score(y, yhat)
print('Accuracy: %.3f' % accuracy)
运行该示例准备数据集,然后使用多数类策略在数据集上定义并拟合DummyCollector。
你的任务
在本课中,您必须运行示例并报告结果,确认模型是否按照我们的计算预期运行。
另外,计算一个朴素分类器模型的预期概率,该模型在每次进行预测时从训练数据集中随机选择一个类别标签。
在下面的评论中发表你的答案。我想看看你有什么想法。
在下一课中,您将发现预测概率的评分模型的指标。
第 07 课:概率分数
在本课中,您将发现两种评分方法,可用于评估分类预测建模问题的预测概率。
为分类问题预测概率而不是类别标签可以为预测提供额外的细微差别和不确定性。
增加的细微差别允许使用更复杂的度量来解释和评估预测的概率。
让我们仔细看看评估预测概率的两种流行评分方法。
日志丢失分数
逻辑损失,简称对数损失,计算预测概率和观察概率之间的对数似然性。
虽然它是为训练像逻辑回归这样的二分类模型而开发的,但它可以用于评估多类问题,并且在功能上等同于计算从信息论导出的交叉熵。
一个技能完美的模型的日志丢失分数为 0.0。日志丢失可以使用 Sklearn 中的 log_loss()函数在 Python 中实现。
例如:
# example of log loss
from numpy import asarray
from sklearn.metrics import log_loss
# define data
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]
# define data as expected, e.g. probability for each event {0, 1}
y_true = asarray([[v, 1-v] for v in y_true])
y_pred = asarray([[v, 1-v] for v in y_pred])
# calculate log loss
loss = log_loss(y_true, y_pred)
print(loss)
布瑞尔分数
布瑞尔分数以格伦·布瑞尔命名,计算预测概率和期望值之间的均方误差。
分数总结了概率预测中误差的大小。
错误分数总是在 0.0 到 1.0 之间,其中技能完美的模型分数为 0.0。
Brier 分数可以使用 Sklearn 中的 brier_score_loss()函数在 Python 中计算。
例如:
# example of brier loss
from sklearn.metrics import brier_score_loss
# define data
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]
# calculate brier score
score = brier_score_loss(y_true, y_pred, pos_label=1)
print(score)
你的任务
在本课中,您必须运行每个示例并报告结果。
作为奖励,改变模拟预测,使其更好或更差,并比较结果得分。
在下面的评论中发表你的答案。我想看看你有什么想法。
这是最后一课。
末日!
( 看你走了多远
你成功了。干得好!
花一点时间,回头看看你已经走了多远。
你发现了:
- 概率在应用机器学习中的重要性。
- 概率的三种主要类型及其计算方法。
- 随机变量的概率分布及如何从中抽取随机样本?
- 如何使用贝叶斯定理计算条件概率,以及如何在分类模型中使用它。
- 如何计算信息、熵和交叉熵分数以及它们的含义。
- 如何开发和评估朴素分类模型的预期表现?
- 如何评估预测分类问题概率值的模型的技能?
下一步,看看我写的关于机器学习概率的书。
摘要
你觉得迷你课程怎么样?
你喜欢这个速成班吗?
你有什么问题吗?有什么症结吗?
让我知道。请在下面留言。
机器学习中概率的入门资源
原文:https://machinelearningmastery.com/probability-resources-for-machine-learning/
最后更新于 2019 年 9 月 25 日
机器学习是计算机科学的一个领域,涉及开发能够从数据中学习的系统。
像统计学和线性代数一样,概率是另一个支持机器学习的基础领域。概率是一个与量化不确定性有关的数学领域。
机器学习的许多方面都是不确定的,最关键的是,包括来自问题领域的观察和模型从这些数据中学习到的关系。因此,机器学习从业者需要对概率以及在该领域中使用的工具和方法有所了解才能有效。也许不是一开始,但肯定是长期的。
在这篇文章中,你将发现一些关键的资源,你可以用来学习机器学习所需的概率部分。
看完这篇文章,你会知道:
- 可以用来发现概率主题的参考资料。
- 涵盖机器学习中概率的书籍、章节和章节。
- 基础概率主题和利用概率的机器学习方法之间的划分。
用我的新书机器学习概率启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
机器学习中的概率入门资源
图片由龙眼提供,保留部分权利。
概观
本教程分为三个部分;它们是:
- 机器学习的概率主题
- 机器学习书籍中涵盖的概率
- 基础概率与概率机器学习
机器学习的概率主题
概率是数学的一个大领域,有许多迷人的发现和有用的工具。
尽管机器学习从业者可能对大部分领域概率感兴趣,但并不是所有领域概率都直接相关。因此,重要的是将概率领域的范围缩小到可以直接帮助从业者的方面。
一种方法可能是回顾概率主题,并选择那些可能有帮助或相关的主题。
维基百科在这个领域有很多不错的综述文章,可以作为起点。例如:
概率维基百科文章
另一个话题来源可能是那些为高级本科生和研究生编写的关于概率的顶级教科书。
例如:
概率教科书
这是一个很好的开始,但具有挑战性,因为如何将丰富的有趣主题有效地过滤到那些与应用机器学习最相关的主题中。
这种方法的风险是花费太多时间学习概率,并在该领域建立太广泛的基础(例如效率低下)。
我更喜欢的一种方法是通过顶级机器学习书籍来回顾概率领域的覆盖面。
这些书的作者都是机器学习领域的专家,并利用这一专业知识将概率领域过滤到机器学习领域最显著的点。
机器学习书籍中涵盖的概率
有很多优秀的机器学习教科书,但在这篇文章中,我们将回顾一些你可能拥有或接触到的更受欢迎的书籍,并可以参考相关章节。它们是:
让我们依次仔细看看每一个。
“机器学习”
”机器学习”是汤姆·米切尔 1997 年的开创性著作,为后来的许多从业者和书籍定义了这个领域。
概率是本书以下章节的重点:
- 第六章:贝叶斯学习
本章专门介绍与机器学习相关的贝叶斯方法,包括:
- 第 6.2 节。贝叶斯定理
- 第 6.3 节。贝叶斯定理与概念学习
- 第 6.4 节。最大似然和最小二乘误差假设
- 第 6.5 节。预测概率的最大似然假设
- 第 6.6 节。最小描述长度原则
- 第 6.7 节。贝叶斯最优分类器
- 第 6.8 节。吉布斯算法
- 第 6.9 节。朴素贝叶斯分类器
- 第 6.10 节。一个例子:学习文本分类
- 第 6.11 节。贝叶斯信念网络
- 第 6.12 节。电磁算法
“模式识别和机器学习”
“模式识别和机器学习”是克里斯托弗·毕肖普关于机器学习的代表作,它建立在并扩展了他之前的著作模式识别神经网络的基础上。
这本书很可能是许多现代从业者使用的机器学习研究生学位课程。
概率是本书以下章节的重点:
- 第一章:引言
- 第 1.2 节。概率论
- 第 1.5 节。决策论
- 第 1.6 节。信息论
- 第二章:概率分布
第二章专门讨论该主题,侧重于概率分布和设置密度估计,涵盖以下主题:
- 2.1.二元变量
- 2.2.多项式变量
- 2.3.高斯分布
- 2.4.指数族
- 2.5.非参数方法
“数据挖掘:实用机器学习工具和技术”
”数据挖掘:实用机器学习工具与技术”由 Witten 和 Frank(等)曾有过多个版本,而由于其实用性和 Weka 平台,已经是众多从业者进入该领域的切入点。
概率是本书以下章节的重点:
- 第 4.2 节:简单概率建模
- 第九章:概率方法
第 4.2 节提供了一个介绍,但第九章深入探讨了以下主题:
- 9.1.基础
- 9.2.贝叶斯网络
- 9.3.聚类和点密度估计
- 9.4.隐藏变量模型
- 9.5.贝叶斯估计和预测
- 9.6.图形模型和因子图
- 9.7.条件概率模型
- 9.8.顺序和时间模型
- 9.9.进一步阅读和书目注释
- 9.10.Weka 实现
“机器学习:概率观点”
”机器学习:一个概率的视角由凯文·墨菲从 2013 年开始编写,是一本通过概率的镜头重点教授机器学习的教科书。
概率是本书以下章节的重点:
- 第二章:概率
- 第五章:贝叶斯统计
- 第六章:常客统计
第五章和第六章真正关注的是建立在贝叶斯和频繁方法基础上的机器学习方法,例如关注分布估计。
第二章更侧重于所需概率的基础,包括以下小节:
- 第 2.1 节。介绍
- 第 2.2 节。概率论简评
- 第 2.3 节。一些常见的离散分布
- 第 2.4 节。一些常见的连续分布
- 第 2.5 节。联合概率分布
- 第 2.6 节。随机变量的变换
- 第 2.7 节。蒙特卡罗近似法
- 第 2.8 节。信息论。
“深度学习”
“深度学习”是 Ian Goodfellow 等人 2016 年关于新兴深度学习领域的开创性教科书。
本书第一部分的标题为“应用数学和机器学习基础知识”,涵盖了深度学习神经网络变得高效所需的一系列重要基础主题,包括概率。
概率是本书以下章节的重点:
- 第三章:概率和信息论
本章分为以下小节:
- 3.1.为什么是概率?
- 3.2.随机变量
- 3.3.概率分布
- 3.4.边缘概率
- 3.5.条件概率
- 3.6.条件概率的链式法则
- 3.7.独立性和条件依赖
- 3.8.期望、方差和协方差
- 3.9.常见概率分布
- 3.10.公共函数的有用性质
- 3.11.贝叶斯法则
- 3.12.连续变量的技术细节
- 3.13.信息论
- 3.14.结构化概率模型
基础概率与概率机器学习
回顾顶级机器学习书籍中的章节,很明显机器学习中的概率有两个主要方面。
从业者应该熟悉一些基本的主题,以便能够有效地进行机器学习。我们可以称之为机器学习的概率理论
然后是从概率领域的工具和技术显式构建的机器学习方法。我们可以称之为机器学习的概率方法
这不是一个明确的划分,因为有很多重叠,但这是一个划分的良好基础。
基础概率主题
这些都是像《深度学习》这样的书所涵盖的主题它们也是机器学习课程的备忘单和刷新器的基础,如斯坦福大学的“概率和统计复习课程”。
机器学习概率论中的一些主题可能包括:概率公理、概率分布、概率矩、贝叶斯定理、联合概率、边缘概率和条件概率等。
这可能还包括更高级和相关的主题,如:似然函数、最大似然估计、信息论中的熵、分布的蒙特卡罗和吉布斯采样以及参数估计。
概率机器学习
这些都是《机器学习:概率视角》后面章节所涉及的主题
机器学习概率方法中的一些主题可能包括:密度估计、核密度估计、散度估计等。
这也将包括诸如朴素贝叶斯之类的技术和诸如贝叶斯信念网络之类的图形模型。
你怎么看?
你会把什么话题放在分裂的两边?
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
机器学习书籍
- 机器学习,1997。
- 模式识别与机器学习,2006。
- 数据挖掘:实用机器学习工具与技术,第 4 版,2016。
- 机器学习:概率视角,2012。
- 深度学习,2016 年。
概率教科书
文章
摘要
在这篇文章中,你发现了一些关键资源,可以用来学习机器学习所需的概率部分
具体来说,您了解到:
- 可以用来发现概率主题的参考资料。
- 涵盖机器学习中概率的书籍、章节和章节。
- 基础概率主题和利用概率的机器学习方法之间的划分。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
随机在机器学习中意味着什么?
原文:https://machinelearningmastery.com/stochastic-in-machine-learning/
最后更新于 2020 年 7 月 24 日
许多机器学习算法的行为和表现被称为随机的。
随机是指一个变量过程,其结果包含一些随机性,并具有一些不确定性。它是一个数学术语,与“随机性”和“概率性”密切相关,可以与“确定性的思想相对比。”
机器学习算法的随机性质是机器学习中的一个重要的基础概念,为了有效地解释许多预测模型的行为,需要理解它。
在这篇文章中,你会发现一个关于机器学习随机性的温和介绍。
看完这篇文章,你会知道:
- 如果结果中包含不确定性或随机性,那么变量或过程就是随机的。
- 随机是随机和概率的同义词,虽然与非确定性不同。
- 许多机器学习算法是随机的,因为它们在优化或学习过程中明确使用了随机性。
用我的新书机器学习概率启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
机器学习中随机的温和介绍
图片由贾尔斯·特恩布尔提供,版权所有。
概观
本教程分为三个部分;它们是:
- 随机是什么意思?
- 随机与随机、概率和不确定
- 机器学习中的随机性
随机是什么意思?
如果事件或结果的发生涉及随机性或不确定性,则变量为随机。
“随机”是指模型具有某种随机性
—第 66 页,思考贝叶斯。
游戏是随机的,因为它们包含了随机性的元素,比如纸牌游戏和棋盘游戏中的洗牌或掷骰子。
在现实生活中,许多不可预测的外部事件会让我们陷入不可预见的境地。许多游戏通过包含随机元素来反映这种不可预测性,例如掷骰子。我们称之为随机博弈。
—第 177 页,人工智能:现代方法,第 3 版,2009 年。
随机通常用于描述使用或利用随机性的数学过程。常见的例子包括布朗运动、马尔可夫过程、蒙特卡罗采样等等。
现在我们有了一些定义,让我们试着通过比较随机和其他不确定性的概念来添加更多的上下文。
随机与随机、概率和非确定性
在本节中,我们将尝试通过将变量或过程与相关术语“随机”、“概率”和“非确定性”进行比较,来更好地理解变量或过程是随机的这一想法
随机与随机
在统计学和概率学中,一个变量被称为“随机变量,可以呈现一个或多个结果或事件。
这是一个可以测量的事物的通用名称。
一般来说,随机是随机的同义词。
例如,随机变量就是随机变量。随机过程就是随机过程。
通常,随机用于表示序列中观察值之间缺乏相关性。例如,公平骰子的滚动是随机的,公平硬币的翻转也是随机的。
严格来说,一个随机变量或随机序列仍然可以用概率分布来概括;它可能只是一个均匀的分布。
如果我们对关注变量的概率性质感兴趣,比如下一个事件对当前事件的部分依赖,我们可以选择将某件事描述为随机的而不是随机的。如果我们想把注意力集中在事件的独立性上,我们可以选择随机而不是随机。
随机与概率
一般来说,随机是概率的同义词。
例如,随机变量或过程是概率性的。可以用概率的工具来总结和分析。
最值得注意的是,事件或序列中的下一个事件的分布可以用概率分布来描述。
如果我们希望强调相关性,例如如果我们使用参数模型或已知的概率分布来总结变量或序列,我们可以选择将变量或过程描述为概率而不是随机的。
随机与非确定性
如果序列中的下一个事件可以根据当前事件准确确定,那么变量或过程就是确定性的。
例如,确定性算法在给定相同输入的情况下,总是会给出相同的结果。相反,非确定性算法可能对同一输入给出不同的结果。
随机变量或过程是不确定的,因为结果存在不确定性。
然而,随机变量或过程也不是非确定性的,因为非确定性只描述结果的可能性,而不是概率。
把某件事描述成随机的比把它描述成不确定的更有说服力,因为我们可以在分析中使用概率工具,比如预期结果和方差。
……“随机”通常意味着结果的不确定性是用概率来量化的;一个不确定的环境是这样一个环境,在这个环境中,行动以其可能的结果为特征,但没有概率与之相关联。
—第 43 页,人工智能:现代方法,第 3 版,2009 年。
机器学习中的随机性
许多机器学习算法和模型被描述为随机的。
这是因为许多优化和学习算法都必须在随机域中运行,并且因为一些算法利用随机性或概率决策。
让我们仔细看看机器学习中不确定性的来源和随机算法的本质。
随机问题域
随机领域是那些涉及不确定性的领域。
……机器学习必须始终处理不确定的量,有时可能还需要处理随机(非确定性)量。不确定性和随机性可以从许多来源产生。
—第 54 页,深度学习,2016。
这种不确定性可能来自受统计噪声或随机误差影响的目标或目标函数。
这也可能是因为用于拟合模型的数据是来自更广泛人群的不完整样本。
最后,所选择的模型很少能够捕捉到该领域的所有方面,而是必须推广到看不见的情况,并失去一些保真度。
随机优化算法
随机优化是指一个优化算法领域,该领域明确使用随机性来寻找目标函数的最优值,或者优化本身具有随机性(统计噪声)的目标函数。
最常见的是,随机优化算法在探索搜索空间和利用已经了解的搜索空间之间寻求平衡,以便钻研最优解。搜索空间中下一个位置的选择是随机选择的,即基于最近搜索了哪些区域的概率。
随机爬山从上坡动作中随机选择;选择的概率可以随着上坡运动的陡度而变化。
—第 124 页,人工智能:现代方法,第 3 版,2009 年。
随机优化算法的常见例子有:
- 模拟退火
- 遗传算法
- 粒子群优化算法
粒子群优化算法是一种随机优化方法,模拟鸟群的社会行为。
—第 9 页,计算智能:简介。
随机学习算法
大多数机器学习算法是随机的,因为它们在学习过程中利用了随机性。
使用随机性是一种特性,而不是 bug。它允许算法避免陷入困境,并实现确定性(非随机)算法无法实现的结果。
例如,一些机器学习算法甚至在其名称中包含“随机”,例如:
- 随机梯度下降(优化算法)。
- 随机梯度提升(集成算法)。
随机梯度下降优化模型的参数,例如人工神经网络,这包括在每次迭代之前随机洗牌训练数据集,这导致模型参数的不同顺序的更新。此外,神经网络中的模型权重通常被初始化为随机起点。
大多数深度学习算法都是基于一种叫做随机梯度下降的优化算法。
—第 98 页,深度学习,2016。
随机梯度提升是决策树算法的集合。随机方面指的是从用于构建树的训练数据集中选择的随机行子集,特别是树的分裂点。
随机算法行为
因为许多机器学习算法利用随机性,所以它们的本质(例如行为和表现)也是随机的。
机器学习算法的随机性质最常见于用于分类和回归预测建模问题的复杂和非线性方法。
这些算法在从训练数据构建模型的过程中利用随机性,这具有每次在相同数据上运行相同算法时拟合不同模型的效果。反过来,在等待测试数据集上评估时,略有不同的模型具有不同的表现。
非线性机器学习算法的这种随机行为对于初学者来说是具有挑战性的,他们假设学习算法将是确定性的,例如,当算法在相同的数据上运行时,适合相同的模型。
这种随机行为要求必须使用描述模型的平均或预期表现的汇总统计数据来总结模型的表现,而不是任何单次训练运行的模型表现。
关于这个主题的更多信息,请查看帖子:
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
邮件
- 如何在 Python 中生成随机数
- Python 机器学习随机数生成器介绍
- 拥抱机器学习中的随机性
- 为什么用随机权重初始化神经网络?
- 使用 XGBoost 和 scikit-学习 Python 的随机梯度提升
文章
摘要
在这篇文章中,你发现了机器学习随机性的温和介绍。
具体来说,您了解到:
- 如果结果中包含不确定性或随机性,那么变量或过程就是随机的。
- 随机是随机和概率的同义词,虽然与非确定性不同。
- 许多机器学习算法是随机的,因为它们在优化或学习过程中明确使用了随机性。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
机器学习中不确定性的温和介绍
原文:https://machinelearningmastery.com/uncertainty-in-machine-learning/
最后更新于 2019 年 9 月 25 日
应用机器学习需要管理不确定性。
机器学习项目中有许多不确定性的来源,包括特定数据值的差异、从域中收集的数据样本,以及从这些数据开发的任何模型的不完美性。
管理预测建模的机器学习中固有的不确定性可以通过来自概率的工具和技术来实现,概率是一个专门设计来处理不确定性的领域。
在这篇文章中,你将发现机器学习中不确定性的挑战。
看完这篇文章,你会知道:
- 不确定性是机器学习初学者,尤其是开发人员最大的困难来源。
- 数据中的噪声、领域的不完全覆盖和模型的不完善是机器学习中不确定性的三个主要来源。
- 概率为量化、处理和利用应用机器学习中的不确定性提供了基础和工具。
用我的新书机器学习概率启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
机器学习中的不确定性简介
图片由 Anastasiy Safari 提供,保留部分权利。
概观
本教程分为五个部分;它们是:
- 机器学习中的不确定性
- 观测中的噪声
- 领域的不完全覆盖
- 问题的不完美模型
- 如何管理不确定性
机器学习中的不确定性
应用机器学习需要适应不确定性。
不确定性是指在信息不完善或不完全的情况下工作。
不确定性是机器学习领域的基础,然而它是给初学者造成最大困难的方面之一,尤其是那些来自开发人员背景的人。
对于软件工程师和开发人员来说,计算机是决定性的。你写一个程序,计算机按照你说的做。算法是基于空间或时间复杂性进行分析的,可以选择优化对项目最重要的算法,如执行速度或内存限制。
使用机器学习的预测建模包括拟合模型以将输入的例子映射到输出,例如在回归问题的情况下是一个数字,或者在分类问题的情况下是一个类标签。
自然,初学者会提出合理的问题,例如:
- 我应该使用的最佳功能是什么?
- 我的数据集的最佳算法是什么?
这些问题的答案是未知的,甚至可能是不可知的,至少是确切的。
计算机科学的许多分支主要处理完全确定和确定的实体。[……]鉴于许多计算机科学家和软件工程师在相对干净和特定的环境中工作,机器学习大量使用概率论可能会令人惊讶。
—第 54 页,深度学习,2016。
这是造成初学者困难的主要原因。
答案未知的原因是因为不确定性,解决方案是系统地评估不同的解决方案,直到为特定的预测问题发现一组好的或足够好的特征和/或算法。
机器学习中的不确定性主要有三个来源,在接下来的章节中,我们将依次来看三个可能的来源。
观测中的噪声
来自域的观察不清晰;相反,它们包含噪音。
来自域的观察通常被称为“实例或“样本,并且是一行数据。它是测量的或收集的。它是描述对象或主体的数据。它是模型的输入和预期的输出。
一个例子可能是在训练数据的情况下测量的一个鸢尾花和花的种类的一组测量值。
Sepal length: 5.1 cm
Sepal width: 3.5 cm
Petal length: 1.4 cm
Petal width: 0.2 cm
Species: Iris setosa
在需要预测的新数据的情况下,这只是没有花的种类的测量。
Sepal length: 5.1 cm
Sepal width: 3.5 cm
Petal length: 1.4 cm
Petal width: 0.2 cm
Species: ?
噪声是指观察中的可变性。
可变性可以是自然的,例如比正常的花更大或更小。这也可能是一个错误,例如测量时的失误或写下时的错别字。
这种可变性不仅影响输入或测量,还影响输出;例如,观察可能有不正确的类标签。
这意味着,尽管我们对该领域有观察,我们必须预期一些可变性或随机性。
真实的世界,反过来,真实的数据,是混乱的或不完美的。作为实践者,我们必须对数据保持怀疑,并开发系统来预期甚至利用这种不确定性。
这就是为什么花了这么多时间来审查数据统计和创建可视化,以帮助识别那些异常或不寻常的情况:所谓的数据清理。
领域的不完全覆盖
来自用于训练模型的领域的观察是样本,根据定义是不完整的。
在统计学中,随机样本是指从没有系统偏差的领域中选择的一组观察值。总会有一些偏见。
例如,我们可以选择测量一个花园中随机选择的花的大小。这些花是随机挑选的,但范围仅限于一个花园。范围可以扩大到一个城市、一个国家、一个大陆等等的花园。
样本中需要适当水平的方差和偏差,以便样本能够代表数据或模型将用于的任务或项目。
我们的目标是收集或获得一个合适的代表性随机观察样本,以训练和评估机器学习模型。通常,我们对采样过程几乎没有控制。相反,我们访问数据库或 CSV 文件,我们拥有的数据是我们必须处理的数据。
在所有情况下,我们永远不会有所有的观察结果。如果我们这样做了,就不需要预测模型了。
这意味着总会有一些未被观察到的案例。将会有我们没有覆盖的部分问题领域。无论我们如何鼓励我们的模型进行推广,我们都只能希望我们能够覆盖训练数据集中的案例和没有覆盖的显著案例。
这就是为什么我们将数据集分割成训练集和测试集,或者使用像这样的重采样方法进行 k 倍交叉验证。我们这样做是为了处理数据集代表性的不确定性,并估计建模过程对该过程中未使用的数据的表现。
问题的不完美模型
机器学习模型总会有一些误差。
这常常被概括为“所有车型都是错的”,或者更完全的用乔治·博克斯的一句格言来说:
所有模型都是错误的,但有些是有用的
这不仅仅适用于模型、工件,而是用于准备它的整个过程,包括数据的选择和准备、训练超参数的选择以及模型预测的解释。
模型误差可能意味着不完美的预测,例如预测回归问题中与预期完全不同的量,或者预测与预期不匹配的类标签。
考虑到我们刚刚讨论的数据的不确定性,这种类型的预测误差是可以预期的,包括观测中的噪声和区域的不完全覆盖。
另一种错误是遗漏错误。为了推广到新的情况,我们省略了细节或抽象它们。这是通过选择更简单但对数据细节更稳健的模型来实现的,而不是选择对训练数据高度专门化的复杂模型。因此,我们可能并且经常选择一个已知会在训练数据集中出错的模型,期望该模型能够更好地推广到新的情况,并具有更好的整体表现。
在许多情况下,使用简单但不确定的规则比使用复杂但确定的规则更实际,即使真正的规则是确定性的,并且我们的建模系统具有适应复杂规则的保真度。
—第 55 页,深度学习,2016。
然而,预测是必需的。
鉴于我们知道模型会出错,我们通过寻找一个足够好的模型来处理这种不确定性。这通常被解释为选择一个相对于简单方法或其他已建立的学习模型而言比较熟练的模型,例如良好的相对表现。
如何管理不确定性
应用机器学习中的不确定性是用概率来管理的。
概率是设计用来处理、操纵和驾驭不确定性的数学领域。
模式识别领域的一个关键概念是不确定性。它既通过测量中的噪声产生,也通过数据集的有限大小产生。概率理论为不确定性的量化和处理提供了一个一致的框架,并构成了模式识别的核心基础之一。
—第 12 页,模式识别与机器学习,2006。
事实上,概率论是更广泛的人工智能领域的核心。
代理可以使用概率和决策理论的方法来处理不确定性,但是首先他们必须从经验中学习他们对世界的概率理论。
—第 802 页,人工智能:现代方法,第 3 版,2009 年。
来自概率的方法和工具提供了思考机器学习解决的预测建模问题的随机或随机性质的基础和方式;例如:
- 在噪声观测方面,概率和统计帮助我们理解和量化来自域的观测中变量的期望值、可变性。
- 就域的不完全覆盖而言,概率有助于理解和量化域内观测值的预期分布和密度。
- 就模型误差而言,概率有助于理解和量化我们的预测模型在应用于新数据时的预期能力和表现差异。
但这只是一个开始,因为概率为许多机器学习模型的迭代训练提供了基础,称为最大似然估计,落后于线性回归、逻辑回归、人工神经网络等模型。
概率还为开发特定算法(如朴素贝叶斯)以及机器学习的整个子研究领域(如贝叶斯信念网络等图形模型)提供了基础。
概率方法构成了大量数据挖掘和机器学习技术的基础。
—第 336 页,数据挖掘:实用机器学习工具和技术。2016 年第 4 版。
我们在应用机器学习中使用的过程是精心选择的,以解决我们已经讨论过的不确定性的来源,但是理解为什么选择这些过程需要对概率和概率论有基本的理解。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 第三章:概率论,深度学习,2016。
- 第二章:概率,机器学习:概率视角,2012。
- 第二章:概率分布、模式识别和机器学习,2006。
文章
摘要
在这篇文章中,你发现了机器学习中不确定性的挑战。
具体来说,您了解到:
- 不确定性是机器学习初学者,尤其是开发人员最大的困难来源。
- 数据中的噪声、领域的不完全覆盖和模型的不完善是机器学习中不确定性的三个主要来源。
- 概率为量化、处理和利用应用机器学习中的不确定性提供了基础和工具。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
概率分布的简单介绍
原文:https://machinelearningmastery.com/what-are-probability-distributions/
最后更新于 2019 年 11 月 14 日
概率可用于不止计算一个事件的可能性;它可以总结所有可能结果的可能性。
对概率感兴趣的东西被称为随机变量,随机变量的每个可能结果和它们的概率之间的关系被称为概率分布。
概率分布是概率论中一个重要的基础概念,常见概率分布的名称和形状大家都很熟悉。概率分布的结构和类型根据随机变量的属性(如连续或离散)而变化,这反过来会影响如何总结分布或如何计算最可能的结果及其概率。
在这篇文章中,你会发现概率分布的温和介绍。
看完这篇文章,你会知道:
- 概率中的随机变量有一个确定的定义域,可以是连续的,也可以是离散的。
- 概率分布概括了随机变量的可能值及其概率之间的关系。
- 概率密度或质量函数将值映射到概率,累积分布函数将小于或等于某个值的结果映射到概率。
用我的新书机器学习概率启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
概率分布简介
图片由汤姆龙提供,版权所有。
概观
本教程分为四个部分;它们是:
- 随机变量
- 概率分布
- 离散概率分布
- 连续概率分布
随机变量
随机变量是由随机过程产生的量。
在概率上,随机变量可以采用许多可能值中的一个,例如来自状态空间的事件。随机变量的一个特定值或一组值可以被赋予一个概率。
在概率建模中,示例数据或实例通常被认为是事件、观察或底层随机变量的实现。
—第 336 页,数据挖掘:实用机器学习工具和技术,第 4 版。2016.
随机变量通常表示为大写字母,例如 X ,随机变量的值表示为小写字母和索引,例如 x1 、 x2 、 x3 。
像 X 这样的大写字母表示随机变量,而像 X 这样的小写字母表示随机变量取值。
—第八页,概率:对于热情的初学者,2016。
随机变量可以取的值叫做它的定义域,随机变量的定义域可以是离散的,也可以是连续的。
概率论中的变量被称为随机变量,它们的名字以大写字母开头。[……]每个随机变量都有一个定义域——它可以取的一组可能值。
—第 486 页,人工智能:现代方法,第 3 版,2009 年。
离散随机变量有一组有限的状态:例如,汽车的颜色。值为真或假的随机变量是离散的,被称为布尔随机变量:例如,掷硬币。连续随机变量有一个数值范围:例如,人类的身高。
- 离散随机变量。值是从一组有限的状态中得出的。
- 布尔随机变量。从{true,false}集合中提取值。
- 连续随机变量。数值是从一系列实数值中得出的。
可以通过等号运算符指定随机变量的值:例如,X =真。
随机变量的概率用大写 P 或 Pr 表示为一个函数;例如, P(X) 是随机变量 X 所有值的概率。
随机变量的值的概率可以表示为P(X =真),在这种情况下表示 X 随机变量具有值真的概率。
概率分布
概率分布是随机变量的值的概率的汇总。
作为一种分布,当随机变量的所有值都排列在一起时,随机变量的值到概率的映射具有形状。该分布还具有可测量的一般特性。概率分布的两个重要性质是期望值和方差。数学上,这些被称为分布的第一和第二时刻。其他时刻包括偏斜度(第三时刻)和峰度(第四时刻)。
你可能熟悉统计学中的均值和方差,其中的概念被推广到除概率分布之外的随机变量分布。
期望值是随机变量 x 的平均值或平均值。这是最有可能的值或概率最高的结果。它通常表示为带方括号的大写字母 E 的函数:例如, X 的期望值为E【X】或E【f(X)】,其中函数 f() 用于从 X 的域中采样值。
随机变量 X 的期望值(或平均值)用 E(X)表示…
—第 134 页,概率:对于热情的初学者,2016。
方差是随机变量的值与平均值的差值。这通常表示为函数Var;例如, Var(X) 是随机变量 X 或 Var(f(x)) 的方差,该方差是使用函数 f() 从 X 的域中提取的值的方差。
方差的平方根将值归一化,称为标准差。两个变量之间的方差称为协方差,总结了两个随机变量如何一起变化的线性关系。
- 期望值。随机变量的平均值。
- 方差。期望值周围的平均分布。
每个随机变量都有自己的概率分布,尽管许多不同随机变量的概率分布可能具有相同的形状。
大多数常见的概率分布可以用几个参数来定义,并提供计算期望值和方差的程序。
概率分布的结构将根据随机变量是离散的还是连续的而不同。
离散概率分布
离散概率分布概括了离散随机变量的概率。
概率质量函数或 PMF 定义了离散随机变量的概率分布。它是一个为特定离散值分配概率的函数。
离散概率分布有一个累积分布函数,或称 CDF。这是一个函数,指定离散随机变量的值小于或等于特定离散值的概率。
- 概率质量函数。离散随机变量值的概率。
- 累积分布函数。概率小于或等于随机变量的值。
随机变量的值可以是也可以不是序数,这意味着它们可以是也可以不是按数字顺序排列的,例如计数可以,汽车颜色不能。在这种情况下,PMF 和 CDF 的结构可能是不连续的,或者可能在跨值的相对概率上没有形成整洁或干净的过渡。
离散随机变量的期望值可以使用模式从样本中计算出来,例如找到最常见的值。PMF 的概率之和等于 1。
众所周知的离散概率分布的一些例子包括:
- 泊松分布。
- 伯努利分布和二项分布。
- 多项式和多项式分布。
- 离散均匀分布。
具有众所周知的离散概率分布的公共域的一些例子包括:
- 骰子滚动的概率形成一个离散的均匀分布。
- 硬币翻转的概率形成伯努利分布。
- 汽车颜色形成多项式分布的概率。
连续概率分布
连续概率分布概括了连续随机变量的概率。
概率分布函数定义了连续随机变量的概率分布。请注意这个名字与具有概率质量函数的离散随机变量或 PMF 的区别。
像离散概率分布一样,连续概率分布也有一个累积分布函数,即 CDF,它定义了一个值小于或等于域中特定数值的概率。
- 概率分布函数。连续随机变量值的概率。
- 累积分布函数。概率小于或等于随机变量的值。
作为连续函数,该结构形成平滑曲线。
众所周知的连续概率分布的一些例子包括:
- 正态或高斯分布。
- 幂律分布。
- 帕累托分布。
具有众所周知的连续概率分布的域的一些例子包括:
- 人类身高的概率呈正态分布。
- 电影大受欢迎的概率形成幂律分布。
- 收入水平的概率形成帕累托分布。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 概率论:科学的逻辑,2003。
- 概率导论,2019 年第 2 版。
- 概率:对于热情的初学者,2016 年。
文章
摘要
在这篇文章中,你发现了概率分布的温和介绍。
具体来说,您了解到:
- 概率中的随机变量有一个确定的定义域,可以是连续的,也可以是离散的。
- 概率分布概括了随机变量的可能值及其概率之间的关系。
- 概率密度或质量函数将值映射到概率,累积分布函数将小于或等于某个值的结果映射到概率。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
如何在 Python 中从头实现贝叶斯优化
原文:https://machinelearningmastery.com/what-is-bayesian-optimization/
最后更新于 2020 年 8 月 22 日
在本教程中,您将发现如何针对复杂的优化问题实现贝叶斯优化算法。
全局优化是一个具有挑战性的问题,寻找一个输入,导致最小或最大的成本给定的目标函数。
通常,目标函数的形式复杂且难以分析,并且通常是非凸的、非线性的、高维的、有噪声的,并且评估起来计算成本高。
贝叶斯优化提供了一种基于贝叶斯定理的有原则的技术,用于指导高效且有效的全局优化问题的搜索。它的工作原理是建立一个目标函数的概率模型,称为替代函数,然后在选择候选样本对真实目标函数进行评估之前,使用获取函数对其进行有效搜索。
贝叶斯优化通常用于应用机器学习,以在验证数据集上调整给定的表现良好的模型的超参数。
完成本教程后,您将知道:
- 全局优化是一个具有挑战性的问题,它涉及黑盒和通常非凸的、非线性的、有噪声的和计算昂贵的目标函数。
- 贝叶斯优化为全局优化提供了一种概率原则方法。
- 如何从零开始实现贝叶斯优化,以及如何使用开源实现。
用我的新书机器学习概率启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
- 2020 年 1 月更新:针对 Sklearn v0.22 API 的变化进行了更新。
贝氏优化的温和介绍
图片由贝尼阿诺德提供,保留部分权利。
教程概述
本教程分为四个部分;它们是:
- 函数优化的挑战
- 什么是贝叶斯优化
- 如何执行贝叶斯优化
- 基于贝叶斯优化的超参数整定
函数优化的挑战
全局函数优化,简称函数优化,涉及寻找目标函数的最小值或最大值。
从域中抽取样本,并通过目标函数进行评估,以给出分数或成本。
让我们定义一些常用术语:
- 样品。域的一个例子,表示为向量。
- 搜索空间:可以从中抽取样本的领域范围。
- 目标函数。获取样本并返回成本的函数。
- 成本。通过目标函数计算的样本数值分数。
样本由一个或多个变量组成,通常易于设计或创建。一个样本通常被定义为 n 维空间中具有预定范围的变量向量。必须对这个空间进行采样和探索,以便找到产生最佳成本的变量值的特定组合。
成本通常有特定于给定领域的单位。优化通常用最小化成本来描述,因为最大化问题可以很容易地通过反转计算的成本而转化为最小化问题。函数的最小值和最大值统称为函数的极值(或复数极值)。
目标函数通常很容易指定,但计算起来可能很有挑战性,或者随着时间的推移,成本计算会很麻烦。目标函数的形式是未知的,并且通常是高度非线性的,并且是由输入变量的数量定义的高度多维的。这个函数也可能是非凸的。这意味着局部极值可能是也可能不是全局极值(例如,可能会误导并导致过早收敛),因此任务的名称为全局而不是局部优化。
尽管对目标函数知之甚少(已知是否从函数中寻求最小或最大成本),因此,它通常被称为黑盒函数,搜索过程被称为黑盒优化。此外,目标函数有时被称为只给出答案的神谕。
函数优化是机器学习的一个基本部分。大多数机器学习算法都涉及参数(权重、系数等)的优化。)来响应训练数据。优化也指的是找到配置机器学习算法训练的最佳超参数集的过程。再高一步,训练数据的选择、数据准备、机器学习算法本身也是一个函数优化的问题。
机器学习优化综述;
- 算法训练。模型参数的优化。
- 算法调整。模型超参数的优化。
- 预测建模。数据优化、数据准备和算法选择。
存在许多函数优化方法,例如随机采样变量搜索空间,称为随机搜索,或者在搜索空间的网格中系统地评估样本,称为网格搜索。
更有原则的方法能够从空间采样中学习,以便将来的样本指向搜索空间中最有可能包含极值的部分。
使用概率的有向全局优化方法称为贝叶斯优化。
什么是贝叶斯优化
贝叶斯优化是一种使用贝叶斯定理指导搜索以找到目标函数的最小值或最大值的方法。
这是一种对复杂、有噪声和/或评估成本高的目标函数最有用的方法。
贝叶斯优化是一种寻找目标函数极值的强有力的策略,但评估成本很高。[……]当这些评估成本高昂、无法获得衍生工具或手头的问题是非凸性的时候,这一点尤其有用。
——昂贵成本函数贝叶斯优化教程,应用于主动用户建模和分层强化学习,2010。
回想一下,贝叶斯定理是一种计算事件条件概率的方法:
- P(A|B) = P(B|A) * P(A) / P(B)
我们可以通过去掉 P(B) 的归一化值来简化这一计算,将条件概率描述为一个比例量。这很有用,因为我们对计算特定的条件概率不感兴趣,而是对优化一个量感兴趣。
- P(A|B) = P(B|A) * P(A)
我们正在计算的条件概率一般称为后验概率;反向条件概率有时称为似然,边缘概率称为先验概率;例如:
- 后验=可能性*先验
这提供了一个框架,可以用来量化关于未知目标函数的信念,给定来自域的样本以及它们通过目标函数的评估。
我们可以设计特定的样本( x1,x2,…,xn )并使用目标函数 f(xi) 对其进行评估,该函数返回样本 xi 的成本或结果。样本及其结果按顺序收集并定义我们的数据 D ,例如 D = {xi,f(xi),… xn,f(xn)} 并用于定义先验。似然函数定义为给定函数 P(D | f) 观察数据的概率。随着收集到更多的观测值,这个似然函数将会改变。
- P(f|D) = P(D|f) * P(f)
后验线代表我们所知道的关于目标函数的一切。它是目标函数的近似值,可用于估计我们可能想要评估的不同候选样本的成本。
这样,后验概率就是一个替代目标函数。
后验捕捉关于未知目标函数的更新信念。也可以将贝叶斯优化的这一步解释为用替代函数(也称为响应面)来估计目标函数。
——昂贵成本函数贝叶斯优化教程,应用于主动用户建模和分层强化学习,2010。
- 替代函数:可以高效采样的目标函数的贝叶斯近似。
代理函数给我们一个目标函数的估计,可以用来指导未来的采样。采样包括在被称为“采集功能的功能中仔细使用后验,例如用于采集更多的样本。我们希望利用我们对目标函数的信念,对搜索空间中最有可能获得回报的区域进行采样,因此,采集将优化搜索中位置的条件概率,以生成下一个样本。
- 采集功能:利用后验从搜索空间中选择下一个样本的技术。
一旦通过目标函数 f() 收集了额外的样本及其评估,它们就被添加到数据 D 中,然后更新后验。
重复这个过程,直到找到目标函数的极值,找到足够好的结果,或者资源耗尽。
贝叶斯优化算法可以总结如下:
- 1.通过优化采集功能选择样本。
- 2.用目标函数评估样本。
- 3.更新数据,然后更新代理函数。
- 4.转到 1。
如何执行贝叶斯优化
在本节中,我们将通过为一个简单的一维测试函数从头开发一个实现来探索贝叶斯优化是如何工作的。
首先,我们将定义测试问题,然后如何用代理函数来建模输入到输出的映射。接下来,我们将看到在将所有这些元素结合到贝叶斯优化过程中之前,如何使用获取函数有效地搜索代理函数。
测试问题
第一步是定义一个测试问题。
我们将使用具有五个峰值的多峰问题,计算如下:
- y = x² *辛(5 皮 x)⁶
其中 x 是范围【0,1】内的实数值, PI 是 PI 的值。
我们将通过添加均值为零、标准偏差为 0.1 的高斯噪声来扩充这个函数。这将意味着真正的评估将有一个正的或负的随机值添加到其中,使函数具有优化的挑战性。
下面的*目标()*函数实现了这一点。
# objective function
def objective(x, noise=0.1):
noise = normal(loc=0, scale=noise)
return (x**2 * sin(5 * pi * x)**6.0) + noise
我们可以测试这个函数,首先定义一个基于网格的输入样本,从 0 到 1,在整个域中步长为 0.01。
...
# grid-based sample of the domain [0,1]
X = arange(0, 1, 0.01)
然后,我们可以在没有任何噪声的情况下使用目标函数评估这些样本,以了解真实的目标函数是什么样子的。
...
# sample the domain without noise
y = [objective(x, 0) for x in X]
然后,我们可以用噪声评估这些相同的点,看看优化目标函数时它会是什么样子。
...
# sample the domain with noise
ynoise = [objective(x) for x in X]
我们可以查看所有无噪声的目标函数值,以找到导致最佳得分的输入并报告它。这将是最优值,在这种情况下是最大值,因为我们正在最大化目标函数的输出。
我们在实践中不会知道这一点,但是对于我们的测试问题,最好知道函数的真正最佳输入和输出,看看贝叶斯优化算法是否能找到它。
...
# find best result
ix = argmax(y)
print('Optima: x=%.3f, y=%.3f' % (X[ix], y[ix]))
最后,我们可以创建一个图,首先将有噪声的评估显示为散点图,x 轴为输入,y 轴为分数,然后是没有任何噪声的分数线图。
...
# plot the points with noise
pyplot.scatter(X, ynoise)
# plot the points without noise
pyplot.plot(X, y)
# show the plot
pyplot.show()
下面列出了查看我们希望优化的测试功能的完整示例。
# example of the test problem
from math import sin
from math import pi
from numpy import arange
from numpy import argmax
from numpy.random import normal
from matplotlib import pyplot
# objective function
def objective(x, noise=0.1):
noise = normal(loc=0, scale=noise)
return (x**2 * sin(5 * pi * x)**6.0) + noise
# grid-based sample of the domain [0,1]
X = arange(0, 1, 0.01)
# sample the domain without noise
y = [objective(x, 0) for x in X]
# sample the domain with noise
ynoise = [objective(x) for x in X]
# find best result
ix = argmax(y)
print('Optima: x=%.3f, y=%.3f' % (X[ix], y[ix]))
# plot the points with noise
pyplot.scatter(X, ynoise)
# plot the points without noise
pyplot.plot(X, y)
# show the plot
pyplot.show()
运行该示例首先报告全局 optima 作为输入,值为 0.9,得分为 0.81。
Optima: x=0.900, y=0.810
然后创建一个图,显示样本的噪声评估(点)和目标函数的非噪声和真实形状(线)。
注:考虑到算法或评估程序的随机性,或数值准确率的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。
用有噪声(点)和无噪声(线)目标函数评估的输入样本图
现在我们有了一个测试问题,让我们回顾一下如何训练一个代理函数。
代理函数
代理函数是一种用于最佳逼近输入示例到输出分数的映射的技术。
概率上,它总结了一个目标函数( f )的条件概率,给定可用数据( D )或 P(f|D) 。
为此可以使用许多技术,尽管最流行的是将问题作为回归预测建模问题来处理,数据代表模型的输入,分数代表模型的输出。这通常最好使用随机森林或高斯过程来建模。
一个高斯过程,或者 GP,是一个在变量上构建联合概率分布的模型,假设一个多元高斯分布。因此,当更多的观测值可用于模型时,它能够高效和有效地总结大量函数并平滑过渡。
这种基于数据的平滑结构和向新函数的平滑过渡是我们对域进行采样时所期望的特性,并且模型的多变量高斯基意味着来自模型的估计将是具有标准偏差的分布的平均值;这将有助于后面的采集功能。
因此,使用 GP 回归模型通常是首选。
我们可以使用高斯过程回归器scikit-从输入样本( X )和来自目标函数( y )的噪声评估中学习实现来拟合 GP 回归模型。
首先,必须定义模型。定义 GP 模型的一个重要方面是内核。这将根据实际数据观测值之间的距离测量值来控制特定点的函数形状。可以使用许多不同的内核函数,有些可以为特定数据集提供更好的表现。
默认情况下,使用一个能够很好工作的径向基函数,或者径向基函数。
...
# define the model
model = GaussianProcessRegressor()
一旦定义,就可以通过调用 fit() 函数直接在训练数据集上拟合模型。
通过对 fit() 的另一次调用,定义的模型可以在任何时候用连接到现有数据的更新数据再次拟合。
...
# fit the model
model.fit(X, y)
该模型将估计提供给它的一个或多个样本的成本。
通过调用 predict() 函数来使用该模型。给定样本的结果将是该点分布的平均值。我们也可以通过指定参数 return_std=True 得到函数中该点的分布的标准差;例如:
...
yhat = model.predict(X, return_std=True)
如果分布在我们感兴趣的给定点很薄,这个函数会导致警告。
因此,在做预测时,我们可以沉默所有的警告。下面的*代理()*函数获取拟合模型和一个或多个样本,并返回估计成本的平均值和标准偏差,同时不打印任何警告。
# surrogate or approximation for the objective function
def surrogate(model, X):
# catch any warning generated when making a prediction
with catch_warnings():
# ignore generated warnings
simplefilter("ignore")
return model.predict(X, return_std=True)
我们可以随时调用该函数来估计一个或多个样本的成本,例如当我们想要在下一节中优化采集函数时。
目前,在随机样本上训练代理函数后,看看它在整个领域中的样子是很有趣的。
我们可以通过首先在 100 个数据点的随机样本上拟合 GP 模型,并用噪声拟合它们的真实目标函数值来实现这一点。然后我们可以绘制这些点的散点图。接下来,我们可以在整个输入域中执行基于网格的采样,并使用代理函数估计每个点的成本,并将结果绘制成一条线。
我们希望替代函数具有真实无噪声目标函数的粗略近似。
给定真实噪声目标函数的随机数据样本和拟合模型,下面的*图()*函数创建该图。
# plot real observations vs surrogate function
def plot(X, y, model):
# scatter plot of inputs and real objective function
pyplot.scatter(X, y)
# line plot of surrogate function across domain
Xsamples = asarray(arange(0, 1, 0.001))
Xsamples = Xsamples.reshape(len(Xsamples), 1)
ysamples, _ = surrogate(model, Xsamples)
pyplot.plot(Xsamples, ysamples)
# show the plot
pyplot.show()
将这些联系在一起,下面列出了在噪声样本上拟合高斯过程回归模型并绘制样本与替代函数的关系的完整示例。
# example of a gaussian process surrogate function
from math import sin
from math import pi
from numpy import arange
from numpy import asarray
from numpy.random import normal
from numpy.random import random
from matplotlib import pyplot
from warnings import catch_warnings
from warnings import simplefilter
from sklearn.gaussian_process import GaussianProcessRegressor
# objective function
def objective(x, noise=0.1):
noise = normal(loc=0, scale=noise)
return (x**2 * sin(5 * pi * x)**6.0) + noise
# surrogate or approximation for the objective function
def surrogate(model, X):
# catch any warning generated when making a prediction
with catch_warnings():
# ignore generated warnings
simplefilter("ignore")
return model.predict(X, return_std=True)
# plot real observations vs surrogate function
def plot(X, y, model):
# scatter plot of inputs and real objective function
pyplot.scatter(X, y)
# line plot of surrogate function across domain
Xsamples = asarray(arange(0, 1, 0.001))
Xsamples = Xsamples.reshape(len(Xsamples), 1)
ysamples, _ = surrogate(model, Xsamples)
pyplot.plot(Xsamples, ysamples)
# show the plot
pyplot.show()
# sample the domain sparsely with noise
X = random(100)
y = asarray([objective(x) for x in X])
# reshape into rows and cols
X = X.reshape(len(X), 1)
y = y.reshape(len(y), 1)
# define the model
model = GaussianProcessRegressor()
# fit the model
model.fit(X, y)
# plot the surrogate function
plot(X, y, model)
运行该示例首先绘制随机样本,用噪声目标函数对其进行评估,然后拟合 GP 模型。
然后,通过替代函数评估的数据样本和跨域点网格分别绘制为点和线。
注:考虑到算法或评估程序的随机性,或数值准确率的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。
在这种情况下,如我们所料,该图类似于基础无噪声目标函数的粗略版本,重要的是峰值在 0.9 左右,我们知道真正的最大值位于该处。
显示随机样本的图,带有噪声评估(点)和跨域(线)的替代函数。
接下来,我们必须定义一个代理函数采样策略。
采集功能
代理函数用于测试领域中的一系列候选样本。
从这些结果中,可以选择一个或多个候选项,并用真实的,并且在正常实践中计算量很大的代价函数进行评估。
这包括两个部分:用于响应代理函数在域中导航的搜索策略,以及用于解释和评分代理函数响应的获取函数。
可以使用简单的搜索策略,例如随机样本或基于网格的样本,尽管更常见的是使用局部搜索策略,例如流行的 BFGS 算法。在这种情况下,我们将使用随机搜索或随机样本的领域,以保持简单的例子。
这包括首先从域中抽取候选样本的随机样本,用获取函数对其进行评估,然后最大化获取函数或选择给出最佳分数的候选样本。下面的 opt_acquisition() 函数实现了这一点。
# optimize the acquisition function
def opt_acquisition(X, y, model):
# random search, generate random samples
Xsamples = random(100)
Xsamples = Xsamples.reshape(len(Xsamples), 1)
# calculate the acquisition function for each sample
scores = acquisition(X, Xsamples, model)
# locate the index of the largest scores
ix = argmax(scores)
return Xsamples[ix, 0]
获取函数负责对给定候选样本(输入)值得用真实目标函数评估的可能性进行评分或估计。
我们可以直接使用代理分数。或者,假设我们选择了高斯过程模型作为替代函数,我们可以在获取函数中使用来自该模型的概率信息来计算给定样本值得评估的概率。
有许多不同类型的概率获取函数可以使用,每一种都提供了一种不同的权衡,来衡量它们的剥削性(贪婪)和探索性。
三个常见的例子包括:
- 改善概率。
- 预期改进。
- 置信下限(LCB)。
改进概率法是最简单的,而期望改进法是最常用的。
在这种情况下,我们将使用更简单的改进概率方法,该方法计算为标准化预期改进的正常累积概率,计算如下:
- PI = CDF((mu–best _ mu)/stdev)
其中 PI 为改善概率, cdf() 为正态累积分布函数,μ为给定样本的替代函数均值 x , stdev 为给定样本的替代函数标准差 x , best_mu 为目前找到的最佳样本的替代函数均值。
我们可以在标准差上加一个非常小的数字,以避免被零除的误差。
下面的*采集()*函数在给定输入样本的当前训练数据集、一组新的候选样本和拟合 GP 模型的情况下实现了这一点。
# probability of improvement acquisition function
def acquisition(X, Xsamples, model):
# calculate the best surrogate score found so far
yhat, _ = surrogate(model, X)
best = max(yhat)
# calculate mean and stdev via surrogate function
mu, std = surrogate(model, Xsamples)
mu = mu[:, 0]
# calculate the probability of improvement
probs = norm.cdf((mu - best) / (std+1E-9))
return probs
完全贝叶斯优化算法
我们可以将所有这些结合到贝叶斯优化算法中。
主要算法包括选择候选样本、用目标函数评估它们、然后更新 GP 模型的循环。
...
# perform the optimization process
for i in range(100):
# select the next point to sample
x = opt_acquisition(X, y, model)
# sample the point
actual = objective(x)
# summarize the finding for our own reporting
est, _ = surrogate(model, [[x]])
print('>x=%.3f, f()=%3f, actual=%.3f' % (x, est, actual))
# add the data to the dataset
X = vstack((X, [[x]]))
y = vstack((y, [[actual]]))
# update the model
model.fit(X, y)
下面列出了完整的示例。
# example of bayesian optimization for a 1d function from scratch
from math import sin
from math import pi
from numpy import arange
from numpy import vstack
from numpy import argmax
from numpy import asarray
from numpy.random import normal
from numpy.random import random
from scipy.stats import norm
from sklearn.gaussian_process import GaussianProcessRegressor
from warnings import catch_warnings
from warnings import simplefilter
from matplotlib import pyplot
# objective function
def objective(x, noise=0.1):
noise = normal(loc=0, scale=noise)
return (x**2 * sin(5 * pi * x)**6.0) + noise
# surrogate or approximation for the objective function
def surrogate(model, X):
# catch any warning generated when making a prediction
with catch_warnings():
# ignore generated warnings
simplefilter("ignore")
return model.predict(X, return_std=True)
# probability of improvement acquisition function
def acquisition(X, Xsamples, model):
# calculate the best surrogate score found so far
yhat, _ = surrogate(model, X)
best = max(yhat)
# calculate mean and stdev via surrogate function
mu, std = surrogate(model, Xsamples)
mu = mu[:, 0]
# calculate the probability of improvement
probs = norm.cdf((mu - best) / (std+1E-9))
return probs
# optimize the acquisition function
def opt_acquisition(X, y, model):
# random search, generate random samples
Xsamples = random(100)
Xsamples = Xsamples.reshape(len(Xsamples), 1)
# calculate the acquisition function for each sample
scores = acquisition(X, Xsamples, model)
# locate the index of the largest scores
ix = argmax(scores)
return Xsamples[ix, 0]
# plot real observations vs surrogate function
def plot(X, y, model):
# scatter plot of inputs and real objective function
pyplot.scatter(X, y)
# line plot of surrogate function across domain
Xsamples = asarray(arange(0, 1, 0.001))
Xsamples = Xsamples.reshape(len(Xsamples), 1)
ysamples, _ = surrogate(model, Xsamples)
pyplot.plot(Xsamples, ysamples)
# show the plot
pyplot.show()
# sample the domain sparsely with noise
X = random(100)
y = asarray([objective(x) for x in X])
# reshape into rows and cols
X = X.reshape(len(X), 1)
y = y.reshape(len(y), 1)
# define the model
model = GaussianProcessRegressor()
# fit the model
model.fit(X, y)
# plot before hand
plot(X, y, model)
# perform the optimization process
for i in range(100):
# select the next point to sample
x = opt_acquisition(X, y, model)
# sample the point
actual = objective(x)
# summarize the finding
est, _ = surrogate(model, [[x]])
print('>x=%.3f, f()=%3f, actual=%.3f' % (x, est, actual))
# add the data to the dataset
X = vstack((X, [[x]]))
y = vstack((y, [[actual]]))
# update the model
model.fit(X, y)
# plot all samples and the final surrogate function
plot(X, y, model)
# best result
ix = argmax(y)
print('Best Result: x=%.3f, y=%.3f' % (X[ix], y[ix]))
运行该示例首先创建搜索空间的初始随机样本和结果评估。然后在此数据上拟合一个 GP 模型。
注:考虑到算法或评估程序的随机性,或数值准确率的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。
创建一个图,将原始观察结果显示为点,并在整个域中显示替代函数。在这种情况下,初始样本在整个域中有很好的分布,代理函数偏向我们知道 optima 所在的域部分。
跨域(线)的初始样本(点)和替代函数图。
然后,该算法迭代 100 个周期,选择样本,评估样本,并将其添加到数据集以更新代理函数,如此反复。
每个周期报告选定的输入值、代理函数的估计分数和实际分数。理想情况下,随着算法收敛到搜索空间的一个区域,这些分数会越来越接近。
...
>x=0.922, f()=0.661501, actual=0.682
>x=0.895, f()=0.661668, actual=0.905
>x=0.928, f()=0.648008, actual=0.403
>x=0.908, f()=0.674864, actual=0.750
>x=0.436, f()=0.071377, actual=-0.115
接下来,创建一个与前一个图形式相同的最终图。
这一次,绘制了优化任务期间评估的所有 200 个样本。我们预计在已知的最佳值附近会有过多的采样,这就是我们所看到的,5 月点在 0.9 左右。我们还看到代理函数对底层目标域有更强的表示。
贝叶斯优化后所有样本(点)和替代函数在整个域(线)中的图。
最后,报告最佳输入及其目标函数得分。
我们知道,如果没有采样噪声,optima 的输入为 0.9,输出为 0.810。
给定采样噪声,优化算法在这种情况下变得接近,建议输入为 0.905。
Best Result: x=0.905, y=1.150
基于贝叶斯优化的超参数整定
这可能是一个有用的练习来实现贝叶斯优化,以了解它是如何工作的。
实际上,在项目中使用贝叶斯优化时,最好使用开源库中提供的标准实现。这既是为了避免错误,也是为了利用更广泛的配置选项和速度改进。
贝叶斯优化的两个流行库包括 Scikit-Optimize 和 HyperOpt 。在机器学习中,这些库通常用于调整算法的超参数。
超参数调整非常适合贝叶斯优化,因为评估函数计算成本高(例如,每组超参数的训练模型)且有噪声(例如,训练数据和随机学习算法中的噪声)。
在本节中,我们将简要介绍如何使用 Scikit-Optimize 库为一个简单的测试分类问题优化 k 近邻分类器的超参数。这将提供一个有用的模板,您可以在自己的项目中使用。
Scikit-Optimize 项目旨在为使用 SciPy 和 NumPy 的应用程序或使用 Sklearn 机器学习算法的应用程序提供贝叶斯优化访问。
首先,必须安装库,这可以使用 pip 轻松实现;例如:
sudo pip install scikit-optimize
本例还假设您安装了 Sklearn 。
一旦安装,scikit-optimize 有两种方法可以用来优化 Sklearn 算法的超参数。第一种是直接在搜索空间上执行优化,第二种是使用 BayesSearchCV 类,Sklearn 原生类的同级来进行随机和网格搜索。
在本例中,将使用更简单的方法直接优化超参数。
第一步是准备数据和定义模型。我们将通过 make_blobs()函数使用一个简单的测试分类问题,有 500 个例子,每个例子有两个特征和三个类标签。然后我们将使用一个kneighgborcsclassifier 算法。
...
# generate 2d classification dataset
X, y = make_blobs(n_samples=500, centers=3, n_features=2)
# define the model
model = KNeighborsClassifier()
接下来,我们必须定义搜索空间。
在这种情况下,我们将调整邻居的数量( n_neighbors )和邻居函数的形状( p )。这要求为给定的数据类型定义范围。在这种情况下,它们是整数,用最小、最大和 Sklearn 模型的参数名称来定义。对于您的算法,您可以同样轻松地优化*真实()和分类()*数据类型。
...
# define the space of hyperparameters to search
search_space = [Integer(1, 5, name='n_neighbors'), Integer(1, 2, name='p')]
接下来,我们需要定义一个函数,用于评估一组给定的超参数。我们希望最小化这个函数,因此返回的值越小,表示模型的表现越好。
我们可以在函数定义上使用 scikit-optimize 项目中的*use _ name _ args()*装饰器,它允许使用搜索空间中的一组特定参数直接调用函数。
因此,我们的自定义函数将把超参数值作为参数,这些参数可以直接提供给模型,以便对其进行配置。我们可以在 python 中使用函数的** 参数参数来定义这些参数,然后通过 set_params(**)函数将它们传递给模型。
既然模型已经配置好了,我们就可以进行评估了。在这种情况下,我们将在数据集上使用 5 倍交叉验证,并评估每一倍的准确性。然后,我们可以将模型的表现报告为 1 减去这些折叠的平均准确率。这意味着准确率为 1.0 的完美模型将返回 0.0 的值(1.0–平均准确率)。
这个函数是在我们加载数据集并定义模型之后定义的,这样数据集和模型都在范围内,可以直接使用。
# define the function used to evaluate a given configuration
@use_named_args(search_space)
def evaluate_model(**params):
# something
model.set_params(**params)
# calculate 5-fold cross validation
result = cross_val_score(model, X, y, cv=5, n_jobs=-1, scoring='accuracy')
# calculate the mean of the scores
estimate = mean(result)
return 1.0 - estimate
接下来,我们可以执行优化。
这是通过用目标函数的名称和定义的搜索空间调用gp _ minimum()函数来实现的。
默认情况下,该函数将使用“ gp_hedge ”获取函数来尝试找出最佳策略,但这可以通过 acq_func 参数进行配置。默认情况下,优化也将运行 100 次迭代,但是这可以通过 n_calls 参数来控制。
...
# perform optimization
result = gp_minimize(evaluate_model, search_space)
一旦运行,我们就可以通过“有趣”属性获得最佳分数,并通过“ x ”数组属性获得最佳超参数集。
...
# summarizing finding:
print('Best Accuracy: %.3f' % (1.0 - result.fun))
print('Best Parameters: n_neighbors=%d, p=%d' % (result.x[0], result.x[1]))
将这些结合在一起,完整的示例如下所示。
# example of bayesian optimization with scikit-optimize
from numpy import mean
from sklearn.datasets import make_blobs
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from skopt.space import Integer
from skopt.utils import use_named_args
from skopt import gp_minimize
# generate 2d classification dataset
X, y = make_blobs(n_samples=500, centers=3, n_features=2)
# define the model
model = KNeighborsClassifier()
# define the space of hyperparameters to search
search_space = [Integer(1, 5, name='n_neighbors'), Integer(1, 2, name='p')]
# define the function used to evaluate a given configuration
@use_named_args(search_space)
def evaluate_model(**params):
# something
model.set_params(**params)
# calculate 5-fold cross validation
result = cross_val_score(model, X, y, cv=5, n_jobs=-1, scoring='accuracy')
# calculate the mean of the scores
estimate = mean(result)
return 1.0 - estimate
# perform optimization
result = gp_minimize(evaluate_model, search_space)
# summarizing finding:
print('Best Accuracy: %.3f' % (1.0 - result.fun))
print('Best Parameters: n_neighbors=%d, p=%d' % (result.x[0], result.x[1]))
运行该示例使用贝叶斯优化执行超参数调整。
该代码可能会报告许多警告消息,例如:
UserWarning: The objective has been evaluated at this point before.
这是意料之中的,是由同一超参数配置被多次评估引起的。
注:考虑到算法或评估程序的随机性,或数值准确率的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。
在这种情况下,该模型通过与 3 个邻居和 p 值为 2 的平均 5 倍交叉验证获得了约 97%的准确性。
Best Accuracy: 0.976
Best Parameters: n_neighbors=3, p=2
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
报纸
- 昂贵成本函数的贝叶斯优化教程,应用于主动用户建模和分层强化学习,2010。
- 机器学习算法的实用贝叶斯优化,2012。
- 贝叶斯优化教程,2018。
应用程序接口
- 高斯过程,Sklearn API 。
- 超点:分布式异步超参数优化
- Scikit-优化项目。
- 用 skopt 调整 scikit 学习估计器
文章
摘要
在本教程中,您发现了用于复杂优化问题的定向搜索的贝叶斯优化。
具体来说,您了解到:
- 全局优化是一个具有挑战性的问题,它涉及黑盒和通常非凸的、非线性的、有噪声的和计算昂贵的目标函数。
- 贝叶斯优化为全局优化提供了一种概率原则方法。
- 如何从零开始实现贝叶斯优化,以及如何使用开源实现。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。