paint-brush
A rétegződési módszer használata a kísérleti elemzéshezáltal@nataliaogneva
33,155 olvasmányok
33,155 olvasmányok

A rétegződési módszer használata a kísérleti elemzéshez

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

Túl hosszú; Olvasni

A rétegzett mintavétel hatékony technika a kísérletek hatékonyságának és a metrikus érzékenység növelésére az adatelemzésben. A közönség csoportosításával és meghatározott súlyokkal való felosztásával optimalizálhatja a kísérleteket, csökkentheti a szórást, és növelheti az eredmények megbízhatóságát.

Company Mentioned

Mention Thumbnail
featured image - A rétegződési módszer használata a kísérleti elemzéshez
Natalia Ogneva HackerNoon profile picture
0-item


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.


Probléma megfogalmazása

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ú.

Rétegezési módszer

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.

Empirikus tesztelés

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:

  • minden réteg egyenlő átlaggal és szórással,
  • minden réteg eltérő átlaggal és egyenlő szórással,
  • minden réteg azonos átlaggal és különböző eltérésekkel.

Mindhárom módszert minden esetben alkalmazni fogjuk, és összevetjük a hisztogramot és a boxplotot.

Kód előkészítése

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


Szimulációs eredmények

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.

Következtetés

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!