5 خوارزميات أخذ العينات الرئيسية


العمل مع البيانات - العمل مع خوارزميات معالجة البيانات.


واضطررت للعمل مع الأكثر تنوعًا على أساس يومي ، لذلك قررت أن أقدم قائمة بالأكثر شعبية في سلسلة من المنشورات.


تركز هذه المقالة على أساليب أخذ العينات الأكثر شيوعًا للعمل مع البيانات.





أخذ عينات عشوائية بسيطة


لنفترض ما إذا كنت تريد إجراء تحديد حيث يكون لكل عنصر احتمال متساوٍ في التحديد.


أدناه نختار 100 من هذه العناصر من مجموعة البيانات.


sample_df = df.sample(100) 



أخذ العينات الطبقية



لنفترض أننا بحاجة إلى تقدير متوسط ​​عدد الأصوات لكل مرشح في الانتخابات. يجري التصويت في ثلاث مدن:


1 مليون عامل يعيشون في المدينة أ


2 مليون فنان يعيشون في المدينة ب


3 ملايين من كبار السن يعيشون في مدينة ج


إذا حاولنا أخذ عينات محتملة بنفس القدر من 60 شخصًا من إجمالي السكان ، فمن المؤكد أنها ستكون غير متوازنة بالنسبة إلى مدن مختلفة ، وبالتالي منحازة ، مما سيؤدي إلى خطأ خطير في التنبؤات.


إذا قمنا على وجه التحديد بتكوين عينة من 10 و 20 و 30 شخصًا من المدن A و B و C ، على التوالي ، فسيكون الخطأ في الحد الأدنى.


في بيثون ، يمكن القيام بذلك على النحو التالي:


 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.25) 



أخذ عينات الخزان



أنا أحب هذه الصيغة للمشكلة:


افترض أن لديك مجموعة من العناصر ذات الحجم الكبير غير المعروف والتي يمكنك تكرارها مرة واحدة فقط.


قم بإنشاء خوارزمية تحدد عنصرًا بشكل عشوائي من الدفق كما لو كان يمكن تحديد أي عنصر باحتمال متساوٍ.


كيف نفعل ذلك؟


افترض أننا بحاجة إلى تحديد 5 كائنات من دفق لانهائي ، بحيث يمكن تحديد كل عنصر في الدفق على الأرجح بنفس القدر.


 import random def generator(max): number = 1 while number < max: number += 1 yield number #    stream = generator(10000) #    k=5 reservoir = [] for i, element in enumerate(stream): if i+1<= k: reservoir.append(element) else: probability = k/(i+1) if random.random() < probability: #    ,    reservoir[random.choice(range(0,k))] = element print(reservoir) ------------------------------------ [1369, 4108, 9986, 828, 5589] 

من الممكن رياضيا إثبات إمكانية اختيار كل عنصر على قدم المساواة.


كيف؟


عندما يتعلق الأمر بالرياضيات ، من الأفضل محاولة بدء الحل بحالة خاصة صغيرة.


لذلك دعونا نلقي نظرة على مجموعة مكونة من 3 عناصر ، حيث نحتاج إلى تحديد 2 فقط.


نرى العنصر الأول ، احفظه في القائمة ، حيث لا يزال هناك مساحة في الخزان. نرى العنصر الثاني ، احفظه في القائمة ، حيث لا يزال هناك مساحة في الخزان.


نرى العنصر الثالث. يصبح أكثر إثارة للاهتمام هنا. سنقوم بحفظ العنصر الثالث باحتمال 2/3.


دعونا الآن نرى الاحتمال الأخير للعنصر الأول الذي يتم حفظه:


إن احتمالية إزاحة العنصر الأول من الخزان تساوي احتمال العنصر الثالث الذي سيتم اختياره ، مضروبًا في احتمال أن يكون العنصر الأول من الاثنين الذي سيتم اختياره للإزاحة. هذا هو:


2/3 * 1/2 = 1/3


