Was ist logistische Regression?
Die logistische Regression wird verwendet, um eine Klasse, dh eine Wahrscheinlichkeit, vorherzusagen. Die logistische Regression kann ein binäres Ergebnis genau vorhersagen.
Stellen Sie sich vor, Sie möchten anhand vieler Attribute vorhersagen, ob ein Darlehen abgelehnt / angenommen wird. Die logistische Regression hat die Form 0/1. y = 0, wenn ein Darlehen abgelehnt wird, y = 1, wenn es angenommen wird.
Ein logistisches Regressionsmodell unterscheidet sich in zweierlei Hinsicht vom linearen Regressionsmodell.
- Erstens akzeptiert die logistische Regression nur dichotome (binäre) Eingaben als abhängige Variable (dh einen Vektor von 0 und 1).
- Zweitens wird das Ergebnis durch die folgende probabilistische Verknüpfungsfunktion gemessen, die aufgrund ihrer S-Form als Sigmoid bezeichnet wird :
Die Ausgabe der Funktion liegt immer zwischen 0 und 1. Überprüfen Sie das Bild unten
Die Sigmoid-Funktion gibt Werte von 0 bis 1 zurück. Für die Klassifizierungsaufgabe benötigen wir eine diskrete Ausgabe von 0 oder 1.
Um einen kontinuierlichen Fluss in einen diskreten Wert umzuwandeln, können wir eine Entscheidungsgrenze von 0,5 festlegen. Alle Werte über diesem Schwellenwert werden als 1 klassifiziert
In diesem Tutorial lernen Sie
- Was ist logistische Regression?
- So erstellen Sie ein Generalized Liner Model (GLM)
- Schritt 1) Überprüfen Sie kontinuierliche Variablen
- Schritt 2) Überprüfen Sie die Faktorvariablen
- Schritt 3) Feature Engineering
- Schritt 4) Zusammenfassende Statistik
- Schritt 5) Zug / Test-Set
- Schritt 6) Erstellen Sie das Modell
- Schritt 7) Bewerten Sie die Leistung des Modells
So erstellen Sie ein Generalized Liner Model (GLM)
Verwenden wir den Datensatz für Erwachsene , um die logistische Regression zu veranschaulichen. Der "Erwachsene" ist ein großartiger Datensatz für die Klassifizierungsaufgabe. Ziel ist es, vorherzusagen, ob das jährliche Einkommen einer Person in Dollar 50.000 übersteigt. Der Datensatz enthält 46.033 Beobachtungen und zehn Merkmale:
- Alter: Alter des Individuums. Numerisch
- Bildung: Bildungsniveau des Einzelnen. Faktor.
- Familienstand: Familienstand des Einzelnen. Faktor dh Nie verheiratet, Ehegatte,…
- Geschlecht: Geschlecht des Individuums. Faktor, dh männlich oder weiblich
- Einkommen: Zielvariable. Einkommen über oder unter 50.000. Faktor dh> 50K, <= 50K
unter anderem
library(dplyr)data_adult <-read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/adult.csv")glimpse(data_adult)
Ausgabe:
Observations: 48,842Variables: 10$ x1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,… $ age 25, 38, 28, 44, 18, 34, 29, 63, 24, 55, 65, 36, 26… $ workclass Private, Private, Local-gov, Private, ?, Private,… $ education 11th, HS-grad, Assoc-acdm, Some-college, Some-col… $ educational.num 7, 9, 12, 10, 10, 6, 9, 15, 10, 4, 9, 13, 9, 9, 9,… $ marital.status Never-married, Married-civ-spouse, Married-civ-sp… $ race Black, White, White, Black, White, White, Black,… $ gender Male, Male, Male, Male, Female, Male, Male, Male,… $ hours.per.week 40, 50, 40, 40, 30, 30, 40, 32, 40, 10, 40, 40, 39… $ income <=50K, <=50K, >50K, >50K, <=50K, <=50K, <=50K, >5…
Wir werden wie folgt vorgehen:
- Schritt 1: Überprüfen Sie kontinuierliche Variablen
- Schritt 2: Überprüfen Sie die Faktorvariablen
- Schritt 3: Feature Engineering
- Schritt 4: Zusammenfassende Statistik
- Schritt 5: Zug / Test-Set
- Schritt 6: Erstellen Sie das Modell
- Schritt 7: Bewerten Sie die Leistung des Modells
- Schritt 8: Verbessern Sie das Modell
Ihre Aufgabe ist es, vorherzusagen, welche Person einen Umsatz von mehr als 50.000 erzielen wird.
In diesem Lernprogramm wird jeder Schritt detailliert beschrieben, um eine Analyse für einen realen Datensatz durchzuführen.
Schritt 1) Überprüfen Sie kontinuierliche Variablen
Im ersten Schritt sehen Sie die Verteilung der stetigen Variablen.
continuous <-select_if(data_adult, is.numeric)summary(continuous)
Code Erklärung
- stetig <- select_if (data_adult, is.numeric): Verwenden Sie die Funktion select_if () aus der dplyr-Bibliothek, um nur die numerischen Spalten auszuwählen
- Zusammenfassung (fortlaufend): Drucken Sie die Zusammenfassungsstatistik
Ausgabe:
## X age educational.num hours.per.week## Min. : 1 Min. :17.00 Min. : 1.00 Min. : 1.00## 1st Qu.:11509 1st Qu.:28.00 1st Qu.: 9.00 1st Qu.:40.00## Median :23017 Median :37.00 Median :10.00 Median :40.00## Mean :23017 Mean :38.56 Mean :10.13 Mean :40.95## 3rd Qu.:34525 3rd Qu.:47.00 3rd Qu.:13.00 3rd Qu.:45.00## Max. :46033 Max. :90.00 Max. :16.00 Max. :99.00
Aus der obigen Tabelle können Sie ersehen, dass die Daten völlig unterschiedliche Maßstäbe und Stunden haben. Per.weeks hat große Ausreißer (z. B. das letzte Quartil und den Maximalwert).
Sie können damit in zwei Schritten umgehen:
- 1: Zeichnen Sie die Verteilung von Stunden pro Woche
- 2: Standardisieren Sie die stetigen Variablen
- Zeichnen Sie die Verteilung
Schauen wir uns die Verteilung von Stunden pro Woche genauer an
# Histogram with kernel density curvelibrary(ggplot2)ggplot(continuous, aes(x = hours.per.week)) +geom_density(alpha = .2, fill = "#FF6666")
Ausgabe:
Die Variable hat viele Ausreißer und keine genau definierte Verteilung. Sie können dieses Problem teilweise beheben, indem Sie die obersten 0,01 Prozent der Stunden pro Woche löschen.
Grundlegende Syntax des Quantils:
quantile(variable, percentile)arguments:-variable: Select the variable in the data frame to compute the percentile-percentile: Can be a single value between 0 and 1 or multiple value. If multiple, use this format: `c(A,B,C,… )- `A`,`B`,`C` and `… ` are all integer from 0 to 1.
Wir berechnen das oberste 2-Prozent-Perzentil
top_one_percent <- quantile(data_adult$hours.per.week, .99)top_one_percent
Code Erklärung
- Quantil (data_adult $ hour.per.week, .99): Berechnen Sie den Wert von 99 Prozent der Arbeitszeit
Ausgabe:
## 99%## 80
98 Prozent der Bevölkerung arbeiten unter 80 Stunden pro Woche.
Sie können die Beobachtungen über diesen Schwellenwert fallen lassen. Sie verwenden den Filter aus der dplyr-Bibliothek.
data_adult_drop <-data_adult %>%filter(hours.per.weekAusgabe:
## [1] 45537 10
- Standardisieren Sie die stetigen Variablen
Sie können jede Spalte standardisieren, um die Leistung zu verbessern, da Ihre Daten nicht dieselbe Skalierung haben. Sie können die Funktion mutate_if aus der dplyr-Bibliothek verwenden. Die grundlegende Syntax lautet:
mutate_if(df, condition, funs(function))arguments:-`df`: Data frame used to compute the function- `condition`: Statement used. Do not use parenthesis- funs(function): Return the function to apply. Do not use parenthesis for the functionSie können die numerischen Spalten wie folgt standardisieren:
data_adult_rescale <- data_adult_drop % > %mutate_if(is.numeric, funs(as.numeric(scale(.))))head(data_adult_rescale)Code Erklärung
- mutate_if (is.numeric, funs (scale)): Die Bedingung ist nur eine numerische Spalte und die Funktion ist scale
Ausgabe:
## X age workclass education educational.num## 1 -1.732680 -1.02325949 Private 11th -1.22106443## 2 -1.732605 -0.03969284 Private HS-grad -0.43998868## 3 -1.732530 -0.79628257 Local-gov Assoc-acdm 0.73162494## 4 -1.732455 0.41426100 Private Some-college -0.04945081## 5 -1.732379 -0.34232873 Private 10th -1.61160231## 6 -1.732304 1.85178149 Self-emp-not-inc Prof-school 1.90323857## marital.status race gender hours.per.week income## 1 Never-married Black Male -0.03995944 <=50K## 2 Married-civ-spouse White Male 0.86863037 <=50K## 3 Married-civ-spouse White Male -0.03995944 >50K## 4 Married-civ-spouse Black Male -0.03995944 >50K## 5 Never-married White Male -0.94854924 <=50K## 6 Married-civ-spouse White Male -0.76683128 >50KSchritt 2) Überprüfen Sie die Faktorvariablen
Dieser Schritt hat zwei Ziele:
- Überprüfen Sie die Ebene in jeder kategorialen Spalte
- Definieren Sie neue Ebenen
Wir werden diesen Schritt in drei Teile teilen:
- Wählen Sie die kategorialen Spalten aus
- Speichern Sie das Balkendiagramm jeder Spalte in einer Liste
- Drucken Sie die Grafiken
Wir können die Faktorspalten mit dem folgenden Code auswählen:
# Select categorical columnfactor <- data.frame(select_if(data_adult_rescale, is.factor))ncol(factor)Code Erklärung
- data.frame (select_if (data_adult, is.factor)): Wir speichern die Faktorspalten in factor in einem Datenrahmentyp. Die Bibliothek ggplot2 benötigt ein Datenrahmenobjekt.
Ausgabe:
## [1] 6Der Datensatz enthält 6 kategoriale Variablen
Der zweite Schritt ist geschickter. Sie möchten für jede Spalte im Datenrahmenfaktor ein Balkendiagramm zeichnen. Es ist bequemer, den Prozess zu automatisieren, insbesondere in Situationen, in denen viele Spalten vorhanden sind.
library(ggplot2)# Create graph for each columngraph <- lapply(names(factor),function(x)ggplot(factor, aes(get(x))) +geom_bar() +theme(axis.text.x = element_text(angle = 90)))Code Erklärung
- lapply (): Verwenden Sie die Funktion lapply (), um eine Funktion in allen Spalten des Datasets zu übergeben. Sie speichern die Ausgabe in einer Liste
- Funktion (x): Die Funktion wird für jedes x verarbeitet. Hier ist x die Spalte
- ggplot (Faktor, aes (get (x))) + geom_bar () + theme (axis.text.x = element_text (angle = 90)): Erstellen Sie für jedes x-Element ein Balkendiagramm. Um x als Spalte zurückzugeben, müssen Sie es in get () einfügen.
Der letzte Schritt ist relativ einfach. Sie möchten die 6 Diagramme drucken.
# Print the graphgraphAusgabe:
## [[1]]
## ## [[2]]
## ## [[3]]
## ## [[4]]
## ## [[5]]
## ## [[6]]
Hinweis: Verwenden Sie die Schaltfläche Weiter, um zum nächsten Diagramm zu navigieren
Schritt 3) Feature Engineering
Neufassung der Ausbildung
Aus der obigen Grafik können Sie ersehen, dass die variable Bildung 16 Stufen hat. Dies ist erheblich, und einige Ebenen weisen eine relativ geringe Anzahl von Beobachtungen auf. Wenn Sie die Menge an Informationen verbessern möchten, die Sie aus dieser Variablen erhalten können, können Sie sie in eine höhere Ebene umwandeln. Sie erstellen nämlich größere Gruppen mit ähnlichem Bildungsniveau. Zum Beispiel wird ein niedriges Bildungsniveau in Schulabbrecher umgewandelt. Höhere Bildungsniveaus werden auf Master umgestellt.
Hier ist das Detail:
Altes Niveau
Neues level
Vorschule
ausfallen
10 ..
Ausfallen
11 ..
Ausfallen
12 ..
Ausfallen
1.-4
Ausfallen
5.-6
Ausfallen
7.-8
Ausfallen
9 ..
Ausfallen
HS-Grad
HighGrad
Einige College
Gemeinschaft
Assoc-acdm
Gemeinschaft
Assoc-voc
Gemeinschaft
Junggesellen
Junggesellen
Meister
Meister
Prof-Schule
Meister
Promotion
PhD
recast_data <- data_adult_rescale % > %select(-X) % > %mutate(education = factor(ifelse(education == "Preschool" | education == "10th" | education == "11th" | education == "12th" | education == "1st-4th" | education == "5th-6th" | education == "7th-8th" | education == "9th", "dropout", ifelse(education == "HS-grad", "HighGrad", ifelse(education == "Some-college" | education == "Assoc-acdm" | education == "Assoc-voc", "Community",ifelse(education == "Bachelors", "Bachelors",ifelse(education == "Masters" | education == "Prof-school", "Master", "PhD")))))))Code Erklärung
- Wir verwenden das Verb mutate aus der dplyr-Bibliothek. Wir ändern die Werte der Bildung mit der Aussage ifelse
In der folgenden Tabelle erstellen Sie eine zusammenfassende Statistik, um im Durchschnitt zu sehen, wie viele Jahre Ausbildung (Z-Wert) erforderlich sind, um den Bachelor, Master oder PhD zu erreichen.
recast_data % > %group_by(education) % > %summarize(average_educ_year = mean(educational.num),count = n()) % > %arrange(average_educ_year)Ausgabe:
## # A tibble: 6 x 3## education average_educ_year count#### 1 dropout -1.76147258 5712## 2 HighGrad -0.43998868 14803## 3 Community 0.09561361 13407## 4 Bachelors 1.12216282 7720## 5 Master 1.60337381 3338## 6 PhD 2.29377644 557 Neufassung des Familienstands
Es ist auch möglich, niedrigere Ebenen für den Familienstand zu erstellen. Im folgenden Code ändern Sie die Stufe wie folgt:
Altes Niveau
Neues level
Nie verheiratet
Nicht verheiratet
Verheiratet-Ehepartner-abwesend
Nicht verheiratet
Verheirateter AF-Ehepartner
Verheiratet
Verheirateter Ehegatte
Getrennt
Getrennt
Geschieden
Witwen
Witwe
# Change level marryrecast_data <- recast_data % > %mutate(marital.status = factor(ifelse(marital.status == "Never-married" | marital.status == "Married-spouse-absent", "Not_married", ifelse(marital.status == "Married-AF-spouse" | marital.status == "Married-civ-spouse", "Married", ifelse(marital.status == "Separated" | marital.status == "Divorced", "Separated", "Widow")))))Sie können die Anzahl der Personen in jeder Gruppe überprüfen.table(recast_data$marital.status)Ausgabe:
## ## Married Not_married Separated Widow## 21165 15359 7727 1286Schritt 4) Zusammenfassende Statistik
Es ist Zeit, einige Statistiken über unsere Zielvariablen zu überprüfen. In der folgenden Grafik zählen Sie den Prozentsatz der Personen, die aufgrund ihres Geschlechts mehr als 50.000 verdienen.
# Plot gender incomeggplot(recast_data, aes(x = gender, fill = income)) +geom_bar(position = "fill") +theme_classic()Ausgabe:
Überprüfen Sie als nächstes, ob die Herkunft der Person ihren Verdienst beeinflusst.
# Plot origin incomeggplot(recast_data, aes(x = race, fill = income)) +geom_bar(position = "fill") +theme_classic() +theme(axis.text.x = element_text(angle = 90))Ausgabe:
Die Anzahl der Arbeitsstunden nach Geschlecht.
# box plot gender working timeggplot(recast_data, aes(x = gender, y = hours.per.week)) +geom_boxplot() +stat_summary(fun.y = mean,geom = "point",size = 3,color = "steelblue") +theme_classic()Ausgabe:
Das Box-Diagramm bestätigt, dass die Verteilung der Arbeitszeit für verschiedene Gruppen geeignet ist. In der Box-Darstellung haben beide Geschlechter keine homogenen Beobachtungen.
Sie können die Dichte der wöchentlichen Arbeitszeit nach Art der Ausbildung überprüfen. Die Verteilungen haben viele unterschiedliche Auswahlmöglichkeiten. Dies kann wahrscheinlich durch die Art des Vertrags in den USA erklärt werden.
# Plot distribution working time by educationggplot(recast_data, aes(x = hours.per.week)) +geom_density(aes(color = education), alpha = 0.5) +theme_classic()Code Erklärung
- ggplot (recast_data, aes (x = hour.per.week)): Für ein Dichtediagramm ist nur eine Variable erforderlich
- geom_density (aes (Farbe = Bildung), Alpha = 0,5): Das geometrische Objekt zur Steuerung der Dichte
Ausgabe:
Um Ihre Gedanken zu bestätigen, können Sie einen Einweg-ANOVA-Test durchführen:
anova <- aov(hours.per.week~education, recast_data)summary(anova)Ausgabe:
## Df Sum Sq Mean Sq F value Pr(>F)## education 5 1552 310.31 321.2 <2e-16 ***## Residuals 45531 43984 0.97## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Der ANOVA-Test bestätigt den Unterschied im Durchschnitt zwischen den Gruppen.
Nichtlinearität
Bevor Sie das Modell ausführen, können Sie feststellen, ob die Anzahl der geleisteten Arbeitsstunden mit dem Alter zusammenhängt.
library(ggplot2)ggplot(recast_data, aes(x = age, y = hours.per.week)) +geom_point(aes(color = income),size = 0.5) +stat_smooth(method = 'lm',formula = y~poly(x, 2),se = TRUE,aes(color = income)) +theme_classic()Code Erklärung
- ggplot (recast_data, aes (x = Alter, y = Stunden pro Woche)): Legen Sie die Ästhetik des Diagramms fest
- geom_point (aes (Farbe = Einkommen), Größe = 0,5): Konstruieren Sie das Punktdiagramm
- stat_smooth (): Fügen Sie die Trendlinie mit den folgenden Argumenten hinzu:
- method = 'lm': Zeichnen Sie den angepassten Wert bei linearer Regression
- Formel = y ~ Poly (x, 2): Passen Sie eine Polynomregression an
- se = TRUE: Füge den Standardfehler hinzu
- aes (Farbe = Einkommen): Brechen Sie das Modell nach Einkommen
Ausgabe:
Kurz gesagt, Sie können Interaktionsterme im Modell testen, um den Nichtlinearitätseffekt zwischen der wöchentlichen Arbeitszeit und anderen Funktionen zu ermitteln. Es ist wichtig zu erkennen, unter welchen Bedingungen sich die Arbeitszeit unterscheidet.
Korrelation
Die nächste Überprüfung besteht darin, die Korrelation zwischen den Variablen zu visualisieren. Sie konvertieren den Faktorstufentyp in einen numerischen Typ, damit Sie eine Wärmekarte zeichnen können, die den mit der Spearman-Methode berechneten Korrelationskoeffizienten enthält.
library(GGally)# Convert data to numericcorr <- data.frame(lapply(recast_data, as.integer))# Plot the graphggcorr(corr,method = c("pairwise", "spearman"),nbreaks = 6,hjust = 0.8,label = TRUE,label_size = 3,color = "grey50")Code Erklärung
- data.frame (lapply (recast_data, as.integer)): Konvertiert Daten in numerische Daten
- ggcorr () zeichnet die Heatmap mit den folgenden Argumenten:
- Methode: Methode zur Berechnung der Korrelation
- nbreaks = 6: Anzahl der Pausen
- hjust = 0.8: Kontrollposition des Variablennamens im Plot
- label = TRUE: Fügen Sie Beschriftungen in der Mitte des Fensters hinzu
- label_size = 3: Größenbeschriftungen
- color = "grey50"): Farbe des Etiketts
Ausgabe:
Schritt 5) Zug / Test-Set
Für jede überwachte maschinelle Lernaufgabe müssen die Daten zwischen einem Zugsatz und einem Testsatz aufgeteilt werden. Sie können die "Funktion" verwenden, die Sie in den anderen betreuten Lern-Tutorials erstellt haben, um ein Zug- / Test-Set zu erstellen.
set.seed(1234)create_train_test <- function(data, size = 0.8, train = TRUE) {n_row = nrow(data)total_row = size * n_rowtrain_sample <- 1: total_rowif (train == TRUE) {return (data[train_sample, ])} else {return (data[-train_sample, ])}}data_train <- create_train_test(recast_data, 0.8, train = TRUE)data_test <- create_train_test(recast_data, 0.8, train = FALSE)dim(data_train)Ausgabe:
## [1] 36429 9dim(data_test)Ausgabe:
## [1] 9108 9Schritt 6) Erstellen Sie das Modell
Um zu sehen, wie der Algorithmus funktioniert, verwenden Sie das Paket glm (). Das verallgemeinerte lineare Modell ist eine Sammlung von Modellen. Die grundlegende Syntax lautet:
glm(formula, data=data, family=linkfunction()Argument:- formula: Equation used to fit the model- data: dataset used- Family: - binomial: (link = "logit")- gaussian: (link = "identity")- Gamma: (link = "inverse")- inverse.gaussian: (link = "1/mu^2")- poisson: (link = "log")- quasi: (link = "identity", variance = "constant")- quasibinomial: (link = "logit")- quasipoisson: (link = "log")Sie können das Logistikmodell schätzen, um das Einkommensniveau auf eine Reihe von Funktionen aufzuteilen.
formula <- income~.logit <- glm(formula, data = data_train, family = 'binomial')summary(logit)Code Erklärung
- Formel <- Einkommen ~ .: Erstellen Sie das passende Modell
- logit <- glm (Formel, data = data_train, family = 'binomial'): Passen Sie ein logistisches Modell (family = 'binomial') an die data_train-Daten an.
- Zusammenfassung (logit): Druckt die Zusammenfassung des Modells
Ausgabe:
#### Call:## glm(formula = formula, family = "binomial", data = data_train)## ## Deviance Residuals:## Min 1Q Median 3Q Max## -2.6456 -0.5858 -0.2609 -0.0651 3.1982#### Coefficients:## Estimate Std. Error z value Pr(>|z|)## (Intercept) 0.07882 0.21726 0.363 0.71675## age 0.41119 0.01857 22.146 < 2e-16 ***## workclassLocal-gov -0.64018 0.09396 -6.813 9.54e-12 ***## workclassPrivate -0.53542 0.07886 -6.789 1.13e-11 ***## workclassSelf-emp-inc -0.07733 0.10350 -0.747 0.45499## workclassSelf-emp-not-inc -1.09052 0.09140 -11.931 < 2e-16 ***## workclassState-gov -0.80562 0.10617 -7.588 3.25e-14 ***## workclassWithout-pay -1.09765 0.86787 -1.265 0.20596## educationCommunity -0.44436 0.08267 -5.375 7.66e-08 ***## educationHighGrad -0.67613 0.11827 -5.717 1.08e-08 ***## educationMaster 0.35651 0.06780 5.258 1.46e-07 ***## educationPhD 0.46995 0.15772 2.980 0.00289 **## educationdropout -1.04974 0.21280 -4.933 8.10e-07 ***## educational.num 0.56908 0.07063 8.057 7.84e-16 ***## marital.statusNot_married -2.50346 0.05113 -48.966 < 2e-16 ***## marital.statusSeparated -2.16177 0.05425 -39.846 < 2e-16 ***## marital.statusWidow -2.22707 0.12522 -17.785 < 2e-16 ***## raceAsian-Pac-Islander 0.08359 0.20344 0.411 0.68117## raceBlack 0.07188 0.19330 0.372 0.71001## raceOther 0.01370 0.27695 0.049 0.96054## raceWhite 0.34830 0.18441 1.889 0.05894 .## genderMale 0.08596 0.04289 2.004 0.04506 *## hours.per.week 0.41942 0.01748 23.998 < 2e-16 ***## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1## ## (Dispersion parameter for binomial family taken to be 1)## ## Null deviance: 40601 on 36428 degrees of freedom## Residual deviance: 27041 on 36406 degrees of freedom## AIC: 27087#### Number of Fisher Scoring iterations: 6Die Zusammenfassung unseres Modells zeigt interessante Informationen. Die Leistung einer logistischen Regression wird mit bestimmten Schlüsselmetriken bewertet.
- AIC (Akaike Information Criteria): Dies entspricht R2 in der logistischen Regression. Es misst die Anpassung, wenn eine Strafe auf die Anzahl der Parameter angewendet wird. Kleinere AIC- Werte zeigen an, dass das Modell näher an der Wahrheit liegt.
- Nullabweichung: Passt das Modell nur mit dem Achsenabschnitt an. Der Freiheitsgrad ist n-1. Wir können es als Chi-Quadrat-Wert interpretieren (angepasster Wert, der sich vom Testen der tatsächlichen Werthypothese unterscheidet).
- Restabweichung: Modell mit allen Variablen. Es wird auch als Chi-Quadrat-Hypothesentest interpretiert.
- Anzahl der Fisher-Scoring-Iterationen: Anzahl der Iterationen vor der Konvergenz.
Die Ausgabe der Funktion glm () wird in einer Liste gespeichert. Der folgende Code zeigt alle Elemente, die in der Logit-Variablen verfügbar sind, die wir zur Bewertung der logistischen Regression erstellt haben.
# Die Liste ist sehr lang, drucken Sie nur die ersten drei Elemente
lapply(logit, class)[1:3]Ausgabe:
## $coefficients## [1] "numeric"#### $residuals## [1] "numeric"#### $fitted.values## [1] "numeric"Jeder Wert kann mit dem $ -Zeichen gefolgt vom Namen der Metriken extrahiert werden. Sie haben das Modell beispielsweise als Protokoll gespeichert. Um die AIC-Kriterien zu extrahieren, verwenden Sie:
logit$aicAusgabe:
## [1] 27086.65Schritt 7) Bewerten Sie die Leistung des Modells
Verwirrung Matrix
Die Verwirrungsmatrix ist eine bessere Wahl, um die Klassifizierungsleistung im Vergleich zu den verschiedenen Metriken zu bewerten, die Sie zuvor gesehen haben. Die allgemeine Idee besteht darin, zu zählen, wie oft True-Instanzen als False klassifiziert werden.
Um die Verwirrungsmatrix zu berechnen, benötigen Sie zunächst eine Reihe von Vorhersagen, damit diese mit den tatsächlichen Zielen verglichen werden können.
predict <- predict(logit, data_test, type = 'response')# confusion matrixtable_mat <- table(data_test$income, predict > 0.5)table_matCode Erklärung
- Vorhersagen (logit, data_test, type = 'response'): Berechnen Sie die Vorhersage für den Testsatz. Setzen Sie type = 'response', um die Antwortwahrscheinlichkeit zu berechnen.
- Tabelle (data_test $ Einkommen, Vorhersage> 0,5): Berechnen Sie die Verwirrungsmatrix. Vorhersagen> 0,5 bedeutet, dass 1 zurückgegeben wird, wenn die vorhergesagten Wahrscheinlichkeiten über 0,5 liegen, andernfalls 0.
Ausgabe:
#### FALSE TRUE## <=50K 6310 495## >50K 1074 1229Jede Zeile in einer Verwirrungsmatrix repräsentiert ein tatsächliches Ziel, während jede Spalte ein vorhergesagtes Ziel darstellt. In der ersten Zeile dieser Matrix wird das Einkommen unter 50.000 (die falsche Klasse) berücksichtigt: 6241 wurden korrekt als Personen mit einem Einkommen unter 50.000 ( wahr negativ ) klassifiziert, während die verbleibende fälschlicherweise als über 50.000 ( falsch positiv ) klassifiziert wurde . In der zweiten Zeile wird das Einkommen über 50.000 betrachtet, die positive Klasse war 1229 ( wahr positiv ), während die wahre negativ 1074 war.
Sie können das Modell berechnen Genauigkeit durch Addition der wahre positive + wahr negativ über die gesamte Beobachtungs
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)accuracy_TestCode Erklärung
- sum (diag (table_mat)): Summe der Diagonale
- sum (table_mat): Summe der Matrix.
Ausgabe:
## [1] 0.8277339Das Modell scheint unter einem Problem zu leiden, es überschätzt die Anzahl der falsch negativen Ergebnisse. Dies wird als Genauigkeitstest-Paradoxon bezeichnet . Wir haben festgestellt, dass die Genauigkeit das Verhältnis der korrekten Vorhersagen zur Gesamtzahl der Fälle ist. Wir können eine relativ hohe Genauigkeit haben, aber ein nutzloses Modell. Es passiert, wenn es eine dominante Klasse gibt. Wenn Sie auf die Verwirrungsmatrix zurückblicken, können Sie sehen, dass die meisten Fälle als echt negativ eingestuft werden. Stellen Sie sich vor, das Modell klassifiziert alle Klassen als negativ (dh unter 50.000). Sie hätten eine Genauigkeit von 75 Prozent (6718/6718 + 2257). Ihr Modell bietet eine bessere Leistung, hat jedoch Schwierigkeiten, das wahre Positive vom wahren Negativen zu unterscheiden.
In einer solchen Situation ist es vorzuziehen, eine präzisere Metrik zu haben. Wir können uns Folgendes ansehen:
- Präzision = TP / (TP + FP)
- Rückruf = TP / (TP + FN)
Präzision gegen Rückruf
Bei der Präzision wird die Genauigkeit der positiven Vorhersage untersucht. Rückruf ist das Verhältnis der positiven Instanzen, die vom Klassifizierer korrekt erkannt werden.
Sie können zwei Funktionen erstellen, um diese beiden Metriken zu berechnen
- Präzision konstruieren
precision <- function(matrix) {# True positivetp <- matrix[2, 2]# false positivefp <- matrix[1, 2]return (tp / (tp + fp))}Code Erklärung
- mat [1,1]: Gibt die erste Zelle der ersten Spalte des Datenrahmens zurück, dh das wahre Positiv
- mat [1,2]; Gibt die erste Zelle der zweiten Spalte des Datenrahmens zurück, dh das falsch positive
recall <- function(matrix) {# true positivetp <- matrix[2, 2]# false positivefn <- matrix[2, 1]return (tp / (tp + fn))}Code Erklärung
- mat [1,1]: Gibt die erste Zelle der ersten Spalte des Datenrahmens zurück, dh das wahre Positiv
- mat [2,1]; Gibt die zweite Zelle der ersten Spalte des Datenrahmens zurück, dh das falsch negative Ergebnis
Sie können Ihre Funktionen testen
prec <- precision(table_mat)precrec <- recall(table_mat)recAusgabe:
## [1] 0.712877## [2] 0.5336518Wenn das Modell angibt, dass es sich um eine Person über 50.000 handelt, ist dies in nur 54 Prozent der Fälle korrekt und kann in 72 Prozent der Fälle Personen über 50.000 beanspruchen.
Sie können die
ist ein harmonisches Mittel dieser beiden Metriken, was bedeutet, dass die niedrigeren Werte mehr Gewicht erhalten.
f1 <- 2 * ((prec * rec) / (prec + rec))f1Ausgabe:
## [1] 0.6103799Kompromiss zwischen Präzision und Rückruf
Es ist unmöglich, sowohl eine hohe Präzision als auch einen hohen Rückruf zu erzielen.
Wenn wir die Präzision erhöhen, wird die richtige Person besser vorhergesagt, aber wir würden viele von ihnen vermissen (geringerer Rückruf). In einigen Situationen bevorzugen wir eine höhere Präzision als den Rückruf. Es gibt eine konkave Beziehung zwischen Präzision und Rückruf.
- Stellen Sie sich vor, Sie müssen vorhersagen, ob ein Patient eine Krankheit hat. Sie möchten so präzise wie möglich sein.
- Wenn Sie potenzielle betrügerische Personen auf der Straße durch Gesichtserkennung erkennen müssen, ist es besser, viele als betrügerisch gekennzeichnete Personen zu fangen, obwohl die Genauigkeit gering ist. Die Polizei kann die nicht betrügerische Person freigeben.
Die ROC-Kurve
Die Betriebskennlinie des Empfängers ist ein weiteres gängiges Werkzeug für die binäre Klassifizierung. Es ist der Präzisions- / Rückrufkurve sehr ähnlich, aber anstatt die Präzision gegen den Rückruf zu zeichnen, zeigt die ROC-Kurve die wahre positive Rate (dh den Rückruf) gegen die falsch positive Rate. Die falsch positive Rate ist das Verhältnis der negativen Instanzen, die fälschlicherweise als positiv eingestuft werden. Es ist gleich eins minus der wahren negativen Rate. Die wahre negative Rate wird auch als Spezifität bezeichnet . Daher zeigt die ROC-Kurve die Empfindlichkeit (Rückruf) gegen die 1-Spezifität
Um die ROC-Kurve zu zeichnen, müssen wir eine Bibliothek namens RORC installieren. Wir finden in der Conda Bibliothek. Sie können den Code eingeben:
conda install -cr r-rocr --yes
Wir können den ROC mit den Funktionen Vorhersage () und Leistung () zeichnen.
library(ROCR)ROCRpred <- prediction(predict, data_test$income)ROCRperf <- performance(ROCRpred, 'tpr', 'fpr')plot(ROCRperf, colorize = TRUE, text.adj = c(-0.2, 1.7))Code Erklärung
- Vorhersage (Vorhersage, data_test $ Einkommen): Die ROCR-Bibliothek muss ein Vorhersageobjekt erstellen, um die Eingabedaten zu transformieren
- Leistung (ROCRpred, 'tpr', 'fpr'): Gibt die beiden Kombinationen zurück, die im Diagramm erzeugt werden sollen. Hier werden tpr und fpr konstruiert. Verwenden Sie "prec", "rec", um die Genauigkeit des Plots zu bestimmen und gemeinsam abzurufen.
Ausgabe:
Schritt 8) Verbessern Sie das Modell
Sie können versuchen, dem Modell durch die Interaktion zwischen dem Modell Nichtlinearität hinzuzufügen
- Alter und Stunden pro Woche
- Geschlecht und Stunden pro Woche.
Sie müssen den Score-Test verwenden, um beide Modelle zu vergleichen
formula_2 <- income~age: hours.per.week + gender: hours.per.week + .logit_2 <- glm(formula_2, data = data_train, family = 'binomial')predict_2 <- predict(logit_2, data_test, type = 'response')table_mat_2 <- table(data_test$income, predict_2 > 0.5)precision_2 <- precision(table_mat_2)recall_2 <- recall(table_mat_2)f1_2 <- 2 * ((precision_2 * recall_2) / (precision_2 + recall_2))f1_2Ausgabe:
## [1] 0.6109181Die Punktzahl ist etwas höher als die vorherige. Sie können weiter an den Daten arbeiten und versuchen, die Punktzahl zu übertreffen.
Zusammenfassung
Wir können die Funktion zum Trainieren einer logistischen Regression in der folgenden Tabelle zusammenfassen:
Paket
Zielsetzung
Funktion
Streit
- -
Zug- / Testdatensatz erstellen
create_train_set ()
Daten, Größe, Zug
glm
Trainieren Sie ein verallgemeinertes lineares Modell
glm ()
Formel, Daten, Familie *
glm
Fassen Sie das Modell zusammen
Zusammenfassung()
Einbaumodell
Base
Vorhersage machen
vorhersagen()
angepasstes Modell, Datensatz, Typ = 'Antwort'
Base
Erstellen Sie eine Verwirrungsmatrix
Tabelle()
y, prognostiziere ()
Base
Erstellen Sie eine Genauigkeitsbewertung
Summe (diag (Tabelle ()) / Summe (Tabelle ()
ROCR
ROC erstellen: Schritt 1 Vorhersage erstellen
Prognose()
vorhersagen (), y
ROCR
ROC erstellen: Schritt 2 Leistung erstellen
Performance()
Vorhersage (), 'tpr', 'fpr'
ROCR
ROC erstellen: Schritt 3 Diagramm zeichnen
Handlung()
Performance()
Die anderen GLM- Modelle sind:
- Binomial: (link = "logit")
- Gauß: (link = "Identität")
- Gamma: (link = "invers")
- inverse.gaussian: (link = "1 / mu 2")
- poisson: (link = "log")
- quasi: (link = "Identität", Varianz = "Konstante")
- Quasibinom: (link = "logit")
- Quasipoisson: (link = "log")