Logisztikus regresszió – Egy teljes oktatóanyag példákkal R nyelven

A logisztikus regresszió egy prediktív modellezési algoritmus, amelyet akkor használnak, ha az Y változó bináris kategorikus. Vagyis csak két értéket vehet fel, például 1 vagy 0. A cél egy olyan matematikai egyenlet meghatározása, amely segítségével megjósolható az 1. esemény valószínűsége. Ha az egyenlet megvan, akkor az Y megjóslására használható, ha csak az X�ek ismertek.

Logisztikus regresszió – Egy teljes oktatóanyag példákkal az R-ben Tartalom1. Bevezetés a logisztikus regresszióba
2. Néhány valós példa bináris osztályozási problémákra
3. Miért nem lineáris regresszió?
4. A logisztikus egyenlet
5. Hogyan építsünk logisztikus regressziós modellt R-ben?
6. Hogyan kezeljük az osztályegyenlőtlenséget?
7. Hogyan kezeljük az osztályegyenlőtlenséget Upsample és Downsample segítségével?
8. A logisztikus regressziós modell felépítése
9. A logisztikus regressziós modell felépítése
9. Hogyan kell előrejelzést készíteni a tesztadathalmazon
10. Miért fontos az osztályegyensúlyhiány kezelése?
11. Következtetés

1. Bevezetés a logisztikus regresszióba

Előtte már látta, mi az a lineáris regresszió, és hogyan használjuk folyamatos Y változók előrejelzésére.

A lineáris regresszióban az Y változó mindig folytonos változó. Ha tegyük fel, hogy az Y változó kategorikus, akkor a lineáris regresszióval nem lehet modellezni.

Mi a teendő akkor, ha az Y egy kategorikus változó, amelynek 2 osztálya van?

A logisztikus regresszió az ilyen, bináris osztályozási problémáknak is nevezett problémák modellezésére és megoldására használható.

A legfontosabb szempont itt az, hogy az Y-nak csak 2 osztálya lehet, ennél több nem. Ha Y-nak több mint 2 osztálya van, akkor többosztályos osztályozássá válik, és erre már nem használható a vanília logisztikus regresszió.

Mégis, a logisztikus regresszió egy klasszikus prediktív modellezési technika, és még mindig népszerű választás bináris kategorikus változók modellezésére.

A logisztikus regresszió másik előnye, hogy kiszámítja egy esemény előrejelzési valószínűségi pontszámát. Erről bővebben akkor, amikor ténylegesen elkezdjük a modellek építését.

Néhány valós példa bináris osztályozási problémákra

Elképzelhető, hogy elgondolkodik azon, hogy milyen problémákra használhatja a logisztikus regressziót.

Itt van néhány példa bináris osztályozási problémákra:

  • Spam detektálás : Annak előrejelzése, hogy egy e-mail spam-e vagy sem
  • Hitelkártya csalás : Annak előrejelzése, hogy egy adott hitelkártya tranzakció csalás-e vagy sem
  • Egészségügy : Annak előrejelzése, hogy egy adott szövettömeg jó- vagy rosszindulatú-e
  • Marketing : Annak előrejelzése, hogy egy adott felhasználó megvesz-e egy biztosítási terméket vagy sem
  • Banki tevékenység : Annak előrejelzése, hogy egy ügyfél nem fog-e fizetni egy hitelt.

Miért nem lineáris regresszió?

Ha a válaszváltozónak csak 2 lehetséges értéke van, akkor olyan modell kívánatos, amely az értéket vagy 0 vagy 1 értékként, vagy 0 és 1 közötti valószínűségi pontszámként jósolja meg.

A lineáris regresszió nem rendelkezik ezzel a képességgel. Ugyanis, Ha lineáris regressziót használunk egy bináris válaszváltozó modellezésére, az így kapott modell nem korlátozhatja az előre jelzett Y értékeket 0 és 1 közé.

Lineáris vs. logisztikus regresszió

Ez az a pont, ahol a logisztikus regresszió a képbe kerül. A logisztikus regresszióban egy valószínűségi pontszámot kapunk, amely az esemény bekövetkezésének valószínűségét tükrözi.

Egy esemény ebben az esetben a képzési adathalmaz minden sora. Ilyen lehet például annak osztályozása, hogy egy adott e-mail spam-e, vagy egy sejttömeg rosszindulatú-e, vagy egy felhasználó megvesz-e egy terméket és így tovább.

A logisztikus egyenlet

A logisztikus regresszió ezt úgy éri el, hogy az esemény logaritmikus esélyét ln(P/1?P), ahol, P az esemény valószínűsége. Tehát P mindig 0 és 1 között van.

Az egyenlet mindkét oldalán az exponens felvétele adja:

Az egyenletet a glm() függvény segítségével valósíthatja meg, ha a family argumentumot "binomial"-re állítja.

Egy fontos figyelmeztetés továbbá, hogy a type="response" beállítására ügyeljen, ha a predict függvényt használja a logisztikus regressziós modellre. Ellenkező esetben a P log esélyét, azaz a Z-értéket fogja megjósolni maga a valószínűség helyett.

Hogyan építsünk logisztikus regressziós modellt R-ben?

Most nézzük meg, hogyan valósíthatjuk meg a logisztikus regressziót a BreastCancer adatkészlet felhasználásával a mlbench csomagban. Ehhez telepítenünk kell a mlbench csomagot.

A cél itt az, hogy modellezzük és megjósoljuk, hogy egy adott minta (sor az adathalmazban) benign vagy malignant-e, 9 másik sejtjellemző alapján. Töltsük be tehát az adatokat, és csak a teljes eseteket tartsuk meg.

Mellrák adatállomány

Az adatállomány 699 megfigyelést és 11 oszlopot tartalmaz. A Class oszlop a válasz (függő) változó, és azt mondja meg, hogy egy adott szövet rosszindulatú vagy jóindulatú.

Nézzük meg ennek az adathalmaznak a szerkezetét.

A Id kivételével az összes többi oszlop faktor. Ez problémát jelent az ilyen típusú adatok modellezésekor.

Mert amikor logisztikus modellt építünk faktorváltozókkal mint jellemzőkkel, a faktor minden egyes szintjét egy 1-es és 0-s dummy bináris változóvá alakítja.

A Cell shape például egy 10 szintes faktor. Amikor a glm segítségével modellezi az Osztály a sejt alakjának függvényében, a sejt alakját 9 különböző bináris kategorikus változóra bontja a modell építése előtt.

Ha logisztikus modellt akar építeni, anélkül, hogy bármilyen előkészítő lépést elvégezne, akkor a következőket tehetné. De mi ezt nem fogjuk követni, mivel vannak bizonyos dolgok, amelyekre ügyelnünk kell a logit modell építése előtt.

A logit modell építésének szintaxisa nagyon hasonlít a lineáris regresszióban látott lm függvényhez. A logisztikus regressziós modell építéséhez csak a family='binomial'-t kell beállítanunk a glm helyett.

glm az általánosított lineáris modellek rövidítése, és a lineáris és logisztikus regresszión kívül számos más típusú regressziós modell építésére is képes.

Lássuk, hogyan nézhet ki a logisztikus modell építésének kódja. Erre a lépésre később még visszatérek, mivel a modell építése előtt néhány előfeldolgozási lépést kell elvégezni.

A fenti modellben a Class csak a Cell.shape függvényeként van modellezve.

De figyeljük meg a kimenetből, hogy a Cell.Shape 9 különböző változóra lett felosztva. Ennek az az oka, hogy mivel a Cell.Shape faktorváltozóként van tárolva, a glm 1 bináris változót (más néven dummy változót) hoz létre a Cell.Shape mind a 10 kategorikus szintjéhez.

A Cell.Shape jelentéséből egyértelműen látszik, hogy van valamilyen rendezés a Cell.Shape kategorikus szintjein belül. Vagyis a 2-es cellaforma értéke nagyobb, mint az 1-es cellaforma és így tovább.

Ez az adatállomány más változói esetében is így van. Ezért célszerű ezeket numerikus változókká alakítani, és eltávolítani az id oszlopot.

Ha ez egy tisztán kategorikus változó lenne, belső rendezés nélkül, mint például a beteg neme, akkor ezt a változót meghagyhatnánk önmagában faktornak.

# 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

A “jóindulatú” és “rosszindulatú” osztályok körülbelül 1:2 arányban oszlanak meg.

Egyértelmű, hogy osztályegyensúlyhiány van. Tehát a logit modell felépítése előtt úgy kell felépíteni a mintákat, hogy az 1-esek és a 0-sok megközelítőleg egyenlő arányban legyenek.

Ezt az aggályt általában néhány technikával kezeljük, amelyeket úgy hívunk:

  • Down Sampling
  • Up Sampling
  • Hybrid Sampling a SMOTE és a ROSE segítségével.

Azaz, mi a Down mintavételezés és a Up mintavételezés?

7. Hogyan kezeljük az osztályok kiegyensúlyozatlanságát Upsampling és Downsampling segítségével

A Down mintavételezés során a többségi osztályt véletlenszerűen lemintavételezzük, hogy a kisebb osztállyal azonos méretű legyen. Ez azt jelenti, hogy a képzési adathalmaz létrehozásakor a jóindulatú osztállyal rendelkező sorokat kevesebbszer választjuk ki a véletlenszerű mintavételezés során.

