Texnologiyalari va komunikatsiyalarini



Download 196,5 Kb.
Sana02.07.2022
Hajmi196,5 Kb.
#732966
Bog'liq
5-amaliy ish


O’ZBEKISTON RESPUBLIKASI AXBOROT TEXNOLOGIYALARI VA KOMUNIKATSIYALARINI RIVOJLANTIRISH VAZIRLIGI

Muhammad Al-Xorazmiy nomidagi Toshkent axborot texnologiyalari universiteti Samarqand filiali


AMALIY ISH_5
Mashinali o’qitish fanidan
201– 18 – guruh talabasi Bajardi :Isodinov S
Tekshirdi : Axrorov M


Samarqand -2021

Master Machine Learning: Logistic Regression From Scratch With Python

Logistik regressiya - siz duch keladigan eng oddiy tasniflash algoritmi. Bu o'tgan hafta o'rganilgan chiziqli regressga o'xshaydi, ammo burilish bilan. Bu haqda biroz ko'proq ma'lumot.


Bugun logistika regressiya algoritmini noldan boshlab amalga oshirish va sozlash orqali qo'llaringizni bulg'aysiz. Bu "noldan" keladigan ko'plab maqolalarning uchinchisi, shuning uchun ko'proq ma'lumot olishni istasangiz, blogni kuzatib boring. Avvalgi maqolalarga havolalar ushbu qismning oxirida joylashgan.
Reja:

1: Logistik regressiyaga kirish


2: Logistik regressiya ortidagi matematik


3: Ikkilik xoch entropiyasini yo'qotish bo'yicha kirish 4: Noldan boshlab amalga oshirish


5: Eshikni optimallashtirish

6: Scikit-Learn bilan taqqoslash 7: Xulosa


Logistik regressiyaga kirish

Logistik regressiya - ikkilik tasniflash muammolari uchun asosiy mashina o'rganish algoritmi. Hozirgi kunda u odatda faqat boshlang'ich modelni qurish uchun ishlatiladi. Shunga qaramay, bu juda yaxshi birinchi algoritm, chunki u juda izohlanadi.


Qaysidir ma'noda logistik regressiya chiziqli regressiyaga o'xshaydi. Bashorat qilish uchun biz hali ham chiziqli tenglama bilan shug'ullanmoqdamiz. Bu safar natijalar Sigmoidni faollashtirish funktsiyasi orqali haqiqiy qiymatlarni ehtimollarga aylantirish uchun uzatiladi.
Ehtimol, sizga ijobiy sinfga tegishli bo'lgan misolning ehtimolini bildiradi (masalan, ushbu mijozning 0,85 churn ehtimoli bor). Keyinchalik, bu ehtimolliklar pol qiymatiga asoslangan haqiqiy sinflarga yo'naltiriladi. Agar ehtimollik poldan kattaroq bo'lsa, biz musbat sinfni tayinlaymiz va aksincha.
Chegara qiymati muammoga va siz optimallashtirayotgan metrik turiga qarab o'zgartirilishi mumkin (va bo'lishi kerak).
Logistik regressiya modelining taxminlari [1] haqida to'xtalamiz: Kuzatishlar (ma'lumotlar punktlari) mustaqil
Mustaqil o'zgaruvchilar orasida multikollinearlik juda oz (korrelyatsiyani tekshiring va ortiqcha uchun olib tashlang)
Tanlovning katta hajmi - har bir mustaqil o'zgaruvchining natijasi eng kam bo'lgan kamida 10 ta holat. Masalan, agar sizda beshta mustaqil o'zgaruvchingiz bo'lsa va eng kam chastotali natijaning kutilayotgan ehtimoli 0,1 bo'lsa, unda siz 500 (10 * 5
/ 0,1) minimal namuna hajmiga ehtiyoj sezasiz

Logistik regressiya modelini o'qitish og'irlik va noaniqlik uchun eng yaxshi koeffitsientlarni hisoblashni anglatadi. Bularni gradiyent tushish deb nomlanadigan iterativ optimallashtirish jarayoni orqali hisoblash mumkin. Keyingi bo'limda bu haqda ko'proq ma'lumot.


