设置随机种子后,iterative_train_test_split仍无法返回相同划分怎么办?
解决iterative_train_test_split无法生成一致数据划分的问题
问题分析
你当前的代码中,标签集(y)的划分完全一致,但特征集(X)的划分却不一致,说明样本的选择逻辑是正确的,但全局随机种子的设置没有完全覆盖函数内部的随机操作,或者存在隐性的随机因素干扰。
解决方案
1. 全局随机种子仅需设置一次
不需要在每次调用iterative_train_test_split前重复设置环境变量和随机种子,在程序启动时一次性配置即可,重复设置可能引发不必要的状态混乱。
2. 直接给函数传入random_state参数
iterative_train_test_split支持传入random_state参数(整数或np.random.RandomState对象),这是确保划分一致性最可靠的方式,它可以直接控制函数内部的随机选择逻辑。
修改后的代码示例
import os import random import numpy as np from skmultilearn.model_selection import iterative_train_test_split SEED = 42 # 全局一次性配置随机种子与环境变量 os.environ['PYTHONHASHSEED'] = str(SEED) os.environ['OMP_NUM_THREADS'] = '1' os.environ['OPENBLAS_NUM_THREADS'] = '1' os.environ['MKL_NUM_THREADS'] = '1' os.environ['TF_NUM_INTEROP_THREADS'] = '1' os.environ['TF_NUM_INTRAOP_THREADS'] = '1' os.environ['NUMEXPR_NUM_THREADS'] = '1' random.seed(SEED) np.random.seed(SEED) # 传入random_state参数控制划分 X_train1, y_train1, X_test1, y_test1 = iterative_train_test_split(X.values, y.values, test_size=0.2, random_state=SEED) X_train2, y_train2, X_test2, y_test2 = iterative_train_test_split(X.values, y.values, test_size=0.2, random_state=SEED) # 若X为浮点数,建议用np.allclose替代==判断 print(np.allclose(X_train1, X_train2)) print(np.allclose(X_test1, X_test2)) print((y_train1 == y_train2).all()) print((y_test1 == y_test2).all())
额外说明
如果你的特征集X包含浮点数,直接使用==和.all()判断相等可能会因为浮点精度误差返回False,此时建议用np.allclose(X_train1, X_train2)来验证数组是否在可接受的误差范围内一致。
内容的提问来源于stack exchange,提问作者MisterJAcobz
相关产品推荐
相关产品推荐