Hasonlóképpen, az UpSampling során a kisebbségi osztály sorait, azaz a malignant sorokat ismételten újra és újra mintavételezzük, amíg eléri a többségi osztállyal azonos méretet (benign).

A Hybrid sampling esetében azonban mesterséges adatpontokat generálunk, amelyeket szisztematikusan adunk hozzá a kisebbségi osztály körül. Ezt a SMOTE és ROSE csomagok segítségével lehet megvalósítani.

Ezzel a példával azonban azt fogom bemutatni, hogyan lehet felfelé és lefelé mintavételt végezni.

Elkészítem tehát a képzési és tesztadatokat a caret csomag segítségével.

A fenti részletben betöltöttem a caret csomagot, és a createDataPartition függvényt használtam a képzési adathalmaz sorszámainak létrehozására. A p=.70 beállításával úgy döntöttem, hogy a sorok 70%-a a trainData-be kerüljön, a maradék 30% pedig a testData-be.

table(trainData$Class)

Ez körülbelül 2-szer több jóindulatú minta. Tehát csökkentsük le a mintavételt a caret csomag downSample függvényének segítségével.

Ezhez csak az X és Y változókat kell megadni argumentumként.

A jó- és rosszindulatúak most már azonos arányban vannak.

A %ni% a %in% függvény negációja, és itt arra használtam, hogy a Class oszlop kivételével az összes oszlopot kiválasszam.

A downSample függvényhez az ‘y’ változóra mint tényezőváltozóra van szükség, ez az oka annak, hogy az eredeti adatokban az osztályt tényezővé alakítottam át.

Nagyszerű! Most hadd végezzem el a mintavételezést a upSample függvény segítségével. Hasonló szintaxist követ, mint a downSample.

Amint várható volt, a jó- és rosszindulatúak most már azonos arányban vannak.

A következő lépésben az adathalmaz lemintavételezett változatát fogom használni a logit modell építéséhez.

A logisztikus regressziós modell építése

How to Predict on Test Dataset

A logitmod most felépült. Most már használhatja a válasz előrejelzésére a testData-en.

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

Most a pred tartalmazza annak a valószínűségét, hogy a megfigyelés rosszindulatú minden egyes megfigyeléshez.

Megjegyezzük, hogy a logisztikus regresszió használatakor a type='response'-ot kell beállítania az előrejelzési valószínűségek kiszámításához. Lineáris regresszió esetén erre az argumentumra nincs szükség.

Az általános gyakorlat szerint a valószínűségi határértéket 0,5-nek vesszük. Ha Y valószínűsége > 0,5, akkor eseménynek (rosszindulatúnak) minősíthető.

Ha tehát a pred nagyobb, mint 0,5, akkor rosszindulatú, máskülönben jóindulatú.

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

Kalkuláljuk ki a pontosságot, ami nem más, mint a y_pred és a y_act közötti egyezés aránya.

mean(y_pred == y_act) 

Ezzel 94%-os pontosságot kapunk.

Miért fontos az osztályegyensúlytalanság kezelése?

Megígértem, hogy korábban elmondom, miért kell az osztályegyensúlytalansággal foglalkozni. Ennek megértéséhez tegyük fel, hogy van egy adathalmazunk, ahol az Y értékek 95%-a a jóindulatú osztályba, 5%-a pedig a rosszindulatú osztályba tartozik.

Ha csak vakon jóindulatúnak jósolnám az összes adatpontot, akkor 95%-os pontossági százalékot érnék el. Ami elég magasnak hangzik. De nyilvánvalóan ez hibás. Az számít, hogy milyen jól jósolja meg a rosszindulatú osztályokat.

Ez tehát megköveteli, hogy a jóindulatú és rosszindulatú osztályok egyensúlyban legyenek ÉS ezen felül finomabb pontossági mérésekre és modellértékelési metrikákra van szükségem az előrejelzési modellem javításához.

Teljes kód

Következtetés

Ebben a bejegyzésben láttad, hogy mikor és hogyan kell logisztikus regressziót használni bináris válaszváltozók osztályozására R-ben.

Ezt egy példán keresztül láttad a BreastCancer adatállomány alapján, ahol a cél annak meghatározása volt, hogy egy adott szövettömeg rosszindulatú vagy jóindulatú-e.

A modell felépítése és az Y osztályozása csak fél munka. Valójában még a fele sem. Mert a modell hatékonyságának megítélésére szolgáló értékelési metrikák köre hatalmas, és gondos mérlegelést igényel a megfelelő modell kiválasztása. A következő részben különböző értékelési metrikákat fogok tárgyalni, amelyek segítenek megérteni, hogy az osztályozási modell milyen jól teljesít a különböző szempontok szerint.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.