Logistic Regression – A Complete Tutorial With Examples in R

Logistic regression is een voorspellend modelleringsalgoritme dat wordt gebruikt wanneer de Y-variabele binair categorisch is. Dat wil zeggen dat zij slechts twee waarden kan aannemen, zoals 1 of 0. Het doel is een wiskundige vergelijking op te stellen die kan worden gebruikt om de waarschijnlijkheid van gebeurtenis 1 te voorspellen. Zodra de vergelijking is opgesteld, kan ze worden gebruikt om de Y te voorspellen wanneer alleen de X�s bekend zijn.

Logistic Regression – A Complete Tutorial With Examples in R Inhoud1. Inleiding tot Logistische Regressie
2. Enkele voorbeelden uit de praktijk van binaire classificatieproblemen
3. Waarom geen lineaire regressie?
4. De Logistische Vergelijking
5. Hoe een logistisch regressiemodel bouwen in R?
6. Hoe omgaan met klassenonevenwichtigheid?
7. Hoe omgaan met klassenonevenwichtigheid met Upsample en Downsample?
8. Het Logistische Regressiemodel bouwen
9. Hoe voorspellen op Test Dataset
10. Waarom is het belangrijk om met klassenonevenwichtigheid om te gaan?
11. Conclusie

1. Inleiding tot logistische regressie

Eerder hebt u gezien wat lineaire regressie is en hoe u deze kunt gebruiken om continue Y-variabelen te voorspellen.

In lineaire regressie is de Y-variabele altijd een continue variabele. Stel dat de Y-variabele categorisch is, dan kun je hem niet met lineaire regressie modelleren.

Wat doe je dan als de Y een categorische variabele met 2 klassen is?

Logistische regressie kan worden gebruikt om dergelijke problemen, ook wel binaire classificatieproblemen genoemd, te modelleren en op te lossen.

Het belangrijkste punt hierbij is dat Y slechts 2 klassen kan hebben en niet meer dan dat. Als Y meer dan 2 klassen heeft, wordt het een classificatie met meerdere klassen en kun je de vanilla logistische regressie daarvoor niet meer gebruiken.

Toch is logistische regressie een klassieke voorspellende modelleringstechniek en nog steeds een populaire keuze voor het modelleren van binaire categorische variabelen.

Een ander voordeel van logistische regressie is dat het een voorspellende waarschijnlijkheidsscore van een gebeurtenis berekent. Meer daarover wanneer je de modellen daadwerkelijk gaat bouwen.

Enkele voorbeelden uit de praktijk van binaire classificatieproblemen

Je vraagt je misschien af voor wat voor soort problemen je logistische regressie kunt gebruiken.

Hier volgen enkele voorbeelden van binaire classificatieproblemen:

  • Spam Detection : Voorspellen of een e-mail Spam is of niet
  • Credit Card Fraud : Voorspellen of een gegeven credit card transactie fraude is of niet
  • Gezondheid : Voorspellen of een gegeven weefselmassa goedaardig of kwaadaardig is
  • Marketing : Voorspellen of een gegeven gebruiker al dan niet een verzekeringsproduct zal kopen
  • Bankieren : Voorspellen of een klant in gebreke zal blijven bij het aflossen van een lening.

Waarom geen lineaire regressie?

Wanneer de responsvariabele slechts 2 mogelijke waarden heeft, is het wenselijk een model te hebben dat de waarde voorspelt als 0 of 1 of als een waarschijnlijkheidsscore die tussen 0 en 1 ligt.

Lineaire regressie is hiertoe niet in staat. Als u namelijk lineaire regressie gebruikt om een binaire responsvariabele te modelleren, is het mogelijk dat het resulterende model de voorspelde Y-waarden niet beperkt tot 0 en 1.

Lineaire versus logistische regressie

Dit is waar logistische regressie in het spel komt. Bij logistische regressie krijgt u een waarschijnlijkheidsscore die de waarschijnlijkheid weergeeft dat de gebeurtenis zich voordoet.

Een gebeurtenis is in dit geval elke rij van de trainingsdataset. Het kan bijvoorbeeld gaan om de classificatie of een bepaalde e-mail spam is, of een massa cellen kwaadaardig is, of een gebruiker een product zal kopen, enzovoort.

De logistische vergelijking

Logistische regressie bereikt dit door de log-kans van de gebeurtenis ln(P/1?P) te nemen, waarbij P de waarschijnlijkheid van de gebeurtenis is. P ligt dus altijd tussen 0 en 1.

Het nemen van de exponent aan beide zijden van de vergelijking geeft:

U kunt deze vergelijking implementeren met behulp van de functie glm() door het argument family in te stellen op "binomial".

Een belangrijk voorbehoud is ook dat u de type="response" instelt wanneer u de functie predict gebruikt voor een logistisch regressiemodel. Anders zal het de log odds van P voorspellen, dat is de Z-waarde, in plaats van de waarschijnlijkheid zelf.

Hoe bouw je een logistisch regressiemodel in R?

Nu laten we eens kijken hoe we logistische regressie kunnen implementeren met behulp van de BreastCancer dataset in mlbench pakket. U moet het mlbench-pakket hiervoor installeren.

Het doel hier is om een model te maken en te voorspellen of een bepaald specimen (rij in de dataset) benign of malignant is, op basis van 9 andere celkenmerken. Laten we dus de gegevens laden en alleen de volledige gevallen behouden.

Borstkankerdataset

De dataset heeft 699 waarnemingen en 11 kolommen. De kolom Class is de responsvariabele (afhankelijke variabele) en geeft aan of een bepaald weefsel kwaadaardig of goedaardig is.

Laten we de structuur van deze dataset eens bekijken.

Behoudens Id zijn alle andere kolommen factoren. Dit is een probleem wanneer u dit type gegevens modelleert.

Omdat, wanneer u een logistisch model bouwt met factorvariabelen als kenmerken, het elk niveau in de factor omzet in een dummy binaire variabele van 1’s en 0’s.

Voorbeeld, celvorm is een factor met 10 niveaus. Wanneer je glm gebruikt om de klasse te modelleren als functie van de celvorm, wordt de celvorm vóór de bouw van het model opgesplitst in 9 verschillende binaire categorische variabelen.

Als je een logistisch model wilt bouwen zonder enige voorbereidende stappen te doen, zou je het volgende kunnen doen. Maar wij gaan dit niet volgen, omdat er bepaalde dingen zijn die u moet regelen voordat u het logit-model bouwt.

De syntaxis om een logit-model te bouwen lijkt sterk op de lm-functie die u bij lineaire regressie hebt gezien. U hoeft alleen de family='binomial' voor glm in te stellen om een logistisch regressiemodel te bouwen.

glm staat voor gegeneraliseerde lineaire modellen en is in staat om vele soorten regressiemodellen te bouwen naast lineaire en logistische regressie.

Laten we eens kijken hoe de code om een logistisch model te bouwen eruit zou kunnen zien. Ik kom later op deze stap terug, omdat er enkele voorbewerkingsstappen moeten worden uitgevoerd voordat het model wordt gebouwd.

In bovenstaand model wordt Class gemodelleerd als een functie van Cell.shape alleen.

Maar merk op dat in de uitvoer Cell.Shape in 9 verschillende variabelen is opgesplitst. Dit komt omdat, aangezien Cell.Shape is opgeslagen als een factorvariabele, glm 1 binaire variabele (alias dummy-variabele) creëert voor elk van de 10 categorische niveaus van Cell.Shape.

Uit de betekenis van Cell.Shape blijkt duidelijk dat er een soort ordening is binnen de categorische niveaus van Cell.Shape. Dat wil zeggen, een celvormwaarde van 2 is groter dan celvorm 1 enzovoort.

Dit is ook het geval met andere variabelen in de dataset. Het verdient dus de voorkeur ze in numerieke variabelen om te zetten en de id-kolom te verwijderen.

Was het een zuiver categorische variabele zonder interne ordening, zoals bijvoorbeeld het geslacht van de patiënt, dan kun je die variabele als factor zelf laten staan.

# 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

De klassen ‘goedaardig’ en ‘kwaadaardig’ zijn ongeveer in de verhouding 1:2 gesplitst.

Er is duidelijk sprake van een klassenonevenwichtigheid. Voordat u het logit-model bouwt, moet u de steekproeven dusdanig samenstellen dat zowel de 1’s als de 0’s ongeveer evenredig verdeeld zijn.

Dit probleem wordt gewoonlijk aangepakt met een paar technieken die worden genoemd:

  • Down Sampling
  • Up Sampling
  • Hybrid Sampling met behulp van SMOTE en ROSE.

Dus, wat is Down Sampling en Up Sampling?

7. Hoe om te gaan met Klasse Onbalans met Upsampling en Downsampling

In Down sampling, wordt de meerderheidsklasse willekeurig down sampled om even groot te zijn als de kleinere klasse. Dat betekent dat bij het samenstellen van de trainingsdataset de rijen met de goedaardige klasse minder vaak worden gekozen tijdens de aselecte bemonstering.

