paint-brush
Tajriba tahlili uchun tabaqalanish usulidan foydalanishtomonidan@nataliaogneva
33,155 o'qishlar
33,155 o'qishlar

Tajriba tahlili uchun tabaqalanish usulidan foydalanish

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

Juda uzoq; O'qish

Stratifikatsiyalangan namuna olish ma'lumotlarni tahlil qilishda tajriba samaradorligi va metrik sezgirlikni oshirishning kuchli usuli hisoblanadi. Auditoriyangizni klasterlash va ularni ma'lum og'irliklarga bo'lish orqali siz tajribalarni optimallashtirishingiz, farqlarni kamaytirishingiz va natijalar ishonchliligini oshirishingiz mumkin.

Company Mentioned

Mention Thumbnail
featured image - Tajriba tahlili uchun tabaqalanish usulidan foydalanish
Natalia Ogneva HackerNoon profile picture
0-item


Har qanday tajriba tez natijalar va metrik sezgirlik o'rtasidagi o'zaro kelishuvni o'z ichiga oladi. Agar tanlangan ko'rsatkich dispersiya jihatidan keng bo'lsa, tajriba natijalarining to'g'riligiga ishonch hosil qilish uchun biz uzoq vaqt kutishimiz kerak. Keling, tahlilchilarga ko'p vaqt yoki metrik sezgirlikni yo'qotmasdan o'z tajribalarini kuchaytirishga yordam beradigan usullardan birini ko'rib chiqaylik.


Muammoni shakllantirish

Faraz qilaylik, biz yangi tartiblash algoritmini sinab ko'rish uchun standart tajriba o'tkazamiz, seans uzunligi asosiy ko'rsatkich sifatida. Bundan tashqari, bizning auditoriyamizni taxminan uch guruhga bo'lish mumkinligini hisobga oling: 1 million o'smir, 18-45 yoshdagi 2 million foydalanuvchi va 45 va undan yuqori yoshdagi 3 million foydalanuvchi. Yangi reyting algoritmiga javob ushbu auditoriya guruhlari orasida sezilarli darajada farq qiladi. Ushbu keng o'zgaruvchanlik metrikaning sezgirligini pasaytiradi.


Boshqacha qilib aytganda, aholini quyidagi tarzda tavsiflangan uchta qatlamga bo'lish mumkin:


Aytaylik, har bir komponent normal taqsimotga ega. Keyin, aholi uchun asosiy ko'rsatkich ham normal taqsimotga ega.

Stratifikatsiya usuli

Biz foydalanuvchilar o'rtasidagi farqlarni hisobga olmagan holda klassik tajriba dizaynida barcha foydalanuvchilarni populyatsiyadan tasodifiy ajratamiz . Shunday qilib, biz namunani quyidagi kutilgan qiymat va dispersiya bilan ko'rib chiqamiz.


Yana bir usul - har bir qatlamni umumiy populyatsiyadagi qatlamning og'irligiga qarab tasodifiy taqsimlash .

Bunday holda, kutilgan qiymat va farq quyidagicha bo'ladi.


Kutilgan qiymat birinchi tanlovdagi kabi. Biroq, dispersiya kamroq, bu esa yuqori metrik sezgirlikni kafolatlaydi.

Endi Neymanning usulini ko'rib chiqamiz. Ular foydalanuvchilarni o'ziga xos og'irliklar bilan har bir qatlam ichida tasodifiy ravishda bo'lishni taklif qilishadi.

Demak, kutilgan qiymat va dispersiya bu holda quyidagiga teng.

Kutilgan qiymat birinchi holatda asimptotik tarzda kutilgan qiymatga teng. Biroq, farq ancha past.

Empirik test

Biz bu usulning samaradorligini nazariy jihatdan isbotladik. Keling, namunalarni simulyatsiya qilaylik va tabaqalanish usulini empirik tarzda sinab ko'raylik.

Keling, uchta holatni ko'rib chiqaylik:

  • teng vositalar va tafovutlar bilan barcha strats,
  • har xil vositalar va teng farqlarga ega bo'lgan barcha strats,
  • teng vositalar va turli xil farqlar bilan barcha strats.

Biz barcha holatlarda uchta usulni qo'llaymiz va ularni solishtirish uchun gistogramma va quti chizmasini tuzamiz.

Kod tayyorlash

Birinchidan, Python-da uchta qatlamdan iborat umumiy populyatsiyamizni taqlid qiladigan sinf yarataylik.

 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]


Keyin, nazariy qismda tasvirlangan uchta namuna olish usullari uchun funksiyalarni qo'shamiz.

 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


Bundan tashqari, empirik qism uchun bizga har doim tajriba jarayonini simulyatsiya qilish funktsiyasi kerak.

 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


Simulyatsiya natijalari

Agar biz barcha qatlamlarimiz bir xil qiymatlarga va farqlarga ega bo'lgan umumiy aholini ko'rib chiqsak, barcha uchta usulning natijalari ko'proq yoki kamroq teng bo'lishi kutiladi.

Turli xil vositalar va teng farqlar yanada qiziqarli natijalarga erishdi. Stratifikatsiyadan foydalanish tafovutni keskin kamaytiradi.

Teng vositalar va turli xil dispersiyalarga ega bo'lgan hollarda Neyman usulida dispersiyaning qisqarishini ko'ramiz.

Xulosa

Endi siz metrik tafovutni kamaytirish va tajribani kuchaytirish uchun tabaqalanish usulini qo'llashingiz mumkin, agar siz o'z auditoriyangizni guruhlashtirsangiz va ularni har bir klaster ichida ma'lum og'irliklar bilan texnik jihatdan tasodifiy taqsimlasangiz!