You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/lt/2-Regression/4-Logistic
leestott 3773c80b49
🌐 Update translations via Co-op Translator
2 weeks ago
..
solution 🌐 Update translations via Co-op Translator 3 weeks ago
README.md 🌐 Update translations via Co-op Translator 2 weeks ago
assignment.md 🌐 Update translations via Co-op Translator 3 weeks ago
notebook.ipynb 🌐 Update translations via Co-op Translator 3 weeks ago

README.md

Logistinė regresija kategorijoms prognozuoti

Logistinės ir linijinės regresijos infografika

Prieš paskaitos testas

Ši pamoka pasiekiama ir R kalba!

Įvadas

Šioje paskutinėje pamokoje apie regresiją, vieną iš pagrindinių klasikinių ML technikų, apžvelgsime logistinės regresijos metodą. Šią techniką galite naudoti norėdami atrasti dėsningumus ir prognozuoti dvejetaines kategorijas. Ar šis saldainis yra šokoladas, ar ne? Ar ši liga yra užkrečiama, ar ne? Ar šis klientas pasirinks šį produktą, ar ne?

Šioje pamokoje sužinosite:

  • Naują biblioteką duomenų vizualizacijai
  • Logistinės regresijos technikas

Gilinkite savo supratimą apie darbą su šio tipo regresija šiame mokymosi modulyje

Būtinos žinios

Dirbdami su moliūgų duomenimis jau pakankamai susipažinome su jais, kad suprastume, jog yra viena dvejetainė kategorija, su kuria galime dirbti: Spalva.

Sukurkime logistinės regresijos modelį, kuris prognozuotų, kokia spalva greičiausiai bus tam tikras moliūgas (oranžinė 🎃 ar balta 👻).

Kodėl kalbame apie dvejetainę klasifikaciją pamokoje apie regresiją? Tik dėl lingvistinio patogumo, nes logistinė regresija iš tiesų yra klasifikacijos metodas, nors ir pagrįstas linijine regresija. Sužinokite apie kitus duomenų klasifikavimo būdus kitame pamokų cikle.

Apibrėžkite klausimą

Mūsų tikslams išreikšime tai kaip dvejetainę kategoriją: „Balta“ arba „Ne balta“. Mūsų duomenų rinkinyje taip pat yra „dryžuota“ kategorija, tačiau jos pavyzdžių yra nedaug, todėl jos nenaudosime. Ji vis tiek išnyksta, kai pašaliname tuščias reikšmes iš duomenų rinkinio.

🎃 Smagus faktas: baltus moliūgus kartais vadiname „vaiduokliais“. Juos nėra lengva išskaptuoti, todėl jie nėra tokie populiarūs kaip oranžiniai, bet atrodo įspūdingai! Taigi galėtume reformuluoti savo klausimą kaip: „Vaiduoklis“ arba „Ne vaiduoklis“. 👻

Apie logistinę regresiją

Logistinė regresija skiriasi nuo linijinės regresijos, kurią jau išmokote, keliais svarbiais aspektais.

ML pradedantiesiems - Logistinės regresijos supratimas mašininio mokymosi klasifikacijai

🎥 Spustelėkite aukščiau esančią nuotrauką, kad peržiūrėtumėte trumpą vaizdo įrašą apie logistinės regresijos apžvalgą.

Dvejetainė klasifikacija

Logistinė regresija nepasiūlo tų pačių funkcijų kaip linijinė regresija. Pirmoji pateikia prognozę apie dvejetainę kategoriją („balta arba ne balta“), o antroji gali prognozuoti tęstines reikšmes, pavyzdžiui, atsižvelgiant į moliūgo kilmę ir derliaus nuėmimo laiką, kaip padidės jo kaina.

Moliūgų klasifikavimo modelis

Infografiką sukūrė Dasani Madipalli

Kitos klasifikacijos

Yra ir kitų logistinės regresijos tipų, įskaitant daugianarę ir tvarką turinčią:

  • Daugianarė, kai yra daugiau nei viena kategorija - „Oranžinė, Balta ir Dryžuota“.
  • Tvarką turinti, kai kategorijos yra išdėstytos logiška tvarka, naudinga, jei norėtume logiškai išdėstyti rezultatus, pavyzdžiui, moliūgus, kurie yra išdėstyti pagal ribotą dydžių skaičių (mini, mažas, vidutinis, didelis, labai didelis, milžiniškas).

