paint-brush
Gebruik die stratifikasiemetode vir die eksperimentanalisedeur@nataliaogneva
33,172 lesings
33,172 lesings

Gebruik die stratifikasiemetode vir die eksperimentanalise

deur Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

Te lank; Om te lees

Gestratifiseerde steekproefneming is 'n kragtige tegniek om eksperimentdoeltreffendheid en metriese sensitiwiteit in data-analise 'n hupstoot te gee. Deur jou gehoor te groepeer en hulle met spesifieke gewigte te verdeel, kan jy eksperimente optimaliseer, variansie verminder en resultaatbetroubaarheid verbeter.

Company Mentioned

Mention Thumbnail
featured image - Gebruik die stratifikasiemetode vir die eksperimentanalise
Natalia Ogneva HackerNoon profile picture
0-item


Enige eksperiment behels 'n afweging tussen vinnige resultate en metriese sensitiwiteit. As die gekose maatstaf wyd is in terme van variansie, moet ons lank wag om te verseker dat die eksperiment se resultate akkuraat is. Kom ons oorweeg een metode om ontleders te help om hul eksperimente 'n hupstoot te gee sonder om te veel tyd of metriese sensitiwiteit te verloor.


Probleemformulering

Gestel ons voer 'n standaard eksperiment uit om 'n nuwe rangordealgoritme te toets, met sessielengte as die primêre maatstaf. Neem ook in ag dat ons gehoor rofweg in drie groepe gekategoriseer kan word: 1 miljoen tieners, 2 miljoen gebruikers van 18-45 en 3 miljoen gebruikers van 45 en ouer. Die reaksie op 'n nuwe rangordealgoritme sal aansienlik verskil tussen hierdie gehoorgroepe. Hierdie wye variasie verminder die sensitiwiteit van die metrieke.


Met ander woorde, die bevolking kan in drie strata verdeel word, wat in die volgende beskryf word:


Kom ons sê dat elke komponent 'n normale verspreiding het. Dan het die hoofmetriek vir die bevolking ook 'n normale verspreiding.

Stratifikasie metode

Ons verdeel alle gebruikers lukraak uit die populasie in 'n klassieke eksperimentontwerp sonder om die verskille tussen ons gebruikers in ag te neem. Dus, ons beskou die steekproef met die volgende verwagte waarde en variansie.


'n Ander manier is om ewekansig binne elke strat te verdeel volgens die gewig van die strat in die algemene bevolking.

In hierdie geval is die verwagte waarde en variansie die volgende.


Die verwagte waarde is dieselfde as in die eerste seleksie. Die variansie is egter minder, wat 'n hoër metrieke sensitiwiteit waarborg.

Kom ons kyk nou na Neyman se metode . Hulle stel voor om gebruikers ewekansig binne elke strat met spesifieke gewigte te verdeel.

Dus, die verwagte waarde en variansie is gelyk aan die volgende in hierdie geval.

Die verwagte waarde is gelyk aan die verwagte waarde in die eerste geval asimptoties. Die variansie is egter baie minder.

Empiriese toetsing

Ons het die doeltreffendheid van hierdie metode teoreties bewys. Kom ons simuleer monsters en toets die stratifikasiemetode empiries.

Kom ons kyk na drie gevalle:

  • alle strate met gelyke gemiddeldes en afwykings,
  • alle strate met verskillende middele en gelyke variansies,
  • alle strate met gelyke gemiddeldes en verskillende variansies.

Ons sal al drie metodes in alle gevalle toepas en 'n histogram en kasdiagram teken om hulle te vergelyk.

Kode voorbereiding

Kom ons skep eers 'n klas in Python wat ons algemene bevolking simuleer wat uit drie strate bestaan.

 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]


Kom ons voeg dan funksies by vir die drie steekproefmetodes wat in die teoretiese deel beskryf word.

 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


Ook vir die empiriese deel het ons altyd 'n funksie nodig om die eksperimentproses te simuleer.

 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


Simulasie resultate

As ons na die algemene bevolking kyk, waar al ons strate dieselfde waardes en afwykings het, word verwag dat die resultate van al drie metodes min of meer gelyk sal wees.

Verskillende middele en gelyke afwykings het meer opwindende resultate behaal. Die gebruik van stratifikasie verminder variansie dramaties.

In gevalle met gelyke gemiddeldes en verskillende afwykings, sien ons 'n variansievermindering in Neyman se metode.

Gevolgtrekking

Nou kan jy die stratifikasiemetode toepas om die metrieke variansie te verminder en die eksperiment ’n hupstoot te gee as jy jou gehoor groepeer en hulle tegnies ewekansig binne elke groep met spesifieke gewigte verdeel!