بِسمِ اللّهِ الرَّحمنِ الرَّحیم

در این پروژه سعی خواهم کرد که یکی از مسابقات سایت www.kaggle.com را که از طریق این پیوند قابل دست رسی می‌باشد، بررسی کنم.
در این مسابقه، از شرکت کنندگان خواسته شده که با استفاده از اطّلاعات داده شده درباره ی مسافران کشتی آر اِم اِس تایتانیک1، که در مجموعه ی داده‌های2 مسابقه ارائه شده، پیش بینی کنند که چه کسی از کشتی تایتانیک جان سالم به در برده است!
در ادامه، ابتدا توضیحاتی راجع به داده های مسئله داده می شود؛ سپس تعدادی از روش هایی که برای حلّ مسئله مطرح هستند، بررسی خواهند شد.

۱. مقدمه

در حادثه ی برخورد کشتی بخار بزرگ تایتانیک به کوه یخ، که در تاریخ 15 آوریل 1912، از بندر ساوت همپتون انگلستان به مقصد نیویورک آمریکا در سفر بود، 1514 نفر از 2224 مسافر و خدمه ی کشتی، کشته شدند؛ که یکی از دلایل اصلی آن عدم تعبیه ی قایق نجات، به تعداد لازم بود.
هر چند که می توان شانس را یکی از عوامل تأثیر گذار در نجات یافتن افراد بیان کرد؛ امّا برای برخی افراد، مانند زنان و بچّه ها
و افرادی که در قسمت های با درجه ی بالاتر جای داشتند، احتمال بیشتری وجود داشت که نجات پیدا کنند.
داده های مسئله، به صورت فایل های 3csv، در اختیار کاربران قرار داده شده اند.
در شکل زیر ، اطّلاعاتِ داده شده و توضیحات آن ها آورده شده است.

شکل 1- اطّلاعات داده شده راجع به مسافران

قسمتی از داده ها نیز در شکل پایین، قابل مشاهده می باشند.
شکل 2- قسمتی از داده ها

همان طور که در شکل 2 مشخّص است، برای برخی افراد، بعضی ویژگی ها، دارای مقدار نمی باشند.
مجموعه ی داده ها، دارای 819 نمونه می باشد.
مجموعه ی داده شده جهت تست، دارای 418 نمونه است.
در صورتی که یک بررسی اوّلیه بر روی داده ها انجام دهیم، نتایج شکل زیر به دست می آیند.
شکل 3- بررسی اوّلیه

همان طور که مشاهده می کنید، جنسیت مسافر، در این که نجات پیدا می کند یا خیر، بسیار تأثیر گذار می باشد؛ چنان که 74% زنان زنده ماندند؛ در حالی که تنها 18% مردان توانستند نجات پیدا کنند.
این اطّلاعات، یک درک کلّی از شرایط مسئله، در اختیار ما قرار می دهد.
در منابع ذکر شده، روش های جنگل تصادفی، درخت تصمیم، شبکه های عصبی، ماشین بردار پشتیبان، Naive Bayes، افزایش شیب دار و... استفاده شده اند.
اِن شاءَ اللّه ما در این پروژه، سعی خواهیم کرد روش شبکه های عصبی4 را در حدّ امکان و قابل فهم بررسی کنیم.
ابتدا کلّیت روش شبکه های عصبی را توضیح داده، و سپس این روش را برای مسئله ی داده شده به کار خواهیم برد.
شبکه های عصبی
شبکه‌های عصبی، مدلی می‌باشند که با الهام از سیستم‌های زیستی به وجود آمده‌اند. در یک شبکه از عصب‌های زیستی مانند مغز، عصب‌ها سلول‌های جداگانه‌ای می‌باشند که ورودی دریافت کرده؛ بر روی آن عملیات انجام می‌دهند؛ سپس حاصل را به عصب یا عصب‌های دیگری که به آنها متّصل می‌باشند، منتقل می‌نمایند. این را رفتار را ‌می‌توان با استفاده از یک عصب مصنوعی مدل سازی نمود.
شکل 4- یک عصب در شبکه ی عصبی

شکل بالا یک عصب را نشان می‌دهد که ورودی‌هایی را دریافت کرده؛ با استفاده از f، آن ها را پردازش می‌کند و خروجی‌هایی را تولید می‌نماید.
می‌توان مجموعه‌ای از این عصب‌ها را در چند لایه به صورتی که در شکل زیر مشاهده می‌کنید به کار برد.
شکل 5- یک شبکه ی عصبی با چهار لایه

