paint-brush
Эксперименттик талдоо үчүн стратификация ыкмасын колдонуутарабынан@nataliaogneva
33,172 окуулар
33,172 окуулар

Эксперименттик талдоо үчүн стратификация ыкмасын колдонуу

тарабынан 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


Симуляция натыйжалары

Эгерде биздин бардык катмарларыбыз бирдей баалуулуктарга жана дисперсияларга ээ болгон жалпы калкты карасак, үч ыкманын тең натыйжалары аздыр-көптүр бирдей болушу күтүлөт.

Ар кандай каражаттар жана бирдей дисперсиялар кызыктуу натыйжаларды алды. Стратификацияны колдонуу дисперсияны кескин азайтат.

Бирдей каражаттар жана ар түрдүү дисперсиялар болгон учурларда, Нейман методунда дисперсиянын азайышын көрөбүз.

Корутунду

Эми, сиз аудиторияңызды кластер кылып, аларды ар бир кластердин ичинде кокустук түрдө белгилүү бир салмак менен бөлсөңүз, метрикалык дисперсияны азайтуу жана экспериментти күчөтүү үчүн стратификация ыкмасын колдоно аласыз!