رگرسیون خطی رابطهای از شکل «عرض از مبدأ + مجموع وزندار ویژگیها» را به داده برازش میدهد. در سادهترین حالت، یک ورودی داریم و یک خط پیدا میکنیم که مجموع مربع اختلاف پیشبینی و مقدار مشاهدهشده را کم کند. برای فهم فرایند، اینجا سه نقطه را دستی برازش میدهیم و همان محاسبه را با پایتون بازتولید میکنیم.
از تعریف مسئله تا فرمول خط
اگر هنوز نمیدانید خروجی باید عدد باشد یا دسته، راهنمای تفاوت رگرسیون و طبقهبندی را بخوانید. این مطلب یک گام جلوتر است: فرض میکنیم هدف عددی و ورودی قابل استفاده تعریف شده و میخواهیم ضرایب را حساب کنیم. مثال، واحد تجاری ندارد و درباره رابطه واقعی میان تماس و فروش ادعایی نمیکند.
مدل را y_hat = a*x + b بنویسیم. a شیب و b عرض از مبدأ است. برای هر نقطه، باقیمانده برابر y منهای y_hat خواهد بود. مربعکردن باعث میشود اختلافهای مثبت و منفی همدیگر را خنثی نکنند. در همین تعریف، خطای بزرگتر سهم بیشتری از جمع میگیرد؛ اگر یک ثبت اشتباه بسیار دور از بقیه باشد، ابتدا منشأ آن را بررسی کنید.
سه نقطه را با دست حساب کنیم
| x | y |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 3 | 5 |
میانگین x برابر ۲ و میانگین y برابر ۳ است. مجموع (x−۲)² برابر ۲ و مجموع (x−۲)(y−۳) برابر ۳ میشود. پس a=۳÷۲=۱٫۵ و b=۳−۱٫۵×۲=۰ است. این فرمول برای یک ویژگی، عرض از مبدأ آزاد و کمترین مربعات بدون جریمه به کار میرود؛ فرمول همه مدلهای خطی یا همه نوع محدودیت نیست.
| x | پیشبینی | باقیمانده | مربع باقیمانده |
|---|---|---|---|
| 1 | ۱٫۵ | ۰٫۵ | ۰٫۲۵ |
| 2 | 3 | −۱ | 1 |
| 3 | ۴٫۵ | ۰٫۵ | ۰٫۲۵ |
جمع مربع خطا یا SSE برابر ۱٫۵ و میانگین مربع خطا روی همین سه نقطه برابر ۰٫۵ است. این عدد «دقت ۵۰ درصد» نیست. اگر واحد هدف دقیقه باشد، واحد MSE دقیقه مربع خواهد بود؛ در مثال ما هیچ واحد واقعی تعیین نشده است.
کد قابل اجرا، بدون نصب بسته
x = [1.0, 2.0, 3.0]
y = [2.0, 2.0, 5.0]
xbar, ybar = sum(x)/len(x), sum(y)/len(y)
sxx = sum((v-xbar)**2 for v in x)
if sxx == 0:
raise ValueError('x must vary for a unique slope')
a = sum((u-xbar)*(v-ybar) for u, v in zip(x, y))/sxx
b = ybar-a*xbar
pred = [a*u+b for u in x]
sse = sum((v-z)**2 for v, z in zip(y, pred))
print('slope/intercept', round(a, 6), round(b, 6))
print('predictions', pred)
print('SSE/MSE', sse, sse/len(x))
assert abs(a-1.5) < 1e-12 and abs(b) < 1e-12
assert abs(sse-1.5) < 1e-12خروجی شیب ۱٫۵، عرض از مبدأ صفر و پیشبینیهای ۱٫۵، ۳ و ۴٫۵ است. اگر همه xها برابر باشند، مخرج صفر میشود و شیب یکتا از این فرمول به دست نمیآید؛ کد آن حالت را صریح متوقف میکند. داده این قطعه ثابت و معتبر است و کد، ورودی عمومی یا فایلهای بزرگ را اعتبارسنجی نمیکند.
برازش با توان پیشبینی فرق دارد
برای x=۴ خط، عدد ۶ میدهد. اما چون فقط بازه ۱ تا ۳ را دیدهایم، این خروجی برونیابی است؛ شاهد درستبودن رابطه بیرون آن بازه نیست. حتی خطایی که روی سه نقطه حساب کردیم خطای آموزش است. برای ارزیابی، نمونههای مستقل و متناسب زمان پیشبینی لازماند. بخش بیشبرازش و تعمیم روش نگاهکردن به این فاصله را توضیح میدهد.
تمرین مفید این است که y آخر را از ۵ به ۸ تغییر دهید، ضرایب را دوباره به دست بیاورید و میزان جابهجایی خط را ثبت کنید. سپس بررسی کنید آیا تغییر ورودی واقعی است یا خطای ثبت. بهترشدن SSE پس از دستکاری داده، بهتنهایی پیشرفت مدل نیست.
این دانش در انتخاب راهکار چه کمکی میکند؟
وقتی یک پیشنهاد هوش مصنوعی عدد پیشبینی میکند، تعریف خروجی، بازه معتبر ورودی و خطای داده تازه را بخواهید. نام مدل جای این شواهد را نمیگیرد. برای مسئله پاسخگویی و پیگیری مشتری، ابتدا ورودی و خروجی موردنیاز را بنویسید و در مسیر خدمات اپرا بررسی کنید چه راهی مناسب است؛ این آموزش معرفی سرویس پیشبینی عددی اپرا نیست.
فایل تمرین و منابع
دریافت کد کامل این تمرین؛ این فایل فقط از کتابخانه استاندارد پایتون استفاده میکند. ورودیهای آن ساختگی و برای بازتولید محاسبهاند؛ اجرای آموزشی آن نتیجه یک محصول یا مشتری را نشان نمیدهد.
تاریخ بررسی منابع: ۳ نوامبر ۲۰۲۶. منابع، مرجع روشاند؛ دادهها، اعداد و کد مثال برای همین راهنما طراحی شدهاند.
ادامه مسیر یادگیری
گرادیان نزولی با مثال عددی — اینجا ضرایب را مستقیم پیدا کردیم؛ برای دیدن مسیر تکراری تغییر یک پارامتر، این راهنما را بخوانید.