Portal
Logistic Regression: Sigmoid və Log Loss ilə Modelin Sıfırdan Qurulması

Logistic Regression: Sigmoid və Log Loss ilə Modelin Sıfırdan Qurulması

Bu yazıda sinifləndirmənin təməl alqoritmlərindən biri olan Logistic Regression modelindən danışacağıq.

Bu gün daha çox mürəkkəb modellər barədə eşidirik: Neural Networks, LLM-lər, Generative AI və s. Amma real problemlərin həllində illərdir istifadə olunan və bu gün də aktuallığını qoruyan modellərdən biri məhz Logistic Regression-dır.

Bəs daha güclü modellərin mövcud olduğu bir dövrdə Logistic Regression niyə hələ də bu qədər çox istifadə olunur?

Çünki real biznes problemlərində məqsəd yalnız düzgün proqnoz vermək deyil. Bəzən modelin həmin qərara necə gəldiyini izah edə bilmək də nəticə qədər önəmlidir.

Məsələn, kredit riski qiymətləndirilərkən modelin sadəcə “bu müştəri riskli” deməsi kifayət etmir. Bu nəticəyə hansı amillərin daha çox təsir etdiyini də bilmək istəyirik — gəlir səviyyəsi, mövcud borclar, əvvəlki kredit tarixçəsi, yoxsa başqa göstəricilər?

Logistic Regression-un ən böyük üstünlüklərindən biri məhz budur. Model nisbətən sadə quruluşa malikdir, sürətli öyrədilir və nəticələrini izah etmək asandır. Sütunların ağırlıqlarına baxaraq onların modelin qərarına hansı istiqamətdə təsir etdiyini görə bilirik.

Ona görə də sadə model həmişə zəif model demək deyil. Praktikada problemin tələblərinə uyğun olaraq daha sadə və izah edilə bilən model, daha kompleks bir modeldən çox zaman daha məqsədəuyğun seçim olur.

Daha kompleks model ≠ daha yaxşı model.

İndi isə Logistic Regression-un bu qərarları necə verdiyini sıfırdan anlamağa çalışaq.

Gələn mailin spam olub-olmadığını, ya da şişin xoşxassəli və ya bədxassəli olduğunu müəyyən etmək kimi məsələlər sinifləndirmə problemi kimi qəbul edilir. Bunları 1 və 0 kimi işarələyə bilərik: müəyyən şərtlər ödəndikdə 1 (məsələn, bədxassəli), ödənmədikdə isə 0 (xoşxassəli).

Çoxsinifli sinifləndirmə də mövcuddur:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Bu yazıda biz ikili (binary) sinifləndirmə məsələsinə fokuslanacağıq. Aşağıdakı problemə baxaq:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Fərz edək ki, əlimizdə belə bir data var. Bu problemə əvvəlcə Xətti Reqressiya məntiqi ilə yanaşaq:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Göründüyü kimi, sadə xətti bir model ilə 2 sinfi bir-birindən ayıra bildik. Təsadüfi olaraq 0.5 həddini götürüb reqressiyadan alınan nəticələri bu ədədlə müqayisə etməklə dataları aydın şəkildə sinifləndirə bilərik.

İndi isə fərqli bir data toplusu təsəvvür edək: şiş böyüdükcə onun bədxassəli olma ehtimalı da artır. Sadə bir nümunə üzərində baxaq:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Bu halda modelimizi yeniləməli olacağıq. Məsələn, aşağıdakı kimi bir model əldə edə bilərik:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Tutaq ki, bu xətlə uğurlu bir xətti reqressiya əldə etdik. Amma nəticələri 0.5 ilə müqayisə edərək ayırmağa çalışdıqda, bəzi 1 dəyərlərinin xəttin 0.5-dən aşağı hissəsinə düşdüyünü və səhvən 0 kimi sinifləndirildiyini görürük — halbuki onların həqiqi qiyməti 1-dir. Deməli, xətti funksiya ilə yaxşı bir sinifləndirmə əldə edə bilmirik və hipotez funksiyamızı dəyişməli oluruq.

İkili sinifləndirmədən (0 və 1) danışdığımız üçün bizə 0 ilə 1 arasında dəyişən bir funksiya lazımdır.

Bunun üçün sigmoid funksiyasından istifadə edəcəyik.

Sigmoid funksiyası z-dən asılıdır. Bizim hipotez funksiyamız isə X inputlarından və onların ağırlıqlarından asılıdır. Ona görə z-nin yerinə uyğun ifadəni qoyuruq:

Funksiyanın qrafiki aşağıdakı kimi olur:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Gördüyümüz kimi, z müsbət sonsuzluğa doğru getdikcə nəticə 1-ə, mənfi sonsuzluğa doğru getdikcə isə 0-a yaxınlaşır.

Fərz edək ki, hesablama apardıq və hipotezin dəyəri 0.8 çıxdı. Bu o deməkdir ki, 80% ehtimalla y=1 olacaq. Buna ehtimal kimi baxsaq, əslində X və w məlum olduqda y=1 olma ehtimalını hesablamış oluruq. Bunu belə ifadə edə bilərik:

Eyni şəkildə y=0 olma ehtimalını da hesablaya bilərik və hər iki ehtimalın cəmi 1 olmalıdır:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Əvvəlki nümunəyə qayıtsaq: y=1 olma ehtimalı 0.8 idisə, y=0 olma ehtimalı 0.2 olacaq.

