0

目前,我想观察缺失值对我的数据集的影响。我将数据点 (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但它仍然对我没有多大帮助。

4

1 回答 1

0

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

  1. 为您的 Zipf 分发选择一个参数,例如SciPy 文档页面上给出的示例中的 a = 2 。
  2. 查看同一页上给出的图,您可以决定在 10 处截断,即如果出现任何超过 10 的采样值,您将丢弃它。
  3. 然后您可以将剩余的 0 到 10 的域线性映射到您的五个分类列:0 到 2 之间的任何值对应于第一列,依此类推。

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

于 2020-03-31T19:48:08.630 回答