You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Scikit-Learn与Keras机器学习实战》中为何不建议用random.seed?更新数据集时为何失效?

固定随机种子划分测试集失效的原因与哈希方案解析

我正在阅读Aurélien Géron所著的《Scikit-Learn与Keras机器学习实战》(第2版),书中54-55页介绍了测试集的创建步骤。作者使用numpy.random.permutation实现的划分代码如下:

import numpy as np
def split_train_test(data, test_ratio):
    shuffled_indices = np.random.permutation(len(data))
    test_set_size = int(len(data) * test_ratio)
    test_indices = shuffled_indices[:test_set_size]
    train_indices = shuffled_indices[test_set_size:]
    return data.iloc[train_indices], data.iloc[test_indices]

作者指出,这个方法每次运行会生成不同的测试集,长期下来会让算法接触到全量数据,因此提出两个临时解决方案:

  • 一次性生成测试集并保存,后续每次加载使用
  • 使用numpy.random.seed固定随机种子

但作者提到这两种方案在数据集更新时都会失效,我理解保存加载方案的问题,但不明白固定seed的方案为何失效——毕竟每次是基于输入数据集生成测试集,数据更新后变化应该能被体现?另外我知道不建议使用numpy.random的全局seed,改用生成器实例的方式,但还是没搞懂作者的理由,以及为什么要转而采用哈希方法创建测试集。

固定随机种子方案失效的核心原因

假设你固定了全局seed(比如np.random.seed(42)),第一次划分时,数据集有1000条数据,permutation会生成0-999的固定乱序序列,取前200条作为测试集。当数据集更新后,新增了100条数据(总1100条),此时再用同一个seed调用permutation(1100),生成的是0-1099的固定乱序序列——这个序列和之前的划分逻辑没有任何关联:原来测试集里的部分数据可能会被分到训练集,新增的数据也会混入测试集,直接破坏了新旧测试集的一致性。

简单来说,固定seed只能保证「相同长度的数据集」生成完全相同的划分,但数据集更新后(长度变化、行顺序调整或内容变更),划分出的测试集不再是原测试集的合理扩展,而是完全重新生成的、和之前没有对应关系的集合。这就违背了测试集要始终独立于训练过程的原则——你可能会把之前训练过的数据重新放到测试集,或者把本该保留的测试数据放到训练集,最终导致模型评估结果失真。

哪怕改用独立的随机生成器实例,本质逻辑和固定全局seed是一致的:它只能保证相同输入长度下生成相同的乱序,但数据集更新后输入长度变化,生成的划分就和之前的测试集没有延续性了。

哈希方法的优势

哈希方法的核心逻辑是基于每条数据的唯一标识(比如行索引或某列唯一ID)生成哈希值,通过哈希值的大小判断该数据属于训练集还是测试集。示例实现如下:

import hashlib

def split_train_test_by_id(data, test_ratio, id_column="index"):
    ids = data[id_column]
    # 取哈希值最后一位,判断是否小于'8'(对应80%训练集,20%测试集)
    test_set_ids = ids.apply(lambda id_: hashlib.md5(str(id_).encode()).hexdigest()[-1] < '8')
    return data.loc[~test_set_ids], data.loc[test_set_ids]

这种方法的核心优势:

  • 稳定性:只要数据的唯一标识不变,这条数据的划分结果就不会变。新增的数据会根据自身哈希值分配到对应集合,不会影响原有数据的划分
  • 一致性:不需要保存测试集,也不依赖随机种子,每次运行的划分结果完全一致
  • 适配性:完美解决了随机种子方案中「数据集长度变化导致划分混乱」的问题,能轻松应对数据更新的场景

内容的提问来源于stack exchange,提问作者user662650

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:07:39