Как сделать случайную стратифицированную выборку с помощью Python (не разделив поезд / тест)? - PullRequest
0 голосов
/ 06 мая 2018

Я ищу лучший способ сделать случайную стратифицированную выборку, такую ​​как опрос и опросы. Я не хочу делать sklearn.model_selection.StratifiedShuffleSplit, так как я не занимаюсь обучением под наблюдением, и у меня нет цели. Я просто хочу создать случайные стратифицированные выборки из панд DataFrame (https://www.investopedia.com/terms/stratified_random_sampling.asp).

Python - мой основной язык.

Спасибо за любую помощь

1 Ответ

0 голосов
/ 06 мая 2018

Это мое лучшее решение на данный момент. Важно заранее связать непрерывные переменные и иметь минимум наблюдений для каждого слоя.

В этом примере я:

  1. Генерация населения
  2. Выборка чисто случайным образом
  3. Выборка случайным образом стратифицированным образом

При сравнении обеих выборок стратифицированная является гораздо более представительной для всей популяции.

Если у кого-то есть идея относительно более оптимального способа сделать это, пожалуйста, не стесняйтесь поделиться.


import pandas as pd
import numpy as np

# Generate random population (100K)

population = pd.DataFrame(index=range(0,100000))
population['income'] = 0
population['income'].iloc[39000:80000] = 1
population['income'].iloc[80000:] = 2
population['sex'] = np.random.randint(0,2,100000)
population['age'] = np.random.randint(0,4,100000)

pop_count = population.groupby(['income', 'sex', 'age'])['income'].count()

# Random sampling (100 observations out of 100k)

random_sample = population.iloc[
    np.random.randint(
        0, 
        len(population), 
        int(len(population) / 1000)
    )
]

# Random Stratified Sampling (100 observations out of 100k)

stratified_sample = list(map(lambda x : population[
    (
        population['income'] == pop_count.index[x][0]
    ) 
    &
    (
        population['sex'] == pop_count.index[x][1]
    )
    &
    (
        population['age'] == pop_count.index[x][2]
    )
].sample(frac=0.001), range(len(pop_count))))

stratified_sample = pd.concat(stratified_sample)
...