paint-brush
Коришћење методе стратификације за анализу експериментаод стране@nataliaogneva
33,155 читања
33,155 читања

Коришћење методе стратификације за анализу експеримента

од стране Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

Предуго; Читати

Стратификовано узорковање је моћна техника за повећање ефикасности експеримента и метричке осетљивости у анализи података. Груписањем публике и дељењем са одређеним тежинама, можете оптимизовати експерименте, смањити варијансу и побољшати поузданост резултата.

Company Mentioned

Mention Thumbnail
featured image - Коришћење методе стратификације за анализу експеримента
Natalia Ogneva HackerNoon profile picture
0-item


Сваки експеримент укључује компромис између брзих резултата и метричке осетљивости. Ако је изабрани показатељ широк у смислу варијансе, морамо дуго чекати да бисмо били сигурни да су резултати експеримента тачни. Хајде да размотримо једну методу која помаже аналитичарима да појачају своје експерименте без губљења превише времена или метричке осетљивости.


Формулација проблема

Претпоставимо да спроводимо стандардни експеримент да тестирамо нови алгоритам за рангирање, са дужином сесије као примарном метриком. Уз то, узмите у обзир да се наша публика може грубо категорисати у три групе: 1 милион тинејџера, 2 милиона корисника од 18 до 45 година и 3 милиона корисника од 45 и више година. Одговор на нови алгоритам за рангирање би се значајно разликовао међу овим групама публике. Ова широка варијација смањује осетљивост метрике.


Другим речима, становништво се може поделити на три слоја, описана у наставку:


Рецимо да свака компонента има нормалну дистрибуцију. Затим, главна метрика за популацију такође има нормалну дистрибуцију.

Метода стратификације

Насумично делимо све кориснике из популације у класичном дизајну експеримента не узимајући у обзир разлике између наших корисника. Дакле, разматрамо узорак са следећом очекиваном вредношћу и варијансом.


Други начин је насумична подела унутар сваког страта према тежини страта у општој популацији.

У овом случају, очекивана вредност и варијанса су следеће.


Очекивана вредност је иста као у првом избору. Међутим, варијанса је мања, што гарантује већу метричку осетљивост.

Сада, хајде да размотримо Нејманов метод . Они предлажу да се корисници насумично поделе унутар сваког страта са одређеним тежинама.

Дакле, очекивана вредност и варијанса су у овом случају једнаке следећем.

Очекивана вредност је једнака очекиваној вредности у првом случају асимптотски. Међутим, варијанса је много мања.

Емпиријско тестирање

Теоретски смо доказали ефикасност ове методе. Хајде да симулирамо узорке и емпиријски тестирамо метод стратификације.

Хајде да размотримо три случаја:

  • сви стратови са једнаким средњим вредностима и варијацијама,
  • сви стратови са различитим средњим вредностима и једнаким варијацијама,
  • сви стратови са једнаким средњим вредностима и различитим варијацијама.

Ми ћемо применити све три методе у свим случајевима и нацртати хистограм и бокплот да бисмо их упоредили.

Припрема кода

Прво, хајде да направимо класу у Питхон-у која симулира нашу општу популацију која се састоји од три страта.

 class GeneralPopulation: def __init__(self, means: [float], stds: [float], sizes: [int], random_state: int = 15 ): """ Initializes our General Population and saves the given distributions :param means: List of expectations for normal distributions :param stds: List of standard deviations for normal distributions :param sizes: How many objects will be in each strata :param random_state: Parameter fixing randomness. Needed so that when conducting experiment repeatedly with the same input parameters, the results remained the same """ self.strats = [st.norm(mean, std) for mean, std in zip(means, stds)] self._sample(sizes) self.random_state = random_state def _sample(self, sizes): """Creates a general population sample as a mixture of strata :param sizes: List with sample sizes of the corresponding normal distributions """ self.strats_samples = [rv.rvs(size) for rv, size in zip(self.strats, sizes)] self.general_samples = np.hstack(self.strats_samples) self.N = self.general_samples.shape[0] # number of strata self.count_strats = len(sizes) # ratios for every strata in GP self.ws = [size/self.N for size in sizes] # ME and Std for GP self.m = np.mean(self.general_samples) self.sigma = np.std(self.general_samples) # ME and std for all strata self.ms = [np.mean(strat_sample) for strat_sample in self.strats_samples] self.sigmas = [np.std(strat_sample) for strat_sample in self.strats_samples]


Затим, додајмо функције за три методе узорковања описане у теоријском делу.

 def random_subsampling(self, size): """Creates a random subset of the entire population :param sizes: subsample size """ rc = np.random.choice(self.general_samples, size=size) return rc def proportional_subsampling(self, size): """Creates a subsample with the number of elements, proportional shares of strata :param sizes: subsample size """ self.strats_size_proport = [int(np.floor(size*w)) for w in self.ws] rc = [] for k in range(len(self.strats_size_proport)): rc.append(np.random.choice(self.strats_samples[k], size=self.strats_size_proport[k])) return rc def optimal_subsampling(self, size): """Creates a subsample with the optimal number of elements relative to strata :param sizes: subsample size """ sum_denom = 0 for k in range(self.count_strats): sum_denom += self.ws[k] * self.sigmas[k] self.strats_size_optimal = [int(np.floor((size*w*sigma)/sum_denom)) for w, sigma in zip(self.ws, self.sigmas)] if 0 in self.strats_size_optimal: raise ValueError('Strats size is 0, please change variance of smallest strat!') rc = [] for k in range(len(self.strats_size_optimal)): rc.append(np.random.choice(self.strats_samples[k], size=self.strats_size_optimal[k])) return rc


Такође, за емпиријски део увек нам је потребна функција за симулацију процеса експеримента.

 def run_experiments(self, n_sub, subsampling_method, n_experiments=1000): """Conducts a series of experiments and saves the results :param n_sub: size of sample :param subsampling_method: method for creating a subsample :param n_experiments: number of experiment starts """ means_s = [] if(len(self.general_samples)<100): n_sub = 20 if(subsampling_method == 'random_subsampling'): for n in range(n_experiments): rc = self.random_subsampling(n_sub) mean = rc.sum()/len(rc) means_s.append(mean) else: for n in range(n_experiments): if(subsampling_method == 'proportional_subsampling'): rc = self.proportional_subsampling(n_sub) elif(subsampling_method == 'optimal_subsampling'): rc = self.optimal_subsampling(n_sub) strats_mean = [] for k in range(len(rc)): strats_mean.append(sum(rc[k])/len(rc[k])) # Mean for a mixture means_s.append(sum([w_k*mean_k for w_k, mean_k in zip(self.ws, strats_mean)])) return means_s


Резултати симулације

Ако погледамо општу популацију, где сви наши стратови имају исте вредности и варијансе, очекује се да ће резултати све три методе бити мање-више једнаки.

Различите средине и једнаке варијансе дале су узбудљивије резултате. Коришћење стратификације драматично смањује варијансу.

У случајевима са једнаким средњим вредностима и различитим варијацијама, видимо смањење варијансе у Нејмановом методу.

Закључак

Сада можете да примените метод стратификације да бисте смањили метричку варијансу и појачали експеримент ако групишете своју публику и технички је поделите насумично унутар сваког кластера са одређеним тежинама!