Logistická regrese – kompletní výukový program s příklady v R

Logistická regrese je algoritmus prediktivního modelování, který se používá, pokud je proměnná Y binární kategoriální. To znamená, že může nabývat pouze dvou hodnot jako 1 nebo 0. Cílem je určit matematickou rovnici, kterou lze použít k předpovědi pravděpodobnosti události 1. Jakmile je rovnice stanovena, lze ji použít k předpovědi proměnné Y, když jsou známy pouze proměnné X.

Logistická regrese – kompletní výukový program s příklady v jazyce R Obsah1. Úvod do logistické regrese
2. Několik reálných příkladů problémů binární klasifikace
3. Proč ne lineární regrese?
4. Logistická rovnice
5. Jak sestavit logistický regresní model v R?
6. Jak se vypořádat s nerovnováhou tříd?
7. Jak řešit nerovnováhu tříd pomocí Upsample a Downsample?
8. Sestavení logistického regresního modelu
9. Jak se vypořádat s nerovnováhou tříd? Jak předpovídat na testovací datové sadě
10. Proč je důležité pracovat s nevyvážeností tříd?
11. Závěr

1. Úvod do logistické regrese

Předtím jste viděli, co je to lineární regrese a jak ji použít k predikci spojitých proměnných Y.

V lineární regresi je proměnná Y vždy spojitá proměnná. Pokud bychom předpokládali, že proměnná Y je kategoriální, nemůžete ji pomocí lineární regrese modelovat.

Co byste tedy dělali, když je Y kategoriální proměnná se dvěma třídami?

Logistickou regresi lze použít k modelování a řešení takových problémů, které se také nazývají binární klasifikační problémy.

Klíčové je, že Y může mít pouze dvě třídy a ne více. Pokud by Y mělo více než 2 třídy, jednalo by se o klasifikaci více tříd a k tomu již nelze použít vanilkovou logistickou regresi.

Logistická regrese je však klasickou technikou prediktivního modelování a stále zůstává oblíbenou volbou pro modelování binárních kategoriálních proměnných.

Další výhodou logistické regrese je, že vypočítává skóre pravděpodobnosti predikce události. Více se o tom dozvíte, až začnete modely skutečně sestavovat.

Několik reálných příkladů problémů binární klasifikace

Možná vás zajímá, pro jaké problémy můžete logistickou regresi použít.

Zde jsou uvedeny některé příklady binárních klasifikačních problémů:

  • Detekce spamu : Předpovídání, zda je e-mail spam, nebo ne
  • Podvody s kreditními kartami : Předpovídání, zda je daná transakce kreditní kartou podvod, nebo ne
  • Zdraví : Předpovídání, zda je daný útvar tkáně nezhoubný nebo zhoubný
  • Marketing : Předpovídání, zda si daný uživatel koupí pojistný produkt nebo ne
  • Bankovnictví : Předpovídání, zda zákazník nesplácí úvěr.

Proč ne lineární regrese?

Když má proměnná odpovědi pouze 2 možné hodnoty, je žádoucí mít model, který předpovídá hodnotu buď jako 0, nebo 1, nebo jako skóre pravděpodobnosti, které se pohybuje mezi 0 a 1.

Lineární regrese tuto možnost nemá. Pokud totiž použijete lineární regresi k modelování binární proměnné odpovědi, výsledný model nemusí omezit předpovídané hodnoty Y v rozmezí 0 a 1.

Lineární vs. logistická regrese

Tady přichází ke slovu logistická regrese. V logistické regresi získáte skóre pravděpodobnosti, které odráží pravděpodobnost výskytu události.

Událostí je v tomto případě každý řádek trénovacího souboru dat. Může to být něco jako klasifikace, zda je daný e-mail spam, nebo masa buněk je zhoubná, nebo uživatel koupí produkt a tak dále.

Logistická rovnice

Logistická regrese toho dosáhne tak, že vezme logaritmickou pravděpodobnost události ln(P/1?P), kde, P je pravděpodobnost události. P tedy vždy leží mezi 0 a 1.

Přičtením exponentu na obě strany rovnice získáte:

Tuto rovnici můžete implementovat pomocí funkce glm() nastavením argumentu family na "binomial".

