sklearn.train_test_split与torch.random_split的差异及精度差异原因咨询
两种数据集拆分方法的核心差异及准确率差异原因
1. 拆分逻辑本质不一样
- torch.utils.data.random_split:靠索引子集拆分,不会改动原数据集。它生成两组随机索引,再创建两个
Subset对象,分别指向原数据集中对应索引的样本。原数据集的结构、样本顺序完全保留,只是通过索引筛选出子集。 - sklearn.model_selection.train_test_split:直接对样本集合进行拆分(只要
my_dataset是可迭代对象),返回两个独立的数据集或样本列表。它会把原数据里的样本重新分配到两个新集合中,相当于重新组织了样本。
2. 随机数生成逻辑不同
random_split默认使用PyTorch内置的torch.Generator生成随机索引,和NumPy/Sklearn的随机源不是同一套机制。train_test_split默认依赖NumPy的随机数生成器,哪怕不手动设置种子,两者的随机拆分结果也完全独立,导致训练/测试集的样本分布可能存在明显差异。
3. 样本数量的严格程度有区别
random_split严格按照你传入的lengths参数分配样本:比如数据集有101个样本,train_len = int(0.9*101) = 90,测试集就固定是11个。train_test_split的test_size=0.1是按比例近似分配,当总样本数无法被10整除时会自动调整:比如101个样本,测试集会是10个。测试集大小的细微差异,可能影响最终的准确率计算。
4. 洗牌与分层的默认操作不同
random_split本身不执行洗牌操作,如果原数据集是按类别排序的,你需要手动传入带随机排列的generator参数才能实现洗牌拆分;否则它只是随机选取索引,若原数据有序,仍可能出现训练/测试集类别分布不均的情况。train_test_split默认开启洗牌(shuffle=True),但默认不做分层(stratify=None)。如果你的数据集存在类别不平衡,两种方法拆分后的类别分布差异,会直接影响模型的准确率表现。
为啥会出现准确率差异?
你观察到的准确率差异,核心原因是两种方法的随机拆分结果不同:
- 若
random_split拆分出的测试集样本更贴合训练集的分布,或者样本难度更低,模型在该测试集上的准确率自然更高; - 反之,
train_test_split的拆分结果可能让测试集包含更多难分类样本,或是训练集的类别覆盖度不足,最终拉低了准确率。
要对齐实验结果,建议:
- 给两种方法指定相同的随机种子(注意
random_split需传入torch.Generator并设置种子,train_test_split需设置random_state参数); - 确保两种方法拆分后的训练/测试集样本数量完全一致;
- 若数据集类别不平衡,在
train_test_split中设置stratify参数,同时给random_split传入分层后的索引,保证两边的类别分布一致。
内容的提问来源于stack exchange,提问作者009
相关产品推荐
相关产品推荐

