【问题标题】:How to generate random categorical data in python according to a probability distribution? [closed]如何根据概率分布在python中生成随机分类数据? [关闭]
【发布时间】:2019-12-17 12:21:40
【问题描述】:

我正在尝试从现有列生成分类变量的随机列以创建一些合成数据。例如,如果我的列有 3 个值 0、1、2,其中 0 出现 50% 的时间,1 和 2 出现 30% 和 20% 的时间,我希望我的新随机列也具有相似(但不相同)的比例

使用 R.https://stats.stackexchange.com/questions/14158/how-to-generate-random-categorical-data 解决了交叉验证的类似问题。但是我想要一个 Python 解决方案来解决这个问题

【问题讨论】:

标签: python-3.x pandas numpy random


【解决方案1】:

使用np.random.choice() 并指定对应于所选数组的概率向量:

>>> import numpy as np 
>>> np.random.seed(444) 
>>> data = np.random.choice(  
...     a=[0, 1, 2],  
...     size=50,  
...     p=[0.5, 0.3, 0.2]  
... )                                                                                                                                                                                                                                                        
>>> data                                                                                                                                                                                                                                                     
array([2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1,
       1, 1, 0, 2, 1, 1, 2, 1, 1, 0, 0, 0, 0, 2, 0, 1, 0, 2, 0, 2, 2, 2,
       1, 1, 1, 0, 0, 1])
>>> np.bincount(data) / len(data)    # Proportions                                                                                                                                                                                                                          
array([0.44, 0.32, 0.24])

随着样本量的增加,经验频率应向您的目标收敛:

>>> a_lot_of_data = np.random.choice(  
...     a=[0, 1, 2],  
...     size=500_000,  
...     p=[0.5, 0.3, 0.2]  
... )
>>> np.bincount(a_lot_of_data) / len(a_lot_of_data)                                                                                                                                                                                                          
array([0.499716, 0.299602, 0.200682])

正如@WarrenWeckesser 所指出的,如果您已经拥有一维 NumPy 数组或 Pandas 系列,则可以直接将其用作输入,而无需指定 pnp.random.choice() 的默认值是替换采样 (replace=True),因此通过传递您的原始数据,得到的分布应该接近输入的分布。

【讨论】:

  • 如果不是使用[0, 1, 2] 作为选项,而是使用现有列,则不需要指定p。随机选择的分布自然会遵循现有列的分布。
  • 这是一个很好的观点。我假设指定的概率应该是准确的,固定在问题的百分比上。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 2018-05-23
  • 2011-03-31
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多