Logistik regressiya ortidagi matematik
Logistik regressiya ortidagi matematik juda oddiy. Biz hali ham chiziqli tenglama bilan shug'ullanmoqdamiz:


Ammo bu safar chiziqli tenglamaning chiqishi quyidagi formulada ko'rsatilgan Sigmoid (Logistic) funktsiyasi orqali uzatiladi:


The role of a sigmoid function is to take any real value and map it to a probability


— value between zero and one. It’s an S-shaped function, and you can use the following code to visualize it:

import numpy
as np

import matplotlib.pyplot as plt

from matplotlib import rcParams

rcParams['figure.figsize'] = (14, 7)

rcParams['axes.spines.top'] = False

rcParams['axes.spines.right'] = False

def sigmoid(x):

return 1 / (1 + np.exp(-x))

xs = np.arange(-10, 10, 0.1)

ys = [sigmoid(x) for x in xs]

plt.plot(xs, ys, c='#087E8B', lw=3)

plt.title('Sigmoid function', size=20)

plt.xlabel('X', size=14)

plt.ylabel('Y (probability)', size=14)

plt.show()



Sigmasimon funktsiyani qaytaradigan qiymati ijobiy sinfning ehtimoli sifatida izohlanadi. Agar ehtimollik biron bir chegaradan kattaroq bo'lsa (odatda 0,5), biz


ijobiy sinfni tayinlaymiz. Agar ehtimollik chegaradan past bo'lsa, biz salbiy sinfni tayinlaymiz.


Lineer regressiyada bo'lgani kabi, biz optimallashtirishimiz kerak bo'lgan ikkita parametr mavjud - og'irlik va noaniqlik. Biz optimallashtirishni amalga oshirish uchun xarajatlar funktsiyasini e'lon qilishimiz kerak. Afsuski, tanish o'rtacha kvadratik xato funktsiyasidan foydalanib bo'lmaydi. Xo'sh, u nazariy jihatdan ishlatilishi mumkin, ammo bu yaxshi fikr emas.
Buning o'rniga biz quyidagi formulada ko'rsatilgan Ikkilik Xoch Entropiya funktsiyasidan foydalanamiz:

Agar u chet tiliga o'xshab qolsa, tashvishlanmang, biz buni keyingi bobda tushuntiramiz.


Keyinchalik, ushbu xarajatlar funktsiyasini optimallashtirish jarayonida og'irliklarni yangilash va takroriy ravishda yangilash uchun ishlatishingiz kerak bo'ladi. Buning uchun ikkilik o'zaro faoliyat entropiya funktsiyasining og'irlik va yonma parametrlarga nisbatan qisman hosilalarini hisoblashingiz kerak bo'ladi:



Skalyarni tashlab yuborish mumkin, chunki bu hech qanday farq qilmaydi. Keyinchalik, siz quyidagi og'irliklarda ko'rsatilgan og'irliklar va xatolarni yangilash qoidalariga muvofiq yangilashingiz kerak bo'ladi:

Alfa parametri o'rganish tezligini anglatadi. Istalgan takrorlash uchun butun jarayon takrorlanadi.


Va bu matematikaga tegishli! Keling, ikkilik o'zaro faoliyat entropiyani yo'qotish funktsiyasini ko'rib chiqamiz.
Ikkilik xoch entropiyasini yo'qotish bo'yicha kirish

Ikkilik o'zaro faoliyat entropiya - bu ikkilik tasniflash modellarini baholash uchun umumiy xarajat (yoki yo'qotish) funktsiyasi. Odatda bu jurnalni yo'qotish deb nomlanadi, shuning uchun bu sinonimlarni unutmang.


Ushbu xarajat funktsiyasi noto'g'ri prognozlarni yaxshi "mukofotlash" dan ko'ra ko'proq "jazolaydi". Keling, buni amalda ko'rib chiqaylik.

  1. misol - to'g'ri bashorat qilish uchun miloddan avvalgi vaqtni hisoblash

Aytaylik, sizning modelingiz ijobiy sinfni 90% ehtimollik bilan taxmin qilmoqda (0,9). Bu shuni anglatadiki, model salbiy sinfni bashorat qilish kerakligiga faqat 10% ishonadi.