Op vergelijkbare wijze worden bij UpSampling de rijen uit de minderheidsklasse, dat wil zeggen malignant herhaaldelijk bemonsterd totdat deze dezelfde grootte hebben als de meerderheidsklasse (benign).

Maar in het geval van Hybride bemonstering worden kunstmatige gegevenspunten gegenereerd en systematisch toegevoegd rond de minderheidsklasse. Dit kan worden geïmplementeerd met behulp van de pakketten SMOTE en ROSE.

Hoewel voor dit voorbeeld, zal ik laten zien hoe te doen up and down sampling.

Laat me de Training en Test Data met behulp van caret Package.

In de bovenstaande snippet, heb ik de caret pakket geladen en gebruikt de createDataPartition functie om de rijnummers voor de training dataset te genereren. Door p=.70 in te stellen heb ik 70% van de rijen in trainData gezet en de overige 30% in testData.

table(trainData$Class)

Er zijn ongeveer 2 keer zoveel goedaardige monsters. Laten we dus downsamplen met behulp van de downSample functie uit het caret pakket.

Om dit te doen hoef je alleen maar de X en Y variabelen als argumenten op te geven.

Benigne en maligne zijn nu in dezelfde verhouding.

De %ni% is de negatie van de %in% functie en ik heb die hier gebruikt om alle kolommen te selecteren behalve de Class kolom.

De downSample functie vereist de ‘y’ als een factor variabele, dat is de reden waarom ik de klasse in de oorspronkelijke gegevens in een factor had omgezet.

Geweldig! Laat me nu de upsampling doen met de upSample functie. Het volgt een soortgelijke syntaxis als downSample.

Zoals verwacht, zijn goedaardig en kwaadaardig nu in dezelfde verhouding.

Ik zal de gedownsamplede versie van de dataset gebruiken om het logit-model in de volgende stap te bouwen.

Het bouwen van het logistische regressiemodel

Hoe te voorspellen op de testdataset

De logitmod is nu gebouwd. U kunt het nu gebruiken om de respons op testData te voorspellen.

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

Nu, pred bevat de waarschijnlijkheid dat de observatie kwaadaardig is voor elke observatie.

Merk op dat, wanneer u logistische regressie gebruikt, u type='response' moet instellen om de voorspellingswaarschijnlijkheden te berekenen. Dit argument is niet nodig in het geval van lineaire regressie.

Het is gebruikelijk om de waarschijnlijkheidsgrens op 0,5 te stellen. Als de waarschijnlijkheid van Y > 0,5 is, dan kan het worden geclassificeerd als een gebeurtenis (kwaadaardig).

Dus als pred groter is dan 0,5, dan is het kwaadaardig anders is het goedaardig.

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

Laten we de nauwkeurigheid berekenen, die niets anders is dan de proportie van y_pred die overeenkomt met y_act.

mean(y_pred == y_act) 

Daar heb je een nauwkeurigheid van 94%.

Waarom is het belangrijk om met klasse onbalans om te gaan?

Al goed, ik heb beloofd dat ik je zal vertellen waarom je eerder met klasse onbalans moet omgaan. Om dat te begrijpen, stel dat je een dataset hebt waarin 95% van de Y-waarden tot de goedaardige klasse behoort en 5% tot de kwaadaardige klasse.

Als ik alle datapunten blindelings als goedaardig had voorspeld, zou ik een nauwkeurigheidspercentage van 95% halen. Dat klinkt behoorlijk hoog. Maar dat is duidelijk niet juist. Waar het om gaat, is hoe goed je de kwaadaardige klassen voorspelt.

Dat vereist dus dat de goedaardige en kwaadaardige klassen in evenwicht zijn EN bovendien heb ik verfijndere nauwkeurigheidsmetingen en metrieken voor de evaluatie van het model nodig om mijn voorspellingsmodel te verbeteren.

Volledige code

Conclusie

In dit bericht heb je gezien wanneer en hoe je logistische regressie kunt gebruiken om binaire responsvariabelen in R te classificeren.

Je hebt dit gezien met een voorbeeld op basis van de BreastCancer-dataset waarbij het doel was om te bepalen of een gegeven weefselmassa kwaadaardig of goedaardig is.

Het bouwen van het model en het classificeren van de Y is slechts het halve werk. Eigenlijk, niet eens de helft. Want het scala van evaluatiemetrieken om de doeltreffendheid van het model te beoordelen is enorm en vereist een zorgvuldig oordeel om het juiste model te kiezen. In het volgende deel zal ik verschillende evaluatiemetrieken bespreken die zullen helpen om te begrijpen hoe goed het classificatiemodel presteert vanuit verschillende perspectieven.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.