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.
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.
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.
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:
Aplicarem els tres mètodes en tots els casos i traçarem un histograma i un diagrama de caixa per comparar-los.
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
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.
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.