r подмножество разбивает данные на группы; подмножество максимального количества наблюдений на группу, пока истинные и ложные логические значения сбалансированы - PullRequest
0 голосов
/ 12 мая 2018

R подмножество данных стратификации по группам;подмножество максимального количества наблюдений на группу, пока истинные и ложные логические значения сбалансированы: (ответ на python также принимается)

У меня есть набор данных из 10000 выборок из 600 идентификаторов ресторанов, некоторые из которых отсутствуют ипредвзятая логическая величина, которую мне нужно сбалансировать до 50:50, прежде чем запускать какие-либо модели.Чтобы воссоздать набор данных, вот код

x<-floor(runif(10000, 0, 600)) #make a dataset of 10000 samples from 600 restaurant IDs
x<-sort(x)
y<-sample(0:1,10000,prob=c(.16,.84),replace=TRUE) #make a biased boolean for those 10000 samples
df = data.frame(x,y) #dataframe has random number of restaurants and biased boolean
colnames(df) <- c("Restaurant_ID","Restaurant_Bool")
summary(df)
nrow(df)

z<-floor(runif(10, 0, 600)) #create a 10 restaurants by ID that are missing from the dataset
for (i in 10) {
  df<-df[!(df$Restaurant_ID==z[i]),] #remove those restaurants by ID from the dataset
}
summary(df)
nrow(df)

Соотношение true: false для набора данных составляет около 84:16, но это число также варьируется в зависимости от идентификатора ресторана

Аналогично стратификациипо идентификатору ресторана, мне нужно ограничить количество истинных наблюдений равным количеству ложных наблюдений для идентификатора ресторана

Я понятия не имею, как это кодировать, и что-нибудь помогает

, поэтому дляНапример, для restaurant_ID 0 может быть 10 наблюдений, где 8 имеет значение true, а 2 - false.Для restaurant_ID 2 нет restaurant_ID 1.

, может быть 8 наблюдений, где 3 имеет значение true, а 5 - false.

    X restaurant_ID Restaurant_Bool
    1 0             1
    2 0             1
    3 0             1
    4 0             0
    5 0             1
    6 0             1
    7 0             1
    8 0             0
    9 0             1
   10 0             1
   11 2             0
   12 2             0
   13 2             1
   14 2             0
   15 2             1
   16 2             0
   17 2             1
   18 2             0
   ...

Я хочу получить результат подмножества, в которомчисло Restaurant_Bool == 0 совпадает с номером Restaurant_Bool == 1 до тех пор, пока максимальное количество наблюдений подмножество основано на минимальном количестве логических наблюдений для каждого restaurant_ID

 X restaurant_ID Restaurant_Bool
 1 0             1
 2 0             1
 4 0             0
 8 0             0
11 2             0
12 2             0
13 2             1
15 2             1
16 2             0
17 2             1
...

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

 X restaurant_ID Restaurant_Bool
 6 0             1
 7 0             1
 4 0             0
 8 0             0
14 2             0
18 2             0
13 2             1
15 2             1
16 2             0
17 2             1
...

... и т. Д., Где несколько разных подмножеств из одного набора данныхможно создать, сохранив тот же номер выборки Restaurant_Bool == 1, что и Restaurant_Bool == 0 для restaurant_ID

В редком случае, когда Restaurant_Bool == 0 имеет больше наблюдений, чем Restaurant_Bool == 1, тогда используйте наименее представленноелогическое значение для воссоздания набора данных по идентификатору ресторана, где может быть указан весь идентификатор ресторанаудаляется из набора данных, если у true или false нет наблюдений

Причина, по которой я хочу разделить по restaurant_ID, заключается в том, что может быть некоторая внутренняя корреляция с остальными столбцами, которые мне нужно сохранить при создании моей модели

Ближайший ответ, который я нашел, это Данные панели подмножеств по группам , но не учитывается, что я хочу сохранить максимальное количество наблюдений на restaurant_ID до тех пор, пока true и false booleanсбалансированы

1 Ответ

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

В Python код выглядит следующим образом

Создайте новый пустой набор данных и напишите цикл for, который группирует по restaurant_id и находит минимальное количество n для каждой подгруппы Restaurant_Bool

создать уловгде, если n равно 0, то перейдите к следующему restaurant_id

. Рекомендуется и не рекомендуется объединение во временный фрейм данных group_reviews и добавьте рецензии group_reviews в фрейм данных balance_reviews, утверждая, что среднее значение Restaurant_Bool равно 0,5

* 1008.* после того, как цикл завершен для каждой группы, утверждают, что среднее значение Restaurant_Bool равно 0,5 для всего кадра данных сбалансированных_просмотров
balanced_reviews = pd.DataFrame()
for restaurant_id, group in reviews.groupby('restaurant_id'):
    take_n = min((group['Restaurant_Bool'] == 0).sum(), (group['Restaurant_Bool'] == 1).sum())
    if take_n == 0:
        continue
    reg_reviews = group[group['Restaurant_Bool'] == 1].sample(n=take_n, random_state=0)
    not_reviews = group[group['Restaurant_Bool'] == 0].sample(n=take_n, random_state=0)
    group_reviews = reg_reviews.append(not_reviews)

    assert group_reviews['Restaurant_Bool'].mean() == .5
    balanced_reviews = balanced_reviews.append(group_reviews)

assert balanced_reviews['Restaurant_Bool'].mean() == .5
...