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

如何无重复拆分数据集为训练集与测试集并遍历全量数据测试

解决方案:无重叠测试集的循环拆分

直接替换你代码中需要修复的循环部分,以下是完整修改后的代码:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier

df = pd.read_csv("CustomersInfo.csv")
y = df['CustomerRank']
X = df.drop('CustomerRank', axis=1, errors='ignore')

# -------------------------- 修复后的拆分逻辑 --------------------------
# 1. 生成随机打乱的数据集索引(设置random_state保证可复现)
np.random.seed(11)  # 可替换为你需要的随机种子
shuffled_indices = np.random.permutation(len(df))

# 2. 将索引拆分为5个不重叠的子集(对应5次20%的测试集)
test_folds = np.array_split(shuffled_indices, 5)

# 3. 循环每个子集作为测试集
for fold_idx, test_indices in enumerate(test_folds):
    # 生成训练集索引:所有不在当前测试集里的索引
    train_indices = np.setdiff1d(shuffled_indices, test_indices)
    
    # 拆分训练/测试数据
    X_train, X_test = X.iloc[train_indices], X.iloc[test_indices]
    y_train, y_test = y.iloc[train_indices], y.iloc[test_indices]
    
    # 后续训练和分析逻辑不变
    clf = XGBClassifier(random_state=fold_idx + 11)  # 保持不同的随机种子
    clf.fit(X_train, y_train)
    fnStoreAnalyse(y_train)
# ---------------------------------------------------------------------

关键逻辑说明

  • 随机打乱索引:先对整个数据集的索引做随机排列,保证拆分的随机性,同时设置np.random.seed确保结果可复现。
  • 无重叠拆分:用np.array_split将打乱后的索引分成5个等份(20%×5=100%),每个子集就是一次的测试集索引,天然保证无重叠。
  • 训练集生成:用np.setdiff1d获取所有不在当前测试集的索引作为训练集,确保每次训练集是剩余80%的数据。
  • 可复现性:循环中给XGBoost的random_state设置不同值(基于fold_idx递增),保证每次训练的随机性可控。

额外注意事项

  • 如果数据集长度无法被5整除,np.array_split会自动调整子集大小,确保每个子集尽可能接近20%,不影响无重叠的核心要求。
  • 若需要严格固定20%的测试集比例,可先计算测试集大小(test_size = int(len(df)*0.2)),再从打乱的索引中依次截取,剩余少量数据可合并到最后一次测试集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:45:56