Python – رگرسیون خطی (Linear Regression)

رگرسیون

در یادگیری ماشین و مدل‌سازی آماری، واژه “رگرسیون” زمانی استفاده می‌شود که بخواهیم رابطه بین متغیرها را پیدا کنیم. این رابطه برای پیش‌بینی نتایج آینده استفاده می‌شود.

رگرسیون خطی

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

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

در مثال زیر، محور x نمایانگر سن و محور y نمایانگر سرعت است. ما سن و سرعت 13 خودرو را هنگام عبور از یک ایستگاه عوارض ثبت کرده‌ایم. بیایید ببینیم آیا داده‌های جمع‌آوری شده می‌توانند در رگرسیون خطی استفاده شوند:

مثال

ابتدا نمودار پراکندگی را رسم کنید:

import matplotlib.pyplot as plt

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

plt.scatter(x, y)
plt.show()

مثال ماژول scipy را وارد کنید و خط رگرسیون خطی را رسم کنید:

import matplotlib.pyplot as plt
from scipy import stats

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
  return slope * x + intercept

mymodel = list(map(myfunc, x))

plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

توضیح مثال

  • ماژول‌های مورد نیاز را وارد کنید:
import matplotlib.pyplot as plt
from scipy import stats
  • آرایه‌های x و y را ایجاد کنید:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
  • متدی را اجرا کنید که مقادیر کلیدی رگرسیون خطی را برمی‌گرداند:
slope, intercept, r, p, std_err = stats.linregress(x, y)
  • تابعی ایجاد کنید که از مقادیر شیب و عرض از مبدأ برای برگرداندن مقدار جدید استفاده کند:
def myfunc(x):
  return slope * x + intercept
  • هر مقدار از آرایه x را از طریق تابع اجرا کنید تا آرایه‌ای جدید با مقادیر جدید برای محور y به دست آورید:
mymodel = list(map(myfunc, x))
  • نمودار پراکندگی اصلی را رسم کنید:
plt.scatter(x, y)
  • خط رگرسیون خطی را رسم کنید:
plt.plot(x, mymodel)
  • دیاگرام را نمایش دهید:
plt.show()

R برای رابطه

مهم است که بدانید رابطه بین مقادیر محور x و مقادیر محور y چگونه است. اگر رابطه‌ای وجود نداشته باشد، رگرسیون خطی نمی‌تواند برای پیش‌بینی استفاده شود. این رابطه – ضریب همبستگی – با r نمایش داده می‌شود.

مقدار r از -1 تا 1 متغیر است، که 0 به معنی عدم رابطه و 1 (و -1) به معنی 100% رابطه است.

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

from scipy import stats

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

slope, intercept, r, p, std_err = stats.linregress(x, y)

print(r)

نتیجه -0.76 نشان می‌دهد که رابطه‌ای وجود دارد، هرچند کامل نیست، اما نشان می‌دهد که می‌توان از رگرسیون خطی برای پیش‌بینی‌های آینده استفاده کرد.

پیش‌بینی مقادیر آینده

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

مثال: بیایید تلاش کنیم سرعت یک خودرو 10 ساله را پیش‌بینی کنیم. برای این کار، نیاز به همان تابع myfunc() از مثال بالا داریم:

def myfunc(x):
  return slope * x + intercept

مثال پیش‌بینی سرعت یک خودرو 10 ساله:

from scipy import stats

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
  return slope * x + intercept

speed = myfunc(10)

print(speed)

این مثال سرعت 85.6 را پیش‌بینی می‌کند که می‌توانیم آن را از دیاگرام نیز ببینیم.

مناسب نبودن تطابق

بیایید مثالی بسازیم که در آن رگرسیون خطی روش مناسبی برای پیش‌بینی مقادیر آینده نباشد.

مثال این مقادیر برای محور x و y باید منجر به تطابق بسیار بدی برای رگرسیون خطی شوند:

import matplotlib.pyplot as plt
from scipy import stats

x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
  return slope * x + intercept

mymodel = list(map(myfunc, x))

plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

و مقدار r برای رابطه؟ مثال باید مقدار r بسیار پایینی دریافت کنید:

import numpy
from scipy import stats

x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]

slope, intercept, r, p, std_err = stats.linregress(x, y)

print(r)

نتیجه: 0.013 نشان می‌دهد که رابطه بسیار ضعیف است و به ما می‌گوید که این مجموعه داده برای رگرسیون خطی مناسب نیست.

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
JavaScript - رویدادها (Events)

JavaScript – رویدادها (Events)

رویدادهای HTML رویدادها در HTML، “اتفاقاتی” هستند که برای عناصر HTML رخ می‌دهند. این اتفاقات می‌توانند ناشی از کار...

بیشتر بخوانید
JavaScript - سازنده‌های شیء (Object Constructors)

JavaScript – سازنده‌های شیء (Object Constructors)

ساخت آبجکت با تابع سازنده (Object Constructor Function) برای ساخت چندین آبجکت مشابه، از تابع سازنده استفاده می‌شود. این...

بیشتر بخوانید
JavaScript - نمایش شیء (Object Display)

JavaScript – نمایش شیء (Object Display)

نحوه نمایش آبجکت‌ها در جاوااسکریپت هنگام نمایش یک آبجکت جاوااسکریپت به صورت مستقیم، خروجی معمولاً به شکل [object Object]...

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.