كيفية استخدام smote للبيانات غير المتوازنة في r (مع مثال)


في كثير من الأحيان، عند العمل باستخدام خوارزميات تصنيف التعلم الآلي، ستكون الفئات الموجودة في مجموعة البيانات غير متوازنة.

على سبيل المثال:

  • قد تحتوي مجموعة البيانات التي تحتوي على معلومات حول ما إذا كان اللاعبون الجامعيون قد تم تجنيدهم في الدوري الاميركي للمحترفين أم لا، على 98% من اللاعبين غير المصاغين و2% قيد الصياغة.
  • قد تحتوي مجموعة البيانات التي تحتوي على معلومات حول ما إذا كان المرضى مصابون بالسرطان أم لا، على 99% من المرضى غير المصابين بالسرطان و1% فقط مصابين بالسرطان.
  • قد تحتوي مجموعة البيانات التي تحتوي على معلومات الاحتيال المصرفي على 96% من المعاملات المشروعة و4% من المعاملات الاحتيالية.

وبسبب هذه الفئات غير المتوازنة، قد لا يعمل النموذج التنبؤي الذي تبنيه بشكل جيد مع فئة الأقلية.

والأسوأ من ذلك أن فئة الأقلية هي في كثير من الأحيان الفئة التي نرغب في التنبؤ بها.

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

تتضمن هذه التقنية إنشاء مجموعة بيانات جديدة عن طريق أخذ عينات من الملاحظات من فئة الأقلية، مما ينتج مجموعة بيانات ذات فئات أكثر توازناً.

أسهل طريقة لاستخدام SMOTE في R هي استخدام الدالة SMOTE() من حزمة DMwR .

تستخدم هذه الوظيفة بناء الجملة الأساسي التالي:

 SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)

ذهب:

  • النموذج : صيغة تصف النموذج الذي تريد تعديله
  • البيانات : اسم إطار البيانات
  • perc.over : الرقم الذي يحدد عدد الحالات الإضافية لفئة الأقلية التي سيتم إنشاؤها
  • perc.under : الرقم الذي يحدد عدد الحالات الإضافية لفئة الأغلبية التي سيتم إنشاؤها

يوضح المثال التالي كيفية استخدام هذه الوظيفة عمليًا.

مثال: كيفية استخدام SMOTE في R

لنفترض أن لدينا مجموعة البيانات التالية التي تحتوي على 100 ملاحظة في R حيث تحتوي 90 منها على فئة “نعم” و10 بها فئة “لا” لمتغير الاستجابة:

 #make this example reproducible
set. seed ( 0 )

#create data frame with one response variable and two predictor variables
df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )),
                 x1=rnorm( 100 ),
                 x2=rnorm( 100 ))

#view first six rows of data frame
head(df)

    y x1 x2
1 Yes 1.2629543 0.7818592
2 Yes -0.3262334 -0.7767766
3 Yes 1.3297993 -0.6159899
4 Yes 1.2724293 0.0465803
5 Yes 0.4146414 -1.1303858
6 Yes -1.5399500 0.5767188
 
#view distribution of response variable
table(df$y)

 Drowned 
 10 90

هذا مثال كلاسيكي لمجموعة بيانات غير متوازنة لأن متغير الاستجابة الذي نتوقعه يحتوي على 90 ملاحظة بفئة “نعم” و10 ملاحظات فقط بفئة “لا”.

لإنشاء مجموعة بيانات أكثر توازناً، يمكننا استخدام الدالة SMOTE() من حزمة DMwR :

 library ( DMwR)

#use SMOTE to create new dataset that is more balanced
new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 )

#view distribution of response variable in new dataset
table(new_df$y)

 Drowned 
210,800

تحتوي مجموعة البيانات الناتجة على 210 ملاحظة مع “لا” كفئة و800 ملاحظة مع “نعم” كفئة.

إليك بالضبط كيف أنتجت الدالة SMOTE مجموعة البيانات الجديدة هذه:

  • حددت الوسيطة perc.over أننا أردنا إضافة 2000/100 (أو 20) ضعف عدد ملاحظات الأقلية الموجودة إلى مجموعة البيانات. نظرًا لوجود 10 ملاحظات في مجموعة البيانات الأصلية، أضفنا 20*10 = 200 ملاحظة أقلية إضافية .
  • حددت الوسيطة perc.under أننا أردنا أن نجعل عدد ملاحظات الأغلبية يساوي 400/100 (أو 4) أضعاف عدد ملاحظات الأقلية المضافة إلى ملاحظات الأقلية الموجودة. منذ إضافة 200 ملاحظة إضافية للأقليات، جعلنا عدد ملاحظات الأغلبية يساوي 200 * 4 = 800 ملاحظة للأغلبية .

والنتيجة النهائية هي مجموعة بيانات لا تزال تحتوي على المزيد من فئات الأغلبية، ولكنها لا تزال أكثر توازناً من مجموعة البيانات الأصلية.

يمكنك الآن تكييف خوارزمية التصنيف التي تختارها مع مجموعة البيانات الجديدة هذه، والتي من المفترض أن تؤدي أداءً أفضل على فئة الأقلية نظرًا لوجود المزيد من الملاحظات من فئة الأقلية في مجموعة البيانات الجديدة هذه.

ملاحظة : لا تتردد في اللعب باستخدام الوسيطتين perc.over و perc.under في الدالة SMOTE للحصول على مجموعة بيانات تناسب احتياجاتك.

مصادر إضافية

تشرح البرامج التعليمية التالية كيفية تنفيذ المهام الشائعة الأخرى في R:

كيفية إنشاء جداول ملخصة في R
كيفية تطبيع البيانات في R
كيفية إزالة القيم المتطرفة في R

Add a Comment

ایمئیل یایینلانمایاجاق ایسته‎نیله‎ن بوشلوقلار خاللانمیشدیر *