بسم الله الرحمن الرحیم

۱. مقدمه

سیستم اشتراک گذاری دوچرخه یا سیستم دوچرخه عمومی ، یک سرویس است که در آن دوچرخه در مدت زمان کوتاهی برای استفاده مشترک افراد در نظر گرفته می شود . در این سیستم ، مردم می توانند دوچرخه را از ایستگاه های مختلف مانند ایستگاه A امانت بگیرند و در ایستگاه دیگری مانند B تحویل دهند . با استفاده از این سیستم ، افراد زیادی می توانند از دوچرخه استفاده کنند .
هدف اصلی سیستم اشتراک گذاری دوچرخه ، دسترسی رایگان و مقرون به صرفه به دوچرخه برای سفر های کوتاه در یک منطقه شهری و به عنوان جایگزینی برای وسایل حمل و نقل موتوری است که منجر به کاهش تراکم ترافیک ، سر و صدا و آلودگی هوا می شود.
میزان استفاده مردم از دوچرخه به عوامل متعددی مانند فصل ، دما ، وضعیت آب و هوا و ... بستگی دارد . در این پروژه قصد داریم مجموعه داده هایی را که مربوط به سیستم اشتراک گذاری دوچرخه می باشد ، بررسی نماییم و با استفاده از آن ها پیش بینی کنیم که با توجه به عواملی که داده شده است ، چند بار ممکن است که دوچرخه امانت گرفته شود .

۲. مجموعه داده1

مجموعه داده این سیستم ، توسط آقای هادی فنایی ترک تهیه شده است و از kaggle گرفته شده است . این مجموعه داده شامل 17381 داده است که اطلاعات مربوط به تعداد اجاره دوچرخه در 19 روز اول ماه داده شده است و با بررسی این اطلاعات باید تعداد اجاره دوچرخه از روز 20 ام تا پایان ماه را پیش بینی کنیم .این داده ها شامل 12 متغیربه شرح زیر می باشد:

|datetime|season|holiday|workingday|weather|temp|atemp|humidity|windspeed|casual|registered|count|
  • تاریخ و زمان اجاره دوچرخه 2

  • فصلی 3 که دوچرخه در آن اجاره داده شده است را با یک اعدد صحیح در بازه [1,4] نشان می دهد . بدین صورت که عدد 1 نماد فصل بهار ، عدد 2 نماد فصل تابستان ، عدد 3 نماد فصل پاییز و عدد 4 نماد فصل زمستان است .

  • تعطیل 4 بودن یا نبودن روز اجاره دوچرخه را نشان می دهد . اگر روز تعطیل باشد ، عدد 1 و در غیر این صورت عد 0 را نشان می دهد.

  • نشان دهنده کاری 5 یا غیر کاری بودن روز اجاره دوچرخه است . اگر جزو روز های کاری باشد ، عدد 1 و در غیر این صورت عدد 0 را نشان می دهد .

  • وضعیت آب و هوا 6 را با یک عدد صحیح در بازه [1,4] نشان می دهد . بدین صورت که عدد 1 نماد آب و هوای آفتابی ، عدد 2 نماد آب و هوای غبار آلود ، عدد 3 نماد آب و هوای برفی و عدد 4 نماد بارندگی سنگین است.

  • دما 7 بر حسب درجه سلسیوس

  • دمای ظاهری 8 برحسب درجه سلسیوس

  • درصد رطوبت نسبی 9

  • سرعت باد 10

  • تعداد افرادی که بدون ثبت نام 11 ، دوچرخه اجاره کرده اند

  • تعداد افرادی که برای اجاره دوچرخه ثبت نام 12 کرده اند

  • تعداد 13کل کسانی که دوچرخه اجاره کرده اند
    این 12 ویژگی برای داده ها ذکر شده است و ما باید با بررسی این داده ها بتوانیم پیش بینی کنیم که برای داده های با ویژگی ها جدید میزان استفاده از دوچرخه چقدر می باشد .
    در این قسمت دو راه وجود دارد :
    راه اول: پردازش اطلاعات را برای داده هایی که اجاره کننده ، ثبت نام کرده باشد و یا نکرده باشد را جدا انجام دهیم و نتایج را نیز جدا بدست آوریم .
    راه دوم : می توانیم به طور کلی تعداد اجاره دوچرخه را حساب کنیم و میان کسی که ثبت نام کرده است و کسی که ثبت نام نکرده است ، تفاوتی قائل نشویم .

  • اطلاعات کامل مجموعه داده

