فکر کنم تو کل جهان اپیدمی شده که بعد از توضیح دادن رگرسیون خطی به عنوان اولین حوزه کاربرد ، تشخیص قیمت خونه رو مثال بزنند .
منم میخوام به عنوان اولین بلاگ پستی که قراره درباره داده کاوی توش بنویسم ، یه دیتاست معقولی رو معرفی بکنم و سعی بکنم باهاش کار بکنم.
اگه حقیقت رو بخواید ، اینجا بیشتر شبیه بوم نقاشی منه و دوست دارم مسیر پیشرفتم رو ذره ذره ثبت بکنم و البته الان چند تا پست درفت شده هم دارم درباره امنیت و تحلیل داده که یکم پیچیده تر هستند.
سعی میکنم این سری پست هایی که درباره تحلیل داده میخوام بنویسم یه روند صعودی از نظر پیچیدگی داشته باشه.
خیلی وقت ها ما مفاهیم زیادی را وارد مغزمون میکنیم و اصطلاحا یادمیگیریم ولی تا وقتی که خودمون دست به کار نشیم تو ذهنمون ثبت نمیشه . اگر این ثبت شدن همراه با بازخورد باشه ، به مراتب اثرش برای تو ذهن موندن بیشتر میشه . ویرگول برای من دقیقا مصداق همین موضوعه و ثبت میکنم و بازخورد میگیرم و رشدم رو مشاهده میکنم و این باعث میشه که هم انگیزه طی کردن این مسیر که حدودا از یک سال پیش شروع کردم بیشتر بشه و هم افرادی که تازه کارند به منابع بهتری دست پیدا بکنند . و مهمتر از همه اینکه به سمت کاربرد نزدیک بشیم و از فضاهای انتزاعی دور بشیم و کاری رو بکنیم که بیشترین ارزش افزوده رو داشته باشه.
گاهی ما با موضوعاتی مواجه میشیم که از لحاظ پیچیدگی در رده بالایی قراردارند ولی حقیقتی که وجود داره اینه که موضوعات پیچیده قابل تفکیک به موضوعات ساده هستند و اگر بتوانیم مسائل ساده را به خوبی حل بکنیم ، قطعا از پس حل مسائل پیچیده نیز برخواهیم آمد . و مسئله ای مانند پردازش تصویر همان رگرسیون لجستیک با ابعاد بالاتر است و پیچیدگی طولی پیدا کرده و نه عرضی.
من سعی کنیم از مفاهیم ساده شروع بکنم و با فیچر های کم شروع بکنیم و توی همین پست بتونیم فیچر هامون رو بیشتر بکنیم ( اگه مطلب خیلی طولانی بشه منتشر میکنم و نمیتونم دوباره فیچر های جدید رو امتحان بکنم )
همزمان با این نوشته در کولب ، نوت بوکش رو هم اجرا میکنم و کد ها رو به اشتراک میذارم. و انتهای نوشته لینکش رو میذارم.
بریم سراغ دیتاست!!
من همیشه به اولین جایی که برای پیدا کردن دیتاست سر میزنم کگل هستش و اغلب میتونم دیتاستی که میخوام رو پیدا بکنم و حتی سرچ کردن تو کگل از سرچ کردن تو گوگل هم نتایج بهتری داره.
بنابر عادت همیشگی ، تو کگل سرچ کردم و یه دیتاست خوب پیداکردم و لینکشو پایین میزارم .
تو این دیتاست فعلا برای سادگی ما از 5 تا فیچر که خودمون هم ارتباط منطقی بینشون رو میدونیم شروع خواهیم کرد و اگر دیدیم مدلمون دقت کافی رو نداره میریم سراغ فیچر های بیشتر و ترکیب کردن و ...
توضیح درباره ارتباط منطقی : منظورم از ارتباط منطقی یه ارتباطی مثل افزایش مساحت منجر به افزایش قیمت میشود ، حقیقت اینه که تو خیلی مسائل اصلا ارتباطات قابل کشف نیست مثلا نمیتونیم بگیم لزوما اگر مقدار ستون 15 سطر 45 عکسی که داریم بررسی میکنیم بیشتر باشه ، احتمال وجود گربه تو اون عکس بالامیره ( قبول دارم مثالی که زدم خیلی انتزاعی و دور از ذهن بود ولی مفهوم رو کاملا میرسونه و در آموزش اتفاقا این روش خیلی مرسومه) و اتفاقا بیشترین کاربرد داده کاوی زمانی هست که ما نمیتونیم ارتباطات منطقی پیدا بکنیم و همه چیز ضمنی بیان میشه.
خب ما طبق روش کریسپ میخوایم بریم جلو.
در واقع این روش یکی از معروفترین متدولوژی های مدیریت پروژه های داده کاوی هستش. و اگه قصد داشته باشیم در یک سازمان ، یک محصول مبتنی بر داده طراحی و اجرا بکنیم ، یکی از الزامات موفق انجام دادنش داشتن یک متدولوژیه . و انتخاب این متدولوژی هاتون هم به شدت بستگی به پروژه داره.
و اگه بیشتر بخواید درباره این متدولوژی ها بدونید کافیه سرچ کنید :
Data Science Project Management Methodologies
روش crisp در واقع سلسله مراتب انجام دادن یک پروژه داده کاوی رو برای ما به صورت سیستماتیک تشریح میکنه. و منم چون مدل معروفیه اینجا آوردمش. و حقیقت اینه که حتی اگه کسی به ما نمیگفت که اینجوری کار بکنید ، شاید همینجوری کار میکردیم. ولی کار سیستماتیک خیلی مهمه. اغلب باعث میشه نتیجه های بهتری بگیریم.
و لینک ویکیپدیاش رو هم میزارم که اگه خواستید کامل تر بدونید دربارش بخونید.
1 - فهم بیزینس و کسب و کار
ما تو مرحله اول باید یک مسئله مشخص و دقیقی داشته باشیم و بخوایم از ابزار های داده کاوی برای حلش استفاده بکنیم.متاسفانه این روز ها خیلی ها چون ابزار ها رو بلدند و روی مفاهیم و کاربرد هاش مطالعه ندارند حس میکنند داده کاوی بی فایده است.
به نظر من اگر این مرحله رو خیلی کم روش وقت بگذارید یه پروژه ای تحویل میدید که قطعا با روش های ساده تری میشد حلش کرد و یا این که مسئله اصلی و دغدغه اون سازمان نیست .و شما عملا هزینه و وقتتون رو تلف کردید. و خیلی شبیه طراحی بیزینس مدل ها برای شروع کسب و کاره . حتما باید از یه مدل ذهنی به یک نوشته تبدیل بشه.
برای مسئله ما شاید بشه توی یک خط خلاصش کرد ولی توی پروژه واقعی شامل خیلی چیزها میشه.
ما میخوایم قیمت خونه های جدید رو از روی قیمت خونه هایی که تو دیتاستمون هست و ترین کردیم ، تخمین بزنیم. کاری که یک متخصص معامله املاک توی 5 سال یاد میگیره رو میخوایم تو 3 دقیقه به کامپیوترمون یاد بدیم.
2 - فهمیدن داده ها
توی این مرحله ما بیشتر دست به کد میشیم و داده ها رو نگاه میکنیم و سعی میکنیم که بفهمیم ویژگی هایی که برای مدل سازی مهم هستند چی هستند.
اول داده ها رو وارد دیتافریممون میکنیم و یه نگاه بهشون میندازیم.
حتی اگر دیتاستمون در حدود گیگ هستش معمولا یه بخشی از داده ها رو با پانداس بررسی میکنیم چون دستورات sql یه مقدار برای ابتدای کار پیچیده هستش.
import pandas as pd df = pd.read_csv('data.csv') df.head()
مثلا صرفا یک لیست از اعداد رو هیچ وقت نمیشه از توش نکته مهمی استخراج کرد ولی اگر به ما میگن این اعداد سری زمانی یک سهام هستش ، اونوقت خیلی کار ها میشه باهاش کرد.
البته بحث جمع آوری داده ها هم میشه توی این بخش گنجوند ولی چون ما داده هامون آماده است بیشتر باید بریم بفهمیم که هر ستون معنی دقیقش چیه . مثلا توی همین داده های ما یه ستون به اسم floor وجود داره که خب دو مفهوم داره ، یکی این که ساختمون چند طبقه است و یک مفهوم دیگه این که خونه تو طبقه چندم آپارتمانه . باید حواسمون باشه که خوب بفهمیم که داده ها دارند به ما چی میگن.
موارد مربوط به خونه نسبتا واضحه و من 4 تا فیچر رو به صورت خطی ابتدا مدل میکنم و بعد برای بهتر شدن مدل رو غیر خطی میکنم و فیچر های بیشتری بهش اضافه میکنم.
لیست فیچرهایی که میخوام تو مدل اولیه استفاده بکنم : floor , bedrooms , bathtooms , sqft_living , yr_built هست که کاملا واضحه به ما دارند چی میگن . به ترتیب تعداد طبقات و اتاق و حمام و مساحت و سال ساخت رو دارند بیان می کنند.
3 - آماده سازی داده ها
من الان میخوام یه مدل با رگرسیون خطی ترین بکنم ، که التبه درست تر بود که قبل از این که بخوایم مدل رو بسازیم بخوایم هر فیچر رو بررسی بکنیم و تاثیرش روی قیمت رو بسنجیم و همبستگی رو حساب بکنیم و مواردی از این دست ولی چون دیتاست ما خیلی تمیزه ، نکته خاصی از توش در نمیاد و منم سعی میکنم این پست رو جوری بنویسم که خوانندگانش حوصلشون سر نره و این موارد رو توی نوت بوک کولب لحاظ خواهم کرد.
ولی یه مورد که حتما باید انجام بدم ، اینه که داده ها رو نرمال بکنم. و همرو بیارم توی بازه مشخصی که همه داده ها تاثیر یکسانی بزارن و فقط وزن ها نشون دهنده تاثیر هر پارامتر برای تخمین باشه و به روش های متعددی این کار انجام میشه. من در اینجا از روش min-max استفاده میکنم که فرمولش به صورت زیره :
برای نرمال کردن داده ها من فیچر ها رو توی متغیر x میریزم و بعد x رو نرمال میکنم.
x = df['bathrooms','bedrooms','floors','sqft_living'].copy() x.head()
from sklearn.preprocessing import minmax_scale x_scale = minmax_scale(x) x_scale.head()
4 - مدل سازی
برای این که پست خیلی طولانی نشه من خیلی سریع با sklearn مدلمون رو میسازم ، ولی حتما تو پست های بعدی رگرسیون رو کامل توضیح میدم و فرمول هاش رو هم ذکر میکنم.
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_scale,y)
من متغیر x رو نرمال کردم و داخل متغیر x_scale ریختم و از اون برای مدل سازی استفاده کردم.
ما مدلمون رو ساختیم ولی حقیقتا مدل خیلی رو هوا جواب میده بنابر این تو قسمت های بعدی در مورد ارزیابی مدل های پیش بینی صحبت میکنم و همچنین سعی میکنم مدل فعلی رو بهبود بدم.
برای اینکه ورودی بدیم و خروجی بگیریم هم میتونیم از دستور زیر استفاده بکنیم.
model.predict(input)
امیدوارم خسته کننده نبوده باشه.
این پست خیلی جذاب نبود ولی سعی میکنم دیتاست های جالب تر و جذاب تری رو برای پست های بعدی آماده بکنم.
این هم لینک کولب که تمام کد ها و ویژوال ها رو توش ببینید و احتمالا پستی که میخوام فیچر اضافه بکنم و روابط غیر خطی رو هم پوشش بدیم رو ادامه همین بنویسم.
ممنون که تا اینجا خوندید.