شروع یک مسئله ماشین لرنینگ با داده های کم قسمت ۱

به نام خدا

سلام ، امروز میخوایم به زبان ساده به این موضوع بپردازیم که در برخورد با یک مسئله ماشین لرنینگ چنانچه دیتاست بزرگی برای train کردن مسئله نداشته باشیم، از چه راه هایی میشه استفاده کرد تا عملیات Train رو انجام بدیم.

مسئله ماشین لرنینگ شبیه یک ماشین و داده ها شبیه بزنین برای ماشین هستند .

برای رسیدن به مقصد با ماشین، یا باید بنزین کافی وجود داشته باشه ، یا باید مصرف بنزین ماشین بهینه شده باشه تا با یک مقدار کمی از بنزین به مقصد برسیم.

در مسائل ماشین لرنینگ هم یا باید دیتای کافی داشته باشیم ،‌یا متدهایی که برای train مسئله مون استفاده میکنیم باید با دیتای کم هم نتایج خوبی بدن و یا هر دو !

اول به این موضوع بپردازیم که چرا و چطور ممکنه داده های ما کم باشه ؟!

۱) دیتای انحصاری :

مثلا آمار تصادفات خودرو های خودران شرکت تسلا ، دیتای بیماری های نادر و ... این ها در اختیار ما قرار ندارند و ممکن هست برای تهیه برخی دیتاست هم نیاز به هزینه های گزافی باشه.

۲) داده های محدود :

مثلا برای پیاده سازی یک مسئله برای یافتن عادت های مالی حساب یک مشتری بانک زمانی که مشتری جدید باشه و تراکنش های زیادی نداشته باشه ، این دیتا وجود نداره .

۳) منبع داده ی خراب :

فرض کنید در خط تولید فولاد ، یک سنسوری قرار دادیم که قرار هست ، دمای ورق فولاد رو انداره گیری کنه . حالا اگر این سنسور خراب بشه اطلاعاتی که ثبت میکنه دارای نویز و خطا هست درنتیجه داده ی صحیح و سالم در دسترس نیست.

۴) داده های نامتعادل

فرض کنید دیتاست عظیمی از آزمایش افراد جهت تشخیص یک بیماری نادر داریم. چنانچه از یک میلیون آزمایش فقط ۱۰ مورد مثبت گزارش شود ، نتیجه آن است که تعادل بین دسته های مختلف داده یعنی موارد منفی و مثبت بهم میخورد و امکان تشخیص اشتباه توسط ماشین زیاد میشود.


ترید آف بین bias و variance

بایاس و واریانس به زبان ساده یعنی چی ؟

زمانی که شما یک دیتاست دارید و الگوریتمی برای train ( آموزش دادن ) مسئله خود، روی اون دیتاست پیاده میکنید ، داده ها رو به دو دسته train و test تقسیم میکنید ( مثلا ۹۰ درصد برای train و ۱۰ درصد برای Test ) حالا چند حالت وجود داره :

۱) ماشین شما داده های Train رو عالی تشخیص میده ولی روی داده های تست ضعیف عمل میکنه . چرا ؟ چون اینقدری دقیق طراحی شده که اگه خارج از چهار چوب داده هایی که تعلیم دیده ، داده ای بهش داده بشه ، پرت حساب میشه !

۲)ماشین شما داده های train رو ضعیف تشخیص میده ولی روی داده های تست بهتر عمل میکنه . چرا ؟ چون الگوریتمی که پیاده کردید اونقدر دقیق نیست که فقط train ها رو تشخیص بده و میتونه تست ها رو عملا تا حدی درست تشخیص بده .

۳) ماشین شما هم داده های train و هم داده های test رو به حد متعادلی و با درصد دقت خوبی میتونه تشخیص بده . در این حالت ما این رو میپذیریم که ممکنه خطاهایی داشته باشه .

همینطوری که در تصویر بالا میبینید ، چنانچه مدل ما پیچیده و دقیق تر شود ، مقدار بایاس( خطا روی داده های train) رفته رفته کم شده و واریانس ( خطا در تشخیص داده تست ) زیاد میشود . برعکس هرچه پیچیدگی کمتر باشد ، خطای بایاس یعنی تشخیص داده ترین زیاد و واریانس کم است .

بهترین نقطه کجاست ؟ بهترین نقطه همان خط عمودی تصویر یعنی نقطه ای که جمع خطای bias و variance کم ترین مقدار ممکن شود. همانطور که میبینید خط قرمز مجموع این دو مقدار است و نقطه ای که خط عمودی رسم کرده ایم کمترین مقدار ممکن را دارد .

یک نکته : به حالت اول overfitting و به حالت دوم underfitting میگن.

خب اصلا چرا این موضوع رو اینجا مطرح کردیم ؟

در اکثر مسائل با داده ی کم ، ما با مشکل overfitting مواجه هستیم . چرا که دیتای کمی برای ترین داریم و حالت های زیادی را شامل نمیشه ، این موجب میشه که فقط تمرکز ماشین روی ساپورت ست خودش ( دیتای کمی که در مسائل ماشین لرنینگ به مسئله برای train میدن ) باشه و داده تست رو درست تشخیص نده .