۳. کارهای مرتبط

این مساله از نوع یادگیری با ناظر است . این روش ، یک روش عمومی در یادگیری ماشین است که در آن به یک سیستم، مجموعه ای از جفت‌های ورودی – خروجی ارائه شده و سیستم تلاش می‌کند تا تابعی از ورودی به خروجی را فرا گیرد. یادگیری تحت نظارت نیازمند تعدادی داده ورودی به منظور آموزش سیستم است که به دو دسته تقسیم می شود:
تقسیم بندی14 : در این روش مقادیر ممکن خروجی را به صورت چند کلاس در نظر می گیریم . برای مثال بازه های 0 تا 20 ،20 تا 40 و ... . با توجه به کلاس ها، مقدار خروجی در هر کلاس قرار گرفت ، داده به آن کلاس تعلق می گیرد .
رگرسیون 15 :تحلیل رگرسیونی فن و تکنیکی آماری برای بررسی و مدل سازی ارتباط بین متغیر وابسته و متغیر مستقل بوده و هدف آن پیش‌‏بینی متغیر وابسته از روی متغیر و یا متغیرهای مستقل می‌‌باشد .

با توجه به توضیحات بالا ، اگر بخواهیم مشاهدات را در یک بسته محدود از برچسب ها دسته بندی کنیم یا به عبارت دیگر داده ها یا اشیا مشاهده شده را نام گذاری کنیم ، از روش تقسیم بندی استفاده می کنیم . اما اگر هدف این باشد که یک متغیر هدف پیوسته 16 را پیش بینی کنیم ، از روش رگرسیون استفاده می کنیم .
الگوریتم هایی که برای حل این مسئله استفاده می شوند از نوع رگرسیون هستند که در ادامه توضیح داده می شود:
رگرسیون خطی 17 : در این روش، خطی را مشخص می کنیم به طوری که مجموع فاصله نقاط تا آن خط مینیمم باشد . در این مسئله ، محور عمودی نمودار تعداد کرایه دوچرخه و محور افقی شماره دوچرخه می باشد و نقاط نمودار تعداد کرایه هر دوچرخه را نشان می دهد. خط مورد نظر به صورت زیر است:

در این جا بردار [X=[x1,x2,…,xn و [W=[w1,w2,…,wn را داریم . خط مورد نظر ما از رابطه زیر بدست می آید که در آن y مقادیر واقعی(یعنی تعداد دوچرخه ها) و XW خط است . حاصل این فرمول ، خطی است که مینیمم فاصله را تا تمام نقاط در رگرسیون دارد .

قطعه کد زیر مثالی از متدی در زبان برنامه نویسی پایتون را نشان می دهد که رگرسیون خطی را با بررسی ورودی ها محاسبه می کند :

...from sklearn import linear_model
...clf = linear_model.LinearRegression()
...clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
...clf.coef_

رگرسیون خطی-راسی 18 : در این روش همانند رگرسیون خطی به دنبال خطی هستیم که نقاط را به دو قسمت تقسیم کند و از نقاط مرزی کمترین فاصله را داشته باشد. با این تفاوت که علاوه بر پیدا کردن کمترین فاصله می خواهیم ضرایب خط یعنی W نیز کمترین مقدار را داشته باشد.بنابراین از فرمول زیر استفاده می کنیم:

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

رگرسیون خطی-راسی

قطعه کد زیر مثالی از متدی در زبان برنامه نویسی پایتون را نشان می دهد که با بررسی داده های ورودی ، رگرسیون خطی راسی را پیدا می کند.`

...from sklearn import linear_model
...clf = linear_model.Ridge (alpha = .5)
...clf.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
...clf.coef
...clf.intercept_ 

ماشین بردار پشتیبانی 19 :

یکی از روش‌های یادگیری بانظارت است که از آن برای طبقه‌بندی و رگرسیون استفاده می‌کنند . در این روش نقاط خروجی یعنی تعداد دوچرخه ها را در یک صفحه مختصات داریم و به دنبال خطی هستیم که نقاط خروجی را به دو دسته طوری تقسیم کند که فاصله نقاط مرزی تا خط حد اکثر باشد.
روش حل :
ما مجوعه داده های D آزمایش شامل n عضو(نقطه)را در اختیار داریم که به صورت زیر تعریف می شود:

هدف پیدا کردن ابرصفحه جداکننده با بیشترین فاصله از نقاط حاشیه ای است که نقاط با yi=1 را از نقاط باyi=-1 جدا کند. هر ابر صفحه می تواند به صورت مجموعه ای از نقاط که شرط زیر را ارضا می کند نوشت:

بردار W بردار نرمال است، که به ابرصفحه عمود است. ما می خواهیم و w,b را طوری انتخاب کنیم که بیشترین فاصله بین ابر صفحه های موازی که داده ها را از هم جدامی کنند، ایجاد شود. این ابرصفحه ها با استفاده از رابطه زیر توصیف می شوند.


و

شکل زیر این روش را نشان می دهد :
ماشین بردار پشتیبانی

در زبان پایتون ، متدی برای ماشین بردار پشتیبان وجود دارد که قطعه کد زیر مثالی از آن است``:

...from sklearn import svm
...X = [[0, 0], [2, 2]]
...y = [0.5, 2.5]
...clf = svm.SVR()
...clf.fit(X, y) 

جنگل تصادفی20 :
این الگوریتم از تعداد زیادی درخت تصمیم درست می‌شود که حالت خروجی به‌دست آمده از این درخت، منحصر‌به‌فرد است . از این الگوریتم هم برای داده‌های تقسیم بندی و هم داده‌های رگرسیون می‌توان استفاده کرد که با توجه به توضیحات قبلی برای این مسئله ، از نوع رگرسیون استفاده می کنیم .
در این الگوریتم ، تعداد زیادی درخت تصمیم21 با داده ها رسم می کنیم و حاصل عبارت زیر را برای هر درخت محاسبه می کنیم .

فرمول محاسبه برای انتخاب درخت تصمیم بهینه

در این فرمول ، Y مقدار واقعی و y مقداری است که با استفاده از درخت تصمیم بدست می آید . درختی که حاصل آن کمترین مقدار را داشته باشد به عنوان درخت تصمیم مسئله انتخاب می کنیم.
برای رسم درخت تصمیم ، ابتدا از بین ویژگی‌های داده‌های مسئله ، یک ویژگی را به عنوان شروع درخت تصمیم در‌نظر می‌گیریم . سپس با استفاده از ویژگی‌های دیگر داده ها، درخت تصمیم را تا رسیدن به برگ ها که جواب های مسئله هستند، ادامه می دهیم . بعد از مشخص شدن درخت تصمیم مسئله ، پاسخ داده های test را با استفاده از این درخت تصمیم بدست می‌آوریم .

درخت تصمیم

مهم ترین مزیت های استفاده از الگوریتم Random Forest :

  1. یکی از دقیق ترین الگوریتم‌های یادگیری در‌دسترس است که برای بسیاری از مجموعه داده‌ها یک طبقه بندی بسیار دقیق ارائه می‌دهد.

  2. برای مجموعه داده‌های بسیار بزرگ به‌خوبی کار می‌کند .

  3. تقریب خوبی در مورد این که کدام متغیر برای طبقه بندی مناسب است ارائه می‌دهد.

  4. این الگوریتم در مقایسه با الگوریتم رگرسیون خطی ، جواب های دقیق تری را می دهد . برای مثال ، تابع (log(x را با هر دو روش پیش بینی می کنیم .

    مقایسه الگوریتم جنگل تصادفی با رگرسیون خطی

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

    ...from sklearn.ensemble import RandomForestClassifier
    ...forest = RandomForestClassifier(n_estimators = 100)
    ...forest = forest.fit(train_data[0::,1::],train_data[0::,0])
    ...output = forest.predict(test_data)

  5. آشنایی با Random Forest

  6. آشنایی با درخت تصمیم

افزایش شیب22 :
یکی از الگوریتم های قدرتمند در زمینه ماشین های یادگیرنده است که در زمینه های رگرسیون ، تقسیم بندی و رتبه بندی کاربرد دارد . فرض کنید داده هایی به صورت (x1,y1),(x2,y2),… داریم و تابع (F(x با حداقل هزینه را داریم . اگر داشته باشیم :


بدست آوردت تابع h باعث بهبود الگوریتم می‌شود . در واقع اگر مقداری که تابع F می دهد با h جمع شود مقدار واقعی حاصل می شود. طبق رابطه بالا داریم :

تابع هزینه را به صورت زیر تعریف می‌کنیم :
تابع هزینه

می خواهیم مقدار عبارت زیر را با استفاده از تنظیم (F(xi ها مینیمم کنیم :

سپس تابع شیب منفی را که قرینه تابع h مورد نظر ما است به صورت زیر تعریف می‌کنیم :
تابع شیب منفی

و داریم :


تابع هزینه ، شیب منفی و h به صورت زیر حاصل می شود :

ارجاع به مقاله شماره 6

۴. آزمایش‌ها

از بین الگوریتم هایی که برای حل این مسئله ارائه شد ، دو مورد random Forest و Gradient Boosting با توجه به مزیت هایشان نسبت به الگوریتم های دیگر برای ارزیابی مسئله انتخاب شده اند . پیاده سازی این الگوریتم ها با استفاده از کتابخانه sklearn زبان پایتون انجام شده است . در این قسمت پس از پیاده سازی الگوریتم های فوق ، داده های train را جهت یادگیری ماشین می دهیم، سپس ماشین با استفاده از دانشی که بدست آورده ، تعداد اجاره دوچرخه برای زمان هایی که در داده های test داده شده است را پیش بینی می کند .
کد های پیاده سازی این الگوریتم در لینک زیر قرار دارد :

  • کد های پیاده سازی پیش بینی میزان استفاده از دوچرخه
    مجموعه داده های مسئله را از اینجا دانلود کنید و در کنار کدها قرار دهید . فایل RandomForest.py الگوریتم Random Forest را پیاده سازی می کند و پاسخ داده های test یعنی پیش بینی میزان استفاده از دوچرخه برای 10 روز آخر ماه را محاسبه می کند و نتیجه را در فایل RandomForest.csv ذخیره می کند . فایل GradientBoosting.py نیز الگوریتم Gradient Boosting را پیاده سازی می کند و مانند الگوریتم قبلی ، پاسخ داده های test را در Gradient Boosting.csv ذخیره می کند.
    بعد از به دست آوردن جواب های مسئله با استفاده از الگوریتم های فوق ، باید پاسخ ها را ارزیابی کنیم تا میزان خطای هر الگوریتم مشخص شود .
    با توجه به این که در مجموعه داده ها ، پاسخ داده های test را نداریم ، نمی توانیم مستقیما میزان خطا را محاسبه کنیم . به همین علت میزان خطا را با استفاده از داده های مجموعه train محاسبه می کنیم . در فایل RF_evaluate.py فایل RandomForest.csv که حاصل اجرای الگوریتم RandomForest برای این مسئله است را به عنوان ورودی می دهیم و میزان استفاده از دوچرخه را برای مجموعه داده های train محاسبه می کنیم . سپس این مقدار را با مقدار اصلی مقایسه می کنیم . همین کار را در مورد الگوریتم Gradient Boosting نیز با فایل GB_evaluate.py انجام می دهیم . میزان خطا را با فرمول زیر محاسبه می کنیم :

محاسبه میزان خطا

نتیجه میزان خطا برای دو الگوریتم فوق به صورت زیر است :

مقایسه میزان خطای الگوریتم ها

همان طور که از نتایج جدول مشخص است ، الگوریتم Random Forest میزان خطای کمتری نسبت به الگوریتم Gradient Boosting دارد و برای این مسئله مناسب تر است .

۵. کارهای آینده

۶. مراجع

[1] Fanaee-T, Hadi, and Gama, Joao, Event labeling combining ensemble detectors and background knowledge, Progress in Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg.
[2] Jimmy Du,Forecasting Bike Rental Demand , Rolland He, Zhivko Zhechev
[3] Yu-Chun Yin, Chi-Shuen Lee, and Yu-Po ,Demand Prediction of Bicycle Sharing Systems, Wong Stanford University
[4] Ford Rylander , Bo Peng and Jeff Wheeler , Bike Share Usage Prediction in London
[5] Andy Liaw and Matthew,Classification and Regression by randomForest
[6] Cheng Li ,A Gentle Introduction to Gradient Boosting
[7] Arnab Kumar Datta , Predicting bike-share usage patterns with machine learning
[8] Hanzhong Xu and Meng Meng , Bike Sharing Demand

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


  1. Dataset

  2. Date time

  3. Season

  4. Holiday

  5. Workingday

  6. Weather

  7. Temp

  8. Atemp

  9. Humidity

  10. Windspeed

  11. Casual

  12. Registered

  13. Count

  14. Classification

  15. Regression

  16. continuous target variable

  17. Linear regression

  18. Ridge Linear Regression

  19. Support vector machines

  20. Random Forest

  21. Decision Tree

  22. Gradient Boosting

تایید شده

باسلام. در مورد پروژه شما چند نکته را ذکر می‌نمایم:
1-بهتر بود مجموعه داده مورد استفاده خود را در قسمت آزمایش ذکر می‌نمودید.
2-شاید بهتر بود در قسمت کارهای مرتبط در ابتدا به پروژه‌های دیگری با ساختار مشابه پروژه خود (یعنی پیش بینی استفاده) اشاره می‌نمودید و سپس الگوریتم‌های مرتبط با موضوع را معرفی می‌نمودید.
3-در قسمت کارهای مرتبط و در ذیل هر عنوان که توضیح آن را ذکر نموده‌اید، لینکی مستقیم به وب‌سایت مرجع آن مطلب داده‌اید؛ شاید بهتر بود که بجای این کار از قسمت مراجع استفاده می‌نمودید و منبع مورد نظر خود را به شکل مرسوم در مقالات علمی شماره گذاری می نمودید و در انتهای مقاله در قسمت مراجع، آن مرجع را ذکر می نمودید.
4-در حد خیلی خلاصه بهتر بود که مثال‌هایی که از پیاده‌سازی در زبان پایتون آورده‌اید را توضیح می‌دادید. ضمناً این قسمت‌ها می‌توانند بطور کلی حذف شوند. چون نبودشان خدشه‌ای به اصل بحث و روند مقاله شما وارد نمی‌کند.
5-شاید بهتر می‌بود قسمتی از توضیحاتی که در بخش آزمایش‌ها آورده‌اید را (آن قسمت ها که به توضیح محتویات فایل‌های پایتون پرداخته‌اید) را در صفحه گیت‌هاب مرتبط با پروژه قرار می‌دادید تا افرادی که از طریق گیت‌هاب با پروژه شما آشنا می‌شوند در جریان جزئیات پیاده‌سازی شما قرار بگیرند.
6-نکته دیگر در مورد موارد نگارشی است که رعایت آن‌ها در ارائه مقالات از اهمیت ویژه‌ برخوردار است. کاراکترهایی مانند «.» یا «،» و از این دست، می‌بایست به کلمه قبل از خود اتصال داشته باشند و از کلمه بعد از خود به اندازه یک Space فاصله داشته باشند.
7-برخی فرمول‌ها که با سایز بزرگ و بصورت عکس در مقاله استفاده شده‌اند به نوعی چشم‌نوازی مقاله را مخدوش نموده‌اند. بهتر بود تا حد امکان از ادیتور خود بوته برای نوشتن آن‌ها استفاده می‌نمودید.
8-تقریباً تمامی مراجع مورد استفاده‌تان با فرمت صحیحی درج نشده‌اند و تاریخ و محل ارائه آن‌ها مشخص نشده است.
9-شماره گذاری عکسها را نیز فراموش نکنید.

موفق باشید

تایید شده

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

تایید شده

سلام. از زحماتی که برای پروژه کشیده اید ممنونم. در کل عملکرد خوبی داشتید. فقط به یک سری ایرادات و انتقادات از گزارش رو خواستم ذکر کنم.

  • تصاویر و جداول شماره گذاری نشده اند.

  • بهتر بود به جای استفاده از عکس برای جداول و فرمول ها از Markdown و LaTex استفاده می‌کردید.

  • در مورد الگوریتم ها توضیح کمی داده شده است و محتصرا فرمول های آن بررسی شده اند.

  • بهتر بود چند خط در مورد دلیل مزیت های برشمرده شده برای الگوریتم Random Forest می‌نوشتید.

  • به مزیت های الگوریتم Gradient Boosting اشاره کرده‌اید ولی درباره‌ی آن چیزی ننوشتده اید.

  • استفاده از داده های train شده به عنوان test کمی غیر استاندارد به نظر می‌رسد و ممکن است نتیجه را منحرف کند. بهتر بود بخشی از داده هارا قبل از train جدا می‌کردید و به عنوان test استفاده می‌کردید.

تایید شده

سلام
کار شما در این فاز خوب است.
به نکاتی که دوستان چه از نظر نگارشی و چه از نظر محتوایی گفته‌اند توجه کنید.
موفق باشید