Aiemmassa postauksessamme syvennyimme syihin, joiden vuoksi Logistisessa regressiossa käytetään Sigmoid-funktiota normaalin lineaarisen funktion sijasta. Tässä postauksessa jatkamme kustannusfunktion jakamista.
Kustannusfunktio on tärkeä, koska se antaa meille ennusteidemme virheet ja myöhemmin sitä tarvitaan oppimisalgoritmillemme. Konkreettisesti haluamme minimoida ennusteidemme virheet eli minimoida kustannusfunktion. Ihannetapauksessa, jos kaikki virheet ovat nolla, on kuin pelaisimme tikkapeliä, jossa kaikki tikkamme osuvat napakymppiin. Toisaalta, jos virheemme ovat hyvin suuria, se tarkoittaa, että ennustetut arvot eivät osu kaikkiin todellisiin havaittuihin arvoihin, eli tikkamme eivät yleensä osu napakymppiin.
Vaikka haluaisimmekin, että virheet ovat nolla, kun ajamme kustannusfunktiota oletetuilla arvoilla (täydellinen ennuste jokaiselle arvolle), tämä ei välttämättä ole hyvä skenaario, koska se voi johtaa ilmiöön, jota kutsutaan ”suureksi varianssiksi”. Käsittelemme tätä tarkemmin myöhemmissä kirjoituksissa.
Palatakseni takaisin tappiofunktion muotoiluun, tyypillinen tappiofunktio olisi minimoida neliövirheiden summa, ts.
Tämä funktio voi kuitenkin synnyttää useita paikallisia optimeita optimointiprosessin aikana, mikä tarkoittaa sitä, että optimoitu ratkaisusi ei välttämättä olekaan kaikkein optimaalisin (on mahdollista, että on olemassa parempi ratkaisu). Ihannetapauksessa haluamme optimoidun ratkaisun olevan pikemminkin globaali minimi kuin paikallinen minimi.
Kuten yllä olevasta kaaviosta nähdään, saatamme epähuomiossa alustaa parametrit ja optimoida ne paikalliseen minimiin saavuttamatta ”todellista” globaalia minimiä. Siksi edellä mainittu häviöfunktio ei olisi ihanteellinen käyttöömme.
Mikä voisi sitten olla häviöfunktiomme?
Yksi logistisessa regressiossa yleisesti käytetty häviöfunktio on tämä:
Huomaa, että käytin kustannusta ja häviöfunktiota synonyymisti, mutta niille, jotka ovat tottuneet Andrew Ng:n luentoihin, sanon tässä, että ”häviöfunktio” koskee yhtä yksittäistä harjoitteluesimerkkiä, kun taas ”kustannusfunktio” ottaa keskiarvon kaikista harjoitteluesimerkeistä.
Voit nähdä, miksi tämä tappiofunktio on järkevä: Olettaen, että y = 1, ja keskittyen ylimpään yhtälöön, -log(h⊖(x)), haluamme sen olevan hyvin negatiivinen, koska tämä on tappiofunktio (Muistetaan, että haluamme minimoida tappiofunktion tavoitteena). Tämän seurauksena h⊖(x) on suuri. Muistutetaan kuitenkin, että h⊖(x) rajoittuu maksimiarvoon 1, koska Sigmoid-funktio rajoittaa estimoidun hypoteesiarvon välille 0-1:
h⊖(x) = ŷ = σ(z)
Näin ollen, kun y=1, häviöfunktio on minimoitu äärimmilleen, kun ŷ = 1. Täydellinen ennuste, jossa syntyy vain vähän tai ei lainkaan tappioita/kustannuksia.
Kääntäen, jos y = 0, ja keskittyen yhtälön alaosaan, -log(1- h⊖(x)). Haluamme tämän olevan hyvin negatiivinen tappioiden minimointitavoitteen vuoksi. Tämän seurauksena 1- h⊖(x) olisi hyvin suuri, ja tästä seuraa, että h⊖(x) olisi hyvin pieni. Muistutetaan kuitenkin, että h⊖(x) rajoittuu minimiarvoon 0, koska Sigmoid-funktio tekee estimoidun hypoteesiarvon välille 0-1.
Kun y=0, häviöfunktio on siis minimoitu äärimmilleen, kun ŷ = 0. Täydellinen ennuste, jossa syntyy vain vähän tai ei lainkaan tappioita/kustannuksia.
Neuvotteluja vastaavat kuvaajat havainnollistavat edellä mainittuja seikkoja:
Vasemmanpuoleisesta kuvaajasta (y = -log(h⊖(x)) nähdään, että kun y = 1, kustannus menee 0:aan, kun oletettu arvo on 1, ja menee äärettömään, kun oletettu arvo on lähellä 0.
Samoin oikeanpuoleinen kuvaaja (y = -log(1 – h⊖(x)), kun y = 0, kustannus menee 0:aan, kun oletettu arvo on 0 ja menee äärettömään, kun oletettu arvo on lähellä 1.
Yhdistämällä molemmat yhteen siistiksi yhtälöksi saadaan logistiikkaregression kustannusfunktio m harjoitusesimerkillä:
jolloin i menee 1:stä m:n harjoitusesimerkin kohdalla.
Tekoälyssä ja koneoppimisessa heitetään paljon merkintöjä, ja olisi hyödyllistä saada käsitys niistä.
Koulutettaessa logistista regressiomallia pyritään löytämään parametrit ”w” ja ”b”, jotka minimoivat kokonaiskustannusfunktion. Seuraavassa artikkelissa käsittelemme seuraavaa tärkeää osa-aluetta, gradienttilaskeutumista.
Numpy:ssä voimme koodata kustannusfunktion seuraavasti:
import numpy as npcost = (-1/m) * np.sum(Y*np.log(A) + (1-Y)*(np.log(1-A)))
Selittääksemme:
- np.sum laskee summan matriisin elementtien yli (Y*np.log(A) + (1-Y)*(np.log(1-A)), joka tässä tapauksessa olisi summa kaikkien harjoitusesimerkkien yli. Lue lisää täältä.
- np.log ottaa luonnollisen login elementtikohtaisesti matriisin elementteihin. Lue lisää täältä.
- ”*” ottaa yhden array:n elementit ja kertoo ne elementtiviisaasti toisen array:n elementteihin. Tämä ei ole matriisikertolasku, jolla on muotovaatimus molemmista matriiseista: Ensimmäisen matriisin sarakkeiden lukumäärän on oltava yhtä suuri kuin toisen matriisin rivien.