مثلا ۵ تا عکس از گربه،سگ،اسب،گوریل و میمون به مسئله دادیم و انتظار داریم وقتی عکس های تست یعنی عکس یه گربه ی بیچاره ای که از گوگل دانلود کردیم رو درست تشخیص بده ! خب مشخصه وقتی ماشین ما فقط یک عکس گربه دیده ، چیز زیادی یاد نگرفته که بتونه هر عکس گربه ای رو تشخیص بده . بنابراین فقط میتونه همون عکسی که خودش یاد گرفته ( که توی ساپورت ست بوده ) رو با درصد بالایی درست تشخیص شده اما عکس تست رو خیر ( this is overfitting ! )

راه حل مشکل overfitting چیه ؟

۱) پیچیدگی کم مدل :

هرچی مدل پیچیده تر بشه، تشخیص داده های train قوی تر میشه overfitting بیشتر.

۲) حذف داده های پرت :

وقتی دیتای کمی داریم، وجود یک دیتای پرت میتونه به راحتی همه چیز رو بهم بریزه، مثلا ما ۵ تا دسته بندی برای اون ۵ تا عکسی که در بالا گفتیم داریم ولی یک عکس ششمی از موز هم به ماشین میدیم ! ماشین ناچارا این موز رو توی یکی از این دسته بندی ها جا میده ولی همینطوری که حدس میزنید همه ی فیچر هایی که در نظر گرفته بوده بهم میریزه . ( مثلا میذاره تو دسته اسب ولی فیچر هایی ( ویژگی ها) که برای اسب در نظر گرفته بوده ، همش بهم میریزه .

۳) بهینه سازی فیچر ها :

مهندسی کردن یک سری داده خام اندک کار فوق العاده جذاب و هوشیارانه ای هست.

مثلا زمانی که داده های کمی برای قیمت سهام داریم ، به فرض چهار ستون قیمت،زمان باز شدن کندل،تعداد معامله و حجم . خب ما زمانی که میدونیم مسئله در تایم فریم ۱ روزه به فرض داره حل میشه، از روی زمان باز شدن کندل میتونیم به راحتی زمان بسته شدن رو تشخیص بدیم و به مسئله اضافه کنیم : زمان باز شدن+۱ روز

یا مثلا میانگین حجم هر معامله رو با تقسیم کردن حجم کل به تعداد معامله میشه به دست آورد.نهایتا از این داده هایی که create کردیم استفاده میکنیم .

نکته ریز : در شبکه های عصبی معمولا نیاز به این کار نیست ، چون خود شبکه این کار رو انجام میده و روابط رو تا حدی پیدا میکنه .

۴) روش ترکیبی یا همان ensemble :

در این روش ، ما از چند مدل برای پیش بینی نتایج خود استفاده میکنیم و نهاتا اون پاسخی که بیشترین رای رو بیاره ، به عنوان جواب انتخاب میشه.

با استفاده از این روش میشه از یک مدل که دچار overfitting هست و یکی underfitting و چندل مدل دیگه در کنار هم دیگه استفاده کرد .

یادگیری ترکیبی سه نوع است :bagging, boosting, stacking ,voting

خلاصه ای از روش ها :

روش voting : این روش از مدل های متفاوت ( مثلا svm,knn و ... ) استفاده کرده و سهم هر مدل در تصمیم گیری با مدل دیگری یکسان است. نهایتا نظر جمع هرچه بود همان انتخاب میشود.

روش staking : این روش دقیقا همان voting است اما به هر یک از مدل ها یک وزنی اختصاص داده میشود تا بر اساس تاثیر و اهمیتی که دارند ،‌ تاثیر گذار باشند. وظیفه پیدا کردن این وزن ها با یک مدل سطح بالاتر از مدل های پایه ی قبلی انجام میشود.


روش bagging : در این روش تمامی مدل ها باید یکسان باشند ( مثلا همگی از نوع svm یا ...) اما دیتاست اصلی خودمون رو به چندتا زیر دیتا تقسیم میکنیم ( به این کار bootstrap :the random sampling with replacement) میگن . بعدش این مدل ها روی این زیر دیتاست ها کار میکنن و نتایج نهایتا با هم aggregate میشه.

روش boosting : در این روش ، زمانی که ما با مسائل پیچیده سر و کار داریم که نمیشه با یک مدل ساده مثل پرسپترون و ....اون رو حل کرد، میایم چند مدل ساده روی برای این مسئله پیچیده با هم دیگه ترکیب میکنیم .این کار باعث میشه خطای بایاس هم کم بشه و مجموع این مدل های ساده شبیه یک مدل پیچیده عمل بکنه


خلاصه قسمت اول :

در این قسمت از این موضوع شروع کردیم که چرا ممکن هست که دیتای کمی داشته باشیم ، بعد از اون به مفهوم مهم bias و variance پرداختیم و فهمیدیم که اگر داده های مسئله کم باشه مشکل overfitting رخ میده که برای حل چنین مسائلی چهار راه حل ارائه دادیم :پیچیدگی کم-حذف داده پرت-مهندسی بهینه کردن فیچر ها - روش ترکیبی که خود روش ترکیبی به چهار روش تقسیم شد : voting-staking-bagging-boosting


  • در قسمت بعدی : به موضوع Cross-Validation و مبحث فوق العاده مهم transfer learning میپردازیم.
https://vrgl.ir/FsNCF

نکته : برای جمع آوری این مطلب ، از نتایج تجربی نویسنده و همچنین سایت https://neptune.ai استفاده شده است.