فائزه ثقفی
فائزه ثقفی
خواندن ۴ دقیقه·۹ ماه پیش

پیش بینی کرایه تاکسی با استفاده از شبکه عصبی

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

پروژه کوچیک امروز یه مثال ساده برای رگرسیون هست. اینکه ما بیایم با استفاده از یه شبکه عصبی چند لایه روی دیتاست NYCTaxiFares کرایه تاکسی رو پیش بینی کنیم.

درواقع این دیتاست NYCTaxiFares یه داده جدولی هست که فیچرهاش مشخصات یه سفر درون شهری مثل زمان سوارکردن مسافر و پیاده کردنش یا مثلا مختصات سوار کردن و پیاده کردنش هست و لیبلش هم کرایه دریافتی هست.


برای شروع کار بیاید importهامون رو انجام بدیم :

import torch import torch.nn as nn import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline

همونطور که میدونین torch و قسمت torch.nn و numpy و pandas که از ملزومات کار با شبکه های عصبی و کار با دیتاست ها هستند. شاید بعدها یه سری اموزش برای numpy و pandas گذاشتم.

کتابخونه matplotlib هم که برای رسم نمودار و ایناس. اون تیکه آخر matplotlib inline % هم برای اینه که پلاتها در محیط نوت بوک درست نمایش داده بشن.

مرحله بعد لود کردن دیتاسته. برید از آدرسی که بالا گذاشتم فایل csv اش رو دانلود کنین. اگه کگل فیلتر بود (چون گاهی نصفه نیمه بالا میاد) خودتون سرچ کنین و فایلش رو دانلود کنین.پیشنهاد منم اینه فایلش رو بیارید کنار کدتون. از جای دیگه لود نکنین . کثیف کاریه . بعد با پانداس دیتافریم رو لود کنین:

df = pd.read_csv('NYCTaxiFares.csv')

حالا اگه بخوایم یه ذره بازی کنیم با این دیتافریممون، میتونیم یه ذره دستکاریش کنیم. مثلا بیایم فاصله دو نقطه سوار شدن و پیاده شدن مسافر رو با استفاده از مختصاتش حساب کنیم و به جدول اضافه کنیم. چون اینجوری ربط کرایه دریافتی با مسافت طی شده بهتر مشخص میشه. به اینکار میگن feature engineering

برای محاسبه فاصله دو نقطه روی کره زمین از فرمول هاورساین استفاده میکنیم :

Haversine formula
Haversine formula

پیاده سازیش هم به این صورته :

def haversine_distance(df, lat1, long1, lat2, long2): r = 6371 # average radius of Earth in kilometers phi1 = np.radians(df[lat1]) phi2 = np.radians(df[lat2]) delta_phi = np.radians(df[lat2]-df[lat1]) delta_lambda = np.radians(df[long2]-df[long1]) a = np.sin(delta_phi/2)**2 + np.cos(phi1) * np.cos(phi2) * np.sin(delta_lambda/2)**2 c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a)) d = (r * c) # in kilometers return d

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

df['dist_km'] = haversine_distance(df,'pickup_latitude', 'pickup_longitude', 'dropoff_latitude', dropoff_longitude') df.head()

و اینجوری دیتافریممون این شکلی میشه:

ستون dist_km رو اضافه کردیم به جدول
ستون dist_km رو اضافه کردیم به جدول

اگه بیایم یه ()df.info روی دیتاست بگیریم. میبینیم که تایپ ستون pickup_datetime از جنس object هست. درواقع به شکل string ذخیره شده. میتونیم اون رو تبدیل به datetime پانداس کنیم و خیلی اطلاعات دیگه ازش بگیریم. مثل کدوم روز هفته بوده؟ صبح بوده یا بعدازظهر؟ اختلاف زمانی utc با شهر نیویورک رو حساب کنیم و از این قبیل کارها.

اینجوری میتونیم ستون pickup_datetime رو از string به datetime تبدیل کنیم:

df['pickup_datetime'] = pd.to_datetime(df['pickup_datetime'])

خروجی ای که میبینم به این صورته که تفاوتش با حالت string مشخصه :


حالا میتونیم از داده های این ستون یه سری اطلاعات جدید به دست بیاریم. مثلا اینکه مشخص کنیم اختلاف زمانی سوار شدن مسافر رو درست کنیم. چون زمان اینجا utc هست با ساعت نیویورک حدود 4 ساعت اختلاف داره:

df['EDTdate'] = pd.to_datetime(df['pickup_datetime']) - pd.Timedelta(hours=4)

بعد مثلا میتونیم ساعت رو مشخصا در یه ستون جدا ذخیره کنیم:

df['Hour'] = df['EDTdate'].dt.hour

یا مثلا بگیم زمان سوار شدن مسافر صبح بوده یا عصر:

df['AMorPM'] = np.where(df['Hour']<12,'am','pm')

برای اینکار میایم از np.where استفاده میکنیم. خیلی روشهای دیگه هم هست ولی این روش هم باحال و سرراسته. اینجوریه که ارگومان اول شرطه مونه . الان چون df['Hour'] مقداری که داره 24 ساعته است میتونیم بگیم اگه کمتر از 12 هست یعنی قبل از ظهره و مقدار df['AMorPM'] در اون سطر رو بذار am و اگه بیشتره بعد از ظهره. پس بذار pm.

کار باحال بعدی ای که میتونیم انجام بدیم اینه روز هفته رو دربیاریم:

df['Weekday'] = df['EDTdate'].dt.strftime(&quot%a&quot)

اینو دیگه حوصله ندارم . برید خودتون از داکیومنت پانداس بخونید. البته متدهای ساده تری هم توی همین پانداس هست مثل day_of_weak.

در نهایت دیتاستمون این شکلی شد:


خب تا اینجای کار یه سری feature engineering انجام دادیم و با داده های ورودیمون بازی کردیم . کلا 80 درصد پروژه های ماشین لرنینگ تمیزکاری و هندل کردن دیتاس که برای اینکار لازمه که توی کار با numpy و pandas مهارت داشته باشین.

خب دیگه بسه . بریم سراغ قسمت بعدی :)


شبکه عصبییادگیری ماشینیپایتونپایتورچ
برنامه نویس پایتون، عاشق کتاب، فیلم، روزنوشته و ... محمدحسین
شاید از این پست‌ها خوشتان بیاید