Důležitým upozorněním je také ujištění, že při použití funkce predict na modelu logistické regrese nastavíte type="response". Jinak bude předpovídat logaritmickou šanci P, tedy hodnotu Z, místo samotné pravděpodobnosti.

Jak sestavit logistický regresní model v R?

Nyní se podíváme, jak implementovat logistickou regresi pomocí datové sady BreastCancer v balíčku mlbench. Budete si k tomu muset nainstalovat balíček mlbench.

Cílem je modelovat a předpovědět, zda je daný vzorek (řádek v datasetu) benign nebo malignant, a to na základě 9 dalších buněčných znaků. Načtěme tedy data a ponechme pouze úplné případy.

Soubor dat o rakovině prsu

Soubor dat má 699 pozorování a 11 sloupců. Sloupec Class je odpovědní (závislá) proměnná a říká, zda je daná tkáň zhoubná nebo nezhoubná.

Podívejme se na strukturu tohoto datasetu.

Kromě Id jsou všechny ostatní sloupce faktory. To je problém, když modelujete tento typ dat.

Protože když sestavujete logistický model s faktorovými proměnnými jako rysy, převádí se každá úroveň ve faktoru na fiktivní binární proměnnou 1 a 0.

Například tvar buňky je faktor s 10 úrovněmi. Když použijete glm k modelování třídy jako funkce tvaru buňky, bude tvar buňky před sestavením modelu rozdělen na 9 různých binárních kategoriálních proměnných.

Pokud máte sestavit logistický model bez provedení jakýchkoli přípravných kroků, pak můžete postupovat následovně. My se tím ale řídit nebudeme, protože před sestavením logistického modelu je třeba se postarat o určité věci.

Syntaxe pro sestavení logistického modelu je velmi podobná funkci lm, kterou jste viděli u lineární regrese. Pro sestavení logistického regresního modelu stačí nastavit family='binomial' pro glm.

glm je zkratka pro zobecněné lineární modely a kromě lineární a logistické regrese dokáže sestavit mnoho dalších typů regresních modelů.

Podívejme se, jak může vypadat kód pro sestavení logistického modelu. K tomuto kroku se ještě vrátím později, protože před sestavením modelu je třeba provést některé kroky předzpracování.

Ve výše uvedeném modelu je Class modelována jako funkce samotné Cell.shape.

Všimněte si však, že z výstupu se Cell.Shape rozdělila na 9 různých proměnných. Je to proto, že protože Cell.Shape je uložena jako faktorová proměnná, glm vytváří 1 binární proměnnou (tzv. dummy proměnnou) pro každou z 10 kategoriálních úrovní Cell.Shape.

Je zřejmé, že z významu Cell.Shape se zdá, že v rámci kategoriálních úrovní Cell.Shape existuje nějaké uspořádání. To znamená, že hodnota tvaru buňky 2 je větší než hodnota tvaru buňky 1 atd.

Tak je tomu i u ostatních proměnných v souboru dat. Proto je vhodnější převést je na číselné proměnné a odstranit sloupec id.

Kdyby se jednalo o čistě kategoriální proměnnou bez vnitřního uspořádání, jako je například pohlaví pacienta, můžete tuto proměnnou ponechat jako samotný faktor.

# 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

Třídy “benigní” a “maligní” jsou rozděleny přibližně v poměru 1:2.

Je zřejmé, že dochází k nerovnováze tříd. Před sestavením logitového modelu je tedy třeba sestavit vzorky tak, aby 1 i 0 byly přibližně ve stejném poměru.

Tento problém se obvykle řeší pomocí několika technik, které se nazývají:

  • Down Sampling
  • Up Sampling
  • Hybrid Sampling pomocí SMOTE a ROSE.

Co je to Down Sampling a Up Sampling

7. Jak se vypořádat s nerovnováhou tříd pomocí Upsampling a Downsampling

Při Down Sampling se většinová třída náhodně zmenší tak, aby měla stejnou velikost jako menší třída. To znamená, že při vytváření trénovacího souboru dat budou při náhodném vzorkování méněkrát vybrány řádky s benigní třídou.