Bunu daha əvvəl bəhs etdiyimiz Bernoulli düsturuna uyğun olaraq ümumi formada da yaza bilərik:

Yuxarıda threshold (hədd) dəyəri olaraq 0.5 seçdik, amma bunu problemin xarakterinə uyğun olaraq dəyişmək mümkündür. Threshold-u 0.5-dən 0.6-ya qaldırdıqda modelin bir nümunəni y=1 kimi qiymətləndirməsi üçün daha yüksək ehtimal tələb olunur — nəticədə model daha az sayda nümunəyə y=1 deyəcək.

z-nin qrafikinə nəzər salsaq, hipotez funksiyasını 0.5 ilə müqayisə etmək əslində z-ni 0 ilə müqayisə etmək deməkdir. Qrafikə baxaq:

Bunu düstur şəklində belə yazaq:

Decision boundary

Tutaq ki, hesablama nəticəsində ağırlıqları belə tapmışıq:

w₀=-3, w₁=1, w₂=1. Bu, əslində -3+x₁+x₂≥0 olduqda y=1 deməkdir. Başqa sözlə, x₁+x₂≥3 olduqda y=1 olacaq. Qrafik üzərində baxaq:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Yuxarıdakı hipotez funksiyasında yalnız bir nümunə üçün hesablama etdik — sadəcə ilk müşahidənin 1 ya da 0 olduğunu tapdıq. Bəs nümunə sayı çox olduqda nə etməliyik? Yəni bir neçə nümunənin eyni anda 1 və ya 0 olma ehtimalından danışırıqsa, düstur aşağıdakı formanı alacaq:

Likelihood function

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

İndi bu funksiyanın qrafikini çəkək:

Bu dəfə göründüyü kimi biz maksimallaşdırma aparmalıyıq. Buna görə Gradient Ascent metodundan istifadə edəcəyik. Düsturu yazaq:

Hesablamaları asanlaşdırmaq üçün L funksiyasının loqarifmasını götürürəm. Bu zaman düstur aşağıdakı şəkli alır:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Buna əsasən cost funksiyasını belə yaza bilərik:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Sigmoid funksiyasının törəməsi

Bunu da belə yaza bilərik:

Deməli,

İndi də loqarifmanın törəməsinə baxaq:

Artıq l funksiyasının törəməsinə baxa bilərik:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Törəməni açsaq, aşağıdakı nəticəni alırıq:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

Mötərizəni açıb hesabladıqda aşağıdakı nəticə alınır:

Şəkli tam ölçüdə görmək üçün Enter düyməsinə basın və ya üzərinə klikləyin

İndi əldə etdiyimiz nəticələrə əsasən Python kodunu yazaq:

df=pd.read_csv("datasets/diabetes.csv")

X=df.drop("Outcome", axis=1)
X = np.c_[np.ones(X.shape[0]), X]

n, m=X.shape
y=np.array(df['Outcome']).reshape(-1, 1)
w=np.zeros((m, 1))
alpha=0.01
epochs=1000

def sigmoid_function(X, w):

    y_pred= 1/(1 + np.exp(-np.dot(X, w)))

    return y_pred
    
for epoch in range(epochs):
    
    y_pred=sigmoid_function(X, w)

    J=(-1/n) * ( np.dot(y.T, np.log(y_pred)) + np.dot((1-y).T, np.log(1-y_pred)) )
    
    dw=((-1/n)* np.dot(X.T, (y-y_pred)))

    w=w-alpha*dw

İndi isə öyrəndiyimiz w ağırlıqlarından istifadə edərək modelin proqnozlarını hesablayaq:

def accuracy(y, y_pred):
    return (y==y_pred).mean()

y_pred=sigmoid_function(X, w)

y_pred=(y_pred >= 0.5).astype(int)

print(accuracy(y, y_pred))

İndi isə eyni işi sklearn kitabxanasının LogisticRegression sinfi ilə görək:

from sklearn.linear_model import LogisticRegression

X=df.drop("Outcome", axis=1)
y=df["Outcome"]

log_reg=LogisticRegression()
log_reg.fit(X, y)

y_pred=log_reg.predict(X)

print(accuracy_score(y, y_pred))

print(accuracy_score(y, y_pred))

Yekun olaraq, Logistic Regression sinifləndirmə problemlərində geniş istifadə olunan və nəticəni ehtimal şəklində təqdim edən əsas maşın öyrənməsi alqoritmlərindən biridir. Model xətti kombinasiyanın nəticəsini sigmoid funksiyası vasitəsilə 0 ilə 1 arasında bir ehtimal dəyərinə çevirir və müəyyən edilmiş threshold əsasında yekun sinfi təyin edir. Modelin uyğun ağırlıqları öyrənməsi üçün Log Loss (Binary Cross-Entropy) cost funksiyası minimallaşdırılır, ağırlıqlar isə Gradient Descent vasitəsilə addım-addım yenilənir. Logistic Regression sadə və izah edilə bilən quruluşuna baxmayaraq, ehtimal əsaslı yanaşması və aydın decision boundary yarada bilmə qabiliyyəti sayəsində sinifləndirmə problemlərində bu gün də geniş şəkildə istifadə olunur.

Bu məqaləni bəyən

Bəyən 0 nəfər bəyənib

Bu məqaləni paylaş

1 nəfər bu məqaləni oxuyub

Öyrənməyə başlamağa hazırsan? Karyera istiqamətlərinə bax
WhatsApp-da bizə yazın