如何无重复拆分数据集为训练集与测试集并遍历全量数据测试
解决方案:无重叠测试集的循环拆分
直接替换你代码中需要修复的循环部分,以下是完整修改后的代码:
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
相关产品推荐
相关产品推荐

