Logistinen regressio – Täydellinen opetusohjelma esimerkkeineen R:ssä

Logistinen regressio on ennustava mallinnusalgoritmi, jota käytetään, kun Y-muuttuja on binäärinen kategorinen. Toisin sanoen se voi ottaa vain kaksi arvoa, kuten 1 tai 0. Tavoitteena on määrittää matemaattinen yhtälö, jonka avulla voidaan ennustaa tapahtuman 1 todennäköisyys. Kun yhtälö on määritetty, sitä voidaan käyttää Y:n ennustamiseen, kun vain X�:t tunnetaan.

Logistic Regression – A Complete Tutorial With Examples in R Sisältö1. Johdanto logistiseen regressioon
2. Joitakin reaalimaailman esimerkkejä binääriluokitusongelmista
3. Miksi ei lineaarista regressiota?
4. Logistinen yhtälö
5. Miten logistinen regressiomalli rakennetaan R:ssä?
6. Miten käsitellä luokkien epätasapainoa?
7. Miten käsitellä luokkien epätasapainoa Upsample- ja Downsample-menetelmillä?
8. Logistisen regressiomallin rakentaminen
9. Miten ennustaa testiaineistossa
10. Miksi luokan epätasapainon käsittely on tärkeää?
11. Johtopäätökset

1. Johdatus logistiseen regressioon

Viime aikoina olet nähnyt, mitä on lineaarinen regressio ja miten sitä käytetään jatkuvien Y-muuttujien ennustamiseen.

Lineaarisessa regressiossa Y-muuttuja on aina jatkuva muuttuja. Jos oletetaan, että Y-muuttuja olisi kategorinen, et voi käyttää lineaarista regressiota sen mallintamiseen.

Mitä tekisit siis silloin, kun Y on kategorinen muuttuja, jossa on kaksi luokkaa?

Logistista regressiota voidaan käyttää tällaisten ongelmien mallintamiseen ja ratkaisemiseen, joita kutsutaan myös binäärisiksi luokitteluongelmiksi.

Keskeinen huomioitava seikka tässä yhteydessä on se, että Y:llä voi olla vain kaksi luokkaa, ei enempää. Jos Y:llä on enemmän kuin 2 luokkaa, siitä tulee moniluokkainen luokitus, eikä siihen voi enää käyttää vaniljaista logistista regressiota.

Logistinen regressio on kuitenkin klassinen ennustemallinnustekniikka, ja se on edelleen suosittu valinta binääristen kategoristen muuttujien mallintamiseen.

Logistisen regression etuna on myös se, että se laskee tapahtumalle ennustetodennäköisyyspisteet. Siitä lisää, kun varsinaisesti aletaan rakentaa malleja.

Joitakin reaalimaailman esimerkkejä binääriluokitusongelmista

Saatat miettiä, millaisiin ongelmiin logistista regressiota voi käyttää.

Tässä on joitain esimerkkejä binääriluokitusongelmista:

  • Roskapostin havaitseminen : Ennustetaan, onko sähköposti roskapostia vai ei
  • Luottokorttipetos : Ennustetaan, onko tietty luottokorttitapahtuma petos vai ei
  • Terveys : Ennustaminen, onko tietty kudosmassa hyvän- vai pahanlaatuinen
  • Markkinointi : Ennustaminen, ostaako tietty käyttäjä vakuutustuotteen vai ei
  • Pankkitoiminta : Ennustaminen, laiminlyökö asiakas lainanmaksun.

Miksi ei lineaarista regressiota?

Kun vastemuuttujalla on vain kaksi mahdollista arvoa, on toivottavaa, että malli ennustaa arvon joko arvona 0 tai 1 tai todennäköisyyspistemääränä, joka vaihtelee 0:n ja 1:n välillä.

Lineaarisella regressiolla ei ole tätä mahdollisuutta. Koska, Jos käytät lineaarista regressiota binäärisen vastemuuttujan mallintamiseen, tuloksena saatava malli ei välttämättä rajoita ennustettuja Y-arvoja 0:n ja 1:n välille.

Lineaarinen vs. logistinen regressio

