# Python机器学习中的随机数生成器简介

> 原文： [https://machinelearningmastery.com/introduction-to-random-number-generators-for-machine-learning/](https://machinelearningmastery.com/introduction-to-random-number-generators-for-machine-learning/)

随机性是机器学习的重要组成部分。

随机性被用作准备数据的工具或特征，以及用于将输入数据映射到输出数据以便做出预测的学习算法。

为了理解机器学习中统计方法的必要性，您必须了解机器学习中随机性的来源。机器学习中的随机性源是一种称为伪随机数发生器的数学技巧。

在本教程中，您将发现伪随机数生成器以及何时控制和控制机器学习中的随机性。

完成本教程后，您将了解：

*   应用机器学习中随机性的来源，侧重于算法。
*   什么是伪随机数生成器以及如何在Python中使用它们。
*   何时控制随机数的序列以及何时控制随机数。

让我们开始吧。

![Introduction to Random Number Generators for Machine Learning](img/12d2e38e2534a033ba13ae2f85f3a47e.jpg)

用于机器学习的随机数发生器的介绍
照片由 [LadyDragonflyCC - ＆gt ;;＆lt;](https://www.flickr.com/photos/ladydragonflyherworld/34027444050/) ，保留一些权利。

## 教程概述

本教程分为5个部分;他们是：

1.  机器学习中的随机性
2.  伪随机数发生器
3.  何时播种随机数发生器
4.  如何控制随机性
5.  常见问题

## 机器学习中的随机性

应用机器学习中有许多随机性来源。

随机性被用作帮助学习算法更加稳健并最终导致更好的预测和更准确的模型的工具。

让我们看几个随机性来源。

### 数据的随机性

我们从域中收集的数据样本中有一个随机元素，我们将用它来训练和评估模型。

数据可能有错误或错误。

更深刻的是，数据包含的噪声可能会掩盖输入和输出之间清晰的关系。

### 评估中的随机性

我们无法访问域中的所有观察结果。

我们只使用一小部分数据。因此，我们在评估模型时利用随机性，例如使用k折交叉验证来拟合和评估可用数据集的不同子集上的模型。

我们这样做是为了了解模型如何平均工作而不是特定的数据集。

### 算法中的随机性

机器学习算法在从数据样本中学习时使用随机性。

这是一个特征，其中随机性允许算法实现比不使用随机性更好的数据映射。随机性是一种特征，它允许算法尝试避免过拟合小训练集并推广到更广泛的问题。

使用随机性的算法通常称为随机算法而不是随机算法。这是因为尽管使用了随机性，但是所得到的模型被限制在更窄的范围内，例如，喜欢有限的随机性。

机器学习算法中使用的一些明显的随机性示例包括：

*   在随机梯度下降的每个训练时期之前改组训练数据。
*   随机森林算法中为吐点选择的输入特征的随机子集。
*   人工神经网络中的随机初始权重。

我们可以看到，我们必须控制两种随机性源，例如数据中的噪声，以及我们可以控制的随机源，例如算法评估和算法本身。

接下来，让我们看一下我们在算法和程序中使用的随机源。

## 伪随机数生成器

我们注入到程序和算法中的随机源是一种称为伪随机数生成器的数学技巧。

随机数生成器是从真实的随机源生成随机数的系统。经常是物理的东西，比如盖革计数器，结果变成随机数。甚至还有从您可以购买的物理来源生成的随机数书，例如：

*   [百万随机数，100,000正常偏差](http://amzn.to/2CM9dDv)

我们在机器学习中不需要真正的随机性。相反，我们可以使用伪随机性。伪随机性是看起来接近随机的数字样本，但是使用确定性过程生成。

随机值改组数据和初始化系数使用伪随机数生成器。这些小程序通常是一个可以调用的函数，它将返回一个随机数。再次调用，他们将返回一个新的随机数。包装函数通常也可用，允许您将随机性作为整数，浮点，特定分布，特定范围内等等。

数字按顺序生成。序列是确定性的，并以初始数字播种。如果您没有显式地为伪随机数生成器设定种子，那么它可以使用当前系统时间（以秒或毫秒为单位）作为种子。

种子的价值无关紧要。选择你想要的任何东西重要的是，该过程的相同种子将导致相同的随机数序列。

让我们通过一些例子来具体化。

## Python中的伪随机数生成器

Python标准库提供了一个名为 [random](https://docs.python.org/3/library/random.html) 的模块，它提供了一组用于生成随机数的函数。

Python使用一种流行且强大的伪随机数生成器，称为 [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) 。

可以通过调用 _random.seed（）_函数来播种伪随机数发生器。通过调用 _random.random（）_函数可以生成0到1之间的随机浮点值。

以下示例为伪随机数生成器播种，生成一些随机数，然后重新种子以证明生成了相同的数字序列。

```py
# 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())
```

运行该示例将打印五个随机浮点值，然后重新生成伪随机数生成器后的相同五个浮点值。

```py
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还有自己的[伪随机数生成器](https://docs.scipy.org/doc/numpy/reference/routines.random.html)和便捷包装函数的实现。

NumPy还实现了Mersenne Twister伪随机数生成器。重要的是，播种Python伪随机数生成器不会影响NumPy伪随机数生成器。它必须单独播种和使用。

以下示例为伪随机数生成器提供种子，生成五个随机浮点值的数组，再次为生成器播种，并演示生成相同的随机数序列。

```py
# 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))
```

在重新生成发生器之后，运行该示例将打印第一批数字和相同的第二批数字。

```py
[0.07630829 0.77991879 0.43840923 0.72346518 0.97798951]
Reseeded
[0.07630829 0.77991879 0.43840923 0.72346518 0.97798951]
```

现在我们知道如何生成受控随机性，让我们看看我们可以有效地使用它的位置。

## 何时播种随机数发生器

在预测性建模项目中，有时您应该考虑播种随机数生成器。

我们来看两个案例：

*   **数据准备**。数据准备可以使用随机性，例如数据的混洗或值的选择。数据准备必须一致，以便在拟合，评估和使用最终模型做出预测时始终以相同的方式准备数据。
    **Data Splits** 。必须一致地进行数据的分割，例如用于训练/测试分割或k折叠交叉验证。这是为了确保在相同的数据子样本上以相同的方式训练和评估每个算法。

您可能希望在每个任务之前或在执行一批任务之前为伪随机数生成器播种一次。一般无关紧要。

有时您可能希望算法的行为一致，也许是因为它每次都在完全相同的数据上进行训练。如果在生产环境中使用该算法，则可能发生这种情况。如果您在教程环境中演示算法，也可能会发生这种情况。

在这种情况下，在拟合算法之前初始化种子可能是有意义的。

## 如何控制随机性

随机机器学习算法每次在相同数据上运行时都会略有不同。

这将导致每次训练时表现略有不同的模型。

如上所述，我们每次都可以使用相同的随机数序列来拟合模型。在评估模型时，这是一种不好的做法，因为它隐藏了模型中固有的不确定性。

更好的方法是以这样的方式评估算法，使得报告的表现包括算法表现中测量的不确定性。

我们可以通过用不同的随机数序列重复多次算法评估来做到这一点。伪随机数发生器可以在评估开始时播种一次，或者可以在每次评估开始时用不同的种子播种。

这里要考虑两个方面的不确定性：

*   **数据不确定性**：评估多个数据分割的算法将深入了解算法表现如何随训练和测试数据的变化而变化。
*   **算法不确定性**：在相同的数据分割上多次评估算法，可以深入了解算法表现如何单独变化。

总的来说，我建议报告这两种不确定因素的总和。这是算法适合每次评估运行的数据的不同分割并具有新的随机序列的地方。评估程序可以在开始时对随机数生成器进行一次播种，并且该过程可以重复大约30次或更多次，以给出可以概括的表现分数群。

这将对模型表现进行公平的描述，同时考虑到训练数据和学习算法本身的差异。

## 常见问题

**我可以预测随机数吗？**
即使使用深度神经网络，也无法预测随机数的序列。

**真正的随机数会带来更好的结果吗？**
据我所知，除非您正在使用物理过程的模拟，否则使用真实随机性通常无济于事。

**最终型号怎么样？**
[最终模型](https://machinelearningmastery.com/train-final-machine-learning-model/)是所选择的算法和配置，可以使用所有可用的训练数据做出预测。该模型的表现将落在评估模型的方差范围内。

## 扩展

本节列出了一些扩展您可能希望探索的教程的想法。

*   确认播种Python伪随机数生成器不会影响NumPy伪随机数生成器。
*   开发在范围和高斯随机数之间生成整数的示例。
*   找到方程式并实现一个非常简单的伪随机数生成器。

如果你探索任何这些扩展，我很想知道。

## 进一步阅读

如果您希望深入了解，本节将提供有关该主题的更多资源。

### 帖子

*   [在机器学习中拥抱随机性](https://machinelearningmastery.com/randomness-in-machine-learning/)
*   [如何使用Keras](https://machinelearningmastery.com/reproducible-results-neural-networks-keras/) 获得可重现的结果
*   [如何评估深度学习模型的技巧](https://machinelearningmastery.com/evaluate-skill-deep-learning-models/)
*   [微量批量梯度下降的简要介绍以及如何配置批量大小](https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/)

### API

*   [随机Python API](https://docs.python.org/3/library/random.html)
*   [NumPy中的随机采样](https://docs.scipy.org/doc/numpy/reference/routines.random.html)

### 用品

*   [维基百科上的随机数生成](https://en.wikipedia.org/wiki/Random_number_generation)
*   [伪随机数发生器](https://en.wikipedia.org/wiki/Pseudorandom_number_generator)
*   [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister)

## 摘要

在本教程中，您发现了随机性在应用机器学习中的作用以及如何控制和利用它。

具体来说，你学到了：

*   机器学习具有随机性源，例如数据样本和算法本身。
*   使用伪随机数生成器将随机性注入到程序和算法中。
*   有时候随机性需要仔细控制，以及需要控制随机性的时间。

你有任何问题吗？
在下面的评论中提出您的问题，我会尽力回答。