یک لایه، مربوط به ورودی ( 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
و ...

۶. پیوندهای مفید


  1. RMS Titanic

  2. Dataset

  3. Comma-separated values

  4. Neural Networks

رد شده

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

تایید شده

با سلام و عرض خسته نباشید

  1. در قسمت کارهای مرتبط مطلبی قرار داده نشده است.

  2. قالبِ داده های مورد استفاده را ذکر نکردید و نگفتید از کجا آمده اند ، همچنین بررسی نتایج را توضیح ندادید.

  3. روش ارجاع دادن کلماتِ فارسی به انگلیسی در انتهای مطلب ، جالب بود.

در مجموع برای درک بهترِ مطالب توسط خواننده میتوانستید توضیحات بیشتری بدهید .

تایید شده

با سلام
کار شما در قسمت مقدمه خوب بود و باعث میشد تا خواننده یک شمای ابتدایی از شبکه های عصبی پیدا کند . در قسمت کار های مرتبط بهتر بود که خالی نماند و پشتوانه تئوری برای شما برای انجام پیاده سازی باشد و انواع شبکه های عصبی را بیان میکردید و مزیت و معایب هر کدام را میگفتید . علت انتخاب شبکه عصبی ای که ذکر فرموده اید را میگفتید و به غیر از شبکه های عصبی روش های دیگر برای حل این مساله را نیز ذکر می کردید.
همچنین مراجعتان تنها 4 سایت میباشد که مراجع کمی است و بهتر بود مقالاتی را نیز مطالعه نموده و از آنها استفاده کنید . از طرفی در کنار هر متنی که از هر کدام از مرجع هایتان برداشته این باید ذکر میکردید که از کدام است . که خواننده در صورت تمایل بتواند در باره آن بیشتر مطالعه نماید . همچنین بهتر بود کدتان را کامنت گذاری نمایید تا خواننده با خواندن کامنت های شما متوجه کاری که انجام داده اید بشود .به علاوه تعدادی از عکس هایی را که آپلود نموده اید درست آپلود نشده اند و نمایش داده نمیشوند .بهتر است آنها را مجددا آپلود نمایید.
رسیدن شما به نتیجه تقریبا 78 درصد نتیجه خوبی است و پیشنهاد میکنم این نتیجه را در مرحله بعدی بهبود ببخشید

رد شده

به نام خدا. با عرض خسته نباشید. نکته جالب توجه اول در مورد کار شما این است که با وجود اینکه با عنوان پروژه نمی توان ارتباط راحت و مناسبی با آن برقرار کرد، در بخش مقدمه به خوبی آنرا تشریح کردید و به برقرار کردن ارتباط مخاطب با آن بسیار کمک نمودید.از طرف دیگر در مورد شبکه عصبی توضیح نسبتا مناسبی ارائه کردید اما مشکل اصلی کار شما این است که منابع محدودی را ذکر کردید و توضیحات شما به مقاله های محدود ارجاع داده شده است .همچنین متاسفانه بخش کارهای مرتبط کمی نا مفهوم است(با فرض اینکه کارهای بیشتری انجام نشده باشد.)! این 2 موضوع باعث شد من به شما 4ستاره بدهم.
اما نکته مثبت بعدی این بود که شما پیاده سازی های قبلی را بررسی کردید و توانستید پیاده سازی بهینه تری را انجام دهید. اما ضعف کار شما نداشتن ارزیابی بصری برای مخاطب است. می توانستید بهبود نتایج را با اعداد یا نشان دادن نمونه های آزمایش شده ارائه دهید.پیوند های موجود هم مناسب هستند. موفق باشید

محسن ایمانی
  • با توجه به این که در این پروژه شما تنها قصد بررسی شبکه‌های عصبی را در حل مسئله داشتید، انتظار می‌رفت با عمق بیشتری شبکه‌های عصبی را بررسی کنید و آزمایش‌های بیشتری با شبکه‌های با لایه‌های متفاوت، تعداد گره‌های میانی متفاوت و تعداد epoch مختلف انجام دهید اما چیزی که در این فاز دیده می‌شود نسبت به پروژه‌ سال‌های گذشته تغییر چندانی نداشته است.

  • «نتایج، در زیر آورده شده است. سعی شده مقادیر به گونه ای در نظر گرفته شوند که نشان دهنده ی تأثیر تعداد Epoch‌ ها و تعداد عصب‌های میانی باشند» اما شما در نتایج تنها یک عدد برای یک مقدار خاص از epoch و عصب‌های میانی را گزارش کرده‌اید.

  • عکس‌های قرار داده شده در متن نمایش داده نمی‌شوند

  • کد شما همراه با خطا در آدرس‌دهی فایل داده‌ها بود. هرچند که بعد از ویرایش کد قابل اجرا شد.

  • بخش کارهای مرتبط شما خالی است

  • مشخص نکرده‌اید که مراجع ذکر شده در کدام‌یک از بخش‌های متن پروژه شما استفاده شده‌اند.