Daugianarė vs tvarką turinti regresija

Kintamieji NETURI būti koreliuoti

Prisiminkite, kaip linijinė regresija geriau veikė su labiau koreliuotais kintamaisiais? Logistinė regresija yra priešinga kintamieji neturi būti susiję. Tai tinka šiems duomenims, kurių koreliacijos yra gana silpnos.

Reikia daug švarių duomenų

Logistinė regresija pateiks tikslesnius rezultatus, jei naudosite daugiau duomenų; mūsų mažas duomenų rinkinys nėra optimalus šiai užduočiai, todėl turėkite tai omenyje.

ML pradedantiesiems - Duomenų analizė ir paruošimas logistinei regresijai

🎥 Spustelėkite aukščiau esančią nuotrauką, kad peržiūrėtumėte trumpą vaizdo įrašą apie duomenų paruošimą linijinei regresijai

Pagalvokite apie duomenų tipus, kurie geriausiai tiktų logistinei regresijai

Užduotis - sutvarkykite duomenis

Pirmiausia šiek tiek išvalykite duomenis, pašalindami tuščias reikšmes ir pasirinkdami tik kelis stulpelius:

  1. Pridėkite šį kodą:

    
    columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
    pumpkins = full_pumpkins.loc[:, columns_to_select]
    
    pumpkins.dropna(inplace=True)
    

    Visada galite pažvelgti į savo naują duomenų rėmelį:

    pumpkins.info
    

Vizualizacija - kategorinis grafikas

Iki šiol įkėlėte pradinį užrašų knygelę su moliūgų duomenimis ir išvalėte ją, kad išsaugotumėte duomenų rinkinį, kuriame yra keli kintamieji, įskaitant Spalvą. Vizualizuokime duomenų rėmelį užrašų knygelėje naudodami kitą biblioteką: Seaborn, kuri yra sukurta ant Matplotlib, kurį naudojome anksčiau.

Seaborn siūlo keletą įdomių būdų vizualizuoti duomenis. Pavyzdžiui, galite palyginti duomenų pasiskirstymą pagal Variety ir Color kategoriniame grafike.

  1. Sukurkite tokį grafiką naudodami catplot funkciją, naudodami mūsų moliūgų duomenis pumpkins ir nurodydami spalvų žemėlapį kiekvienai moliūgų kategorijai (oranžinė arba balta):

    import seaborn as sns
    
    palette = {
    'ORANGE': 'orange',
    'WHITE': 'wheat',
    }
    
    sns.catplot(
    data=pumpkins, y="Variety", hue="Color", kind="count",
    palette=palette, 
    )
    

    Duomenų vizualizacijos tinklelis

    Stebėdami duomenis galite pamatyti, kaip Spalva duomenys susiję su Variety.

    Atsižvelgdami į šį kategorinį grafiką, kokius įdomius tyrimus galite įsivaizduoti?

Duomenų paruošimas: požymių ir etikečių kodavimas

Mūsų moliūgų duomenų rinkinyje visos stulpelių reikšmės yra tekstinės. Dirbti su kategoriniais duomenimis žmonėms yra intuityvu, tačiau mašinoms ne. Mašininio mokymosi algoritmai geriau veikia su skaitiniais duomenimis. Todėl kodavimas yra labai svarbus duomenų paruošimo etapas, nes jis leidžia paversti kategorinius duomenis skaitiniais, neprarandant informacijos. Geras kodavimas padeda sukurti gerą modelį.

Požymių kodavimui yra du pagrindiniai kodavimo tipai:

  1. Ordinalinis kodavimas: jis gerai tinka tvarką turintiems kintamiesiems, kurie yra kategoriniai kintamieji, kurių duomenys turi logišką tvarką, kaip Item Size stulpelis mūsų duomenų rinkinyje. Jis sukuria žemėlapį, kuriame kiekviena kategorija yra atvaizduojama skaičiumi, kuris atitinka kategorijos tvarką stulpelyje.

    from sklearn.preprocessing import OrdinalEncoder
    
    item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
    ordinal_features = ['Item Size']
    ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
    
  2. Kategorinis kodavimas: jis gerai tinka nominaliems kintamiesiems, kurie yra kategoriniai kintamieji, kurių duomenys neturi logiškos tvarkos, kaip visi požymiai, išskyrus Item Size mūsų duomenų rinkinyje. Tai yra vieno karšto kodavimo metodas, kuris reiškia, kad kiekviena kategorija yra atvaizduojama dvejetainiu stulpeliu: užkoduota reikšmė yra lygi 1, jei moliūgas priklauso tai Variety, ir 0, jei ne.

    from sklearn.preprocessing import OneHotEncoder
    
    categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
    categorical_encoder = OneHotEncoder(sparse_output=False)
    

