如何在给定深度学习代码中完成训练集与测试集的拆分
测试集拆分实现方法
你现有代码已经完成了数据加载、标签独热编码、全局随机混洗三个前置操作,只需在最后注释的位置按比例切分混洗后的Train_data和Train_label即可,以下是具体实现:
方法1:简单按比例切分(最贴合原代码逻辑)
原代码最后两行直接把全部数据赋值给了训练集,我们可以先计算拆分位置,再分别切出训练/验证/测试集:
# 声明拆分比例,可根据需求调整,一般测试集占总数据的10%~30% test_ratio = 0.2 val_ratio = 0.1 # 如果不需要验证集可以去掉这部分,只拆分训练+测试 test_size = int(Totalnb * test_ratio) val_size = int(Totalnb * val_ratio) train_size = Totalnb - test_size - val_size # 因为数据已经提前完成全局混洗,直接按索引切分即可 # 注意切分顺序要和数据的索引对应,保证特征和标签匹配 X_train = Train_data[0:train_size, :] Y_train = Train_label[0:train_size] X_val = Train_data[train_size:train_size+val_size, :] Y_val = Train_label[train_size:train_size+val_size] X_test = Train_data[train_size+val_size:, :] Y_test = Train_label[train_size+val_size:]
说明
- 原代码在切分前已经用
np.random.shuffle打乱了所有样本的顺序,普通场景下直接按位置切分不会出现同标签数据集中在某一个子集的问题 - 切分后的
X_test和Y_test要全程不参与训练、参数调优,只用来最后评估模型的泛化能力
方法2:分层抽样切分(适合类别不均衡场景)
如果你的不同标签的样本数量差距很大,为了保证每个子集的标签分布和总数据集一致,可以用sklearn的train_test_split做分层切分:
from sklearn.model_selection import train_test_split # 先拆分训练+验证集 和 测试集,按标签分层 X_temp, X_test, Y_temp, Y_test = train_test_split(Train_data, Train_label, test_size=0.2, stratify=Train_label, random_state=42) # 再从训练+验证集中拆分出训练集和验证集 X_train, X_val, Y_train, Y_val = train_test_split(X_temp, Y_temp, test_size=0.125, stratify=Y_temp, random_state=42) # 0.125是因为0.1/0.8=0.125,对应总数据的10%为验证集
说明
stratify参数会保证每个子集的标签比例和输入的总数据集标签比例完全一致,避免某类样本全部被分到测试集导致评估不准random_state固定随机种子可以保证每次运行代码的拆分结果一致,方便复现实验结果
内容的提问来源于stack exchange,提问作者JuniorPython
相关产品推荐
相关产品推荐

