如何重新采样一个数据集以符合另一个数据集的分布?

数据挖掘 采样 分配 多元分布
2022-03-03 01:22:26

我有两个具有 20 个特征的数据集,但具有不同的特征分布(DS_A 和 DS_B)。如何对 DS_A 进行采样以使其分布类似于 DS_B,关于多个特征?

我通过检查 DS_A 和 DS_B 的各个特征、形状和百分位数来检查两个数据集的相似性/差异。特征大多是数字的,一些是二进制的,一些是标准化的。


背景:

前段时间,我使用数据集 DS_B 作为基础事实训练了一个模型。现在,我想用更新的数据重新训练模型,看看性能是否有所提高。我收集的新的ground truth数据是DS_A,但是由于实际原因,新数据的收集方式有些不同,因此新数据集中的特征分布与旧数据集中的特征分布不同。

1个回答

一种简单的方法是线性转换分布。如果您的数据分布大致呈线性变化,那应该可以正常工作。

问题是如何改变 DS_A 的分布以匹配 DS_B 的分布,关于多个特征?

话虽如此,您可以通过以下方式转换功能分布 DS_A

  1. 减去均值(DS_A)并添加均值(DS_B)
  2. 除以 DS_A 的标准差并乘以 DS_B 的标准差

长话短说:您更改 DS_A 分布的均值和标准偏差以匹配 DS_B。

这是python中的代码,将这种转换应用于两个高斯分布

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

m1, m2 = 0, 10
s1, s2 = 1, 3

x1 = np.random.normal(m1,s1, 1000)
x2 = np.random.normal(m2,s2, 1000)

sns.distplot(x1, hist_kws=dict(alpha=0.1), color='red', label='Distribution 1')
sns.distplot(x2, hist_kws=dict(alpha=0.1), color='green', label='Distribution 2')

estimated_x1_mean = np.mean(x1)
estimated_x1_sd   = np.std(x1)
estimated_x2_mean = np.mean(x2)
estimated_x2_sd   = np.std(x2)

x2_new = (x2 - estimated_x2_mean + estimated_x1_mean)  * estimated_x1_sd / estimated_x2_sd
sns.distplot(x2_new, color='blue', hist_kws=dict(alpha=0.1, edgecolor='black'), label='Distribution 2 after Transformation')
plt.legend()

结果 在此处输入图像描述