import numpy as np
import pandas as pd
from sklearn.model_selection import StratifiedKFold, GroupKFold, TimeSeriesSplit
# 1. 构造演示数据集
np.random.seed(42)
N = 12
df = pd.DataFrame({
'user_id': [101, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105], # 5 个用户
'timestamp': pd.date_range(start='2026-01-01', periods=N, freq='D'),
'feature': np.random.randn(N),
'target': [0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1] # 不平衡标签
})
print("================ 1. 分层 K-Fold (StratifiedKFold) ================")
skf = StratifiedKFold(n_splits=3)
for fold, (train_idx, val_idx) in enumerate(skf.split(df, df['target'])):
val_targets = df.iloc[val_idx]['target'].values
print(f"Fold {fold+1} 验证集索引: {val_idx} | 标签分布: {np.bincount(val_targets)}")
print("\n================ 2. 用户分组 K-Fold (GroupKFold) ================")
gkf = GroupKFold(n_splits=3)
for fold, (train_idx, val_idx) in enumerate(gkf.split(df, df['target'], groups=df['user_id'])):
val_users = df.iloc[val_idx]['user_id'].unique()
train_users = df.iloc[train_idx]['user_id'].unique()
# 验证同一个用户是否跨集中
intersection = set(val_users).intersection(set(train_users))
print(f"Fold {fold+1} 验证集用户: {val_users} | 跨集交叉用户数: {len(intersection)}")
print("\n================ 3. 时间序列切分 (TimeSeriesSplit) ================")
tss = TimeSeriesSplit(n_splits=3)
for fold, (train_idx, val_idx) in enumerate(tss.split(df)):
print(f"Fold {fold+1} 训练时间段: {df.iloc[train_idx]['timestamp'].dt.date.values[0]} ~ {df.iloc[train_idx]['timestamp'].dt.date.values[-1]}")
print(f" 验证时间段: {df.iloc[val_idx]['timestamp'].dt.date.values[0]} ~ {df.iloc[val_idx]['timestamp'].dt.date.values[-1]}")