Logistische Regression – Ein komplettes Tutorial mit Beispielen in R

Logistische Regression ist ein Algorithmus zur Vorhersage von Modellen, der verwendet wird, wenn die Variable Y binär und kategorial ist. Das heißt, sie kann nur zwei Werte wie 1 oder 0 annehmen. Ziel ist es, eine mathematische Gleichung zu bestimmen, mit der die Wahrscheinlichkeit des Ereignisses 1 vorhergesagt werden kann. Sobald die Gleichung aufgestellt ist, kann sie zur Vorhersage von Y verwendet werden, wenn nur die X�s bekannt sind.

Logistische Regression – Ein vollständiges Tutorial mit Beispielen in R Inhalt1. Einführung in die logistische Regression
2. Einige reale Beispiele für binäre Klassifizierungsprobleme
3. Warum nicht lineare Regression?
4. Die logistische Gleichung
5. Wie erstellt man ein logistisches Regressionsmodell in R?
6. Wie geht man mit Klassenungleichgewicht um?
7. Wie behandelt man Klassenungleichgewicht mit Upsample und Downsample?
8. Aufbau des logistischen Regressionsmodells
9. Wie man auf einem Testdatensatz Vorhersagen trifft
10. Warum ist der Umgang mit Klassenungleichgewicht wichtig?
11. Schlussfolgerung

1. Einführung in die logistische Regression

Vorhin haben Sie gesehen, was lineare Regression ist und wie man sie zur Vorhersage von kontinuierlichen Y-Variablen verwendet.

In der linearen Regression ist die Y-Variable immer eine kontinuierliche Variable. Wenn die Variable Y eine kategoriale Variable ist, können Sie die lineare Regression nicht zur Modellierung verwenden.

Was würden Sie also tun, wenn Y eine kategoriale Variable mit 2 Klassen ist?

Die logistische Regression kann zur Modellierung und Lösung solcher Probleme verwendet werden, die auch als binäre Klassifizierungsprobleme bezeichnet werden.

Ein wichtiger Punkt, der hier zu beachten ist, ist, dass Y nur 2 Klassen haben kann und nicht mehr als diese. Wenn Y mehr als 2 Klassen hat, wird es zu einer Mehrklassen-Klassifikation, und man kann die logistische Regression nicht mehr dafür verwenden.

Dennoch ist die logistische Regression eine klassische prädiktive Modellierungstechnik und bleibt eine beliebte Wahl für die Modellierung binärer kategorialer Variablen.

Ein weiterer Vorteil der logistischen Regression ist, dass sie eine Vorhersagewahrscheinlichkeit für ein Ereignis berechnet. Mehr dazu, wenn Sie mit der eigentlichen Erstellung der Modelle beginnen.

Einige Beispiele aus der Praxis für binäre Klassifizierungsprobleme

Sie fragen sich vielleicht, für welche Art von Problemen Sie die logistische Regression verwenden können.

Hier sind einige Beispiele für binäre Klassifizierungsprobleme:

  • Spam-Erkennung : Vorhersage, ob eine E-Mail Spam ist oder nicht
  • Kreditkartenbetrug : Vorhersage, ob eine bestimmte Kreditkartentransaktion Betrug ist oder nicht
  • Gesundheit : Vorhersage, ob eine bestimmte Gewebemasse gut- oder bösartig ist
  • Marketing : Vorhersage, ob ein bestimmter Benutzer ein Versicherungsprodukt kaufen wird oder nicht
  • Bankwesen : Vorhersage, ob ein Kunde einen Kredit nicht zurückzahlen wird.

Warum keine lineare Regression?

Wenn die Antwortvariable nur 2 mögliche Werte hat, ist es wünschenswert, ein Modell zu haben, das den Wert entweder als 0 oder 1 oder als Wahrscheinlichkeitswert zwischen 0 und 1 vorhersagt.

Die lineare Regression hat diese Fähigkeit nicht. Wenn Sie nämlich eine lineare Regression zur Modellierung einer binären Antwortvariablen verwenden, kann das resultierende Modell die vorhergesagten Y-Werte nicht auf 0 und 1 beschränken.

Lineare vs. logistische Regression

Hier kommt die logistische Regression ins Spiel. Bei der logistischen Regression erhält man einen Wahrscheinlichkeitswert, der die Wahrscheinlichkeit des Auftretens des Ereignisses widerspiegelt.

Ein Ereignis ist in diesem Fall jede Zeile des Trainingsdatensatzes. Es könnte etwas sein wie die Klassifizierung, ob eine bestimmte E-Mail Spam ist oder eine Zellmasse bösartig ist oder ein Benutzer ein Produkt kauft usw.

Die logistische Gleichung

Die logistische Regression erreicht dies, indem sie die logarithmische Wahrscheinlichkeit des Ereignisses ln(P/1?P) nimmt, wobei P die Wahrscheinlichkeit des Ereignisses ist. P liegt also immer zwischen 0 und 1.

Wenn man den Exponenten auf beiden Seiten der Gleichung einsetzt, erhält man:

Sie können diese Gleichung mit der Funktion glm() implementieren, indem Sie das Argument family auf "binomial" setzen.

Ein weiterer wichtiger Vorbehalt ist, dass Sie sicherstellen, dass Sie type="response" setzen, wenn Sie die Funktion predict für ein logistisches Regressionsmodell verwenden. Andernfalls wird die logarithmische Wahrscheinlichkeit von P, d. h. der Z-Wert, anstelle der Wahrscheinlichkeit selbst vorhergesagt.

Wie erstellt man ein logistisches Regressionsmodell in R?

Nun wollen wir sehen, wie man die logistische Regression mit dem BreastCancer-Datensatz im mlbench-Paket implementiert. Dazu müssen Sie das Paket mlbench installieren.

Das Ziel ist es, zu modellieren und vorherzusagen, ob ein bestimmtes Exemplar (Zeile im Datensatz) benign oder malignant ist, basierend auf 9 anderen Zellmerkmalen. Laden wir also die Daten und behalten nur die vollständigen Fälle.

Brustkrebs-Datensatz

Der Datensatz hat 699 Beobachtungen und 11 Spalten. Die Spalte Class ist die Antwortvariable (abhängige Variable) und gibt an, ob ein bestimmtes Gewebe bösartig oder gutartig ist.

Prüfen wir die Struktur dieses Datensatzes.

Außer Id sind alle anderen Spalten Faktoren. Dies ist ein Problem, wenn Sie diese Art von Daten modellieren.

Wenn Sie nämlich ein logistisches Modell mit Faktormarken als Merkmalen erstellen, wird jede Ebene im Faktor in eine binäre Dummy-Variable mit 1 und 0 umgewandelt.

Zum Beispiel ist Zellform ein Faktor mit 10 Ebenen. Wenn Sie glm verwenden, um die Klasse als Funktion der Zellform zu modellieren, wird die Zellform vor der Erstellung des Modells in 9 verschiedene binäre kategoriale Variablen aufgeteilt.

Wenn Sie ein logistisches Modell erstellen möchten, ohne irgendwelche vorbereitenden Schritte zu unternehmen, könnten Sie wie folgt vorgehen. Wir werden dies jedoch nicht tun, da vor der Erstellung des Logit-Modells bestimmte Dinge zu beachten sind.

Die Syntax zur Erstellung eines Logit-Modells ist der lm-Funktion, die Sie bei der linearen Regression kennengelernt haben, sehr ähnlich. Sie müssen nur die family='binomial' für glm setzen, um ein logistisches Regressionsmodell zu erstellen.

glm steht für verallgemeinerte lineare Modelle und ist in der Lage, viele Arten von Regressionsmodellen neben der linearen und logistischen Regression zu erstellen.

Lassen Sie uns sehen, wie der Code zum Erstellen eines logistischen Modells aussehen könnte. Ich werde später noch einmal auf diesen Schritt zurückkommen, da vor der Erstellung des Modells einige Vorverarbeitungsschritte erforderlich sind.

Im obigen Modell wird Class als Funktion von Cell.shape allein modelliert.

Aber beachten Sie, dass Cell.Shape in 9 verschiedene Variablen aufgeteilt wurde. Da Cell.Shape als Faktorvariable gespeichert wird, erzeugt glm eine binäre Variable (auch Dummy-Variable genannt) für jedes der 10 kategorialen Niveaus von Cell.Shape.

Aus der Bedeutung von Cell.Shape geht eindeutig hervor, dass es eine Art von Ordnung innerhalb der kategorialen Niveaus von Cell.Shape gibt. Das heißt, ein Zellformwert von 2 ist größer als Zellform 1 und so weiter.

Dies ist auch bei anderen Variablen im Datensatz der Fall. Daher ist es besser, sie in numerische Variablen umzuwandeln und die id-Spalte zu entfernen.

Wäre es eine reine kategoriale Variable ohne interne Ordnung, wie z.B. das Geschlecht des Patienten, könnte man diese Variable als Faktor belassen.

# 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

Die Klassen “gutartig” und “bösartig” sind ungefähr im Verhältnis 1:2 aufgeteilt.

Es besteht eindeutig ein Klassenungleichgewicht. Bevor man also das Logit-Modell erstellt, muss man die Stichproben so zusammenstellen, dass die 1 und die 0 ungefähr gleich groß sind.

Dieses Problem wird normalerweise mit einer Reihe von Techniken behandelt, die wie folgt heißen:

  • Down Sampling
  • Up Sampling
  • Hybrid Sampling unter Verwendung von SMOTE und ROSE.

So, was ist Down Sampling und Up Sampling?

7. Wie behandelt man Klassenungleichgewicht mit Upsampling und Downsampling

Beim Down Sampling wird die Mehrheitsklasse nach dem Zufallsprinzip verkleinert, damit sie die gleiche Größe wie die kleinere Klasse hat. Das bedeutet, dass bei der Erstellung des Trainingsdatensatzes die Zeilen mit der gutartigen Klasse bei der Zufallsauswahl weniger oft ausgewählt werden.

