به نام خدا
سلام، امیدوارم حالتون خوب باشه
توی این پست میخوایم به کمک یکی از الگوریتم های طبقه بندی یادگیری ماشین به نام KNN یا "K نزدیک ترین همسایه" و یک دیتاست درباره ی ویژگی ها و وضعیت ترافیک ها در موقعیت های مختلف که از سایت kaggle پیداش کردم بتونیم با کمک ویژگی هایی که توی این دیتاست هستن پیش بینی کنیم که یک ترافیک با توجه به ویژگی هایی که داره در چه حالتی هست(کم یا زیاد).
همیشه از قدیم میگفتن اگه میخوای بدونی فردی چه شکلیه و رفتارش چجوریه ببین با کیا میگرده و با چه کسایی رفیقه
توی الگوریتم KNN همین موضوع صدق میکنه وقتی میخوای یکی از سمپل های توی دیتاست رو با کمک این الگوریتم پیش بینی کنی به تعداد "K" تا از نزدیک ترین سمپل ها و نمونه های نزدیک به اون سمپل رو جمع آوری میکنی و اون موقع پیش بینی میشه که این سمپل هم یکی از اون هاست و لیبل(برچسب) هاشون یکی هست
الگوریتم KNN همونجور که گفتم اولین کاری که میکنه اینه که نزدیک ترین نمونه ها به اون دیتای جدید رو پیدا میکنه و اون ها رو رتبه بندی میکنه(براساس کمترین فاصله نسبت به نمونه جدید) بعدش K تای نزدیک ترین به اون رو انتخاب میکنه تا بتونه تشخیص بده که اون نمونه چه برچسبی میتونه داشته باشه.
و خب اندازه گرفتن فاصله ی نمونه ها تا نمونه و سپمل جدید رو هم با فاصله ی اقلیدسی(Euclidean distance) انجام میدن که مرسوم ترین روش هستش، و اگرنه چندین فاصله ی دیگه هم مثل فاصله های منهتن و مینکوفسکی وجود دارن و بعضی اوقات استفاده میشن.
ستون Time: این ستون و ویژگی نشون دهنده ی زمان و ساعت در طول روز هست و یک ویژگی بسیار مهم و تعیین کننده برای تعیین موقیت ترافیک هست
ستون Date: این ستون از نظر من خیلی قدرت تعیین کننده ای نداره و باید حذف بشه
ستون Day of the week: این یکی از ویژگی های مهم برای تعیین برچسب نهایی است و مانند اینکه ما میگیم جمعه ها معمولا ترافیک بیشتره و خیلی از برنامه هامون رو مطابق اون بهینه سازی میکنیم توی این پروژه هم همین کار رو داریم انجام میدیم
ستون car count: تعداد ماشین ها در خیابان رو نشون میده
ستون bike count: تعداد دوچرخه ها
ستون bus count: تعداد اتوبوس ها
ستون truck count: تعداد کامیون ها ی موجود در خیابان
ستون total: این ویژگی نشان دهنده ی جمع تعداد ماشین ها، دوچرخه ها، اتوبوس ها و کامیون ها هست
و متغیر وابسته به این ویژگی ها، traffic situation: این متغیر برچسب نهایی هست که سمپل ها با توجه ویژگی های بالا دریافت میکنن.
خب این دیتاست همونجور که شاهد بودید چند متغیر داشت که به صورت حرفی نوشته شده بودن و ما نمیتونم از این نوع متغیر ها به این صورت در برنامه استفاده کنیم، به همین خاطر باید به کمک Label Encoder از کتابخانه ی Sklearn این متغیر ها رو به صورت عددی دربیاریم و همچنین یک متغیر به نام Date داشتیم که باید حذف میشد، این کار رو هم با متد drop از کتابخانه ی pandas انجام میدیم.
1: اندازه گیری فاصله :نخست باید تابعی بسازیم که فاصله ی اقلیدسی رو محاسبه بکنه، برای اینکار تابع distance رو میسازیم و آرگومان های X_train و X_test رو بهش میدیم، این به این خاطر هست که تابع بتونه با استفاده از داده های آموزشی فاصله ی داده های تست تا اون ها رو اندازه بگیره.
2: پیش بینی: برای این کار باید یک تابع بنویسیم که با استفاده از فاصله هایی که از تابع قبل به دست آورده بتونه پیش بینی کنه که سمپل و نمونه ی تست برچسبش چیه
برای این کار اول باید فاصله ها رو از بزرگ به کوچک مرتب کنه و توی مرحله ی بعد به تعداد K (که یکی از آرگومان های ورودی تابع هست و کاربر باید اون رو وارد کنه) تا از دیتا هایی با کمترین فاصله نسبت به اون سمپل رو پیدا کنه بعدش باید برچسب اون ها رو جمع آوری کنه و بعدش ببینه که بیشترین تعداد برچسبی که توی این ها بوده چی بودن سپس اون برچسب که بیشترین تکرار رو بین نزدیک ترین دیتا ها به اون داشته رو به اون سمپل جدید نسبت بده.
3: ارزیابی مدل: برای اینکه بتونیم ببینیم مدلمون چقدر خوب کار کرده باید اون رو ارزیابی کنیم و دقت مدل رو بسنجیم
به همین علت تابعی به نام accuracy مینویسیم تا بتونه دقت مدل رو از ۱۰۰ درصد بسنجه
برای استفاده از این تابع ها باید آرگومان های خودمون از دیتاست رو بهش بدیم تا طبق اون دیتاست برای ما پیشبینی کنه
ابتدا تمام پیش بینی های مدل رو توی یه متغیر میریزیم و بعدش به به همراه y ها و متغیر های واقعی به تابع ارزیابی مدل میدیم تا برامون دقت مدل رو محاسبه کنه
این عدد نشان دهنده ی دقت بالای مدل هست
توی این مطلب تونستیم با کمک یه دیتاست که ویژگی های ترافیک و در نهایت وضعیت ترافیک رو به ما میده و الگوریتم k نزدیک ترین همسایه پیش بینی هایی انجام بدیم
فهمیدیم که الگوریتم knn چجوری کار میکنه و براساس اون کدش رو نوشتیم
موفق باشید