如何基于其他数据集的均值方差从Dataset5中采样匹配子集
实现步骤
1. 确认目标匹配指标
你可以先从4组基准数据中选定一组作为匹配目标,优先选和Dataset5方差接近的基准(比如Dataset2,方差644.79和Dataset5的612.18差值最小),采样难度更低。4组基准的统计量整理如下:
- Dataset1:均值28.18,方差393.03
- Dataset2:均值32.70,方差644.79
- Dataset3:均值36.94,方差805.50
- Dataset4:均值28.56,方差436.86
2. 采样实现
方案A:快速加权采样(适合对精度要求不高的场景)
核心逻辑是给tokens长度更接近目标均值的样本更高采样权重,同时保留一定比例的长尾样本保证方差接近目标值,代码示例如下:
import pandas as pd import numpy as np # 替换为你要匹配的目标统计量,这里以Dataset2为例 target_avg = 32.70 target_var = 644.79 # 替换为你的Dataset5读取逻辑 df5 = pd.read_csv("dataset5.csv") # 设定采样子集大小,可按需调整 sample_size = 1000 # 计算每个样本和目标均值的偏差,生成采样权重 df5["dev"] = np.abs(df5["tokens_length"] - target_avg) df5["weight"] = 1 / (df5["dev"] + 1e-3) # 加权采样 sample_df = df5.sample(n=sample_size, weights="weight", random_state=42) # 验证结果 print(f"采样结果 均值:{sample_df['tokens_length'].mean():.2f},方差:{sample_df['tokens_length'].var():.2f}")
方案B:迭代优化采样(适合精度要求高的场景)
如果快速采样的结果达不到要求,可以用迭代替换的方式逐步逼近目标指标,直到误差低于你设定的阈值:
# 精度阈值,可按需调整 avg_threshold = 0.5 var_threshold = 10 max_iter = 10000 # 初始化采样子集 current_df = df5.sample(n=sample_size, random_state=42) current_avg = current_df["tokens_length"].mean() current_var = current_df["tokens_length"].var() for _ in range(max_iter): # 误差达标则退出循环 if abs(current_avg - target_avg) <= avg_threshold and abs(current_var - target_var) <= var_threshold: break # 随机选一个待替换的样本和候选替换样本 drop_idx = np.random.choice(current_df.index) add_idx = np.random.choice(df5[~df5.index.isin(current_df.index)].index) # 生成新子集 new_df = current_df.drop(drop_idx).append(df5.loc[add_idx]) new_avg = new_df["tokens_length"].mean() new_var = new_df["tokens_length"].var() # 计算损失(可调整权重优先匹配均值或方差) current_loss = (current_avg - target_avg) ** 2 + 0.1 * (current_var - target_var) ** 2 new_loss = (new_avg - target_avg) ** 2 + 0.1 * (new_var - target_var) ** 2 # 新子集效果更好则保留 if new_loss < current_loss: current_df = new_df current_avg = new_avg current_var = new_var # 最终结果导出,仅保留需要的列 final_sample = current_df[["text", "tokens_length"]].reset_index(drop=True) print(f"优化后结果 均值:{current_avg:.2f},方差:{current_var:.2f}")
注意事项
- 采样子集大小不要设置过小,样本量越少同时匹配均值和方差的难度越高
- 如果需要匹配其他基准数据集,直接修改
target_avg和target_var的取值即可 - 迭代过程中可以调整损失函数的权重,优先满足你更看重的统计指标
内容的提问来源于stack exchange,提问作者Minions
相关产品推荐
相关产品推荐