Gleichermaßen werden beim UpSampling Zeilen aus der Minderheitenklasse, d. h. malignant, wiederholt abgetastet, bis sie die gleiche Größe wie die Mehrheitsklasse (benign) erreicht.

Beim Hybrid-Sampling werden jedoch künstliche Datenpunkte erzeugt und systematisch um die Minderheitenklasse herum hinzugefügt. Dies kann mit den Paketen SMOTE und ROSE implementiert werden.

In diesem Beispiel zeige ich jedoch, wie man ein Up- und Downsampling durchführt.

Lassen Sie mich also die Trainings- und Testdaten mit dem Caret-Paket erstellen.

Im obigen Ausschnitt habe ich das Caret-Paket geladen und die Funktion createDataPartition verwendet, um die Zeilennummern für den Trainingsdatensatz zu erzeugen. Durch die Einstellung p=.70 habe ich 70 % der Zeilen für trainData und die restlichen 30 % für testData ausgewählt.

table(trainData$Class)

Es gibt etwa 2-mal mehr gutartige Proben. Also lassen Sie uns die Stichprobe mit der Funktion downSample aus dem Paket caret verkleinern.

Um dies zu tun, müssen Sie nur die X- und Y-Variablen als Argumente angeben.

Benigne und maligne sind jetzt im gleichen Verhältnis.

Die %ni% ist die Negation der %in%-Funktion und ich habe sie hier verwendet, um alle Spalten außer der Class-Spalte auszuwählen.

Die downSample-Funktion erfordert die ‘y’-Variable als Faktor, deshalb hatte ich in den ursprünglichen Daten die Klasse in einen Faktor umgewandelt.

Gut! Nun möchte ich das Upsampling mit der Funktion upSample durchführen. Sie folgt einer ähnlichen Syntax wie downSample.

Wie erwartet, sind gutartig und bösartig jetzt im gleichen Verhältnis.

Ich werde die downSampled-Version des Datensatzes verwenden, um im nächsten Schritt das Logit-Modell zu erstellen.

Aufbau des logistischen Regressionsmodells

Wie man auf dem Testdatensatz vorhersagt

Das logitmod ist jetzt erstellt. Sie können es nun verwenden, um die Antwort auf testData vorherzusagen.

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

Jetzt enthält pred die Wahrscheinlichkeit, dass die Beobachtung bösartig ist, für jede Beobachtung.

Beachten Sie, dass Sie bei der logistischen Regression type='response' setzen müssen, um die Vorhersagewahrscheinlichkeiten zu berechnen. Dieses Argument ist bei der linearen Regression nicht erforderlich.

Gemeinsam wird der Wahrscheinlichkeitsgrenzwert als 0,5 angenommen. Wenn die Wahrscheinlichkeit von Y > 0,5 ist, dann kann es als Ereignis (bösartig) eingestuft werden.

Wenn pred also größer als 0,5 ist, ist es bösartig, sonst ist es gutartig.

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

Berechnen wir die Genauigkeit, die nichts anderes ist als der Anteil von y_pred, der mit y_act übereinstimmt.

mean(y_pred == y_act) 

Hier haben wir eine Genauigkeit von 94%.

Warum ist der Umgang mit Klassenungleichgewicht wichtig?

Ich habe versprochen, Ihnen zu erklären, warum Sie sich früher um Klassenungleichgewicht kümmern müssen. Um das zu verstehen, nehmen wir an, Sie haben einen Datensatz, bei dem 95 % der Y-Werte zur gutartigen Klasse und 5 % zur bösartigen Klasse gehören.

Wenn ich einfach blind alle Datenpunkte als gutartig vorhersagen würde, würde ich einen Genauigkeitsgrad von 95 % erreichen. Das klingt ziemlich hoch. Aber das ist natürlich fehlerhaft. Es kommt darauf an, wie gut Sie die bösartigen Klassen vorhersagen können.

Das setzt also voraus, dass die gutartigen und bösartigen Klassen ausgeglichen sind, und darüber hinaus benötige ich verfeinerte Genauigkeitsmaße und Metriken zur Modellbewertung, um mein Vorhersagemodell zu verbessern.

Vollständiger Code

Schlussfolgerung

In diesem Beitrag haben Sie gesehen, wann und wie man die logistische Regression zur Klassifizierung von binären Antwortvariablen in R verwendet.

Sie haben dies anhand eines Beispiels auf der Grundlage des BreastCancerDatensatzes gesehen, bei dem das Ziel darin bestand, zu bestimmen, ob eine bestimmte Gewebemasse bösartig oder gutartig ist.

Die Erstellung des Modells und die Klassifizierung von Y ist nur die halbe Arbeit. Eigentlich nicht einmal die Hälfte. Denn die Bandbreite der Bewertungsmetriken zur Beurteilung der Wirksamkeit des Modells ist groß und erfordert eine sorgfältige Beurteilung, um das richtige Modell auszuwählen. Im nächsten Teil werde ich verschiedene Bewertungsmetriken erörtern, die dabei helfen zu verstehen, wie gut das Klassifizierungsmodell aus verschiedenen Perspektiven funktioniert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.