paint-brush
Përdorimi i metodës së shtresimit për analizën e eksperimentitnga@nataliaogneva
33,155 lexime
33,155 lexime

Përdorimi i metodës së shtresimit për analizën e eksperimentit

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

Shume gjate; Te lexosh

Marrja e mostrave të stratifikuar është një teknikë e fuqishme për të rritur efikasitetin e eksperimentit dhe ndjeshmërinë metrike në analizën e të dhënave. Duke grumbulluar audiencën tuaj dhe duke i ndarë ato me pesha specifike, ju mund të optimizoni eksperimentet, të reduktoni variancën dhe të përmirësoni besueshmërinë e rezultateve.

Company Mentioned

Mention Thumbnail
featured image - Përdorimi i metodës së shtresimit për analizën e eksperimentit
Natalia Ogneva HackerNoon profile picture
0-item


Çdo eksperiment përfshin një shkëmbim ndërmjet rezultateve të shpejta dhe ndjeshmërisë metrike. Nëse metrika e zgjedhur është e gjerë për sa i përket variancës, duhet të presim një kohë të gjatë për të siguruar që rezultatet e eksperimentit të jenë të sakta. Le të shqyrtojmë një metodë për të ndihmuar analistët të nxisin eksperimentet e tyre pa humbur shumë kohë ose ndjeshmëri metrike.


Formulimi i problemit

Supozoni se kryejmë një eksperiment standard për të testuar një algoritëm të ri renditjeje, me gjatësinë e sesionit si metrikë parësore. Për më tepër, kini parasysh se audienca jonë mund të kategorizohet përafërsisht në tre grupe: 1 milion adoleshentë, 2 milion përdorues të moshës 18-45 vjeç dhe 3 milion përdorues të moshës 45 vjeç e lart. Përgjigja ndaj një algoritmi të ri të renditjes do të ndryshonte ndjeshëm midis këtyre grupeve të audiencës. Ky variacion i gjerë zvogëlon ndjeshmërinë e metrikës.


Me fjalë të tjera, popullsia mund të ndahet në tre shtresa, të përshkruara në vijim:


Le të themi se çdo komponent ka një shpërndarje normale. Pastaj, metrika kryesore për popullsinë gjithashtu ka një shpërndarje normale.

Metoda e shtresimit

Ne i ndajmë rastësisht të gjithë përdoruesit nga popullsia në një model eksperimenti klasik pa marrë parasysh ndryshimet midis përdoruesve tanë. Kështu, ne e konsiderojmë kampionin me vlerën dhe variancën e pritur në vijim.


Një mënyrë tjetër është ndarja e rastësishme brenda çdo shtrese sipas peshës së shtresës në popullatën e përgjithshme.

Në këtë rast, vlera e pritur dhe varianca janë si më poshtë.


Vlera e pritur është e njëjtë si në përzgjedhjen e parë. Megjithatë, varianca është më e vogël, gjë që garanton ndjeshmëri më të lartë metrike.

Tani, le të shqyrtojmë metodën e Neyman . Ata sugjerojnë që përdoruesit të ndahen rastësisht brenda çdo shtrese me pesha specifike.

Pra, vlera e pritur dhe varianca janë të barabarta me sa vijon në këtë rast.

Vlera e pritur është e barabartë me vlerën e pritur në rastin e parë asimptotikisht. Sidoqoftë, ndryshimi është shumë më i vogël.

Testimi Empirik

Ne e kemi vërtetuar efektivitetin e kësaj metode teorikisht. Le të simulojmë mostrat dhe të testojmë metodën e shtresimit në mënyrë empirike.

Le të shqyrtojmë tre raste:

  • të gjitha shtresat me mjete dhe variacione të barabarta,
  • të gjitha shtresat me mjete të ndryshme dhe varianca të barabarta,
  • të gjitha shtresat me mjete të barabarta dhe varianca të ndryshme.

Ne do të aplikojmë të tre metodat në të gjitha rastet dhe do të vizatojmë një histogram dhe kuti për t'i krahasuar ato.

Përgatitja e kodit

Së pari, le të krijojmë një klasë në Python që simulon popullatën tonë të përgjithshme të përbërë nga tre shtresa.

 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]


Më pas, le të shtojmë funksione për tre metodat e kampionimit të përshkruara në pjesën teorike.

 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


Gjithashtu, për pjesën empirike, gjithmonë kemi nevojë për një funksion për simulimin e procesit të eksperimentit.

 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


Rezultatet e simulimit

Nëse shikojmë popullatën e përgjithshme, ku të gjitha shtresat tona kanë të njëjtat vlera dhe varianca, rezultatet e të tre metodave pritet të jenë pak a shumë të barabarta.

Mjete të ndryshme dhe varianca të barabarta përftuan rezultate më emocionuese. Përdorimi i shtresimit redukton në mënyrë dramatike variancën.

Në rastet me mesatare të barabarta dhe varianca të ndryshme, shohim një reduktim të variancës në metodën e Neyman.

konkluzioni

Tani, mund të aplikoni metodën e shtresimit për të reduktuar variancën metrike dhe për të rritur eksperimentin nëse gruponi audiencën tuaj dhe i ndani teknikisht ato në mënyrë të rastësishme brenda çdo grupi me pesha specifike!