Svaki eksperiment uključuje kompromis između brzih rezultata i metričke osjetljivosti. Ako je odabrana metrika široka u smislu varijanse, moramo čekati dugo da bismo bili sigurni da su rezultati eksperimenta tačni. Razmotrimo jednu metodu koja pomaže analitičarima da pojačaju svoje eksperimente bez gubljenja previše vremena ili metričke osjetljivosti.
Pretpostavimo da provodimo standardni eksperiment da testiramo novi algoritam za rangiranje, sa dužinom sesije kao primarnom metrikom. Uz to, uzmite u obzir da se naša publika može grubo kategorizirati u tri grupe: 1 milion tinejdžera, 2 miliona korisnika od 18 do 45 godina i 3 miliona korisnika od 45 i više godina. Odgovor na novi algoritam rangiranja značajno bi varirao među ovim grupama publike. Ova široka varijacija smanjuje osjetljivost metrike.
Drugim riječima, stanovništvo se može podijeliti u tri sloja, opisana u nastavku:
Recimo da svaka komponenta ima normalnu distribuciju. Zatim, glavna metrika za populaciju također ima normalnu distribuciju.
Mi nasumično dijelimo sve korisnike iz populacije u klasičnom dizajnu eksperimenta, ne uzimajući u obzir razlike između naših korisnika. Stoga, razmatramo uzorak sa sljedećom očekivanom vrijednošću i varijansom.
Drugi način je nasumično dijeljenje unutar svakog strata prema težini strata u općoj populaciji.
U ovom slučaju, očekivana vrijednost i varijansa su sljedeće.
Očekivana vrijednost je ista kao u prvom odabiru. Međutim, varijansa je manja, što garantuje veću metričku osjetljivost.
Sada, hajde da razmotrimo Neymanovu metodu . Oni predlažu nasumično dijeljenje korisnika unutar svake strateške grupe sa određenim težinama.
Dakle, očekivana vrijednost i varijansa su u ovom slučaju jednake sljedećem.
Očekivana vrijednost je jednaka očekivanoj vrijednosti u prvom slučaju asimptotski. Međutim, varijansa je mnogo manja.
Teoretski smo dokazali efikasnost ove metode. Hajde da simuliramo uzorke i empirijski testiramo metodu stratifikacije.
Razmotrimo tri slučaja:
Primijenit ćemo sve tri metode u svim slučajevima i nacrtati histogram i boxplot da ih uporedimo.
Prvo, napravimo klasu u Pythonu koja simulira našu opštu populaciju koja se sastoji od tri strata.
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]
Zatim, dodajmo funkcije za tri metode uzorkovanja opisane u teoretskom dijelu.
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
Također, za empirijski dio uvijek nam je potrebna funkcija za simulaciju procesa eksperimenta.
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
Ako pogledamo opću populaciju, gdje svi naši stratovi imaju iste vrijednosti i varijanse, očekuje se da će rezultati sve tri metode biti manje-više jednaki.
Različite sredine i jednake varijacije dale su uzbudljivije rezultate. Korištenje stratifikacije dramatično smanjuje varijansu.
U slučajevima s jednakim srednjim vrijednostima i različitim varijacijama, vidimo smanjenje varijanse u Neymanovoj metodi.
Sada možete primijeniti metodu stratifikacije kako biste smanjili metričku varijansu i pojačali eksperiment ako grupišete svoju publiku i tehnički je podijelite nasumično unutar svakog klastera sa određenim težinama!