بِسمِ اللّهِ الرَّحمنِ الرَّحیم
در این پروژه سعی خواهم کرد که یکی از مسابقات سایت www.kaggle.com را که از طریق این پیوند قابل دست رسی میباشد، بررسی کنم.
در این مسابقه، از شرکت کنندگان خواسته شده که با استفاده از اطّلاعات داده شده درباره ی مسافران کشتی آر اِم اِس تایتانیک1، که در مجموعه ی دادههای2 مسابقه ارائه شده، پیش بینی کنند که چه کسی از کشتی تایتانیک جان سالم به در برده است!
در ادامه، ابتدا توضیحاتی راجع به داده های مسئله داده می شود؛ سپس تعدادی از روش هایی که برای حلّ مسئله مطرح هستند، بررسی خواهند شد.
۱. مقدمه
در حادثه ی برخورد کشتی بخار بزرگ تایتانیک به کوه یخ، که در تاریخ 15 آوریل 1912، از بندر ساوت همپتون انگلستان به مقصد نیویورک آمریکا در سفر بود، 1514 نفر از 2224 مسافر و خدمه ی کشتی، کشته شدند؛ که یکی از دلایل اصلی آن عدم تعبیه ی قایق نجات، به تعداد لازم بود.
هر چند که می توان شانس را یکی از عوامل تأثیر گذار در نجات یافتن افراد بیان کرد؛ امّا برای برخی افراد، مانند زنان و بچّه ها
و افرادی که در قسمت های با درجه ی بالاتر جای داشتند، احتمال بیشتری وجود داشت که نجات پیدا کنند.
داده های مسئله، به صورت فایل های 3csv، در اختیار کاربران قرار داده شده اند.
در شکل زیر ، اطّلاعاتِ داده شده و توضیحات آن ها آورده شده است.
قسمتی از داده ها نیز در شکل پایین، قابل مشاهده می باشند.
همان طور که در شکل 2 مشخّص است، برای برخی افراد، بعضی ویژگی ها، دارای مقدار نمی باشند.
مجموعه ی داده ها، دارای 819 نمونه می باشد.
مجموعه ی داده شده جهت تست، دارای 418 نمونه است.
در صورتی که یک بررسی اوّلیه بر روی داده ها انجام دهیم، نتایج شکل زیر به دست می آیند.
همان طور که مشاهده می کنید، جنسیت مسافر، در این که نجات پیدا می کند یا خیر، بسیار تأثیر گذار می باشد؛ چنان که 74% زنان زنده ماندند؛ در حالی که تنها 18% مردان توانستند نجات پیدا کنند.
این اطّلاعات، یک درک کلّی از شرایط مسئله، در اختیار ما قرار می دهد.
در منابع ذکر شده، روش های جنگل تصادفی، درخت تصمیم، شبکه های عصبی، ماشین بردار پشتیبان، Naive Bayes، افزایش شیب دار و... استفاده شده اند.
اِن شاءَ اللّه ما در این پروژه، سعی خواهیم کرد روش شبکه های عصبی4 را در حدّ امکان و قابل فهم بررسی کنیم.
ابتدا کلّیت روش شبکه های عصبی را توضیح داده، و سپس این روش را برای مسئله ی داده شده به کار خواهیم برد.
شبکه های عصبی
شبکههای عصبی، مدلی میباشند که با الهام از سیستمهای زیستی به وجود آمدهاند. در یک شبکه از عصبهای زیستی مانند مغز، عصبها سلولهای جداگانهای میباشند که ورودی دریافت کرده؛ بر روی آن عملیات انجام میدهند؛ سپس حاصل را به عصب یا عصبهای دیگری که به آنها متّصل میباشند، منتقل مینمایند. این را رفتار را میتوان با استفاده از یک عصب مصنوعی مدل سازی نمود.
شکل بالا یک عصب را نشان میدهد که ورودیهایی را دریافت کرده؛ با استفاده از f، آن ها را پردازش میکند و خروجیهایی را تولید مینماید.
میتوان مجموعهای از این عصبها را در چند لایه به صورتی که در شکل زیر مشاهده میکنید به کار برد.
یک لایه، مربوط به ورودی ( input ) میباشد. تعداد عصبها در این لایه معمولاً با تعداد ویژگیها ( در اینجا سن، کلاس، جنسیت، ...) برابر میباشد.
یک شبکه ی عصبی میتواند فاقد لایه ی میانی ( hidden ) باشد یا شامل یک یا چند لایه از این نوع باشد ( در قسمت آزمایش، یک لایه ی میانی در نظر گرفته شده است ).
لایه ی آخر که لایه خروجی ( output ) نام دارد نیز میتواند شامل یک یا چند عصب، بسته به طرّاحی شبکه باشد ( در قسمت آزمایش، یک عصب برای این لایه در نظر گرفته شده است ).
هم چنین در این شبکه، هر ارتباط بین عصبها دارای یک وزن میباشد. بنا بر این برای مثال، در شکل بالا، تابع فعّال سازی برای عصب Hidden 1 به شکل زیر میباشد:
یکی از توابع فعّال سازی معمول، تابع logistic میباشد؛ که یکی از مزایای آن این است که قابل مشتقگیری میباشد. در زیر فرمول تابع را مشاهده می کنید.
روش یادگیری: داده ها در یک شبکه ی عصبی، در دو حالت جریان پیدا میکنند. حالت اوّل زمانی است که شبکه در حال یادگیری میباشد. حالت دوم زمانی است که شبکه در حالت عادی ( پس از یادگیری میباشد ). دادهها از طریق عصبهای ورودی وارد میشوند و پس از عبور از لایههای میانی وارد عصبهای خروجی میگردند.
این روش طراحی feedforward نامیده میشود. شبکههای عصبی با استفاده از یک عنصر باز خوردِ یادگیری که backpropagation نامیده میشود یاد گیری میکنند.
در این روش، مقادیری که در شبکه تولید میشود، با مقادیری که میبایست تولید شود مقایسه میگردد و از تفاوت بین آن ها برای اصلاح ورژنهای بین ارتباطات استفاده میشود.
این فرایند از لایه ی خروجی شروع می شود؛ سپس به لایههای میانی و سرانجام، به سمت لایه ی ورودی به طرف عقب میرود.
۲. کارهای مرتبط
۳. آزمایشها
1-3- پیش نیاز
جهت اجرای کد برنامه که از لینک قابل دست رسی است، نیاز به ماژولهایی میباشد که در فایل requirements.txt موجود در پیوند داده شده ذکر شده اند.
برای نصب ماژولها دو راه وجود دارد:
راه اوّل: همان ابتدا با استفاده از دستور زیر ماژولهای موجود در فایل را نصب کنید. این روش معمولاً به خطا میانجامد؛ چرا که بعضی از ماژولها به راحتی قابل نصب نمیباشند:
pip install –r requirements.txt
راه دوم: نرمافزار miniconda متناسب با سیستم عامل خود را از اینجا دریافت و نصب نمایید. Conda یک برنامه ی package manager میباشد که روش سریعی را جهت استفاده از package ها فراهم میآورد.
پس از این که مراحل نصب تمام شد، با استفاده از دستور conda create -n myenv python یک virtual environment بسازید و با دستور
activate myenv، آن را فعّال کنید ( میتوانید از اسم دل خواه خود به جای myenv استفاده نمایید ).
اکنون با دستور conda install numpy ماژول numpy را نصب کنید.
سایر ماژول ها با استفاده از دستوری که در روش اوّل ذکر شد، قابل نصب میباشند.
2-3- پیش پردازش
دادههای مسئله که در سایت مسابقه دریافت شده اند،در github پروژه قابل دسترسی میباشند.
برای این که دادهها در الگوریتمهای به کار رفته قابل استفاده باشند، لازم است که یک عملیات پیشپردازش بر روی آن ها انجام شود.
برای خواندن و پردازش فایلهای csv از کتابخانه pandas پایتون استفاده شده است. دادههای مسئله دارای یک فایل train.csv میباشد و داده های مربوط به test را از روی داده ی اولیه بدست می آوریم و جهت سادگی کار، دادههای train.csv را که حاوی اطّلاعات کامل میباشند، به دو قسمت، به صورت 30% برای تست و 70% برای یادگیری تقسیم میکنیم تا فرایند آزمایش، بصورت آفلاین قابل انجام باشد.
بسیاری از دادههای داده شده، دارای مقادیر غیر عددی میباشند که لازم است جهت کارکرد صحیح روشها، به مقادیر عددی تبدیل شوند.
هم چنین مقادیر بسیاری از سطرهای جدول دارای مقادیر null میباشند که این مقادیر، قابل قبول نمیباشند.
ستون cabin را به علّت تعداد زیاد مقادیر null، ستون name و ستون ticket را نیز به این دلیل که برای هر فرد، منحصر به فرد میباشد و یافتن روابط در آن ها دشوار میباشد از دادهها حذف میکنیم.
ستونهای دارای مقادیر غیر عددی یا ستونهایی که عدد آن ها نشان دهنده ی مقدار آن ها نمی باشد را نیز به ستونهایی، به تعداد مقادیر مختلفی که میتوانند داشته باشند، تقسیم میکنیم؛
برای مثال ستون Pclass که میتواند دارای مقادیر 1، 2 یا 3 باشد، به سه ستون 1 و 2 و 3 تقسیم میشود که برای فردی که در کلاس 3 بوده، این ستونها به ترتیب مقادیر 0 و 0 و 1 خواهند داشت.
تفاوت این پروژه با نسخه ی قبلی در سایت بوته این است که طبق روش هایی که در تابع get_manipulated_train آمده است برای تعیین سن مسافرانی
که محتوایی ندارد استفاده از interpolate گفته شده بود که در حال حاضر ابتدا برای این کار مقادیر random بین age_avg-age-std و age_avg+age_std انتخاب می شوند. سپس با توجه به sex,pclass,title از روی داده اولیه می توان به جدول زیر رسید :
که از این اطلاعات در کد برای تعیین سن های مشخص نشده استفاده می کنیم .
سپس برای بازه های مختلف سن و کرایه مقدار در نظر گرفته شده است که باعث یادگیری بهتر می شود.
برای دقیق تر شدن تعداد اعضای خانوده هر فرد که در کشتی بودند را نیز از روی sibSp,Parch می فهمیم با توجه به تست و مطالب موجود در منابع تنها بودن فرد نیز موثر است که یک ستون دیگر به نام isAlone تعریف کردیم.
معیار دیگر لقب های هر شخص است که در تصویر زیر تاثیر مورد بررسی قرار داده شده است :
توضیحات بیشتر در کد آمده است.
3-3- روش شبکه های عصبی
در پیاده سازی این قسمت، از ماژول neurolab در زبان پایتون و شبکه ی feed forward multilayer perceptron استفاده شده است.
در ماژول ذکر شده، الگوریتمهای زیادی برای یادگیری در نظر گرفته شده است.
اگر مقدار عصب بیشتر از 0.5 بوده باشد، فرد، زنده و در غیر این صورت، غرق شده پیش بینی شده است.
قبل از بررسی نتایج، لازم است که عبارت epoch توضیح داده شود:Epoch یک تکرارِ کاملِ روندِ یادگیریِ دادههای داده شده، جهت یادگیری میباشد.
نتایج، در زیر آورده شده است. سعی شده مقادیر به گونه ای در نظر گرفته شوند که نشان دهنده ی تأثیر تعداد Epoch ها و تعداد عصبهای میانی باشند:
با ۲۰ epoch با ۷۷.۹ درصد موفقیت حاصل شده است.
از جمله کارهایی که میتوان در فاز بعد، جهت بهینه کردن نتایج انجام داد، استفاده از روشهایی جهت حدس دقیقتر مقادیر null و استفاده از دادههای test، جهتِ گرفتنِ نتیجه ی روشهای به کار رفته از سایت مسابقه میباشد.
۴. کارهای آینده
۵. مراجع
http://adataanalyst.com/kaggle/4-different-ways-predict-survival-titanic-part-3/
http://andrew.gibiansky.com/blog/machine-learning/machine-learning-neural-networks/
https://www.kaggle.com/sinakhorami/titanic-best-working-classifier/notebook
https://www.kaggle.com/ledadel/titanic-survivorship-neural-network-model?scriptVersionId=1555583
و ...
۶. پیوندهای مفید
RMS Titanic
Dataset
Comma-separated values
Neural Networks