为什么要在机器学习模型中设置随机状态?

2025年6月21日 | 阅读6分钟

如果您曾经接触过机器学习,那么在将数据集分割为训练集和测试集或进行超参数调优时,您可能会遇到 `random_state` 参数。大多数人倾向于使用默认值,如 `0` 或 `42`,仅仅是因为它们易于使用。使用此参数并将其设置为某个值可以确保您在任何运行中都获得相同的随机数序列。尤其是在可重复性方面非常有用;当运行相似代码时,您和他人都能获得相同的结果。例如,使用 scikit-learn 中的 `train_test_split` 函数在训练集和测试集之间分割数据,可以确保在设置任何随机状态的情况下获得一致的分割。没有随机状态,每次运行代码时都可能得到不同的分割,这将导致模型性能的差异,并且调试和比较都会变得困难。

它是什么?

在 Scikit-learn 中,`random_state` 参数确保了对特定操作中涉及的随机性进行控制,例如在将数据分割为训练集和测试集之前进行数据混洗。如果此类参数应用于 `train_test_split` 等函数,在混洗后将其分割为训练集和测试集,那么可以肯定的是,在多次代码执行过程中,不同的数据分割将是可重复和一致的。这在比较模型或调试机器学习管道中的问题时非常有用。

random_state 参数可以接受以下值:

整数(例如 0、42 等):当 seed 参数设置为整数值时很有用。它可以被视为一个随机数生成器的种子,这样每次执行代码时,混洗和分割操作都会产生相同的结果。因此,您的实验是确定性的且可重复的。

None: 未指定或设置为 None 时,随机数生成器使用系统时间或任何随机源,因此您在不同程序执行中注定会得到不同的结果。虽然这在许多情况下可能足够,但如果您需要可重复的结果,则会变得有问题。

np.random.RandomState 实例: 更高级的用例可能涉及传递一个随机数生成器实例,这是控制工作流中随机性的一种更通用的方式。

一旦您了解了如何有效地使用 `random_state`,您就可以提高机器学习实验的可靠性和透明度。此参数确保提供的数据每次都以相同的方式进行混洗和分割,因此您可以自信地测试、调整和验证模型。

随机状态的工作原理

我们以一个包含数字 1 到 10 的数据集为例。如果我们想将此数据集分割用于训练和测试,其中 20% 用于测试数据集,那么我们的训练数据集有 8 个样本,测试数据集有 2 个样本。为了始终如一且平均地进行分割,我们使用了 `random_state`。

`random_state` 将确保所有随机操作,例如在分割数据集之前混洗数据集,在每次代码运行时都是相同的。没有这种一致性,每次运行代码时都会发生不同的分割,并且模型训练和评估可能存在不一致。例如,每次运行时用不同的分割训练您的模型可能会产生不稳定的结果,这将使得调试或分析其性能非常困难。

这就是它的工作原理,每个不同的 `random_state` 值都对应着一个特定的随机实现。例如,设置 `random_state=1` 将始终为该特定分割生成相同的训练集和测试集。确定性确保数据混洗和分割每次运行代码时都相同,与运行代码的次数无关。

通过使用固定的 `random_state` 混洗您的数据集,您可以避免某些数据点反复进入训练集或测试集的情况。这对于确保模型在多次实验或由不同人员处理同一项目时,在相同的子集上进行正确训练和测试非常重要。

总而言之,`random_state` 确保了随机过程将始终产生相同的结果,因此可以在不同机器之间无不一致地执行相同的数据流。

让我们看看它如何在分割数据集时使用

代码

输出

Mean Squared Error: 0.009341881934544223

说明

该代码利用 sklearn.datasets 中的回归功能生成用于线性回归的合成数据集。创建了 1000 个样本,其中包含 10 个特征和一些噪声,以模拟真实世界场景。然后,将数据集转换为 pandas DataFrame 以便更容易处理,并使用 `train_test_split` 方法将其分割为训练集和测试集。在训练集 (X_train, y_train) 上训练线性回归模型,并用于预测测试集 (X_test) 的目标变量。使用均方误差 (MSE) 来评估模型性能,该误差计算实际值和预测值之间平方差的平均值。

在上面的代码中,对于 `random_state` 为 0,均方误差为 0.009341。如果 `random_state` 的值发生变化,则会产生不同的均方值。

  • 对于 `random_state` = 1,均方误差为 0.00812。
  • 对于 `random_state` = 50,均方误差为 0.0089。
  • 对于 `random_state` = 42,均方误差为 0.00951。

为什么需要随机状态?

假设您正在处理一个房屋价格预测问题,并且您有一些数据集,其中包含卧室数量或公寓面积等特征,这些特征从数据集顶部到底部是依次增长的。这种排列称为有偏数据,因为它不是随机的,并且遵循特定的顺序。如果您在不混洗数据的情况下将数据分割为训练集和测试集,那么模型很可能在训练数据上表现良好,但在测试数据上表现不佳。这是因为训练集包含只显示较小房屋或公寓的数据,而测试集将包含较大的房屋或公寓,从而表现出不规则的模式。如果先混洗数据集再进行分割,就可以解决这个问题。数据混洗确保训练集和测试集都包含数据的均衡和代表性混合,从而防止性能差异。在分割数据时使用 `random_state` 参数有助于实现一致的随机性,从而每次都能重现相同的混洗和分割。此方法对于训练一个能很好地泛化到未见过数据的鲁棒模型至关重要。

当我们尝试分割数据集时,目标是实现跨各种运行的结果一致性。这意味着每次运行代码时,训练集和测试集都应该唯一。例如,为了获得相同的结果,必须使用 `random_state` 参数。这确保了无论谁使用相同的代码,数据分割的过程都是可重复和一致的。

这会导致基于不同的 `random_state` 值产生性能差异。如上面的代码所示,不同的 `random_state` 值会导致不同的均方误差得分。这表明 `random_state` 的选择会影响模型的性能。如果 `random_state` 的值是随机选择的并且产生了最佳结果,那么该随机值就是好的。

随机状态还有各种其他应用,可以确保实验的可重复性,并允许代码多次运行的结果保持一致。它还用于控制数据混洗中的随机性、将数据集分割为训练集和测试集、在机器学习模型中初始化随机权重,以及在模拟和数据处理任务中生成可重复的随机样本或序列。

结论

总之,随机状态是保证机器学习可重复性的基石之一,因为它提供了持续的实验、公平的评估和透明的研究。对随机性的有效管理使实践者能够构建可靠的模型,自信地呈现结果,并推动创新,以造福社区。