![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Ç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.
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.
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.
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:
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.
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
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.
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!