paint-brush
Ús del mètode d'estratificació per a l'anàlisi de l'experimentper@nataliaogneva
33,155 lectures
33,155 lectures

Ús del mètode d'estratificació per a l'anàlisi de l'experiment

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

Massa Llarg; Per llegir

El mostreig estratificat és una tècnica potent per augmentar l'eficiència de l'experiment i la sensibilitat mètrica en l'anàlisi de dades. En agrupar el vostre públic i dividir-los amb pesos específics, podeu optimitzar els experiments, reduir la variància i millorar la fiabilitat dels resultats.

Company Mentioned

Mention Thumbnail
featured image - Ús del mètode d'estratificació per a l'anàlisi de l'experiment
Natalia Ogneva HackerNoon profile picture
0-item


Qualsevol experiment implica una compensació entre resultats ràpids i sensibilitat mètrica. Si la mètrica escollida és àmplia pel que fa a la variància, haurem d'esperar molt de temps per garantir que els resultats de l'experiment siguin precisos. Considerem un mètode per ajudar els analistes a augmentar els seus experiments sense perdre massa temps o sensibilitat mètrica.


Formulació del problema

Suposem que realitzem un experiment estàndard per provar un nou algorisme de classificació, amb la durada de la sessió com a mètrica principal. A més, tingueu en compte que el nostre públic es pot classificar aproximadament en tres grups: 1 milió d'adolescents, 2 milions d'usuaris de 18 a 45 anys i 3 milions d'usuaris de 45 anys o més. La resposta a un nou algorisme de classificació variaria significativament entre aquests grups de públic. Aquesta gran variació redueix la sensibilitat de la mètrica.


És a dir, la població es pot dividir en tres estrats, que es descriuen a continuació:


Diguem que cada component té una distribució normal. Aleshores, la mètrica principal de la població també té una distribució normal.

Mètode d'estratificació

Dividim aleatòriament tots els usuaris de la població en un disseny experimental clàssic sense tenir en compte les diferències entre els nostres usuaris. Per tant, considerem la mostra amb el valor esperat i la variància següents.


Una altra manera és dividir aleatòriament dins de cada estrat segons el pes de l'estrat a la població general.

En aquest cas, el valor esperat i la variància són els següents.


El valor esperat és el mateix que a la primera selecció. Tanmateix, la variància és menor, cosa que garanteix una major sensibilitat mètrica.

Ara, considerem el mètode de Neyman . Suggereixen dividir els usuaris aleatòriament dins de cada estrat amb pesos específics.

Per tant, el valor esperat i la variància són iguals als següents en aquest cas.

El valor esperat és igual al valor esperat en el primer cas de manera asimptòtica. Tanmateix, la variació és molt menor.

Prova empírica

Hem demostrat l'eficiència d'aquest mètode teòricament. Simulem mostres i testem empíricament el mètode d'estratificació.

Considerem tres casos:

  • totes les estrats amb mitjanes i variàncies iguals,
  • totes les estrats amb mitjanes diferents i variacions iguals,
  • totes les estrats amb mitjanes iguals i diferents variacions.

Aplicarem els tres mètodes en tots els casos i traçarem un histograma i un diagrama de caixa per comparar-los.

Preparació del codi

Primer, creem una classe en Python que simuli la nostra població general que consta de tres estrats.

 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]


A continuació, afegim funcions per als tres mètodes de mostreig descrits a la part teòrica.

 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


A més, per a la part empírica, sempre necessitem una funció per simular el procés d'experimentació.

 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


Resultats de la simulació

Si mirem la població general, on tots els nostres estrats tenen els mateixos valors i variàncies, s'espera que els resultats dels tres mètodes siguin més o menys iguals.

Mitjanes diferents i variacions iguals van obtenir resultats més emocionants. L'ús de l'estratificació redueix dràsticament la variància.

En casos amb mitjanes iguals i variàncies diferents, veiem una reducció de la variància en el mètode de Neyman.

Conclusió

Ara, podeu aplicar el mètode d'estratificació per reduir la variància de la mètrica i augmentar l'experiment si agrupeu el vostre públic i els dividiu tècnicament de manera aleatòria dins de cada clúster amb pesos específics.