Tässä kohtaa logistinen regressio astuu kuvaan. Logistisessa regressiossa saat todennäköisyyspistemäärän, joka kuvastaa tapahtuman esiintymistodennäköisyyttä.

Tapahtuma on tässä tapauksessa jokainen harjoitusaineiston rivi. Se voi olla jotain, kuten sen luokittelu, onko tietty sähköposti roskapostia, tai solun massa on pahanlaatuinen tai käyttäjä ostaa tuotteen ja niin edelleen.

Logistinen yhtälö

Logistisella regressiolla tämä saavutetaan ottamalla tapahtuman ln(P/1?P) log-todennäköisyys ln(P/1?P), jossa, P on tapahtuman todennäköisyys. P on siis aina 0:n ja 1:n välissä.

Valitsemalla yhtälön molemmille puolille eksponentti saadaan:

Tämän yhtälön voi toteuttaa glm()-funktiolla asettamalla family-argumentin arvoksi "binomial".

Tärkeä varoittava seikka on myös, että on syytä varmistua siitä, että asetat arvoksi type="response" käytettäessä funktiota predict logistisen regression mallin kanssa. Muuten se ennustaa P:n log-kertoimen, eli Z-arvon, eikä itse todennäköisyyttä.

Miten rakennetaan logistinen regressiomalli R:ssä?

Katsotaan nyt, miten toteutetaan logistinen regressio käyttäen BreastCancer-paketin mlbench BreastCancer aineistoa. Sinun täytyy asentaa mlbench-paketti tätä varten.

Tavoitteena on mallintaa ja ennustaa, onko tietty näyte (rivi datasetissä) benign vai malignant, perustuen 9 muuhun solun ominaisuuteen. Ladataan siis data ja säilytetään vain täydelliset tapaukset.

Breast Cancer Dataset

Datasetissa on 699 havaintoa ja 11 saraketta. Sarake Class on vastemuuttuja (riippuvainen muuttuja), ja se kertoo, onko tietty kudos pahanlaatuinen vai hyvänlaatuinen.

Tarkastetaan tämän datasetin rakenne.

Katsotaanpa Id lukuun ottamatta kaikki muut sarakkeet ovat tekijöitä. Tämä on ongelma, kun mallinnat tämäntyyppistä dataa.

Koska rakennat logistisen mallin, jossa on faktorimuuttujia ominaisuuksina, se muuntaa jokaisen faktorin tason dummy-binäärimuuttujaksi, jossa on 1:t ja 0:t.

Esimerkiksi Solun muoto on faktori, jossa on 10 tasoa. Kun käytät glm:ää mallintamaan Classia solumuodon funktiona, solumuoto jaetaan 9 eri binääriseksi kategoriseksi muuttujaksi ennen mallin rakentamista.

Jos haluat rakentaa logistisen mallin tekemättä mitään valmistelevia vaiheita, voit tehdä seuraavasti. Emme kuitenkaan aio noudattaa tätä, koska on tiettyjä asioita, joista on huolehdittava ennen logit-mallin rakentamista.

Logit-mallin rakentamisen syntaksi on hyvin samanlainen kuin lineaarisessa regressiossa näkemäsi lm-funktio. Sinun tarvitsee vain asettaa family='binomial' tilalle glm, jotta voit rakentaa logistisen regressiomallin.

glm tarkoittaa yleistettyjä lineaarisia malleja (generalised linear models) ja se pystyy rakentamaan monenlaisia regressiomalleja lineaarisen ja logistisen regression lisäksi.

Katsotaanpa, miltä koodi logistisen mallin rakentamiseksi voisi näyttää. Tulen tähän vaiheeseen uudelleen myöhemmin, sillä ennen mallin rakentamista on tehtävä joitakin esikäsittelyvaiheita.

Yllä olevassa mallissa Class mallinnetaan pelkän Cell.shape funktiona.

Mutta huomaa tulosteesta, että Cell.Shape saatiin jaettua 9 eri muuttujaan. Tämä johtuu siitä, että koska Cell.Shape on tallennettu tekijämuuttujana, glm luo 1 binäärimuuttujan (eli dummy-muuttujan) kullekin Cell.Shape:n 10:stä kategorisesta tasosta.

