بله، واقعا 14 خط نیاز دارین تا رگراسیون خطی رو پیاده سازی کنین! (البته با کثیف کردن کد، کمتر از این هم میشه ولی نظافت مهمتره ((= ). خیلی گشتم برای یه آموزش ساده از کد رگراسیون خطی توی پایتون و هیچ جا توضیح جامعی واسش پیدا نکردم. پس لازم دونستم خودم یه مطلب براش بنویسم. از اینجا میتونین پست قبلیم که درباره مفهوم رگراسیون خطی هست رو بخونین!
خب! برای رسیدن به این نتیجه خارق العاده(!) چی نیاز داریم؟ پایتون، لایبرری های numpy , pandas matplotlib و sklearn و یه IDE که از jupyter notebook پشتیبانی کنه (مثل VS Code) و اندکی حوصله. از همه مهمتر، دیتابیس فروش بستنی بر حسب دما که اینجا قرارش دادم (=
قبل از شروع کار اجازه بدین درباره لایبرری های مورد نیاز یه توضیح بدم. اینجا نمیتونم مفصل هر کدوم رو توضیح بدم و اگه خودتون باهاشون آشنا بشین خیلی بهتره. درواقع مهمترین ابزارها توی یادگیری ماشین همین لایبرریا هستن. نامپای (NumPy) یه لایبرری برای کار با بردار ها و ماتریس هاست. یعنی به کمک نامپای میتونین ماتریس های مختلفی بسازین، عملیات های مختلفی روشون انجام بدین و خلاصه هرچیزی که برای تحلیل ماتریس لازم دارین. لایبرری پانداز (Pandas) برای کار با دیتافریم ها و خوندن و نوشتن دیتا توی دیتافریم هست. پس ارتباط با دیتای برنامه رو، پانداز برامون فراهم میکنه. لایبرری بعدی مت پلات لیب (Matplotlib) هست که برای رسم نمودار های مختلف به کارمون میاد و یه خروجی تصویری بهمون تحویل میده. برای اینکه این تصاویر بتونن نمایش داده بشن باید IDEتون بتونه فایل های ipynb یا همون نوت بوک های ژوپیتر رو بخونه (اگه با VS Code کار میکنین فقط اکستنشن Jupyter رو براش نصب کنین!). در نهایت لایبرری اس کی لرن (sklearn) رو نیاز داریم که برامون تمام الگوریتم رگراسیون خطی رو زده و ما فقط اجراش میکنیم! (لازم نیس چرخ رو دوباره اختراع کنیم که! (= ) برای نصبشون از pip استفاده میکنیم:
pip install numpy matplotlib sklearn pandas
خب با فرض اینکه همه ی نیازمندی ها رو نصب کردین، میریم سراغ کد. قبل از توضیح هر بخش، میخوام کلیت کد رو توضیح بدم که قراره چه اتفاقی بیفته! یه دیتافریم داریم که مثل یه تابع، یه مقادیری رو به مقادیر دیگه نسبت داده. دقیقتر بگم نمونه هایی از دمای هوا و میزان فروشی که بستنی فروشی توی اون دما داشته. برنامه ما به این دیتافریم نگاه میکنه و الگوریتمش رو کشف میکنه و ابزاری رو دراختیارمون قرار میده که بتونیم باهاش هرمقدار دلخواهی رو پیشبینی کنیم. پس توی کد 4 مرحله داریم: 1- خوندن دیتافریم 2- تبدیل کردنش به فرمتی که برای متدهای رگراسیون خطی قابل استفاده باشه 3- ایجاد خط 4- تست کردن برنامه و نمایش نمودار
قبل از هرکاری لایبرری های مورد نیاز رو ایمپورت میکنیم. احتمالا با دستور import آشنایی دارین ولی کلیدواژه as ممکنه براتون جدید باشه. as فقط اسم لایبرری رو داخل برنامه تغییر میده. مثلا به جای استفاده از ()pandas.read_csv مینویسیم ()pd.read_csv . خیلی ساده تر و تمیزتر! اوکی، بریم سراغ ایمپورت کردنا:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
خب. باید دیتافریم رو بخونیم و بخش هاییش رو جدا کنیم. لایبرری پانداز ابزار خوندن دیتافریم از فایل رو در اختیارمون میده. فرمت مورد استفاده برای دیتافریم csv هست که یه نوع دیتافریمه که توش مقادیر با کاما ( , ) از هم جدا شدن و در هر خط یه نمونه وجود داره. خط اول هم اسم هر ستون رو مشخص میکنه. توی این دیتافریم دو ستون دما و فروش رو داریم که نمودارش این شکلیه:
به کمک این تابع از لایبرری پانداز، دیتافریم رو میخونیم و توی یه متغیر به اسم df ذخیره میکنیم:
df = pd.read_csv('database.csv')
اگه دوست داشتین میتونین این متغیر df رو پرینت کنین و ببینین که خیلی مرتب دیتا رو توی خودش جا داده! و یا میتونین اسم ستون مثل Sales رو بعد از df بنویسین و اون رو پرینت بگیرین. اینجوری:
print(df.Sales)
که این خروجی رو به ما میده:
output: 0 193 1 210 2 324 3 318 4 407 5 415 6 403 7 410 8 519 9 445 10 543 11 609 Name: Sales, dtype: int64
همونطور که میبینین تمام محتویات ستون Sales رو برامون با اندیس نمایش داده. نمایش خوشگل و مرتبیه اما هنوز قابل استفاده نیست (= اون خط آخر اضافیه و به اندیس هم نیازی نداریم. پس میتونیم به کمک values فقط مقادیر رو استخراج کنیم:
print(df.Sales.values)
که خروجیش میشه:
output: [193 210 324 318 407 415 403 410 519 445 543 609]
آهاا ! این شد یه چیزی! (= اما هنوزم قابل استفاده نیست! چون کلاس رگراسیون خطی که ایمپورت کردیم از ما فقط یه آرایه دو بعدی (ماتریس) ورودی میگیره و آرایه الانیمون یه بعدیه (برداره). اما مشکلی پیش نمیاد و ما میتونیم همین مقادیر رو به صورت آرایه دوبعدی بنویسیم. یعنی اینجوری:
output: [[193] [210] [324] [318] [407] [415] [403] [410] [519] [445] [543] [609]]
برای رسیدن به این فرم از دیتا، فقط کلیدواژه (1,1-)reshape رو به بخش قبلی اضافه میکنیم؛ ینی اینجوری:
print(df.Sales.values.reshape(-1,1))
حالا این دو ستون دما و فروش رو توی دوتا متغیر ذخیره میکنیم تا بعدا بتونیم به تابع موردنیاز پاس بدیم. اینها همون مقادیری هستن که برنامه اونا رو بررسی میکنه و الگوریتم رو ازشون کشف میکنه. به این صورت:
X_train = df.Temperature.values.reshape(-1,1)
Y_train = df.Sales.values.reshape(-1,1)
خب. دیتامون حاضر شد. حالا فقط باید متدهای مورد نیاز برای خود الگوریتم رگراسیون خطی رو فراهم کنیم. از کلاس LinearRegression یه نمونه به اسم regressor میسازیم تا استفاده ازش ساده تر بشه. این نمونه (یا آبجکت) تمام متدهای رگراسیون خطی رو در اختیارمون قرار میده:
regressor = LinearRegression()
حالا این آبجکت باید ارتباط بین دما و فروش رو توی دیتا کشف کنه. متد fit دیتاهای موردنیاز رو از ما میگیره و ارتباط رو کشف میکنه و خط مورد نظر رو میسازه. به این صورت:
regressor.fit(X_train,Y_train)
حالا به تنها متدی که نیاز داریم، متدیه که از ما ورودی بگیره و پیشبینی رو خروجی بده! ینی این متد:
regressor.predict()
این متد هم یه آرایه دوبعدی ورودی میگیره. پس یه متغیر برای تست میسازیم و مقادیر دلخواهی رو توش میذاریم. به این صورت:
X_test = [[21],[13],[25]]
حالا این متغیر رو به تابع پردیکت پاس میدیم و خروجیش رو توی یه متغیر دیگه میریزیم و پرینت میکنیم:
Y_test = regressor.predict(X_test)
print(Y_test)
و خروجی به ما این مقادیر رو میده:
output: [[468.13244315] [229.99061191] [587.20335877]]
خب! تا اینجاش که خوب به نظر میاد! ((= حالا بیاین به کمک نمودار بررسی کنیم که این مقادیر درست هستن یا نه! همونطوری که گفتم، برای رسم نمودار از لایبرری مت پلات لیب استفاده میکنیم. متد scatter میتونه دوتا ورودی بگیره(ایکس و ایگرگ) و نمودار اونها رو برای ما رسم کنه. قبل از هرچی نمودار خود دیتافریم رو رسم میکنیم:
plt.scatter(X_train,Y_train)
که این خروجی رو به ما میده:
و به کمک متد plot هم میتونیم میتونیم تست هامونو رو نمایش بدیم. من رنگش رو تغییر دادم و کمی بزرگترش کردم تا مشخص باشه:
plt.plot(X_test,Y_test,'o',ms=10,color='red')
تابع پیچیده ای به نظر میاد، اما کارکرد ساده ای داره. این تابع به طور خودکار نقاط رو به هم وصل میکنه،(تفاوتش با متد قبلی همینه) پس 'o' رو گذاشتم که فقط نقاط رو نمایش بده، با ms (که مخفف marker size هست) سایز نقاط رو بزرگ کردم و رنگ هم مشخصه. خروجی به این صورت درمیاد:
واو! تا اینجا هم فوق العاده به نظر میاد! حالا بیاین اون بخش 'o' رو حذف کنیم تا نقاط به هم وصل بشن و خروجی رو ببینیم:
plt.plot(X_test,Y_test,ms=10,color='red')
و خروجی رویایی:
تبریک میگم شما اولین کد یادگیری ماشینتون رو افتتاح کردین!
(درضمن برای اینکه این نمودار های کیوت براتون خروجی داده بشن، کافیه خط ()plt.xkcd رو به کدتون اضافه کنین(((= )