قیمت خانه‌ای با دو اتاق چند است؟ روش رگرسیون

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

زمانی که به دنبال پیدا کردن رابطه ای بین خروجی با ورودی هستیم ، به این حالت یادگیری با نظارت یا supervised learning می‌گوییم. رگرسیون خطی یک مدل یادگیری با نظارت است. در یادگیری با نظارت مدل با ورودی‌ها و خروجی‌های مرتبط با آن آموزش می‌بیند و پس از آموزش دیدن قابلیت پیش‌بینی خروجی با یک ورودی جدید که تا به حال آن را ندیده است را خواهد داشت.

در مسئله رگرسیون یک معادله خط داریم. زیرا وقتی قیمت‌ها را نگاه می‌کنیم متوجه می‌شویم که مساحت خانه Area در یک عدد ثابت b1 ضرب می‌شود و حاصل آن با یک عدد ثابت b0 جمع می‌شود و قیمت خانه (price) بدست می‌آید.

بنابراین یک معادله ریاضی به شرح زیر داریم:

برای اینکه بتوانیم معادله خط بالا را بعنوان مدل خود در نظر بگیریم، باید b0 و b1 را پیدا کنیم. آنگاه خواهیم دانست که خط ما چه خطی خواهد بود. درواقع ما نقطه‌های متعددی داریم (داده‌ها) و تمایل داریم که خطی رسم کنیم که تا حدممکن از اکثر نقاط عبور کند. حال اگر بتوانیم معادله آن خط را پیدا کنیم، مسئله ما حل شده است. زیرا در این صورت دیتای ورودی (x) را به آن معادله می‌دهیم و خروجی را دریافت می‌کنیم.

مدل خطی:

مدل خطی، مدلی است که یک خط با شیب ثابت داریم و آن خط زمانی مطلوب است که اکثریت نقطه‌ها روی آن یا کمترین فاصله از آن را داشته باشند.

معادله خطی در دو نوع simple و multiple وجود دارند. در اکثر مواقع از حالت multiple استفاده می‌کنیم . زیرا تعداد متغیرهای مستقل ما زیاد هستند. متغیرهای مستقل در این مسئله همان عواملی هستند که قیمت خانه را تعیین می‌کنند. برای مثال ، تعداد اتاق، متراژ، سن خانه، تعداد اتاق خواب.

در ادامه خواهیم دید که محاسبه این ضرایب که از حل معادلات چند مجهولی بدست می‌‌آید توسط کتابخانه Scikitlearn به راحتی انجام می‌شود.

لینک دانلود دیتاست+

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

  • ‘Avg. Area Income’:
    • درآمد متوسط ساکنان منطقه
  • ‘Avg. Area House Age’:
    • عمرمتوسط خانه‌ها
  • ‘Avg. Area Number of Rooms’:
    • متوسط مساحت اتاق‌های هر خانه
  • ‘Avg. Area Number of Bedrooms’:
    • متوسط مساحت اتاق خواب‌های هر خانه
  • ‘Area Population’:
    • جمعیت شهر
  • ‘Price’:
    • قیمت فروخته شده هر خانه
  • ‘Address’:
    • آدرس هر خانه

ابتدا کتابخانه‌های مورد نظر را ایمپورت می‌کنیم:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
--> USAhousing = pd.read_csv('USA_Housing.csv')
--> USAhousing 
--> USAhousing.head()
--> USAhousing.info()
--> USAhousing.describe()
--> USAhousing.columns

در مجموع 7 ستون داریم. یکی مربوط به قیمت است و شش مورد دیگر (به جز آدرس) مواردی هستند که روی قیمت ستون آخر (قیمت تاثیر می‌گذارند).

EDA (Exploratory Data Analysis):

در ادامه می‌خواهیم نگاهی به دیتایی که در دست داریم داشته باشیم:

sns.pairplot(USAhousing)
--> sns.distplot(USAhousing['Price'],bins=20,kde=False)
--> sns.distplot(USAhousing['Price'], hist=True, kde=True, bins=20,\
 color = 'darkblue',hist_kws={'edgecolor':'black'}, kde_kws={'linewidth': 4})

