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 миллион наврасон, 2 миллион корбарони 18-45 сола ва 3 миллион корбарони синнашон аз 45 ва болотар. Вокуниш ба алгоритми рейтинги нав дар байни ин гурӯҳҳои шунавандагон ба таври назаррас фарқ мекунад. Ин варианти васеъ ҳассосияти метрикаро коҳиш медиҳад.


Ба ибораи дигар, аҳолиро ба се табақа тақсим кардан мумкин аст, ки дар зер тавсиф мешаванд:


Биёед бигӯем, ки ҳар як ҷузъ тақсимоти муқаррарӣ дорад. Сипас, нишондиҳандаи асосӣ барои аҳолӣ низ тақсимоти муқаррарӣ дорад.

Усули стратификация

Мо ба таври тасодуфӣ ҳамаи корбаронро аз аҳолӣ дар тарҳрезии таҷрибаҳои классикӣ бидуни назардошти фарқиятҳои байни корбарони худ тақсим мекунем . Ҳамин тариқ, мо намунаро бо арзиш ва тафовути интизории зерин баррасӣ мекунем.


Роҳи дигар ин аст , ки ба таври тасодуфӣ дар дохили ҳар як қабат мувофиқи вазни қабат дар шумораи умумӣ тақсим карда мешавад .

Дар ин ҳолат, арзиши интизорӣ ва тафовути зерин аст.


Арзиши интизоршуда ҳамон тавре ки дар интихоби аввал аст. Аммо, фарқият камтар аст, ки ҳассосияти баландтари метриро кафолат медиҳад.

Акнун биёед усули Нейманро дида бароем. Онҳо пешниҳод мекунанд, ки корбарон ба таври тасодуфӣ дар дохили ҳар як қабат бо вазнҳои мушаххас тақсим карда шаванд.

Ҳамин тавр, арзиши интизорӣ ва дисперсия дар ин ҳолат ба зерин баробаранд.

Арзиши интизоршаванда ба арзиши интизоршуда дар ҳолати аввал асимптотикӣ баробар аст. Бо вуҷуди ин, фарқият хеле камтар аст.

Санҷиши эмпирикӣ

Мо самаранокии ин усулро аз ҷиҳати назариявӣ исбот кардем. Биёед намунаҳоро тақлид кунем ва усули стратификацияро ба таври таҷрибавӣ санҷем.

Биёед се ҳолатро баррасӣ кунем:

  • ҳамаи табақаҳо бо воситаҳо ва фарқиятҳои баробар,
  • ҳама стратҳо бо воситаҳои гуногун ва фарқиятҳои баробар,
  • ҳама стратҳо бо воситаҳои баробар ва фарқиятҳои гуногун.

Мо ҳар се усулро дар ҳама ҳолатҳо истифода мебарем ва барои муқоисаи онҳо гистограмма ва қуттии қуттӣ тартиб медиҳем.

Омодасозии код

Аввалан, биёед синферо дар 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


Натиҷаҳои симулятсия

Агар мо ба шумораи умумии аҳолӣ нигоҳ кунем, ки дар он ҳамаи табақаҳои мо арзишҳо ва фарқиятҳои якхела доранд, натиҷаҳои ҳар се усул кам ё камтар баробаранд.

Воситаҳои гуногун ва фарқиятҳои баробар натиҷаҳои ҷолибтар ба даст оварданд. Истифодаи стратификация фарқиятро ба таври назаррас коҳиш медиҳад.

Дар ҳолатҳои дорои воситаҳои баробар ва фарқиятҳои гуногун, мо дар усули Нейман камшавии дисперсияро мебинем.

Хулоса

Акнун, шумо метавонед усули стратификацияро барои кам кардани фарқияти метрикӣ истифода баред ва таҷрибаро афзоиш диҳед, агар шумо аудиторияи худро кластер кунед ва онҳоро ба таври техникӣ ба таври тасодуфӣ дар дохили ҳар як кластер бо вазнҳои мушаххас тақсим кунед!