Savol: BCE qiymati qanday?


Ko'rib turganingizdek, BCE qiymati juda kichik, atigi 0,1. Buning sababi, model bashorat qilishda juda ishonchli edi. Keling, agar bunday bo'lmasa nima bo'lishini ko'rib chiqaylik.



  1. misol - noto'g'ri taxmin qilish uchun miloddan avvalgi vaqtni hisoblash

Aytaylik, sizning modelingiz ijobiy sinfni 10% ehtimollik bilan taxmin qiladi (0,1). Bu shuni anglatadiki, model salbiy sinfni bashorat qilishi kerakligiga 90% ishonadi.
Savol: Miloddan avvalgi qiymat nima?


Ko'rib turganingizdek, bu holda yo'qotish juda katta - miloddan avvalgi noto'g'ri prognozni yaxshilarni mukofotlashdan ko'ra ko'proq jazolashning mukammal namoyishi.


Python dasturini amalga oshirish

Men matematikani qo'l bilan bajarishning katta muxlisi emasman. Agar xuddi shu narsa sizga tegishli bo'lsa, sizga bu qism yoqadi. Python-da quyidagi funktsiya BCE-ni noldan amalga oshiradi:



def binary_cross_entropy(y,
y_hat):

def safe_log(x): return 0 if x == 0 else np.log(x)

total = 0



for curr_y, curr_y_hat in zip(y, y_hat):

total += (curr_y * safe_log(curr_y_hat) + (1 -
curr_y) * safe_log(1 - curr_y_hat))

return - total / len(y)

print(binary_cross_entropy(y=[1, 0], y_hat=[0.9,
0.1]))

print(binary_cross_entropy(y=[1, 0], y_hat=[0.1,
0.9]))

Bizga safe_log () funktsiyasi kerak, chunki log (0) cheksizlikka teng. Qanday bo'lmasin, ushbu kodni ishlatsangiz, bizning qo'lda hisob-kitoblarimiz to'g'ri bo'lganligini ko'rasiz.


Siz endi logistik regressiya algoritmini noldan amalga oshirish uchun zarur bo'lgan hamma narsani bilasiz. Keling, buni qilaylik.
Noldan boshlab amalga oshirish

Qiziqarli qism boshlang! Endi LogisticRegression deb nomlangan sinfni quyidagi usullar bilan e'lon qilamiz:




init (learning_rate, n_iterations) - konstruktor, og'irlik va yonma-yonlik bilan bir qatorda o'rganish tezligi va takrorlanish sonining qiymatlarini o'z ichiga oladi (dastlab Yo'q)

_sigmoid (x) - logistik aktivizatsiya funktsiyasi, siz formulani bilasiz


_binary_cross_entropy (y, y_hat) - bizning xarajatlarimiz funktsiyasi - biz buni avvalroq amalga oshirdik


fit (X, y) - gradiyent tushish orqali og'irlik va moyillikni iterativ ravishda optimallashtiradi. Hisoblash tugagandan so'ng natijalar konstruktorda saqlanadi
predict_proba (X) - sigmasimon aktivizatsiya funktsiyasi orqali o'tgan chiziqli tenglamalar yordamida bashorat qilish ehtimollarini hisoblab chiqadi.
predict (X, pol) - pol parametriga asosan bashorat qilingan sinflarni (ikkilik) hisoblab chiqadi
Agar siz logistik regressiya ortidagi matematikani tushunsangiz, Python-da dastur muammo bo'lishi kerak. Bularning barchasi hujjatlashtirilgan kodning taxminan 70 qatoriga to'g'ri keladi:



from sklearn.datasets import
load_breast_cancer

from sklearn.model_selection import train_test_split

data = load_breast_cancer()

X = data.data

y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=42)

model = LogisticRegression()

model.fit(X_train, y_train)

preds = model.predict(X_test)

Agar bilmoqchi bo'lsangiz, maqbul og'irliklar uchun qiymatlar (model.weights orqali kirish mumkin):

