Python – رگرسیون لجستیک (Logistic Regression)

رگرسیون لجستیک چیست؟

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

در ساده‌ترین حالت، دو نتیجه ممکن وجود دارد که به آن باینومیل (Binomial) گفته می‌شود. به عنوان مثال، پیش‌بینی این که آیا یک تومور بدخیم است یا خیر. در حالت‌های دیگر که بیشتر از دو نتیجه وجود دارد، به آن چند جمله‌ای (Multinomial) گفته می‌شود. یک مثال رایج از رگرسیون لجستیک چند جمله‌ای پیش‌بینی کلاس یک گل زنبق در میان سه گونه مختلف است.

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

نحوه عملکرد

در پایتون، ما ماژول‌هایی داریم که کار را برای ما انجام می‌دهند. ابتدا باید ماژول NumPy را وارد کنیم.

import numpy

متغیرهای مستقل را در X ذخیره کنید و متغیر وابسته را در y.

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

# X نمایانگر اندازه تومور به سانتی‌متر است.
X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)

# توجه: X باید به شکل ستونی تغییر شکل داده شود تا تابع LogisticRegression() کار کند.
# y نمایانگر این است که آیا تومور بدخیم است یا خیر (0 برای "خیر"، 1 برای "بله").
y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

برای استفاده از یک روش از ماژول sklearn، باید این ماژول را نیز وارد کنیم:

from sklearn import linear_model

از ماژول sklearn، ما از متد LogisticRegression() برای ایجاد یک شیء رگرسیون لجستیک استفاده خواهیم کرد. این شیء دارای متدی به نام fit() است که مقادیر مستقل و وابسته را به عنوان پارامترها می‌پذیرد و شیء رگرسیون را با داده‌هایی که رابطه را توصیف می‌کند، پر می‌کند:

logr = linear_model.LogisticRegression()
logr.fit(X, y)

اکنون یک شیء رگرسیون لجستیک داریم که آماده است تا تعیین کند آیا تومور بر اساس اندازه تومور بدخیم است یا خیر:

# پیش‌بینی کنید که آیا تومور با اندازه 3.46 میلی‌متر بدخیم است:
predicted = logr.predict(numpy.array([3.46]).reshape(-1,1))
print(predicted)

نتیجه:

[0]

ما پیش‌بینی کرده‌ایم که تومور با اندازه 3.46 میلی‌متر بدخیم نخواهد بود.

ضریب (Coefficient)

در رگرسیون لجستیک، ضریب تغییر مورد انتظار در لاگ-اودز (log-odds) داشتن نتیجه به ازای تغییر واحد در X است. این به طور مستقیم درک آن‌چنان ساده‌ای ندارد، بنابراین بیایید از آن برای ایجاد چیزی که معنادارتر باشد، یعنی “اودز” (odds)، استفاده کنیم.

مثال:

import numpy
from sklearn import linear_model

# تغییر شکل داده شده برای تابع لجستیک.
X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)
y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

logr = linear_model.LogisticRegression()
logr.fit(X, y)

log_odds = logr.coef_
odds = numpy.exp(log_odds)

print(odds)

نتیجه:

[4.03541657]

این به ما می‌گوید که با افزایش اندازه تومور به ازای هر میلی‌متر، اودز بدخیم بودن تومور 4 برابر افزایش می‌یابد.

احتمال (Probability)

مقادیر ضریب و برش (intercept) می‌توانند برای یافتن احتمال بدخیم بودن هر تومور استفاده شوند.

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

def logit2prob(logr, x):
  log_odds = logr.coef_ * x + logr.intercept_
  odds = numpy.exp(log_odds)
  probability = odds / (1 + odds)
  return probability

توضیح تابع:

  • برای یافتن لاگ-اودز (log-odds) برای هر مشاهده، باید فرمولی مشابه آنچه در رگرسیون خطی داریم، ایجاد کنیم و ضریب و برش را استخراج کنیم:
log_odds = logr.coef_ * x + logr.intercept_
  • برای تبدیل لاگ-اودز به اودز، باید لاگ-اودز را نمایی کنیم:
odds = numpy.exp(log_odds)
  • اکنون که اودز را داریم، می‌توانیم آن را به احتمال تبدیل کنیم با تقسیم آن بر 1 به علاوه اودز:
probability = odds / (1 + odds)

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

مثال:

import numpy
from sklearn import linear_model

X = numpy.array([3.78, 2.44, 2.09, 0.14, 1.72, 1.65, 4.92, 4.37, 4.96, 4.52, 3.69, 5.88]).reshape(-1,1)
y = numpy.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

logr = linear_model.LogisticRegression()
logr.fit(X, y)

def logit2prob(logr, X):
  log_odds = logr.coef_ * X + logr.intercept_
  odds = numpy.exp(log_odds)
  probability = odds / (1 + odds)
  return probability

print(logit2prob(logr, X))

نتیجه:

[[0.60749955]
 [0.19268876]
 [0.12775886]
 [0.00955221]
 [0.08038616]
 [0.07345637]
 [0.88362743]
 [0.77901378]
 [0.88924409]
 [0.81293497]
 [0.57719129]
 [0.96664243]]
  • توضیح نتایج:

    • برای مثال، احتمال بدخیم بودن تومور با اندازه 3.78 سانتی‌متر 61% است.
    • برای تومور با اندازه 2.44 سانتی‌متر، احتمال بدخیم بودن آن 19% است.
    • برای تومور با اندازه 2.09 سانتی‌متر، احتمال بدخیم بودن آن 13% است.

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
Python - محدود کردن داده (MongoDB Limit)

Python – محدود کردن داده (MongoDB Limit)

Python MongoDB محدود کردن نتایج برای محدود کردن نتایج در MongoDB، از متد limit() استفاده می‌کنیم. متد limit() یک...

بیشتر بخوانید
Python - بروزرسانی (MongoDB Update)

Python – بروزرسانی (MongoDB Update)

به‌روزرسانی یک رکورد برای به‌روزرسانی یک رکورد یا سند در MongoDB، از متد update_one() استفاده می‌کنیم. پارامتر اول متد...

بیشتر بخوانید
Python - حذف کالکشن (MongoDB Drop Collection)

Python – حذف کالکشن (MongoDB Drop Collection)

حذف کالکشن شما می‌توانید یک جدول یا کالکشن در MongoDB را با استفاده از متد drop() حذف کنید. مثالحذف...

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

نظرات

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

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