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

数据集划分训练验证测试集时索引重复问题的轻量解决方法

解决数据集划分时索引重复导致样本总数超量的问题

你的推测完全正确:两次独立调用np.random.choice生成的validation_indices和test_indices大概率存在重复索引,而np.delete遇到重复索引只会执行一次删除操作——这就导致训练集里还保留着那些重复的样本,同时这些样本又出现在验证集和测试集里,最终三个集合的样本总数超过了原数据集的34322条。

下面是两种改动极小的修复方案:

方案一:先一次性抽取验证+测试的所有不重复索引,再拆分

只需要替换原函数中生成索引的3行代码,就能彻底避免重复:

X = df.drop("RISK DECISION", axis = 1).values
y = df["RISK DECISION"].values

def train_validation_test_split(X, y, validation_size = 0.1, test_size = 0.1, random_state = None):
    
    if random_state != None:
        np.random.seed(random_state)
    
    n = X.shape[0]
    
    # 改动部分:先选所有验证+测试的不重复索引,再拆分
    total_val_test_count = int(n*(validation_size + test_size))
    val_test_indices = np.random.choice(n, total_val_test_count, replace=False)
    validation_indices = val_test_indices[:int(n*validation_size)]
    test_indices = val_test_indices[int(n*validation_size):]
    
    all_indices = np.concatenate((validation_indices, test_indices))
    
    X_validation = X[validation_indices]
    y_validation = y[validation_indices]
    X_test = X[test_indices]
    y_test = y[test_indices]
    
    X_train = np.delete(X, all_indices, axis = 0)
    y_train = np.delete(y, all_indices, axis = 0)
    
    return(X_train, X_validation, X_test, y_train, y_validation, y_test)

方案二:选完验证索引后,从剩余样本中抽取测试索引

这种方式也能保证索引无重复,只需要修改test_indices的生成逻辑:

X = df.drop("RISK DECISION", axis = 1).values
y = df["RISK DECISION"].values

def train_validation_test_split(X, y, validation_size = 0.1, test_size = 0.1, random_state = None):
    
    if random_state != None:
        np.random.seed(random_state)
    
    n = X.shape[0]
    
    validation_indices = np.random.choice(n, int(n*validation_size), replace = False)
    # 改动部分:从非验证样本的索引中选测试集
    remaining_indices = np.setdiff1d(np.arange(n), validation_indices)
    test_indices = np.random.choice(remaining_indices, int(n*test_size), replace = False)
    
    all_indices = np.concatenate((validation_indices, test_indices))
    
    X_validation = X[validation_indices]
    y_validation = y[validation_indices]
    X_test = X[test_indices]
    y_test = y[test_indices]
    
    X_train = np.delete(X, all_indices, axis = 0)
    y_train = np.delete(y, all_indices, axis = 0)
    
    return(X_train, X_validation, X_test, y_train, y_validation, y_test)

两种方案都能保证三个集合的样本完全无重叠,总数刚好等于原数据集的34322条,而且对原函数的改动都控制在3行以内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:13:18