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 ක්. නව ශ්‍රේණිගත කිරීමේ ඇල්ගොරිතමයකට ලැබෙන ප්‍රතිචාරය මෙම ප්‍රේක්ෂක කණ්ඩායම් අතර සැලකිය යුතු ලෙස වෙනස් වනු ඇත. මෙම පුළුල් විචලනය මෙට්රික් වල සංවේදීතාව අඩු කරයි.


වෙනත් වචන වලින් කිවහොත්, ජනගහනය පහත පරිදි විස්තර කර ඇති ස්ථර තුනකට බෙදිය හැකිය:


සෑම සංරචකයක්ම සාමාන්ය ව්යාප්තියක් ඇති බව කියමු. එවිට, ජනගහනය සඳහා ප්රධාන මෙට්රික් ද සාමාන්ය ව්යාප්තියක් ඇත.

ස්තරීකරණ ක්රමය

අපි අපගේ පරිශීලකයින් අතර ඇති වෙනස්කම් නොසලකා සම්භාව්‍ය අත්හදා බැලීමේ සැලසුමක් තුළ අහඹු ලෙස සියලුම පරිශීලකයින් ජනගහනයෙන් බෙදන්නෙමු . මේ අනුව, අපි පහත අපේක්ෂිත අගය සහ විචලනය සහිත නියැදිය සලකා බලමු.


තවත් ක්‍රමයක් නම් සාමාන්‍ය ජනගහනයේ ස්තරයේ බර අනුව සෑම ස්ථරයක් තුළම අහඹු ලෙස බෙදීමයි .

මෙම අවස්ථාවේදී, අපේක්ෂිත අගය සහ විචලනය පහත දැක්වේ.


අපේක්ෂිත අගය පළමු තේරීමට සමාන වේ. කෙසේ වෙතත්, විචලනය අඩු වන අතර, ඉහළ මෙට්රික් සංවේදීතාව සහතික කරයි.

දැන් අපි නේමන්ගේ ක්‍රමය සලකා බලමු. ඔවුන් යෝජනා කරන්නේ පරිශීලකයන් අහඹු ලෙස සෑම ස්ථරයකම නිශ්චිත බරකින් බෙදීමටය.

එබැවින්, මෙම අවස්ථාවෙහිදී අපේක්ෂිත අගය සහ විචලනය පහත ඒවාට සමාන වේ.

අපේක්ෂිත අගය පළමු අවස්ථාවෙහි අසමමිතිකව අපේක්ෂිත අගයට සමාන වේ. කෙසේ වෙතත්, විචලනය බෙහෙවින් අඩු ය.

ආනුභවික පරීක්ෂණ

අපි මෙම ක්‍රමයේ කාර්යක්ෂමතාව න්‍යායාත්මකව ඔප්පු කර ඇත්තෙමු. අපි සාම්පල අනුකරණය කර ස්තරීකරණ ක්‍රමය ආනුභවිකව පරීක්ෂා කරමු.

අපි අවස්ථා තුනක් සලකා බලමු:

  • සමාන මාධ්‍යයන් සහ විචල්‍යයන් සහිත සියලුම ස්ථර,
  • විවිධ ක්‍රම සහ සමාන විචල්‍යයන් සහිත සියලුම ස්ථර,
  • සමාන මාධ්‍යයන් සහ විවිධ විචල්‍යයන් සහිත සියලුම ස්ථර.

අපි සෑම අවස්ථාවකදීම ක්‍රම තුනම යොදන අතර ඒවා සංසන්දනය කිරීම සඳහා හිස්ටෝග්‍රෑම් එකක් සහ පෙට්ටියක් සැලසුම් කරන්නෙමු.

කේතය සකස් කිරීම

පළමුව, ස්තර තුනකින් සමන්විත අපගේ සාමාන්‍ය ජනගහනය අනුකරණය කරන පන්තියක් පයිතන් හි නිර්මාණය කරමු.

 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


සමාකරණ ප්රතිඵල

අපි සාමාන්‍ය ජනතාව දෙස බැලුවහොත්, අපගේ සියලුම ස්ථර එකම අගයන් සහ විචලනයන් ඇති, ක්‍රම තුනේම ප්‍රතිඵල අඩු වැඩි වශයෙන් සමාන වනු ඇතැයි අපේක්ෂා කෙරේ.

විවිධ මාධ්‍යයන් සහ සමාන විචල්‍යයන් වඩාත් ආකර්ෂණීය ප්‍රතිඵල ලබා ගත්හ. ස්තරීකරණය භාවිතා කිරීම නාටකාකාර ලෙස විචලනය අඩු කරයි.

සමාන මාධ්‍යයන් සහ විවිධ විචල්‍යයන් ඇති අවස්ථාවන්හිදී, අපි නෙයිමන්ගේ ක්‍රමයේ විචල්‍ය අඩුවීමක් දකිමු.

නිගමනය

දැන්, ඔබ ඔබේ ප්‍රේක්ෂකයින් පොකුරු කර, නිශ්චිත බරක් සහිතව එක් එක් පොකුර තුළ අහඹු ලෙස ඔවුන්ව තාක්ෂණිකව බෙදුවහොත්, මෙට්‍රික් විචලනය අඩු කිරීමට සහ අත්හදා බැලීම වැඩි කිරීමට ඔබට ස්තරීකරණ ක්‍රමය යෙදිය හැකිය!