paint-brush
Stratifikācijas metodes izmantošana eksperimenta analīzeiautors@nataliaogneva
33,166 lasījumi
33,166 lasījumi

Stratifikācijas metodes izmantošana eksperimenta analīzei

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

Pārāk ilgi; Lasīt

Stratificēta paraugu ņemšana ir jaudīgs paņēmiens, lai palielinātu eksperimentu efektivitāti un metrisko jutīgumu datu analīzē. Sagrupējot auditoriju un sadalot to ar noteiktiem svariem, varat optimizēt eksperimentus, samazināt dispersiju un uzlabot rezultātu ticamību.

Company Mentioned

Mention Thumbnail
featured image - Stratifikācijas metodes izmantošana eksperimenta analīzei
Natalia Ogneva HackerNoon profile picture
0-item


Jebkurš eksperiments ietver kompromisu starp ātriem rezultātiem un metrisko jutīgumu. Ja izvēlētā metrika ir plaša dispersijas ziņā, mums jāgaida ilgs laiks, lai nodrošinātu, ka eksperimenta rezultāti ir precīzi. Apskatīsim vienu metodi, kas palīdzētu analītiķiem uzlabot eksperimentus, nezaudējot pārāk daudz laika vai metrisko jutīgumu.


Problēmas formulējums

Pieņemsim, ka mēs veicam standarta eksperimentu, lai pārbaudītu jaunu ranžēšanas algoritmu ar sesijas ilgumu kā galveno metriku. Turklāt ņemiet vērā, ka mūsu auditoriju var aptuveni iedalīt trīs grupās: 1 miljons pusaudžu, 2 miljoni lietotāju vecumā no 18 līdz 45 gadiem un 3 miljoni lietotāju vecumā no 45 gadiem. Reakcija uz jaunu ranžēšanas algoritmu šajās auditorijas grupās ievērojami atšķirtos. Šī plašā variācija samazina metrikas jutīgumu.


Citiem vārdiem sakot, iedzīvotājus var iedalīt trīs slāņos, kas aprakstīti šādi:


Pieņemsim, ka katram komponentam ir normāls sadalījums. Tad arī galvenajam populācijas rādītājam ir normāls sadalījums.

Stratifikācijas metode

Mēs nejauši sadalām visus lietotājus no populācijas klasiskā eksperimenta noformējumā, neņemot vērā lietotāju atšķirības. Tādējādi mēs uzskatām paraugu ar šādu paredzamo vērtību un dispersiju.


Vēl viens veids ir nejauša sadalīšana katrā stratā atbilstoši slāņa svaram vispārējā populācijā.

Šajā gadījumā paredzamā vērtība un dispersija ir šādas.


Paredzamā vērtība ir tāda pati kā pirmajā atlasē. Tomēr dispersija ir mazāka, kas garantē augstāku metrisko jutību.

Tagad apskatīsim Neimana metodi . Viņi iesaka sadalīt lietotājus nejauši katrā stratā ar noteiktu svaru.

Tātad šajā gadījumā paredzamā vērtība un dispersija ir vienāda ar sekojošo.

Paredzamā vērtība ir vienāda ar paredzamo vērtību pirmajā gadījumā asimptotiski. Tomēr atšķirība ir daudz mazāka.

Empīriskā pārbaude

Mēs esam teorētiski pierādījuši šīs metodes efektivitāti. Simulēsim paraugus un empīriski pārbaudīsim stratifikācijas metodi.

Apskatīsim trīs gadījumus:

  • visas stratas ar vienādiem līdzekļiem un novirzēm,
  • visas stratas ar dažādiem līdzekļiem un vienādām novirzēm,
  • visas stratas ar vienādiem līdzekļiem un dažādām dispersijām.

Mēs izmantosim visas trīs metodes visos gadījumos un uzzīmēsim histogrammu un lodziņu, lai tās salīdzinātu.

Koda sagatavošana

Vispirms izveidosim Python klasi, kas simulē mūsu vispārējo populāciju, kas sastāv no trim slāņiem.

 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]


Pēc tam pievienosim funkcijas trim teorētiskajā daļā aprakstītajām izlases metodēm.

 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


Tāpat empīriskajai daļai mums vienmēr ir nepieciešama funkcija eksperimenta procesa simulēšanai.

 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


Simulācijas rezultāti

Ja skatāmies uz vispārējo populāciju, kur visiem mūsu stratiem ir vienādas vērtības un dispersijas, paredzams, ka visu trīs metožu rezultāti būs vairāk vai mazāk vienādi.

Dažādi līdzekļi un vienādas dispersijas ieguva aizraujošākus rezultātus. Stratifikācijas izmantošana ievērojami samazina dispersiju.

Gadījumos ar vienādiem vidējiem un dažādām dispersijām mēs redzam Neimana metodes dispersijas samazināšanos.

Secinājums

Tagad varat izmantot stratifikācijas metodi, lai samazinātu metrikas dispersiju un uzlabotu eksperimentu, ja grupējat savu auditoriju un tehniski tos nejauši sadalāt katrā klasterī ar noteiktu svaru.