Minden kísérlet kompromisszumot foglal magában a gyors eredmények és a metrikus érzékenység között. Ha a választott mérőszám szórás szempontjából széles, sokáig kell várnunk, hogy a kísérlet eredményei pontosak legyenek. Tekintsünk egy módszert, amellyel az elemzők fellendíthetik kísérleteiket anélkül, hogy túl sok időt vagy metrikus érzékenységet veszítenének.
Tegyük fel, hogy standard kísérletet végzünk egy új rangsorolási algoritmus tesztelésére, amelynek elsődleges mérőszáma a munkamenet hossza. Ezenkívül vegye figyelembe, hogy közönségünk nagyjából három csoportba sorolható: 1 millió tinédzser, 2 millió 18-45 év közötti felhasználó és 3 millió 45 év feletti felhasználó. Az új rangsorolási algoritmusra adott válasz jelentősen eltérne ezekben a közönségcsoportokban. Ez a széles eltérés csökkenti a metrika érzékenységét.
Más szavakkal, a lakosság három rétegre osztható, amelyeket a következőkben írunk le:
Tegyük fel, hogy minden komponens normális eloszlású. Ekkor a sokaság fő mérőszáma is normális eloszlású.
Véletlenszerűen osztjuk fel az összes felhasználót a populációból egy klasszikus kísérleti elrendezésben, anélkül, hogy figyelembe vesszük a felhasználóink közötti különbségeket. Így a következő várható értékkel és szórással rendelkező mintát tekintjük.
Egy másik módszer az, hogy minden rétegen belül véletlenszerűen osztunk fel a réteg súlya szerint az általános populációban.
Ebben az esetben a várható érték és szórás a következő.
A várható érték megegyezik az első kiválasztásnál megadottal. A szórás azonban kisebb, ami nagyobb metrikus érzékenységet garantál.
Most nézzük meg Neyman módszerét . Azt javasolják, hogy a felhasználókat véletlenszerűen osszák fel minden rétegen belül meghatározott súlyokkal.
Tehát a várható érték és szórás ebben az esetben megegyezik a következővel.
A várható érték az első esetben aszimptotikusan egyenlő a várható értékkel. A szórás azonban sokkal kisebb.
Elméletileg bebizonyítottuk ennek a módszernek a hatékonyságát. Szimuláljunk mintákat, és empirikusan teszteljük a rétegződési módszert.
Nézzünk három esetet:
Mindhárom módszert minden esetben alkalmazni fogjuk, és összevetjük a hisztogramot és a boxplotot.
Először is hozzunk létre egy osztályt a Pythonban, amely három rétegből álló általános populációnkat szimulálja.
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]
Ezután adjunk hozzá függvényeket az elméleti részben leírt három mintavételi módszerhez.
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
Emellett az empirikus részhez mindig szükségünk van a kísérleti folyamat szimulálására szolgáló függvényre.
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
Ha az általános sokaságot nézzük, ahol minden rétegünk azonos értékekkel és szórással rendelkezik, akkor várhatóan mindhárom módszer eredménye többé-kevésbé egyenlő lesz.
Különböző átlagok és egyenlő eltérések izgalmasabb eredményeket értek el. A rétegződés használata drámaian csökkenti a szórást.
Azonos átlagú és különböző varianciájú esetekben a Neyman-módszerben szóráscsökkenést látunk.
Mostantól alkalmazhatja a rétegezési módszert a metrikus variancia csökkentésére és a kísérlet fokozására, ha csoportosítja a közönséget, és technikailag véletlenszerűen osztja fel őket az egyes klasztereken belül meghatározott súlyokkal!