أي الاحتمال الأخير للعنصر الأول الذي يجب حفظه:


1 - 1/3 = 2/3


بالتأكيد يمكن تطبيق نفس المنطق على العنصر الثاني ، وتوسيعه في المستقبل ليشمل عددًا أكبر من العناصر ذات الخزان المتزايد.


بمعنى ، سيتم حفظ كل عنصر باحتمال 2/3 أو في الحالة العامة k / n .




undersampling عشوائي و overampling


مصدر

غالبًا ما توجد مجموعات بيانات غير متوازنة في الحياة.


تسمى الطريقة المستخدمة على نطاق واسع في هذه الحالة إعادة أخذ العينات (في بعض الأحيان يقولون "إعادة تشكيل" في الترجمة الروسية - الترجمة تقريبًا) . يكمن جوهرها في إزالة العناصر من مجموعة كبيرة جدًا (undersampling) و / أو إضافة المزيد من العناصر إلى مجموعة كبيرة غير كافية (overampling).


لنبدأ بإنشاء بعض المجموعات غير المتوازنة.


 from sklearn.datasets import make_classification X, y = make_classification( n_classes=2, class_sep=1.5, weights=[0.9, 0.1], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=100, random_state=10 ) X = pd.DataFrame(X) X['target'] = y 

الآن يمكننا أن نؤدي عملية جمع العينات العشوائية الزائدة بشكل عشوائي مثل:


 num_0 = len(X[X['target']==0]) num_1 = len(X[X['target']==1]) print(num_0,num_1) #   undersampled_data = pd.concat([ X[X['target']==0].sample(num_1) , X[X['target']==1] ]) print(len(undersampled_data)) #   oversampled_data = pd.concat([ X[X['target']==0] , X[X['target']==1].sample(num_0, replace=True) ]) print(len(oversampled_data)) ------------------------------------------------------------ OUTPUT: 90 10 20 180 



Andersampling و overampling باستخدام التعلم غير المتوازن


غير متوازن - التعلم (imblearn) هي مكتبة بيثون للتعامل مع مشاكل مجموعات البيانات غير المتوازنة.


أنه يحتوي على عدة طرق مختلفة لإعادة التشكيل.


أ. Andersampling باستخدام روابط Tomek:


إحدى الطرق المتوفرة تسمى Tomek Links. "الروابط" في هذه الحالة هي أزواج من العناصر من فئات مختلفة موجودة في الجوار.


باستخدام الخوارزمية ، سنقوم أخيرًا بإزالة عنصر الزوج من المجموعة الأكبر ، مما سيسمح للمصنف بالعمل بشكل أفضل.


مصدر


 from imblearn.under_sampling import TomekLinks tl = TomekLinks(return_indices=True, ratio='majority') X_tl, y_tl, id_tl = tl.fit_sample(X, y) 

ب. المبالغة مع SMOTE:


في SMOTE (طريقة التجميع المختلط للأقليات) ، نقوم بإنشاء عناصر على مقربة من العناصر الموجودة في مجموعة أصغر.


مصدر
 from imblearn.over_sampling import SMOTE smote = SMOTE(ratio='minority') X_sm, y_sm = smote.fit_sample(X, y) 

ولكن في imblearn هناك طرق أخرى لفهم الاختزال (Cluster Centroids ، NearMiss ، وما إلى ذلك) والإفراط في أخذ العينات (ADASYN و bSMOTE) ، والتي يمكن أن تكون مفيدة أيضًا.




استنتاج


الخوارزميات هي دم علم البيانات.


أخذ العينات هو واحد من أهم المجالات في العمل مع البيانات ، ويتم تقديم نظرة عامة سطحية فقط أعلاه.


يمكن لاستراتيجية أخذ العينات المختارة جيدًا أن تسحب المشروع بالكامل. اختيار يؤدي سيئة إلى نتائج خاطئة. لذلك ، يجب أن يتم الاختيار بحكمة.

Source: https://habr.com/ru/post/ar461285/


All Articles