paint-brush
Estratifikazio-metodoa erabiltzea Esperimentuaren analisirakoarabera@nataliaogneva
33,138 irakurketak
33,138 irakurketak

Estratifikazio-metodoa erabiltzea Esperimentuaren analisirako

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

Luzeegia; Irakurri

Laginketa estratifikatua datuen analisian esperimentuen eraginkortasuna eta sentsibilitate metrikoa areagotzeko teknika indartsua da. Zure audientzia multzokatuz eta pisu zehatzekin zatituz, esperimentuak optimiza ditzakezu, bariantza murriztu eta emaitzen fidagarritasuna hobetu.

Company Mentioned

Mention Thumbnail
featured image - Estratifikazio-metodoa erabiltzea Esperimentuaren analisirako
Natalia Ogneva HackerNoon profile picture
0-item


Esperimentu orok emaitza bizkorren eta sentsibilitate metrikoaren arteko trukaketa dakar. Aukeratutako metrika bariantzari dagokionez zabala bada, denbora luzez itxaron beharko dugu esperimentuaren emaitzak zehatzak direla ziurtatzeko. Azter dezagun metodo bat analistei esperimentuak areagotzen laguntzeko denbora edo sentsibilitate metriko gehiegi galdu gabe.


Problemaren formulazioa

Demagun esperimentu estandar bat egiten dugula sailkapen-algoritmo berri bat probatzeko, saioaren iraupena metrika nagusia dela. Gainera, kontuan hartu gure audientzia gutxi gorabehera hiru taldetan sailka daitekeela: milioi bat nerabe, 18-45 urte bitarteko 2 milioi erabiltzaile eta 45 urtetik gorako 3 milioi erabiltzaile. Sailkapen algoritmo berri baten erantzuna nabarmen aldatuko litzateke ikusle talde horien artean. Aldaera zabal honek metrikaren sentsibilitatea murrizten du.


Hau da, biztanleria hiru geruzatan bana daiteke, honela deskribatuta:


Demagun osagai bakoitzak banaketa normala duela. Orduan, populazioaren metrika nagusiak ere banaketa normala du.

Estratifikazio metodoa

Populaziotik erabiltzaile guztiak ausaz banatzen ditugu esperimentu-diseinu klasiko batean, gure erabiltzaileen arteko desberdintasunak kontuan hartu gabe. Horrela, honako espero den balio eta bariantza duen lagina kontsideratzen dugu.


Beste modu bat geruza bakoitzaren barruan ausaz banatzea da geruzak biztanleria orokorrean duen pisuaren arabera .

Kasu honetan, espero den balioa eta bariantza hauek dira.


Espero den balioa lehen hautapeneko berdina da. Hala ere, bariantza txikiagoa da, eta horrek sentsibilitate metriko handiagoa bermatzen du.

Orain, kontuan hartu dezagun Neymanen metodoa . Erabiltzaileak ausaz banatzea iradokitzen dute estra bakoitzaren barruan pisu zehatzekin.

Beraz, espero den balioa eta bariantza hurrengoaren berdinak dira kasu honetan.

Espero den balioa lehenengo kasuan espero den balioaren berdina da asintotikoki. Hala ere, bariantza askoz txikiagoa da.

Saiakuntza enpirikoak

Metodo honen eraginkortasuna teorikoki frogatu dugu. Simula ditzagun laginak eta proba ditzagun estratifikazio metodoa enpirikoki.

Azter ditzagun hiru kasu:

  • estratu guztiak batez besteko eta bariantza berdinak dituztenak,
  • estratu guztiak batez bestekoak eta bariantza berdinak dituztenak,
  • estratu guztiak batez bestekoak eta bariantza desberdinak dituztenak.

Hiru metodoak kasu guztietan aplikatuko ditugu eta histograma eta boxplot marraztuko ditugu horiek alderatzeko.

Kodea prestatzea

Lehenik eta behin, sor dezagun klase bat Python-en, hiru estratoz osatutako gure populazio orokorra simulatzen duena.

 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]


Ondoren, gehi ditzagun parte teorikoan deskribatutako hiru laginketa metodoetarako funtzioak.

 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


Gainera, zati enpirikorako, beti behar dugu esperimentu-prozesua simulatzeko funtzio bat.

 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


Simulazioaren emaitzak

Populazio orokorrari erreparatzen badiogu, non gure estratu guztiek balio eta bariantza berdinak dituzten, hiru metodoen emaitzak gutxi gorabehera berdinak izatea espero da.

Batez besteko eta bariantza berdinek emaitza zirraragarriagoak lortu zituzten. Estratifikazioa erabiltzeak bariantza nabarmen murrizten du.

Batez besteko berdinak eta bariantza desberdinak dituzten kasuetan, bariantza murrizketa ikusten dugu Neyman-en metodoan.

Ondorioa

Orain, estratifikazio-metodoa aplika dezakezu bariantza metrikoa murrizteko eta esperimentua areagotzeko zure audientzia multzokatzen baduzu eta teknikoki ausaz zatitzen badituzu kluster bakoitzaren barruan pisu zehatzekin!