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

۱. مقدمه

سیستم اشتراک گذاری دوچرخه یا سیستم دوچرخه عمومی، یک سرویس است که در آن دوچرخه در مدت زمان کوتاهی برای استفاده مشترک افراد در نظر گرفته می شود. در این سیستم، مردم می توانند دوچرخه را از ایستگاه های مختلف مانند ایستگاه 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 : در این روش، خطی را مشخص می کنیم به طوری که مجموع فاصله نقاط تا آن خط مینیمم باشد. در این مسئله، محور عمودی نمودار تعداد کرایه دوچرخه و محور افقی شماره دوچرخه می باشد و نقاط نمودار تعداد کرایه هر دوچرخه را نشان می دهد. خط مورد نظر به صورت زیر است:

y=({ w }_{ 1 }*{ x }_{ 1 })+({ w }_{ 2 }*{ x }_{ 2 })+...+({ w }_{ n }*{ x }_{ n })

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

{min }_{ W }{ ||{ X }_{ W }-y|| }^{ 2 }

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

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

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

{ min }_{ w }{ ||{ X }_{ w } }-y||^{ 2 }+a{ ||w|| }^{ 2 }

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

شکل 1- رگرسیون خطی-راسی

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

...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 عضو(نقطه)را در اختیار داریم که به صورت زیر تعریف می شود:

D={ \{ ({ x }_{ i },{ y }_{ i })\quad |\quad { x }_{ i }\in \quad { R }^{ p },{ y }_{ i }\in \{ -1,1\} \} }_{ i=1 }^{ n }

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

w.x-b=0

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

w.x-b=1

و
w.x-b=-1

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

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

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

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

P\quad =\quad \sum { ({ Y }_{ i }-{ y }_{ i }) }

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

شکل3- درخت تصمیم

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

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

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

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

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

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

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

    ...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 با حداقل هزینه را داریم . اگر داشته باشیم:

F({ x }_{ 1 })+{ h(x }_{ 1 })={ y }_{ 1 }
F({ x }_{ 2 })+{ h(x }_{ 2 })={ y }_{ 2 }
.
.
.
F({ x }_{ n })+{ h(x }_{ n })={ y }_{ n }

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

{ h(x }_{ 1 })={ y }_{ 1 }-F({ x }_{ 1 })

...

{ h(x }_{ n })={ y }_{ n }-F({ x }_{ n })

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

L(y,F(x))=\frac { { (y-F(x)) }^{ 2 } }{ 2 }

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

J=\sum _{ i }^{ }{ L({ y }_{ i } } ,F({ x }_{ i }))

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

-g\left( x_{ i } \right) =-\frac { \partial L({ y }_{ i },F({ x }_{ i })) }{ \partial F({ x }_{ i }) } ={ y }_{ i }-F({ x }_{ i })

و داریم:
F\left( x \right) =\frac { \sum _{ i=1 }^{ n }{ { y }_{ i } } }{ n }

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

L(y,F)\quad =\frac { 1 }{ 2 } { (y-F) }^{ 2 }\quad \quad \quad \quad \left| y-F \right| \le \delta

L(y,F)\quad =\delta (\left| y-F \right| -{ \delta }/{ 2 })\quad \quad \quad \quad \left| y-F \right| >\delta

ارجاع به مقاله شماره 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

رد شده

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

تایید شده

سلام
پروژه ی خوبی بود.
چند مورد به نظرم اومد که بگم:
بخش توضیح مسئله خوب و کامل بود.
بخش آزمایش ها میتوانست بهتر باشد، درباره ی کارهایی که در پیاده سازی انجام دادید مثل استخراج ویژگی ها و یا پیش پردازشی اگر انجام شده توضیحی داده نشده است، اینکه داده ها با چه فرایندی به ماشین یادگیری داده می شوند.
بهتر بود نمونه ای از داده ی درست و نادرست رو ارائه میدادید.
چه کارهایی برای بهینه سازی صورت گرفته؟ چون به ان اشاره ای نشده بود.
در کل خوب بود.
موفق باشید.
نمره 3.5

تایید شده

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

تایید شده

بهتر بود لینک هایی که در طول متن معرفی شده مثل اطلاعات کامل مجموعه داده همه یکجا در قسمت پیوندهای مفید معرفی می شدند.
با شماره گذاری سر فصل ها ارتباط بین آنها بهتر درک می شد.
به نظر می رسد قطعه کد های گذاشته شده برای بهتر کردن فهم هر قسمت گذاشته شده اند درحالی که چون توضیح خاصی برایشان داده نشده زیاد قابل فهم نیستند.
بهتر بود به جای اینکه برای بعضی سرفصل ها هیچ توضیحی داده نشده و فقط به صورت لینک از آنها استفاده شده توضیح کوتاهی داده می شد.
به جای "ارجاع به مقاله ی شماره ی 6" می توانستید از [6] استفاده کنید.
از نقاط قوت پروژه استفاده از دو الگوریتم و مقایسه ی نتایج بین این دو است.
غالبا فرمول ها کامل و قابل فهم توضیح داده شده اند.
استفاده ی مناسب از عکس ها متن را قابل فهم تر کرده.
ممنون از زحمت زیادی که بابت پروژه کشیدید. پروژه ی جالب و جدیدی بود

تایید شده

سلام
در این فاز تغییر زیادی نسبت به فاز قبل نداشتید. با توجه به کارهایتان در فازهای قبل انتظار بیشتری از شما داشتیم
موفق باشید