Попытка сгенерировать случайные данные из списков

Я пытаюсь создать данные для проекта. Данные должны генерироваться случайным образом из заранее определенных списков. По сути, у меня есть реальные данные, но их очень мало. Чтобы построить некоторые классификаторы (тресс принятия решений, машины опорных векторов и наивный байесовский метод), я хочу произвести 100 000 наблюдений.

Я новичок в кодировании (я могу делать элементарные вещи в Matlab и R) и сначала пытался сделать это в Excel, однако функция RANDOMA генерировала очень равномерно распределенные данные. Чтобы быть более конкретным, я использую 5 демографических единиц информации, чтобы предсказать, какой розничный торговец выберет покупатель, например розничный продавец A, B или C. Списки демографической информации приведены ниже:

1) Возрастная группа (18-24, 25-34, 35-44, 45-54, 55+) 2) Пол (мужской или женский) 3) Группа дохода (‹10 000 фунтов стерлингов, 10 000–19,99 000 фунтов стерлингов, 20 000 фунтов стерлингов) 29,99 тыс. Фунтов стерлингов и т. Д.) 4) Регион (Лондон, Уэльс, Шотландия, Северная Ирландия, Юго-Запад и т. Д.) 5) Тип работы (полный рабочий день, неполный рабочий день, студент и т. Д.)

Когда я попытался случайным образом создать 100 000 наблюдений (каждое наблюдение было случайным образом выбрано по одному из каждого из 5 списков), они были почти одинаково распределены между ними. Хуже того, ценность, которую я произвольно присвоил продавцу (A, B или C), также была равной.

Идея состоит в том, чтобы разделить эти случайно сгенерированные данные на данные для обучения и тестирования, чтобы я мог построить несколько моделей и проверить их пригодность.


person Christopher Loynes    schedule 28.11.2017    source источник
comment
Что вы имеете в виду, говоря о равном распределении между ними? Вы имеете в виду, что варианты в каждом списке появлялись с одинаковой частотой (то есть примерно с тем же числом 18-24, что и 25-34, 35-44 и т. Д.)? Этого можно было бы ожидать, если вы единообразно отбираете каждый список.   -  person gnovice    schedule 28.11.2017
comment
Прочтите При каких обстоятельствах я могу добавить к своему вопросу «срочно» или другие похожие фразы, чтобы получить более быстрые ответы? - Резюмируя, можно сказать, что это не идеальный способ обращения к волонтерам и, вероятно, контрпродуктивен для получения ответов. Пожалуйста, воздержитесь от добавления этого к своим вопросам.   -  person halfer    schedule 28.11.2017
comment
Случайное увеличение размера выборки - ужасная вещь, например см. статистики .stackexchange.com / questions / 13456 /. Просто используйте случайный лес в качестве классификатора - он сосредоточен на упаковке, которая отлично помогает избежать переобучения (что является основной проблемой при небольших размерах выборки)   -  person Leander Moesinger    schedule 28.11.2017


Ответы (2)


В Matlab вашим лучшим другом для этой задачи будет randsample функция (см. здесь), который является частью Statistics Toolbox. Приведем пример с вашей переменной Gender:

% possible values (M for male and F for female)
% since it's a qualitative variable, let's use the categorical type
var = categorical({'M' 'F'});

prob = [0.55 0.45]; % corresponding probabilities
n = 100000; % sample size
repl = true; % replacement (true = yes, false = no)

gender = randsample(var,100000,repl,prob);

Вы можете использовать тот же подход для создания образцов, касающихся региона и задания. Давайте теперь сделаем еще один пример с вашей переменной Age.

var = 1:100; % possible values (age from 1 to 100 years)
n = 100000; % sample size
repl = true; % replacement (true = yes, false = no)

% the probability argument is not provided, hence the result is equally distributed
age = randsample(var,100000,repl);

Поскольку вы хотите разделить образец возраста на разные группы, histcounts с краями в качестве второго аргумента сделает это за вас:

age_grps = histcounts(age,[0 18 25 35 45 55 100]);

% remove the first column if you want to esclude people from 0 to 17 years
age_grps(1) = [];

Вы можете использовать тот же подход для создания выборки дохода.

Насколько я понимаю, вас больше всего беспокоит равномерное распределение ваших переменных. Я покажу вам, как установить разные вероятности для каждого возможного значения в функции randsample (аргумент prob).

person Tommaso Belluzzo    schedule 28.11.2017
comment
Это замечательно и определенно поможет мне в будущем. Спасибо! - person Christopher Loynes; 29.11.2017
comment
Я рад это слышать. Если мой ответ удовлетворяет ваши потребности, примите его. - person Tommaso Belluzzo; 29.11.2017

Я не знаю типичного распределения ваших данных, но следующее должно помочь вам начать.

library(tidyverse)
set.seed(315) # This will create the same data set each run
n.size <- 500

myData <- tibble(
ID = 1:n.size,
VisitDT = lubridate::today()-30 - (runif(n.size) * 100),
IncomeGroup = sample(c("Low", "Medium", "High" ), n.size, prob = c(.7, .25, .05), replace = TRUE),
age = round(rnorm(n = n.size, mean = 52, sd = 10),2),
sex = sample (c('M', 'F'), size = n.size, prob = c(.4, .6), replace = TRUE),
region = sample (c('London', 'Wales', 'Scotland'), size = n.size, prob = c(.4,.3,.2), replace = TRUE),
Treatment = sample(c('No','Yes'), size = n.size, prob = c(.1, .9), replace = TRUE)
)
person Todd T    schedule 28.11.2017
comment
Я использовал этот код и адаптировал его на основе вероятностей моих реальных данных. Это позволило мне масштабировать экземпляры с 12 до 10 000. Спасибо большое за вашу помощь! - person Christopher Loynes; 29.11.2017