در درس بیست و دوم از آموزش رایگان یادگیری ماشین با پایتون می خواهیم در مورد رگرسیون خطی چندگانه (Multiple Linear Regression using Python) صحبت کنیم.
رگرسیون خطی
روشی پایهای و رایج برای تجزیه و تحلیل پیشبینی است. رگرسیون خطی به معنای استفاده از روشهای آماری برای بررسی و مدلسازی ارتباط بین یک متغیر وابسته و گروهی از متغیرهای مستقل است.
این مدلها به دو دسته تقسیم میشوند:
1- رگرسیون خطی تک متغیره یا ساده
2- رگرسیون خطی چندگانه
بیایید درباره استفاده از رگرسیون خطی چندگانه با پایتون صحبت کنیم.
رگرسیون خطی چندگانه سعی میکند تا رابطه بین دو یا چند متغیر مستقل و یک پاسخ را با قرار دادن یک معادله خطی بر روی دادههای موجود، مدلسازی نماید. گامهای انجام این نوع رگرسیون تقریباً مشابه رگرسیون خطی ساده است، اما تفاوت در ارزیابی آنهاست. میتوان از این روش برای درک اینکه کدام عامل، بیشترین تأثیر را بر خروجی پیشبینی شده دارد و چگونه متغیرهای مختلف با یکدیگر در ارتباط هستند، استفاده کرد.
در این مدل، Y به صورت زیر بیان میشود:
Y = b0 + b1 * x1 + b2 * x2 + b3 * x3 + …… bn * xn
که در آن، Y متغیر وابسته و x1, x2, x3, …… xn متغیرهای مستقل چندگانهای هستند که در نظر گرفته میشوند.
فرضیات اصلی مدل رگرسیون
- خطی بودن: رابطه میان متغیرهای وابسته و مستقل باید حالت خطی داشته باشد.
- همسانی واریانس: تغییرات خطاها باید ثابت باقی بمانند.
- نرمالیته چندمتغیری: رگرسیون چندگانه بر این فرض استوار است که باقیماندهها دارای توزیع نرمال هستند.
- نبود چندخطیگرایی: این مدل فرض میکند که در دادهها چندخطیگرایی به میزان کم بوده یا اصلاً وجود ندارد.
متغیرهای موهومی (Dummy Variable)
همانطور که میدانیم، در مدل رگرسیون چندگانه از دادههای دستهبندی شده زیادی استفاده میشود. بهکارگیری دادههای دستهبندی شده روش خوبی برای دربرگرفتن دادههای غیرعددی در مدل رگرسیون مربوطه است.
دادههای دستهبندی شده به مقادیری اشاره دارند که دستهها را نشان میدهند، مقادیری با تعداد ثابت و غیرمرتب، مثل جنسیت (مرد/زن). در مدل رگرسیون، این مقادیر میتوانند توسط متغیرهای موهومی نمایش داده شوند.
این متغیرها شامل مقادیری مانند ۰ یا ۱ هستند که وجود و عدم وجود مقادیر دستهبندی شده را نشان میدهند.
تله متغیر موهومی
تله متغیر موهومی شرایطی است که در آن دو یا چند متغیر به شدت با هم ارتباط دارند. به بیان ساده، میتوان گفت که یک متغیر میتواند از پیشبینی متغیر دیگر حدس زده شود. راهحل برای خروج از این تله این است که یکی از متغیرهای دستهبندی را حذف کنیم. پس اگر m متغیر موهوم وجود داشته باشد، در مدل از m-1 متغیر استفاده میشود.
D2 = D1 – 1
در اینجا D2, D1 متغیرهای موهوم هستند.
روشهای ساخت مدلها
– همهجانبه (All-in)
– حذف عقبگرد (Backward-Elimination)
– انتخاب روبه جلو (Forward Selection)
– حذف دوجانبه (Bidirectional Elimination)
– مقایسه امتیاز (Score Comparison)
روش حذف عقبگرد
گام اول: ابتدا یک سطح معناداری برای شروع مدل انتخاب کنید.
گام دوم: مدل کامل را با در نظر گرفتن تمامی پیشبینهای ممکن، بسازید.
گام سوم: پیشبینیکننده با بالاترین مقدار P را بررسی کنید. اگر P بیشتر از سطح معناداری (SL) باشد، به گام چهارم بروید؛ در غیر این صورت، مدل آماده است.
گام چهارم: این پیشبینیکننده را از مدل حذف کنید.
گام پنجم: مدل را بدون این متغیر مجدداً تنظیم کنید.
روش انتخاب روبه جلو
گام اول: یک سطح معناداری برای ورود به مدل تعیین کنید (مثلاً SL = 0.05).
گام دوم: تمام مدلهای رگرسیون ساده y~ x(n) را آزمایش کنید و مدلی را که کمترین مقدار P را دارد، انتخاب کنید.
گام سوم: این متغیر را حفظ کرده و تمام مدلهای ممکن را با اضافه کردن یک پیشبینیکننده دیگر به آنچه در حال حاضر دارید، امتحان کنید.
گام چهارم: پیشبینیکنندهای که کمترین مقدار P را دارد را در نظر بگیرید. اگر P کمتر از SL باشد، به گام سوم بازگردید؛ در غیر این صورت، مدل آماده است.
گامهای مورد نیاز در هر مدل رگرسیون خطی چندگانه
گام اول: آمادهسازی دادهها
- بارگذاری کتابخانههای مورد نیاز.
- وارد کردن مجموعه دادهها.
- رمزگذاری دادههای دستهای.
- اجتناب از تله متغیرهای موهوم.
- تقسیم مجموعه داده به بخشهای آموزشی و تست.
گام دوم: اعمال مدل رگرسیون خطی چندگانه روی مجموعه آموزشی
گام سوم: پیشبینی نتایج بر اساس مجموعه دادههای تست.
کد 1:
import numpy as np import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt def generate_dataset(n): x = [] y = [] random_x1 = np.random.rand() random_x2 = np.random.rand() for i in range(n): x1 = i x2 = i/2 + np.random.rand()*n x.append([1, x1, x2]) y.append(random_x1 * x1 + random_x2 * x2 + 1) return np.array(x), np.array(y) x, y = generate_dataset(200) mpl.rcParams['legend.fontsize'] = 12 fig = plt.figure() ax = fig.add_subplot(projection ='3d') ax.scatter(x[:, 1], x[:, 2], y, label ='y', s = 5) ax.legend() ax.view_init(45, 0) plt.show()
کد 2:
def mse(coef, x, y): return np.mean((np.dot(x, coef) - y)**2)/2 def gradients(coef, x, y): return np.mean(x.transpose()*(np.dot(x, coef) - y), axis=1) def multilinear_regression(coef, x, y, lr, b1=0.9, b2=0.999, epsilon=1e-8): prev_error = 0 m_coef = np.zeros(coef.shape) v_coef = np.zeros(coef.shape) moment_m_coef = np.zeros(coef.shape) moment_v_coef = np.zeros(coef.shape) t = 0 while True: error = mse(coef, x, y) if abs(error - prev_error) <= epsilon: break prev_error = error grad = gradients(coef, x, y) t += 1 m_coef = b1 * m_coef + (1-b1)*grad v_coef = b2 * v_coef + (1-b2)*grad**2 moment_m_coef = m_coef / (1-b1**t) moment_v_coef = v_coef / (1-b2**t) delta = ((lr / moment_v_coef**0.5 + 1e-8) * (b1 * moment_m_coef + (1-b1)*grad/(1-b1**t))) coef = np.subtract(coef, delta) return coef coef = np.array([0, 0, 0]) c = multilinear_regression(coef, x, y, 1e-1) fig = plt.figure() ax = fig.add_subplot(projection='3d') ax.scatter(x[:, 1], x[:, 2], y, label='y', s=5, color="dodgerblue") ax.scatter(x[:, 1], x[:, 2], c[0] + c[1]*x[:, 1] + c[2]*x[:, 2], label='regression', s=5, color="orange") ax.view_init(45, 0) ax.legend() plt.show()
رگرسیون خطی چندگانه یک تکنیک آماری است که برای بررسی ارتباط بین چند متغیر مستقل و یک متغیر وابسته به کار میرود. در پایتون، کتابخانه scikit-learn یک اجرای راحت از رگرسیون خطی چندگانه را از طریق کلاس LinearRegression ارائه میدهد. در اینجا یک نمونه برای نحوه استفاده از LinearRegression برای ساخت یک مدل رگرسیون خطی چندگانه در پایتون آورده شده است:
from sklearn.linear_model import LinearRegression import numpy as np # Assume you have independent variables X and a dependent variable y X = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]) y = np.array([1, 2, 3, 4]) # Create an instance of the LinearRegression class reg = LinearRegression() # Fit the model to the data reg.fit(X, y) # Print the coefficients of the model print(reg.coef_)
این فرآیند به ما ضرایب مدل رگرسیون خطی چندگانه را میدهد که برای پیشبینی متغیر وابسته بر اساس مقادیر جدید متغیرهای مستقل قابل استفاده هستند.
این نکته مهم است که مدل رگرسیون خطی باید با توجه به فرضیات خاصی مانند خطی بودن، همسانی واریانس، استقلال خطاها، نرمالیته خطاها و نبود چندخطیگرایی به کار رود. اگر این فرضیات برآورده نشوند، باید به فکر استفاده از روشهای دیگر یا تغییر دادن دادهها باشید.