Podobně při UpSamplingu jsou opakovaně vzorkovány řádky z minoritní třídy, tedy malignant, dokud nedosáhne stejné velikosti jako majoritní třída (benign).

V případě Hybridního vzorkování jsou však generovány umělé datové body, které jsou systematicky přidávány kolem minoritní třídy. To lze realizovat pomocí balíčků SMOTE a ROSE.

Pro tento příklad však ukážu, jak provést vzorkování nahoru a dolů.

Vytvořím tedy trénovací a testovací data pomocí balíčku caret.

V uvedeném úryvku jsem načetl balíček caret a použil funkci createDataPartition pro generování čísel řádků pro trénovací datovou sadu. Nastavením p=.70jsem zvolil, že 70 % řádků půjde dovnitř trainData a zbývajících 30 % půjde do testData.

table(trainData$Class)

Přibližně 2krát více benigních vzorků. Pojďme je tedy zmenšit pomocí funkce downSample z balíčku caret.

K tomu stačí zadat jako argumenty proměnné X a Y.

Benigní a maligní jsou nyní ve stejném poměru.

Funkce %ni% je negací funkce %in% a já jsem ji zde použil pro výběr všech sloupců kromě sloupce Class.

Funkce downSample vyžaduje proměnnou ‘y’ jako faktor, to je důvod, proč jsem v původních datech převedl třídu na faktor.

Skvělé! Nyní provedu převzorkování pomocí funkce upSample. Ta má podobnou syntaxi jako downSample.

Podle očekávání jsou nyní benigní a maligní ve stejném poměru.

V dalším kroku použiji downsamplovanou verzi datové sady k sestavení logitového modelu.

Sestavení logistického regresního modelu

Jak předpovídat na testovací datové sadě

Model logitmod je nyní sestaven. Nyní jej můžete použít k predikci odpovědi na testData.

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

Nyní pred obsahuje pravděpodobnost, že pozorování je zhoubné pro každé pozorování.

Poznamenejte, že při použití logistické regrese musíte nastavit type='response', abyste mohli vypočítat pravděpodobnosti predikce. Tento argument není potřeba v případě lineární regrese.

Běžnou praxí je brát jako mezní hodnotu pravděpodobnosti 0,5.

Běžnou praxí je brát jako mezní hodnotu pravděpodobnosti 0,5. Pokud je pravděpodobnost Y > 0,5, pak ji lze klasifikovat jako událost (maligní).

Je tedy pred větší než 0,5, je maligní, jinak je benigní.

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

Vypočítáme přesnost, což není nic jiného než podíl y_pred, který se shoduje s y_act.

mean(y_pred == y_act) 

Tady máte přesnost 94 %.

Proč je důležité vypořádat se s nevyvážeností tříd?

Právě jsem slíbil, že vám řeknu, proč je třeba se o nevyváženost tříd postarat dříve. Abychom to pochopili, předpokládejme, že máte soubor dat, kde 95 % hodnot Y patří do třídy benigních a 5 % do třídy maligních.

Kdybych jen slepě předpověděl všechny body dat jako benigní, dosáhl bych procenta přesnosti 95 %. Což zní dost vysoko. Ale je zřejmé, že je to chybné. Záleží na tom, jak dobře předpovídáte maligní třídy.

Takže to vyžaduje, aby benigní a maligní třídy byly vyvážené A navíc potřebuji přesnější míry přesnosti a metriky hodnocení modelu, abych zlepšil svůj predikční model.

Plný kód

Závěr

V tomto příspěvku jste viděli, kdy a jak použít logistickou regresi ke klasifikaci binárních proměnných odpovědí v jazyce R.

Viděli jste to na příkladu založeném na souboru dat BreastCancer, kde bylo cílem určit, zda je daná hmota tkáně maligní nebo benigní.

Sestavení modelu a klasifikace Y je jen polovina odvedené práce. Vlastně ani ne polovina. Protože rozsah hodnotících metrik pro posouzení účinnosti modelu je rozsáhlý a vyžaduje pečlivý úsudek pro výběr správného modelu. V další části se budu zabývat různými hodnotícími metrikami, které pomohou pochopit, jak dobře si klasifikační model vede z různých hledisek.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.