Tada ColumnTransformer naudojamas keliems kodavimo metodams sujungti į vieną žingsnį ir pritaikyti juos tinkamiems stulpeliams.

    from sklearn.compose import ColumnTransformer
    
    ct = ColumnTransformer(transformers=[
        ('ord', ordinal_encoder, ordinal_features),
        ('cat', categorical_encoder, categorical_features)
        ])
    
    ct.set_output(transform='pandas')
    encoded_features = ct.fit_transform(pumpkins)

Kita vertus, etiketės kodavimui naudojame scikit-learn LabelEncoder klasę, kuri yra pagalbinė klasė, padedanti normalizuoti etiketes, kad jos turėtų tik reikšmes tarp 0 ir n_classes-1 (čia, 0 ir 1).

    from sklearn.preprocessing import LabelEncoder

    label_encoder = LabelEncoder()
    encoded_label = label_encoder.fit_transform(pumpkins['Color'])

Kai užkoduojame požymius ir etiketes, galime juos sujungti į naują duomenų rėmelį encoded_pumpkins.

    encoded_pumpkins = encoded_features.assign(Color=encoded_label)

Kokie yra ordinalinio kodavimo privalumai Item Size stulpeliui?

Analizuokite kintamųjų tarpusavio ryšius

Dabar, kai paruošėme duomenis, galime analizuoti požymių ir etikečių tarpusavio ryšius, kad suprastume, kaip gerai modelis galės prognozuoti etiketę pagal požymius. Geriausias būdas atlikti tokio tipo analizę yra duomenų vizualizavimas. Vėl naudosime Seaborn catplot funkciją, kad vizualizuotume Item Size, Variety ir Color tarpusavio ryšius kategoriniame grafike. Norėdami geriau vizualizuoti duomenis, naudosime užkoduotą Item Size stulpelį ir neužkoduotą Variety stulpelį.

    palette = {
    'ORANGE': 'orange',
    'WHITE': 'wheat',
    }
    pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']

    g = sns.catplot(
        data=pumpkins,
        x="Item Size", y="Color", row='Variety',
        kind="box", orient="h",
        sharex=False, margin_titles=True,
        height=1.8, aspect=4, palette=palette,
    )
    g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
    g.set_titles(row_template="{row_name}")

Duomenų vizualizacijos grafikas

Naudokite „swarm“ grafiką

Kadangi Color yra dvejetainė kategorija (Balta arba Ne), jai reikia „specialaus požiūrio vizualizacijai“. Yra ir kitų būdų vizualizuoti šios kategorijos ryšį su kitais kintamaisiais.

Galite vizualizuoti kintamuosius šalia vienas kito naudodami Seaborn grafikus.

  1. Išbandykite „swarm“ grafiką, kad parodytumėte reikšmių pasiskirstymą:

    palette = {
    0: 'orange',
    1: 'wheat'
    }
    sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
    

    Duomenų vizualizacijos „swarm“ grafikas

Atkreipkite dėmesį: aukščiau pateiktas kodas gali generuoti įspėjimą, nes Seaborn nepavyksta atvaizduoti tokio kiekio duomenų taškų „swarm“ grafike. Galimas sprendimas yra sumažinti žymeklio dydį, naudojant „size“ parametrą. Tačiau atminkite, kad tai gali paveikti grafiko skaitomumą.

🧮 Parodykite matematiką

Logistinė regresija remiasi „maksimalaus tikėtinumo“ koncepcija, naudojant sigmoidines funkcijas. Sigmoidinė funkcija grafike atrodo kaip „S“ formos kreivė. Ji paima reikšmę ir priskiria ją intervalui tarp 0 ir 1. Jos kreivė taip pat vadinama „logistine kreive“. Jos formulė atrodo taip:

logistinė funkcija

kur sigmoidės vidurys yra x ašies 0 taške, L yra kreivės maksimali reikšmė, o k yra kreivės statumas. Jei funkcijos rezultatas yra didesnis nei 0.5, atitinkama etiketė bus priskirta „1“ klasei iš dvejetainio pasirinkimo. Jei ne, ji bus priskirta „0“ klasei.

Sukurkite savo modelį

Sukurti modelį, kuris rastų šias dvejetaines klasifikacijas, yra stebėtinai paprasta naudojant Scikit-learn.

ML pradedantiesiems - Logistinė regresija duomenų klasifikacijai

🎥 Spustelėkite aukščiau esančią nuotrauką, kad peržiūrėtumėte trumpą vaizdo įrašą apie linijinės regresijos modelio kūrimą

  1. Pasirinkite kintamuosius, kuriuos norite naudoti savo klasifikavimo modelyje, ir padalykite mokymo bei testavimo rinkinius, iškviesdami train_test_split():

    from sklearn.model_selection import train_test_split
    
    X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
    y = encoded_pumpkins['Color']
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    
    
  2. Dabar galite apmokyti savo modelį, iškviesdami fit() su mokymo duomenimis, ir atspausdinti jo rezultatą:

    from sklearn.metrics import f1_score, classification_report 
    from sklearn.linear_model import LogisticRegression
    
    model = LogisticRegression()
    model.fit(X_train, y_train)
    predictions = model.predict(X_test)
    
    print(classification_report(y_test, predictions))
    print('Predicted labels: ', predictions)
    print('F1-score: ', f1_score(y_test, predictions))
    

    Pažvelkite į savo modelio rezultatų lentelę. Ji nėra bloga, atsižvelgiant į tai, kad turite tik apie 1000 duomenų eilučių:

                       precision    recall  f1-score   support
    
                    0       0.94      0.98      0.96       166
                    1       0.85      0.67      0.75        33
    
        accuracy                                0.92       199
        macro avg           0.89      0.82      0.85       199
        weighted avg        0.92      0.92      0.92       199
    
        Predicted labels:  [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
        0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
        1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0
        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
        0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
        0 0 0 1 0 0 0 0 0 0 0 0 1 1]
        F1-score:  0.7457627118644068
    

Geresnis supratimas per klaidų matricą

Nors galite gauti rezultatų lentelę terminais, atspausdindami aukščiau pateiktus elementus, galbūt galėsite geriau suprasti savo modelį naudodami klaidų matricą, kuri padeda suprasti, kaip modelis veikia.

🎓Klaidų matrica“ (arba „klaidų matrica“) yra lentelė, kuri išreiškia jūsų modelio tikrus ir netikrus teigiamus bei neigiamus rezultatus, taip įvertinant prognozių tikslumą.

  1. Norėdami naudoti klaidų matricą, iškvieskite confusion_matrix():

    from sklearn.metrics import confusion_matrix
    confusion_matrix(y_test, predictions)
    

    Pažvelkite į savo modelio klaidų matricą:

    array([[162,   4],
           [ 11,  22]])
    

Scikit-learn klaidų matricose eilutės (0 ašis) yra tikros etiketės, o stulpeliai (1 ašis) yra prognozuotos etiketės.

0 1
0 TN FP
1 FN TP

Kas čia vyksta? Tarkime, mūsų modelis yra paprašytas klasifikuoti moliūgus tarp dviejų dvejetainių kategorijų, kategorijos „balta“ ir kategorijos „ne balta“.

  • Jei jūsų modelis prognozuoja moliūgą kaip ne baltą, o jis iš tikrųjų priklauso kategorijai „ne balta“, tai vadiname tikru neigiamu rezultatu, kurį rodo viršutinis Kaip painiavos matrica susijusi su tikslumu ir atšaukimu? Atminkite, kad aukščiau pateiktoje klasifikacijos ataskaitoje buvo nurodytas tikslumas (0.85) ir atšaukimas (0.67).

Tikslumas = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461

Atšaukimas = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666

Klausimas: Remiantis painiavos matrica, kaip sekėsi modeliui? Atsakymas: Ne blogai; yra nemažai teigiamų neigiamų atvejų, tačiau taip pat keletas klaidingų neigiamų atvejų.

