رگرسیون لجستیک در حالت دودویی، یک امتیاز خطی را با تابع سیگموید به احتمال مدل برای رخداد کلاس ۱ تبدیل میکند. با وجود واژه «رگرسیون» در نام، کاربرد این حالت پیشبینی مقدار پیوسته نیست. خروجی احتمال را میتوان با آستانه به دسته تبدیل کرد؛ این تصمیم را باید از خود محاسبه احتمال جدا نگه داشت.
سیگموید کدام قسمت را انجام میدهد؟
ابتدا z=w*x+b محاسبه میشود؛ سپس p=۱÷(۱+exp(−z)). برای z=۰، p برابر ۰٫۵ است. در حالت ریاضی، مقدار سیگموید برای ورودی محدود، بین صفر و یک قرار میگیرد. محاسبه رایانهای ممکن است در امتیازهای بسیار دور به صفر یا یک گرد شود. این عدد، برآورد مدل است و خودبهخود ثابت نمیکند فراوانی رخدادهای واقعی با آن برابر است.
امتیاز معلوم را به احتمال تبدیل کنیم
برای تمرین، وزن ۱٫۵ و بایاس منفی ۲ را خودمان انتخاب میکنیم؛ آنها از داده مشتری آموخته نشدهاند. جدول زیر فقط عبور ورودی از این فرمول است، نه نتیجه آموزش یا بنچمارک.
| x | امتیاز z | احتمال تقریبی کلاس ۱ |
|---|---|---|
| 0 | −۲ | ۰٫۱۱۹۲۰۳ |
| 1 | −۰٫۵ | ۰٫۳۷۷۵۴۱ |
| 2 | 1 | ۰٫۷۳۱۰۵۹ |
با آستانه ۰٫۵، تنها ردیف آخر کلاس ۱ میگیرد. با آستانه ۰٫۸، هیچکدام کلاس ۱ نمیگیرند. در این مقایسه وزنها و احتمالها عوض نشدهاند؛ فقط قاعده تصمیم بعد از مدل عوض شده است. مناسببودن آستانه به پیامد خطا و داده ارزیابی نیاز دارد.
یک گام آموزش را هم ببینیم
اکنون یک تمرین جدا داریم: x=۲، پاسخ مرجع y=۱، وزن آغازین ۰٫۵ و بایاس منفی ۱. امتیاز صفر و احتمال ۰٫۵ میشود. برای زیان دودویی بدون جریمه روی همین یک نمونه، گرادیان وزن (p−y)×x یعنی منفی ۱ و گرادیان بایاس p−y یعنی منفی ۰٫۵ است.
با نرخ ۰٫۱، وزن تازه ۰٫۶ و بایاس تازه منفی ۰٫۹۵ میشوند. احتمال تازه حدود ۰٫۵۶۲۱۷۷ و زیان این نمونه از حدود ۰٫۶۹۳۱۴۷ به ۰٫۵۷۵۹۳۹ میرسد. این یک گام روی یک مثال است؛ افت زیان همین نمونه شاهد تعمیم یا کیفیت یک طبقهبند آماده نیست.
کد قابل اجرا با سیگموید پایدارتر
import math
def sigmoid(z):
if z >= 0:
return 1/(1+math.exp(-z))
ez = math.exp(z)
return ez/(1+ez)
print([round(sigmoid(-2+1.5*x), 6) for x in [0, 1, 2]])
x, y, w, b, rate = 2.0, 1.0, 0.5, -1.0, 0.1
p0 = sigmoid(w*x+b)
gw, gb = (p0-y)*x, p0-y
w1, b1 = w-rate*gw, b-rate*gb
p1 = sigmoid(w1*x+b1)
print('new weights', w1, b1)
print('p before/after', p0, round(p1, 6))
print('loss before/after', round(-math.log(p0), 6), round(-math.log(p1), 6))
assert abs(w1-0.6) < 1e-12 and abs(b1+0.95) < 1e-12
assert abs(p1-0.5621765008857981) < 1e-12
assert sigmoid(-1000) == 0.0 and sigmoid(1000) == 1.0دو شاخه تابع، محاسبه exp با علامت نامناسب روی عدد بسیار بزرگ را دور میزنند. کد زیان را فقط برای نمونه متعادل همین تمرین حساب میکند؛ برای زیان عمومی از امتیازهای افراطی باید فرمول پایدار مناسب به کار رود. این فایل ابزار آموزش روی فایل واقعی یا سامانه عملیاتی نیست.
سه اشتباه در خواندن خروجی
- ۰٫۷۳ احتمال مدل برای کلاس تعریفشده است؛ درصد دقت کل مدل نیست.
- ضریب مثبت، شاهد علیت یک ویژگی نیست. تعریف و مقیاس ویژگیها در تفسیر مهماند.
- آزمون روی همان نمونه آموزش نمیتواند خطای آینده را نشان دهد.
برای فهم اختلاف برآورد و فراوانی واقعی، راهنمای کالیبراسیون احتمال را بخوانید. برای تفاوت هدف عددی و دستهای هم تعریف مسئله رگرسیون و طبقهبندی نقطه شروع مناسب است.
قدم بعد برای یک مسئله واقعی
پیش از هر تصمیم خودکار، کلاس ۱ و زمان مشاهده پاسخ واقعی را مشخص کنید. نمونه بینتیجه را منفی فرض نکنید. اگر مسئله شما ارجاع درخواست یا پاسخگویی است، چند نمونه مجاز و مرز ارجاع انسانی را برای بررسی با تیم اپرا آماده کنید؛ این تمرین ادعایی درباره الگوریتم داخلی محصولات ندارد.
فایل تمرین و منابع
دریافت کد کامل این تمرین؛ این فایل فقط از کتابخانه استاندارد پایتون استفاده میکند. ورودیهای آن ساختگی و برای بازتولید محاسبهاند؛ اجرای آموزشی آن نتیجه یک محصول یا مشتری را نشان نمیدهد.
تاریخ بررسی منابع: ۳ نوامبر ۲۰۲۶. منابع، مرجع روشاند؛ دادهها، اعداد و کد مثال برای همین راهنما طراحی شدهاند.
ادامه مسیر یادگیری
Softmax با مثال عددی — پس از حالت دودویی، تبدیل امتیازهای چند کلاس با Softmax را جدا بررسی کنید.