![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
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.
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.
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.
Ons het die doeltreffendheid van hierdie metode teoreties bewys. Kom ons simuleer monsters en toets die stratifikasiemetode empiries.
Kom ons kyk na drie gevalle:
Ons sal al drie metodes in alle gevalle toepas en 'n histogram en kasdiagram teken om hulle te vergelyk.
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
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.
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!