paint-brush
Экспериментті талдау үшін стратификация әдісін қолданубойынша@nataliaogneva
33,155 оқулар
33,155 оқулар

Экспериментті талдау үшін стратификация әдісін қолдану

бойынша Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

Тым ұзақ; Оқу

Стратификацияланған іріктеу деректерді талдауда эксперимент тиімділігі мен метрикалық сезімталдықты арттырудың қуатты әдісі болып табылады. Аудиторияңызды кластерлеу және оларды белгілі бір салмақпен бөлу арқылы эксперименттерді оңтайландыруға, ауытқуларды азайтуға және нәтиже сенімділігін арттыруға болады.

Company Mentioned

Mention Thumbnail
featured image - Экспериментті талдау үшін стратификация әдісін қолдану
Natalia Ogneva HackerNoon profile picture
0-item


Кез келген эксперимент жылдам нәтижелер мен метрикалық сезімталдық арасындағы айырбасты қамтиды. Таңдалған метрика дисперсия тұрғысынан кең болса, эксперимент нәтижелерінің дәлдігіне көз жеткізу үшін біз көп уақыт күтуіміз керек. Сарапшыларға тым көп уақытты немесе метрикалық сезімталдықты жоғалтпай тәжірибелерін арттыруға көмектесетін бір әдісті қарастырайық.


Мәселені құрастыру

Негізгі метрика ретінде сеанс ұзақтығын көрсете отырып, жаңа рейтинг алгоритмін тексеру үшін стандартты эксперимент жүргіздік делік. Сонымен қатар, аудиториямызды үш топқа бөлуге болатынын ескеріңіз: 1 миллион жасөспірім, 18-45 жас аралығындағы 2 миллион пайдаланушы және 45 және одан жоғары жастағы 3 миллион пайдаланушы. Жаңа рейтинг алгоритміне жауап осы аудитория топтары арасында айтарлықтай өзгереді. Бұл кең вариация метриканың сезімталдығын төмендетеді.


Басқаша айтқанда, популяцияны келесідей сипатталған үш қабатқа бөлуге болады:


Әрбір құрамдас бөлікте қалыпты үлестірім бар делік. Сонда популяция үшін негізгі көрсеткіш те қалыпты таралуға ие болады.

Стратификация әдісі

Біз пайдаланушылар арасындағы айырмашылықтарды ескерместен, классикалық эксперимент дизайнында барлық пайдаланушыларды популяциядан кездейсоқ бөлеміз . Осылайша, біз келесі күтілетін мән және дисперсиясы бар үлгіні қарастырамыз.


Тағы бір әдіс - жалпы популяциядағы страттың салмағына сәйкес әрбір қабаттың ішінде кездейсоқ бөлу .

Бұл жағдайда күтілетін мән мен дисперсия төмендегідей болады.


Күтілетін мән бірінші таңдаудағымен бірдей. Дегенмен, дисперсия аз, бұл жоғары метрикалық сезімталдыққа кепілдік береді.

Енді Нейманның әдісін қарастырайық. Олар пайдаланушыларды белгілі бір салмақтары бар әрбір страт ішінде кездейсоқ бөлуді ұсынады.

Сонымен, бұл жағдайда күтілетін мән мен дисперсия келесіге тең.

Күтілетін мән асимптоталық түрде бірінші жағдайда күтілетін мәнге тең. Дегенмен, дисперсия әлдеқайда аз.

Эмпирикалық тестілеу

Біз бұл әдістің тиімділігін теориялық тұрғыдан дәлелдедік. Үлгілерді имитациялап, стратификация әдісін эмпирикалық түрде сынап көрейік.

Үш жағдайды қарастырайық:

  • барлық страттардың орташа және дисперсиясы бірдей,
  • әр түрлі орташа және тең дисперсиялары бар барлық страттар,
  • тең орта және әртүрлі дисперсиялары бар барлық страт.

Біз барлық үш әдісті барлық жағдайда қолданамыз және оларды салыстыру үшін гистограмма мен бокс сызбасын саламыз.

Код дайындау

Біріншіден, үш страттан тұратын жалпы популяцияны имитациялайтын Python-да класс жасайық.

 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]


Содан кейін теориялық бөлімде сипатталған үш іріктеу әдісі үшін функцияларды қосамыз.

 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


Сондай-ақ, эмпирикалық бөлік үшін бізге эксперимент процесін имитациялау функциясы әрқашан қажет.

 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


Модельдеу нәтижелері

Егер біз барлық страттардың бірдей мәндері мен дисперсиялары бар жалпы халықты қарасақ, барлық үш әдістің нәтижелері бірдей немесе азырақ болады деп күтілуде.

Әртүрлі құралдар мен тең дисперсиялар қызықты нәтижелерге қол жеткізді. Стратификацияны пайдалану дисперсияны айтарлықтай азайтады.

Орташалары бірдей және дисперсиялары әртүрлі жағдайларда Нейман әдісінде дисперсияның азаюын көреміз.

Қорытынды

Енді аудиторияңызды кластерлеп, оларды әрбір кластердің ішіне арнайы салмақтармен кездейсоқ түрде бөлсеңіз, метрикалық дисперсияны азайту және экспериментті күшейту үшін стратификация әдісін қолдануға болады!