paint-brush
Փորձի վերլուծության համար շերտավորման մեթոդի օգտագործումըկողմից@nataliaogneva
33,160 ընթերցումներ
33,160 ընթերցումներ

Փորձի վերլուծության համար շերտավորման մեթոդի օգտագործումը

կողմից 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


Մոդելավորման արդյունքներ

Եթե նայենք ընդհանուր բնակչությանը, որտեղ մեր բոլոր շերտերն ունեն նույն արժեքներն ու շեղումները, ապա բոլոր երեք մեթոդների արդյունքները ակնկալվում է, որ քիչ թե շատ հավասար կլինեն:

Տարբեր միջոցները և հավասար շեղումները ստացան ավելի հետաքրքիր արդյունքներ: Շերտավորման օգտագործումը կտրուկ նվազեցնում է շեղումները:

Հավասար միջին և տարբեր շեղումներ ունեցող դեպքերում Նեյմանի մեթոդով մենք տեսնում ենք շեղումների կրճատում։

Եզրակացություն

Այժմ դուք կարող եք կիրառել շերտավորման մեթոդը՝ նվազեցնելու մետրային շեղումը և խթանելու փորձը, եթե ձեր լսարանը խմբավորեք և տեխնիկապես պատահականորեն բաժանեք դրանք յուրաքանչյուր կլաստերի ներսում՝ հատուկ կշիռներով: