طبقه بندی داده های نامتوازن یک مسأله رایج در حوزه تحلیل داده است. فرض کنید که از بین ۱۰۰ بیمار کووید-۱۹، فقط یک نفر به ویروس کرونای دلتا مبتلا باشد. بنابراین ما ۹۹ بیمار کرونای ووهان و ۱ بیمار کرونای دلتا داریم. میخواهیم با استفاده از علائم و شاخصهای حیاتی و علائم مختلف بیمار یک مسأله طبقهبندی بسازیم که پیشبینی کند که آیا بیمار جدید به کرونای ووهان مبتلا است یا کرونای دلتا؟ اگر این ۱۰۰ رکورد را در قالب یک دیتاست به الگوریتمهای معمول یادگیری ماشین بدهیم با دقت ۹۹ درصد میتوانند دلتابودن یا نبودن کرونای بیمار را پیشبینی کنند! ما هم اگر جای آنها بودیم احتمالا دقتمان همینقدر بود! اگر بگوییم همه بیمارها به کرونای ووهان مبتلا هستند، در ۹۹ درصد موارد درست پیشبینی کردهایم چراکه در واقع فقط یک پیشبینی خطا داریم و آن هم همان یک نفری است که به کرونای دلتا مبتلا بود.
مثال فوق، بیان سادهای از مسأله طبقهبندی دادههای نامتوازن (Classification of Imbalanced Data) است. اگر مسأله بهخوبی تعریف نشود یا الگوریتمهای حلکننده آن بهخوبی تنظیم نشده باشند و معیارهای سنجش عملکرد یا خطای پیشبینی متناسب این دسته از مسائل نباشد، خروجی ما با واقعیت، اختلاف جدی پیدا میکند، حتی اگر ظاهرا با دقت ۹۹ درصد پیشبینی کرده باشیم! الگوریتمهای معمول classification با فرض متوازن بودن طبقه دادهها طراحی شدهاند و دربرابر دادههایی که دارای کلاسهای نامتوازن هستند به سمت طبقه اکثریت (Majority Class) منحرف میشوند که موجب افزایش خطا در تشخیص طبقه اقلیت (Minority Class) میگردد.
روشهای رایج برای مواجهه با داده های نامتوازن
برای حل مسأله Classification with Imbalanced Data رویکردهای مختلفی گسترش یافته است. اگر بخواهیم به صورت گذرا و ساده این رویکردها را دستهبندی کنیم میتوانیم از دو رویکرد اصلی نام ببریم: رویکرد در سطح داده (Data Level approach) و رویکرد در سطح الگوریتم (Algorithm Level approach) که البته رویکردهای دیگری نظیر چارچوب یادگیری حساس به هزینه (Cost-sensitive learning framework) نیز وجود دارند که ما بین این دو رویکرد اصلی قرار میگیرند.
در رویکرد سطح داده، فعالیت اصلی برای اصلاح مسأله پیش از شروع فرآیند یادگیری ماشین یا راهاندازی الگوریتمهای یادگیری است. به عبارت دیگر، دادههای خام مسأله (که نامتوازن هستند) قبل از ورود به الگوریتمهای طبقهبند، تغییر داده میشوند. تغییر در اینجا عمدتاً به معنی افزایش سهم طبقه(های) اقلیت یا کاهش سهم طبقه(های) اکثریت به وسیله re-sampling یا بازنمونهسازی است. روشهای تصادفی under-sampling یا over-sampling از جمله روشهای مورد استفاده در این رویکرد هستند.
رویکردهایی سطح الگوریتم، به الگوریتمهای طبقهبند کمک میکند تا فرآیند یادگیری را به سمت طبقه اقلیت سوق دهند. یکی از مهمترین رویکردهای سطح الگوریتم استفاده از تکنیکهای جمعی یا Ensemble است که نتایج چندین الگوریتم طبقهبند را ترکیب میکند. در ادامه این یادداشت، یک راهکار خوب مبتنیبر تکنیکهای جمعی را که در تولباکس آمار و یادگیری ماشین وجود دارد برای مواجهه با مسأله طبقه بندی داده های نامتوازن مورد بررسی قرار میدهیم. البته برای جزئیات بیشتر درباره انواع تکنیکهای سطح الگوریتم و سطح داده میتوانید اینجا را مطالعه کنید.
طبقه بندی داده های نامتوازن در نرم افزار MATLAB
یکی از روشهای طبقهبندی داده های نامتوازن به کمک نرم افزار MATLAB، استفاده از الگوریتم RUSBoost است. این الگوریتم، RUS یا همان random under-sampling و روش متداول boosting با نام AdaBoost را ترکیب میکند تا با حذف گام به گام نمونههای کلاس اکثریت به مدل بهتری دست یافته شود. برای آشنایی با الگوریتم RUSBoost میتوانید مقالات مرجع آن را در اینجا و اینجا مطالعه کنید.
بهمنظور پیادهسازی این الگوریتم از تابع fitcensemble
در متلب استفاده میکنیم. این تابع کمک میکند که نتایج حاصل از روشهای مختلف طبقهبندی با هم ترکیب شوند:
Result = fitcensemble(___,'Method','RUSBoost',)
در صورت نیاز به تنظیمات بیشتر میتوان مقادیر نرخ یادگیری و نسبت به کوچکترین را نیز به روش زیر اعلام کرد:
Result = fitcensemble(___,'Method','RUSBoost', 'LearnRate',0.1, 'RatioToSmallest',[2,1])
در مثال فوق، به تابع fitcensemble
دستور داده میشود که از روش RUSBoost
با نرخ یادگیری 0.1 و نسبت نمونهگیری ۱ و ۲ برای طبقههای ۱ و ۲ استفاده کند. LearnRate
بین صفر تا حداکثر یک است که بیانگر نرخ یادگیری برای shrinkage است که معمولا به نتایج بهتر طی تکرارهای بیشتر میانجامد. منظور از RatioToSmallest
نیز نسبت نمونهگیری با توجه به طبقه اقلیت است. مثلاً فرض کنید که در مسأله طبقهبندی ما K کلاس وجود داشته باشد و تعداد نمونهها در کلاس اقلیت برابر با m باشد، آنگاه اگر فقط یک عدد مثبت (مثل s) را به عنوان نسبت اعلام کنیم، الگوریتم تعداد s*m نمونه را از هر کلاس انتخاب میکند؛ اما اگر برداری از اعداد مثبت (مثل [s1,s2,s3,…]) را به عنوان نسبت اعلام کنیم، الگوریتم تعداد si*m نمونه را از کلاس i انتخاب میکند که i برابر با اعداد صحیح از ۱ تا K است.
برای دستیابی جزئیات بیشتر در مورد تابع fitcensemble
میتوانید صفحه مربوط به راهنمای متلب را در اینجا مطالعه کنید. بهمنظور مشاهده یک مثال عملی از بهکاربستن الگوریتم RUSBoost در متلب اینجا را مشاهده کنید.