Modelni baholash
Biz bu erda oddiy narsalarni saqlaymiz va faqat aniqlik balini va chalkashlik matritsasini chop etamiz. Buning uchun quyidagi kod parchasidan foydalanishingiz mumkin:

from sklearn.metrics
import accuracy_score,
confusion_matrix

print(accuracy_score(y_test, preds))

print(confusion_matrix(y_test, preds))

Mana aniqlik qiymati:
Va bu erda chalkashlik matritsasi:
Ko'rib turganingizdek, model 95% aniqlik bilan juda yaxshi ishlaydi. Oltita noto'g'ri negativ mavjud, ya'ni oltita holatda haqiqiy holat "Ha" bo'lganda model "Yo'q" ni bashorat qilgan. Shunga qaramay, yaxshi natijalar.
Keling, qanday qilib tasniflash chegarasini o'zgartirib, natijalarni yanada yaxshiroq qilishingiz mumkinligini bilib olaylik.
Eshikni optimallashtirish
0,5 har bir tasniflash muammosi uchun eng yaxshi tasniflash chegarasi ekanligiga kafolat yo'q. Baxtimizga, biz predict () usulining pol parametrini o'zgartirib, pol qiymatini o'zgartirishimiz mumkin.
Quyidagi kod parchasi aniqlik chegarasini optimallashtiradi, ammo siz boshqa har qanday o'lchovni tanlashingiz mumkin:



import pandas
as pd

evals = []

for thresh in np.arange(0, 1.01, 0.01):

preds = model.predict(X_test, threshold=thresh)

acc = accuracy_score(y_test, preds)

evals.append({'Threshold': thresh, 'Accuracy': acc})

evals_df = pd.DataFrame(evals)



best_thresh = evals_df.sort_values(by='Accuracy', ascending=False).iloc[0]

plt.plot(evals_df['Threshold'], evals_df['Accuracy'], lw=3, c='#087E8B')

plt.scatter(best_thresh['Threshold'], best_thresh['Accuracy'], label=f"Best threshold = {best_thresh['Threshold']}, Accuracy =
{(best_thresh['Accuracy'] * 100):.2f}%", s=250, c='#087E8B')

plt.title('Threshold Optimization', size=20)

plt.xlabel('Threshold', size=14)

plt.ylabel('Accuracy', size=14)

plt.legend()

plt.show()


Eng yaxshi chegara va mos keladigan aniqlik syujet afsonasida ko'rsatilgan. Ko'rib turganingizdek, chegara qiymati ushbu ma'lumotlar to'plami uchun ozmi-ko'pmi ahamiyatsiz, ammo ehtimol boshqa ma'lumotlar to'plamlari uchun bunday bo'lmaydi.


Endi siz maqbul pol qiymatini hisobga olgan holda modelni tezda qayta tayyorlashingiz mumkin:


model =
LogisticRegression()

model.fit(X_train, y_train)

preds = model.predict(X_test, threshold=0)

print(accuracy_score(y_test, preds))

print(confusion_matrix(y_test, preds))

Mana yangi yaxshilangan aniqlik ko'rsatkichi:


Va bu erda chalkashlik matritsasi:

Endi siz qanday qilib maxsus klassifikator modelini o'rgatish va qanday qilib tasniflash chegarasini optimallashtirishni bilasiz. Keling, uni keyingi Scikit-Learn modeli bilan taqqoslaylik.


Scikit-Learn bilan taqqoslash

Bizning modelimiz yaxshi yoki yo'qligini bilmoqchimiz, shuning uchun uni biz yaxshi biladigan narsa bilan taqqoslaylik - Scisticit-Learn-dan LogisticRegression sinfi.


Model sinfini import qilish, modelni o'qitish, bashorat qilish, aniqlik va chalkashlik matritsasini chop etish uchun siz quyidagi parchadan foydalanishingiz mumkin:



from sklearn.linear_model import
LogisticRegression

lr_model = LogisticRegression()

lr_model.fit(X_train, y_train)

lr_preds = lr_model.predict(X_test)

print(accuracy_score(y_test, lr_preds))

print(confusion_matrix(y_test, lr_preds))

Download 196,5 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2025
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish