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 и повеќе години. Одговорот на новиот алгоритам за рангирање значително ќе се разликува меѓу овие групи на публика. Оваа широка варијација ја намалува чувствителноста на метриката.


Со други зборови, населението може да се подели на три слоеви, опишани подолу:


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

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

Ние по случаен избор ги делиме сите корисници од популацијата во дизајн на класичен експеримент без да ги земеме предвид разликите помеѓу нашите корисници. Така, го разгледуваме примерокот со следната очекувана вредност и варијанса.


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

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


Очекуваната вредност е иста како и во првиот избор. Сепак, варијансата е помала, што гарантира поголема метричка чувствителност.

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

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

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

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

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

Да разгледаме три случаи:

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

Ќе ги примениме сите три методи во сите случаи и ќе нацртаме хистограм и квадрат за да ги споредиме.

Подготовка на код

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

 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


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

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

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

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

Заклучок

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