Ymmärrettävästi Cell.Shape:n merkityksen perusteella näyttää siltä, että Cell.Shape:n kategoristen tasojen sisällä on jonkinlainen järjestys. Toisin sanoen solumuoto 2 on suurempi kuin solumuoto 1 ja niin edelleen.

Tämä pätee myös muihin aineiston muuttujiin. Joten on parempi muuntaa ne numeerisiksi muuttujiksi ja poistaa id-sarake.

Jos kyseessä olisi ollut puhdas kategorinen muuttuja, jolla ei ole sisäistä järjestystä, kuten vaikkapa potilaan sukupuoli, voit jättää kyseisen muuttujan tekijäksi itsessään.

# remove id columnbc <- bc# convert factors to numericfor(i in 1:9) { bc <- as.numeric(as.character(bc))}

Another important point to note. When converting a factor to a numeric variable, you should always convert it to character and then to numeric, else, the values can get screwed up.

Now all the columns are numeric.

Also I’d like to encode the response variable into a factor variable of 1’s and 0’s. Though, this is only an optional step.

So whenever the Class is malignant, it will be 1 else it will be 0. Then, I am converting it into a factor.

bc$Class <- ifelse(bc$Class == "malignant", 1, 0)bc$Class <- factor(bc$Class, levels = c(0, 1))

The response variable Class is now a factor variable and all other columns are numeric.

Alright, the classes of all the columns are set. Let’s proceed to the next step.

How to deal with Class Imbalance?

Before building the logistic regressor, you need to randomly split the data into training and test samples.

Since the response variable is a binary categorical variable, you need to make sure the training data has approximately equal proportion of classes.

table(bc$Class)#> benign malignant #> 444 239

Luokat ‘hyvänlaatuinen’ ja ‘pahanlaatuinen’ jakautuvat suunnilleen 1:2-suhteessa.

Tässä on selvästi luokkien epätasapaino. Ennen logit-mallin rakentamista on siis rakennettava otokset sellaisiksi, että sekä 1:t että 0:t ovat suunnilleen samassa suhteessa.

Tämä huoli hoidetaan yleensä parilla tekniikalla, joita kutsutaan:

  • Down Sampling
  • Up Sampling
  • Hybrid Sampling käyttäen SMOTEa ja ROSEa.

Mitä on Down Sampling ja Up Sampling?

7. Miten käsitellä luokkien epätasapainoa Upsampling- ja Downsampling-menetelmillä

Alasnäytteenotossa (Down Sampling) enemmistöluokkaa pienennetään satunnaisesti alaspäin niin, että se on samankokoinen kuin pienempi luokka. Tämä tarkoittaa sitä, että kun luodaan harjoitusaineistoa, hyvänlaatuisen luokan rivejä poimitaan harvemmin satunnaisotannan aikana.

Hyvinvoivan luokan rivejä poimitaan vastaavasti UpSamplingissa vähemmistöluokan rivejä eli malignant toistuvasti uudestaan ja uudestaan, kunnes se on samankokoinen kuin enemmistöluokka (benign).

Hybridinäytteenotossa luodaan keinotekoisia aineistopisteitä, joita lisätään järjestelmällisesti vähemmistöluokan ympärille. Tämä voidaan toteuttaa käyttämällä SMOTE– ja ROSE-paketteja.

Tässä esimerkissä näytän kuitenkin, miten näytteenotto tehdään ylös- ja alaspäin.

Luotaan siis harjoitus- ja testidata caret-paketin avulla.

Yllä olevassa pätkässä olen ladannut caret-paketin ja käyttänyt funktiota createDataPartition luodakseni rivejä harjoitusdatajoukon rivinumerot. Asettamalla p=.70 olen valinnut 70 % riveistä trainData:n sisälle ja loput 30 % testData:n sisälle.

table(trainData$Class)

Hyvänlaatuisia näytteitä on noin kaksi kertaa enemmän. Joten alennetaan näytteenottoa käyttämällä caret-paketin downSample-funktiota.

Tehdäksesi tämän sinun tarvitsee vain antaa X- ja Y-muuttujat argumentteina.

