Python中用于机器学习的随机数生成器简介
随机性是机器学习的重要组成部分。
随机性被用作准备数据和学习算法的工具或特征,这些算法将输入数据映射到输出数据以进行预测。
为了理解机器学习中对统计方法的需求,你必须了解机器学习中随机性的来源。机器学习中随机性的来源是一种称为伪随机数生成器的数学技巧。
在本教程中,你将了解伪随机数生成器以及何时控制和控制-机器学习中的随机性。
完成本教程后,你将了解:
- 应用机器学习中的随机性来源,重点放在算法上。
- 什么是伪随机数生成器,以及如何在Python中使用它们。
- 何时控制随机数序列以及何时控制-用于随机性。
我们开始吧。
教程概述
本教程分为5个部分,它们是:
- 机器学习中的随机性。
- 伪随机数发生器。
- 何时设定随机数生成器的种子。
- 如何控制随机性。
- 常见问题。
机器学习中的随机性
在应用机器学习中有很多随机性的来源。
随机性被用作一种工具来帮助学习算法变得更优秀,并最终产生更好的预测和更准确的模型。
让我们看看随机性的几个来源。
数据中的随机性
我们从域收集的数据样本中有一个随机元素,我们将使用它来训练和评估模型。
数据可能存在错误或错误。
更深层的是,数据中包含的噪音可能会模糊输入和输出之间清晰的关系。
评估中的随机性
我们无法访问该域中的所有观测数据。
我们只使用一小部分数据样本。因此,我们在评估模型时利用随机性,例如使用k-fold交叉验证在可用数据集的不同子集上拟合和评估模型。
我们这样做是为了了解模型在平均水平上是如何工作的,而不是在特定的一组数据上是如何工作的。
算法中的随机性
机器学习算法在从数据样本中学习时使用随机性。
这是一个特征,其中随机性允许算法实现比不使用随机性更好的数据映射性能。随机性是一个特征,它允许算法试图避免过度拟合较小的训练集,并将其推广到更广泛的问题。
使用随机性的算法通常称为随机算法,而不是随机算法。这是因为虽然使用了随机性,但是所得到的模型被限制在更窄的范围内,例如有限的随机性。
机器学习算法中使用的一些明显的随机性示例包括:
- 在随机梯度下降的每个训练时段之前的训练数据的混洗。
- 在随机森林算法中为SPIT点选择的输入要素的随机子集。
- 人工神经网络中的随机初始权值。
我们可以看到,既有我们必须控制的随机性来源,如数据中的噪声,也有我们可以控制的随机性来源,如算法评估和算法本身。
接下来,让我们看看我们在算法和程序中使用的随机性来源。
伪随机数发生器
我们注入程序和算法的随机性来源是一种称为伪随机数生成器的数学技巧。
随机数生成器是从真正的随机性来源生成随机数的系统。通常是一些物理的东西,比如盖革计数器,结果会变成随机数。
在机器学习中,我们不需要真正的随机性。相反,我们可以使用伪随机性。伪随机性是看起来接近随机的数字样本,但它是使用确定性过程生成的。
使用伪随机数生成器对数据进行混洗并使用随机值初始化系数。这些小程序通常是你可以调用的函数,它将返回一个随机数。再次调用时,它们将返回一个新的随机数。包装器函数通常也是可用的,允许你以整数、浮点、特定分布、特定范围等形式获得随机性。
这些数字是按顺序生成的。该序列是确定性的,并且以初始数字作为种子。如果你没有显式设定伪随机数生成器的种子,则它可能使用以秒或毫秒为单位的当前系统时间作为种子。
种子的价值并不重要。你想选什么就选什么。重要的是,过程的相同种子将产生相同的随机数序列。
让我们用一些例子来具体说明这一点。
Python中的伪随机数生成器
Python标准库提供了一个名为random的模块,该模块提供了一套用于生成随机数的函数。
Python使用一种流行且优秀的伪随机数生成器,称为Mersenne Twister。
伪随机数生成器可以通过调用random.seed()函数进行seed设定。0到1之间的随机浮点值可以通过调用random.random() 函数生成。
下面的示例对伪随机数生成器进行seed设定,生成一些随机数,然后重新设定seed以演示生成了相同的数字序列。
# demonstrates the python pseudorandom number generator from random import seed from random import random # seed the generator seed(7) for _ in range(5): print(random()) # seed the generator to get the same sequence print('Reseeded') seed(7) for _ in range(5): print(random())
运行该示例将打印5个随机浮点值,然后在伪随机数生成器重新设定种子后打印相同的5个浮点值。
0.32383276483316237 0.15084917392450192 0.6509344730398537 0.07243628666754276 0.5358820043066892 Reseeded 0.32383276483316237 0.15084917392450192 0.6509344730398537 0.07243628666754276 0.5358820043066892
NumPy中的伪随机数发生器
在机器学习中,你可能会使用scikit-learn和Keras等库。
这些库在幕后利用了NumPy,这是一个非常有效地处理向量和数字矩阵的库。
NumPy也有自己的伪随机数生成器实现和方便的包装器函数。
NumPy还实现了Mersenne Twister伪随机数生成器。重要的是,设定Python伪随机数生成器的seed不会影响NumPy伪随机数生成器。它会单独使用并运行。
下面的示例设定伪随机数生成器的seed,生成一个由五个随机浮点值组成的数组,然后再次设定生成器的seed,并演示生成相同的随机数序列。
# demonstrates the numpy pseudorandom number generator from numpy.random import seed from numpy.random import rand # seed the generator seed(7) print(rand(5)) # seed the generator to get the same sequence print('Reseeded') seed(7) print(rand(5))
运行该示例将在重新设定生成器后打印第一批数字和相同的第二批数字。
[0.07630829 0.77991879 0.43840923 0.72346518 0.97798951] Reseeded [0.07630829 0.77991879 0.43840923 0.72346518 0.97798951]
现在我们知道了受控随机性是如何产生的,让我们看看在哪里可以有效地使用它。
何时设定随机数生成器的seed
在预测建模项目期间,有时你应该考虑设定随机数生成器的seed。
我们来看两个案例:
- 数据准备。数据准备可以使用随机性,例如数据的混洗或值的选择。数据准备必须一致,以便在拟合、评估和使用最终模型进行预测时始终以相同的方式准备数据。
- 数据拆分。必须一致地进行数据拆分,例如列车/测试拆分或k-fold交叉验证。这是为了确保每个算法在相同的数据子样本上以相同的方式进行训练和评估。
你可能希望在每个任务之前设定一次伪随机数生成器seed,或者在执行一批任务之前设定一次伪随机数生成器seed。无论是哪一种都无关紧要。
有时,你可能希望算法的行为一致,可能是因为它每次都是在完全相同的数据上训练的。如果在生产环境中使用该算法,则可能会发生这种情况。如果你在教程环境中演示算法,也可能会发生这种情况。
在这种情况下,在拟合算法之前初始化seed可能是有意义的。
如何控制随机性
随机机器学习算法每次在相同的数据上运行时将学习略有不同。
这将导致每次训练时模型的性能略有不同。
如前所述,我们可以每次使用相同的随机数序列来拟合模型。在评估模型时,这是一种糟糕的做法,因为它隐藏了模型中固有的不确定性。
更好的方法是以这样的方式评估算法,即报告的性能包括在算法性能中测量的不确定性。
我们可以通过使用不同的随机数序列多次重复算法评估来做到这一点。伪随机数生成器可以在评估开始时seed一次,或者可以在每次评估开始时设定不同的seed。
这里有两个方面的不确定性需要考虑:
- 数据不确定性:对多个数据拆分的算法进行评估将深入了解算法性能如何随训练和测试数据的变化而变化。
- 算法不确定性:在相同的数据拆分上多次评估算法将深入了解算法性能是如何单独变化的。
总体而言,我建议将这两个不确定因素结合起来进行报告。这就是算法适用于每次评估运行的不同数据拆分的地方,并且具有新的随机性序列。评估过程可以在开始时为随机数生成器设定一次seed,该过程可以重复30次或更多次,以给出可以汇总的总体性能分数。
这将在考虑到训练数据和学习算法本身的方差的情况下给出模型性能的公平描述。
常见问题
我可以预测随机数字吗?
即使使用深度神经网络,也无法预测随机数序列。
真随机数会带来更好的结果吗?
就我所读到的,使用真实的随机性通常不会有什么帮助,除非你在研究物理过程的模拟。
最终模型怎么样?
最终模型是根据所有可用训练数据进行训练的选定算法和配置,你可以使用这些数据进行预测。该模型的性能将落在评估模型的方差范围内。
进一步阅读
如果你想深入了解,本节提供了更多关于该主题的资源。