Training a Linear Regression Model

می‌خواهیم مدل خود را تحت آموزش قرار دهیم. اولین کاری که باید انجام دهیم این است که فیچر‌ها را در متغیری به نام X قرار دهیم و target را که در این مسئله قیمت خانه است را در متغیر y قرار دهیم. ستون موسوم به address را حذف می‌کنیم. زیرا فقط شامل متن آدرس هر خانه می‌باشد و در روش regression تاثیری ندارد.

X = USAhousing[['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms','Avg. Area Number of Bedrooms', 'Area Population']]
y = USAhousing['Price']

Train Test Split

حال داده‌ها را به دو دسته training set و test set تقسیم می‌کنیم. فرآیند آموزش داده‌ها توسط training set انجام می‌شود و برای ارزیابی مدل از test set استفاده می‌کنیم.

from sklearn.model_selection import train_test_split
--> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state = 101)

--> print('X_train',X_train )

Creating and Training the Model

با دستورات زیر مدل خود را آموزش می‌دهیم:

--> from sklearn.linear_model import LinearRegression
--> lm = LinearRegression()
--> lm.fit(X_train,y_train)

Model Evaluation

حال با استفاده از ضرایب یه ارزیابی مدل خود می‌پردازیم:

# print the intercept
print(lm.intercept_)
--> # print the coefficients
print(lm.coef_)

intercept که در کد بالا آن را محاسبه کردیم، همان عرض از مبدا (b0) است.

با استفاده از دستور زیر همه ضرایب را در یک ستون نمایش می‌دهیم:

coeff_df = pd.DataFrame(lm.coef_,X.columns,columns=['Coefficient'])
coeff_df

منظور از coefficient همان ضرایب هستند(اگر تنها یک ضریب داشته باشیم، همان شیب است)

Predictions from our Model

حال با استفاده از test set کیفیت پیش‌بینی مدل خود را ارزیابی می‌کنیم:

predictions = lm.predict(X_test)
predictions

Single Sample Prediction

می‌خواهیم فقط مشخصات یک خانه را بدهیم و قیمت آن را پیش‌بینی کنیم:

my_sample=[68500,5.9,6.9,3.4,3600]
sample_array = np.array(my_sample).reshape(1,-1)
#reshape to clolumn as the input cant be row
sample_array
--> 
Price= lm.predict(sample_array)
print('price is:',Price)

حال توسط دستور زیر مقدار y_test را با مقادیر پیش‌بینی شده، مقایسه می‌کنیم:

plt.scatter(y_test,predictions)
--> sns.distplot((y_test-predictions),bins=50);

به طور کلی مقایسه مقدار خطای پیش‌بینی و جواب‌های واقعی این است که ببینیم آیا مدل ما به درد می‌خورد یا نه.

Regression Evaluation Metrics

سه مورد از رایج‌ترین متریک‌ها برای ارزیابی مدل رگرسیون موارد زیر هستند:

Mean Absolute Error (MAE) is the mean of the absolute value of the errors:

درک این خطا از بقیه موارد آسان‌تر است. زیرا بیانگر میزان خطای میانگین است.

Mean Squared Error (MSE) is the mean of the squared errors:

این مورد از MAE رایج‌تر است. زیرا این روش خطاهای بزرگ را بهتر نشان می‌دهند و در دنیای واقعی تمایل به استفاده از آن بیشتر است.

Root Mean Squared Error (RMSE) is the square root of the mean of the squared errors:

این مورد از دو مورد قبلی رایج‌تر است. به دلیل زیر (؟)

RMSE is even more popular than MSE, because RMSE is interpretable in the “y” units.

با استفاده از دستورات زیر میزان خطاها را بهتر بررسی خواهیم کرد:

from sklearn import metrics
print('MAE:', metrics.mean_absolute_error(y_test, predictions))
print('MSE:', metrics.mean_squared_error(y_test, predictions))
print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, predictions)))

***

منابع:

1- گیت هاب + (مونا حاتمی)

2- دیتا ست : +

3- گیت هاب+(شهرام مرادپور)

4- کانال یوتوب آموزش دیتا ساینس (مونا حاتمی)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.