【问题标题】:Randomly selecting from Pandas groups with equal probability -- unexpected behavior以相等的概率从 Pandas 组中随机选择——意外行为
【发布时间】:2017-12-12 06:48:47
【问题描述】:

我尝试从 12 个独特的组中随机抽样,每个组都有不同数量的观察值。我想从整个人口(数据框)中随机抽样,每组具有相同的被选中概率。最简单的示例是具有 2 个组的数据框。

    groups  probability
0       a       0.25
1       a       0.25
2       b       0.5

使用np.random.choice(df['groups'], p=df['probability'], size=100) 现在每次迭代都有 50% 的机会选择group a 和 50% 的机会选择group b

为了得出概率,我使用了以下公式:

(1. / num_groups) / size_of_groups

或在 Python 中:

num_groups = len(df['groups'].unique())  # 2
size_of_groups = df.groupby('label').size()  # {a: 2, b: 1}
(1. / num_groups) / size_of_groups

返回

    groups
a    0.25
b    0.50

这很有效,直到我超过 10 个独特的组,之后我开始得到奇怪的分布。这是一个小例子:

np.random.seed(1234)

group_size = 12
groups = np.arange(group_size)

probs = np.random.uniform(size=group_size)
probs = probs / probs.sum()

g = np.random.choice(groups, size=10000, p=probs)
df = pd.DataFrame({'groups': g})

prob_map = ((1. / len(df['groups'].unique())) / df.groupby('groups').size()).to_dict()

df['probability'] = df['groups'].map(prob_map)

plt.hist(np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True))
plt.xticks(np.arange(group_size))
plt.show()

我希望样本量足够大的分布相当均匀,但是当组数为 11+ 时,我会得到这些翅膀。如果我将 group_size 变量更改为 10 或更低,我确实得到了所需的均匀分布。

我不知道问题出在我的概率计算公式上,还是浮点精度问题?任何人都知道完成此操作的更好方法或此示例的修复方法?

提前致谢!

【问题讨论】:

    标签: python python-2.7 pandas numpy numpy-random


    【解决方案1】:

    您正在使用hist,默认为10 垃圾箱...

    plt.rcParams['hist.bins']
    
    10
    

    group_size 作为bins 参数传递。

    plt.hist(
        np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True),
        bins=group_size)
    

    【讨论】:

    • 啊,有道理!感谢您的快速回复!
    【解决方案2】:

    您的计算没有问题。你得到的数组是:

    arr = np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True)
    

    如果您检查值计数:

    pd.Series(arr).value_counts().sort_index()
    Out: 
    0     855
    1     800
    2     856
    3     825
    4     847
    5     835
    6     790
    7     847
    8     834
    9     850
    10    806
    11    855
    dtype: int64
    

    它非常接近于均匀分布。问题在于直方图的默认箱数 (10)。相反,试试这个:

    bins = np.linspace(-0.5, 10.5, num=12)
    pd.Series(arr).plot.hist(bins=bins)
    

    【讨论】:

    • 感谢您的快速回复!我应该考虑检查价值计数!
    • @pyrate 欢迎您。一般来说,直方图可能会误导一组离散值,所以是的,value_counts + 和条形图在发现阶段可能更有用。
    猜你喜欢
    • 2023-04-03
    • 2011-10-20
    • 1970-01-01
    • 2019-05-10
    • 2018-03-25
    • 2022-01-08
    • 2012-01-20
    • 2020-09-14
    相关资源
    最近更新 更多