根据ZIPF分布在数据集上生成缺失值

时间:2019-10-15 00:39:51

标签: python pandas numpy scipy zipf

目前,我想观察缺失值对数据集的影响。我将数据点(10%,20%,90%)替换为缺失值,并观察了影响。下面的此功能是替换丢失一定百分比的数据点。

def dropout(df, percent):
    # create df copy
    mat = df.copy()
    # number of values to replace
    prop = int(mat.size * percent)
    # indices to mask
    mask = random.sample(range(mat.size), prop)
    # replace with NaN
    np.put(mat, mask, [np.NaN]*len(mask))
    return mat

我的问题是,我想根据zipf分布/功率低/长尾巴来替换缺少的值。例如,我有一个包含10列的数据集(5列分类数据和5列数字数据)。我想替换基于zipf法则分类的5列上的一些数据点,左侧的列比右侧的列丢失更多。

我使用Python来完成此任务。

我在以下链接中看到了有关zipf分布的Scipy手册:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.zipf.html,但仍然对我没有多大帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

Zipf分布是从0到无穷大的分布族,而您只想从5个离散列中删除值,因此您必须做出一些任意决定才能做到这一点。这是一种方法:

  1. 为您的Zipf分布选择一个参数,例如SciPy documentation page上给出的示例,说a = 2。
  2. 看看同一页上给出的图,您可以决定截断为10,即,如果出现大于10的采样值,则将其丢弃。
  3. 然后,您可以将剩余的0到10域线性映射到您的五个分类列:0到2之间的任何值都对应于第一列,依此类推。

因此,您可以使用SciPy函数从Zipf分布中迭代采样单个值。对于每个采样值,都删除该值所对应的列中的一个数据点(请参阅3.),直到达到缺失值的总体所需百分比为止。