Benignit ja malignit ovat nyt samassa suhteessa.

Funktio %ni% on funktion %in% negaatio, ja olen käyttänyt sitä tässä valitsemaan kaikki sarakkeet paitsi sarakkeen Class.

Funktio downSample vaatii ‘y’-muuttujan tekijämuuttujaksi, siksi olin muuttanut luokan tekijäksi alkuperäisessä datassa.

Hienoa! Tehdään nyt upsampling käyttäen upSample-funktiota. Se noudattaa samanlaista syntaksia kuin downSample.

Kuten odotettua, benignit ja malignit ovat nyt samassa suhteessa.

Käytän downSampled-versiota aineistosta rakentaakseni logit-mallin seuraavassa vaiheessa.

Logistisen regressiomallin rakentaminen

Ennustaminen testiaineistolla

Logistinen regressiomalli

Yksityiskuvaus testiaineistolla

Yksityiskuvaus logitmod on nyt rakennettu. Voit nyt käyttää sitä ennustamaan vastetta testData:ssä.

pred <- predict(logitmod, newdata = testData, type = "response")

Nyt pred sisältää todennäköisyyden, että havainto on pahanlaatuinen jokaiselle havainnolle.

Huomaa, että kun käytät logistista regressiota, sinun on asetettava type='response', jotta voit laskea ennustamisen todennäköisyydet. Tätä argumenttia ei tarvita lineaarista regressiota käytettäessä.

Yleinen käytäntö on ottaa todennäköisyyden raja-arvoksi 0.5. Jos Y:n todennäköisyys on > 0.5, se voidaan luokitella tapahtumaksi (pahanlaatuiseksi).

Jos pred on siis suurempi kuin 0.5, se on pahanlaatuinen, muuten se on hyvänlaatuinen.

y_pred_num <- ifelse(pred > 0.5, 1, 0)y_pred <- factor(y_pred_num, levels=c(0, 1))y_act <- testData$Class

Lasketaan tarkkuus, joka ei ole mitään muuta kuin y_pred:n osuus, joka täsmää y_act:n kanssa.

mean(y_pred == y_act) 

Tässä tarkkuusprosentti on 94%.

Miksi luokkien epätasapainon käsittely on tärkeää?

Lupasin kertoa aiemmin, miksi luokkien epätasapainosta pitää huolehtia. Ymmärtääksesi sen oletetaan, että sinulla on tietokokonaisuus, jossa 95 % Y-arvoista kuuluu hyvänlaatuiseen luokkaan ja 5 % kuuluu pahanlaatuiseen luokkaan.

Jos olisin vain sokeasti ennustanut kaikki datapisteet hyvänlaatuisiksi, saavuttaisin 95 %:n tarkkuusprosentin. Mikä kuulostaa aika korkealta. Mutta ilmeisesti se on virheellinen. Ratkaisevaa on, kuinka hyvin ennustat pahanlaatuiset luokat.

Se siis edellyttää, että hyvänlaatuiset ja pahanlaatuiset luokat ovat tasapainossa JA sen lisäksi tarvitsen tarkempia tarkkuusmittareita ja mallin arviointimittareita ennustemallini parantamiseksi.

Täydellinen koodi

Johtopäätös

Tässä postauksessa näit, milloin ja miten logistista regressiota käytetään binääristen vastemuuttujien luokitteluun R:ssä.

Näit tämän esimerkin avulla, joka perustui BreastCancer-tietoaineistoon, jossa tavoitteena oli määritellä onko tietty kudosmassa pahanlaatuinen vai hyvänlaatuinen.

Mallin rakentaminen ja Y:n luokitteleminen on vain puolet työstä tehty. Itse asiassa ei edes puolet. Koska arviointimittareiden kirjo mallin tehokkuuden arvioimiseksi on laaja ja vaatii huolellista harkintaa oikean mallin valitsemiseksi. Seuraavassa osassa käsittelen erilaisia arviointimittareita, jotka auttavat ymmärtämään, miten hyvin luokittelumalli toimii eri näkökulmista.

Vastaa

Sähköpostiosoitettasi ei julkaista.