Grįžkime prie terminų, kuriuos matėme anksčiau, naudodamiesi painiavos matricos TP/TN ir FP/FN žemėlapiu:

🎓 Tikslumas: TP/(TP + FP) Reikšmingų atvejų dalis tarp gautų atvejų (pvz., kurie žymėjimai buvo gerai pažymėti)

🎓 Atšaukimas: TP/(TP + FN) Reikšmingų atvejų dalis, kurie buvo gauti, nesvarbu, ar jie buvo gerai pažymėti, ar ne

🎓 f1-rezultatas: (2 * tikslumas * atšaukimas)/(tikslumas + atšaukimas) Tikslumo ir atšaukimo svertinis vidurkis, geriausias yra 1, blogiausias - 0

🎓 Palaikymas: Kiekvieno gauto žymėjimo pasikartojimų skaičius

🎓 Tikslumas: (TP + TN)/(TP + TN + FP + FN) Procentas žymėjimų, kurie buvo tiksliai nuspėti mėginyje.

🎓 Makro vidurkis: Neįvertintų vidutinių metrikų skaičiavimas kiekvienam žymėjimui, neatsižvelgiant į žymėjimų disbalansą.

🎓 Svertinis vidurkis: Vidutinių metrikų skaičiavimas kiekvienam žymėjimui, atsižvelgiant į žymėjimų disbalansą, sveriant juos pagal jų palaikymą (tikrų atvejų skaičių kiekvienam žymėjimui).

Ar galite pagalvoti, kurią metriką reikėtų stebėti, jei norite, kad jūsų modelis sumažintų klaidingų neigiamų atvejų skaičių?

Vizualizuokite šio modelio ROC kreivę

ML pradedantiesiems - Logistinės regresijos našumo analizė su ROC kreivėmis

🎥 Spustelėkite aukščiau esančią nuotrauką, kad peržiūrėtumėte trumpą vaizdo įrašą apie ROC kreives

Atlikime dar vieną vizualizaciją, kad pamatytume vadinamąją „ROC“ kreivę:

from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])

fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()

Naudodami Matplotlib, nubrėžkite modelio Gavimo veikimo charakteristikos arba ROC kreivę. ROC kreivės dažnai naudojamos norint pamatyti klasifikatoriaus išvestį pagal tikrus ir klaidingus teigiamus atvejus. „ROC kreivėse paprastai Y ašyje pateikiamas tikrų teigiamų atvejų rodiklis, o X ašyje - klaidingų teigiamų atvejų rodiklis.“ Taigi kreivės statumas ir erdvė tarp vidurio linijos ir kreivės yra svarbūs: norite kreivės, kuri greitai kyla aukštyn ir virš linijos. Mūsų atveju pradžioje yra klaidingų teigiamų atvejų, o tada linija tinkamai kyla aukštyn ir virš.

ROC

Galiausiai naudokite Scikit-learn roc_auc_score API, kad apskaičiuotumėte faktinę „Plotą po kreive“ (AUC):

auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)

Rezultatas yra 0.9749908725812341. Kadangi AUC svyruoja nuo 0 iki 1, norite didelio rezultato, nes modelis, kuris 100% tiksliai prognozuoja, turės AUC lygią 1; šiuo atveju modelis yra gana geras.

Ateities pamokose apie klasifikacijas sužinosite, kaip iteruoti, kad pagerintumėte savo modelio rezultatus. Bet kol kas sveikiname! Jūs baigėte šias regresijos pamokas!


🚀Iššūkis

Logistinėje regresijoje yra daug ką išnagrinėti! Tačiau geriausias būdas mokytis yra eksperimentuoti. Suraskite duomenų rinkinį, kuris tinka tokio tipo analizei, ir sukurkite modelį su juo. Ką išmokote? patarimas: pabandykite Kaggle ieškoti įdomių duomenų rinkinių.

Po paskaitos testas

Apžvalga ir savarankiškas mokymasis

Perskaitykite pirmuosius kelis šio Stanfordo dokumento puslapius apie praktinius logistinės regresijos panaudojimus. Pagalvokite apie užduotis, kurios geriau tinka vienam ar kitam regresijos tipui, kuriuos studijavome iki šiol. Kas veiktų geriausiai?

Užduotis

Pakartokite šią regresiją


Atsakomybės apribojimas:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą Co-op Translator. Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.