GLM in R: Yleistetty lineaarinen malli esimerkin kanssa

Mikรค on logistinen regressio?

Logistista regressiota kรคytetรครคn ennustamaan luokkaa eli todennรคkรถisyyttรค. Logistinen regressio voi ennustaa binรครคrituloksen tarkasti.

Kuvittele, ettรค haluat ennustaa, onko laina evรคtty/hyvรคksytty monien ominaisuuksien perusteella. Logistinen regressio on muotoa 0/1. y = 0, jos laina hylรคtรครคn, y = 1, jos laina hyvรคksytรครคn.

Logistinen regressiomalli eroaa lineaarisesta regressiomallista kahdella tavalla.

  • Ensinnรคkin logistinen regressio hyvรคksyy vain dikotomisen (binรครคrisyรถtteen) riippuvaiseksi muuttujaksi (eli vektorin 0 ja 1).
  • Toiseksi lopputulos mitataan seuraavalla todennรคkรถisyyspohjaisella linkkifunktiolla nimeltรครคn sigmoidi S-muotonsa ansiosta:

Logistinen regressio

Toiminnon lรคhtรถ on aina vรคlillรค 0 ja 1. Tarkista alla oleva kuva

Logistinen regressio

Sigmoidifunktio palauttaa arvot vรคlillรค 0โ€“1. Luokittelutehtรคvรครค varten tarvitsemme erillisen tulosteen 0 tai 1.

Jatkuvan virtauksen muuttamiseksi diskreetiksi arvoksi voimme asettaa pรครคtรถsrajaksi 0.5. Kaikki tรคmรคn kynnyksen ylittรคvรคt arvot luokitellaan 1:ksi

Logistinen regressio

Generalized Liner Model (GLM) luominen

Kรคytetรครคn aikuinen tietojoukko logistisen regression havainnollistamiseksi. "Aikuinen" on loistava tietojoukko luokitustehtรคvรครค varten. Tavoitteena on ennustaa, ylittรครคkรถ henkilรถn vuositulo dollareina 50.000 46,033. Aineisto sisรคltรครค XNUMX XNUMX havaintoa ja kymmenen ominaisuutta:

  • ikรค: henkilรถn ikรค. Numeerinen
  • koulutus: Yksilรถn koulutustaso. Tekijรค.
  • siviilisรครคty: Marihenkilรถn asemasta. Factor eli ei koskaan naimisissa, Naimisissa-siviili-puoliso,โ€ฆ
  • sukupuoli: yksilรถn sukupuoli. Tekijรค, eli mies tai nainen
  • tulo: Target muuttuja. Tulot yli tai alle 50 50. Kerroin eli >50K, <=XNUMXK

muiden joukossa

library(dplyr)
data_adult <-read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/adult.csv")
glimpse(data_adult)

lรคhtรถ:

Observations: 48,842
Variables: 10
$ x               <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,...
$ age             <int> 25, 38, 28, 44, 18, 34, 29, 63, 24, 55, 65, 36, 26...
$ workclass       <fctr> Private, Private, Local-gov, Private, ?, Private,...
$ education       <fctr> 11th, HS-grad, Assoc-acdm, Some-college, Some-col...
$ educational.num <int> 7, 9, 12, 10, 10, 6, 9, 15, 10, 4, 9, 13, 9, 9, 9,...
$ marital.status  <fctr> Never-married, Married-civ-spouse, Married-civ-sp...
$ race            <fctr> Black, White, White, Black, White, White, Black, ...
$ gender          <fctr> Male, Male, Male, Male, Female, Male, Male, Male,...
$ hours.per.week  <int> 40, 50, 40, 40, 30, 30, 40, 32, 40, 10, 40, 40, 39...
$ income          <fctr> <=50K, <=50K, >50K, >50K, <=50K, <=50K, <=50K, >5...

Jatketaan seuraavasti:

  • Vaihe 1: Tarkista jatkuvat muuttujat
  • Vaihe 2: Tarkista tekijรคmuuttujat
  • Vaihe 3: Ominaisuussuunnittelu
  • Vaihe 4: Yhteenvetotilasto
  • Vaihe 5: Harjoittelu/testisarja
  • Vaihe 6: Rakenna malli
  • Vaihe 7: Arvioi mallin suorituskyky
  • Vaihe 8: Paranna mallia

Sinun tehtรคvรคsi on ennustaa, kenen tulot ovat yli 50 XNUMX.

Tรคssรค opetusohjelmassa jokainen vaihe on kuvattu yksityiskohtaisesti todellisen tietojoukon analysoimiseksi.

Vaihe 1) Tarkista jatkuvat muuttujat

Ensimmรคisessรค vaiheessa nรคet jatkuvien muuttujien jakauman.

continuous <-select_if(data_adult, is.numeric)
summary(continuous)

Code Selitys

  • jatkuva <- select_if(data_adult, is.numeric): Kรคytรค funktiota select_if() dplyr-kirjastosta valitaksesi vain numeeriset sarakkeet
  • yhteenveto (jatkuva): Tulosta yhteenvetotilasto

lรคhtรถ:

##        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	

Yllรค olevasta taulukosta nรคet, ettรค tiedoilla on tรคysin erilaiset asteikot ja tunnit.viikkoa kohden on suuria poikkeavuuksia (.eli katso viimeistรค kvartiilia ja maksimiarvoa).

Voit kรคsitellรค sen seuraavasti:

  • 1: Piirrรค tuntien.per.viikkojakauma
  • 2: Standardoi jatkuvat muuttujat
  1. Piirrรค jakelu

Katsotaanpa tarkemmin tuntien.per.viikko-jakaumaa

# Histogram with kernel density curve
library(ggplot2)
ggplot(continuous, aes(x = hours.per.week)) +
    geom_density(alpha = .2, fill = "#FF6666")

lรคhtรถ:

Tarkista jatkuvat muuttujat

Muuttujalla on paljon poikkeavuuksia eikรค tarkka jakautuminen. Voit ratkaista tรคmรคn ongelman osittain poistamalla ylimmรคt 0.01 prosenttia viikon tunneista.

Kvantiilin perussyntaksi:

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.

Laskemme ylimmรคn 2 prosentin prosenttipisteen

top_one_percent <- quantile(data_adult$hours.per.week, .99)
top_one_percent

Code Selitys

  • kvantiili(data_adult$hours.per.week, .99): Laske 99 prosentin arvo tyรถajasta

lรคhtรถ:

## 99% 
##  80

98 prosenttia vรคestรถstรค tyรถskentelee alle 80 tuntia viikossa.

Voit pudottaa havainnot tรคmรคn kynnyksen ylรคpuolelle. Kรคytรคt suodatinta dplyr kirjasto.

data_adult_drop <-data_adult %>%
filter(hours.per.week<top_one_percent)
dim(data_adult_drop)

lรคhtรถ:

## [1] 45537    10
  1. Standardoi jatkuvat muuttujat

Voit standardoida jokaisen sarakkeen tehokkuuden parantamiseksi, koska tiedoillasi ei ole samaa mittakaavaa. Voit kรคyttรครค funktiota mutate_if dplyr-kirjastosta. Perussyntaksi on:

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 function

Voit standardoida numeeriset sarakkeet seuraavasti:

data_adult_rescale <- data_adult_drop % > %
	mutate_if(is.numeric, funs(as.numeric(scale(.))))
head(data_adult_rescale)

Code Selitys

  • mutate_if(is.numeric, funs(scale)): Ehto on vain numeerinen sarake ja funktio on skaala

lรคhtรถ:

##           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   >50K

Vaihe 2) Tarkista tekijรคmuuttujat

Tรคllรค vaiheella on kaksi tavoitetta:

  • Tarkista taso kussakin kategoriassa sarakkeessa
  • Mรครคrittele uusia tasoja

Jaamme tรคmรคn vaiheen kolmeen osaan:

  • Valitse kategorialliset sarakkeet
  • Tallenna kunkin sarakkeen pylvรคskaavio luetteloon
  • Tulosta kaaviot

Voimme valita tekijรคsarakkeet alla olevalla koodilla:

# Select categorical column
factor <- data.frame(select_if(data_adult_rescale, is.factor))
	ncol(factor)

Code Selitys

  • data.frame(select_if(data_adult, is.factor)): Tallennamme tekijรคsarakkeet kertoimena tietokehystyyppiin. Kirjasto ggplot2 vaatii tietokehysobjektin.

lรคhtรถ:

## [1] 6

Tietojoukko sisรคltรครค 6 kategorista muuttujaa

Toinen vaihe on taitavampi. Haluat piirtรครค pylvรคskaavion jokaiselle datakehystekijรคn sarakkeelle. Prosessi on kรคtevรคmpรครค automatisoida, varsinkin jos sarakkeita on paljon.

library(ggplot2)
# Create graph for each column
graph <- lapply(names(factor),
    function(x) 
	ggplot(factor, aes(get(x))) +
		geom_bar() +
		theme(axis.text.x = element_text(angle = 90)))

Code Selitys

  • lapply(): Kรคytรค funktiota lapply() vรคlittรครคksesi funktion kaikissa tietojoukon sarakkeissa. Tallennat tulosteen luetteloon
  • function(x): Funktio kรคsitellรครคn jokaiselle x:lle. Tรคssรค x on sarakkeet
  • ggplot(tekijรค, aes(get(x))) + geom_bar()+ teema(akseli.teksti.x = elementin_teksti(kulma = 90)): Luo pylvรคsmerkkikaavio jokaiselle x-elementille. Huomaa, ettรค jos haluat palauttaa x:n sarakkeena, sinun on sisรคllytettรคvรค se get()

Viimeinen vaihe on suhteellisen helppo. Haluat tulostaa 6 kuvaajaa.

# Print the graph
graph

lรคhtรถ:

## [[1]]

Tarkista tekijรคmuuttujat

## ## [[2]]

Tarkista tekijรคmuuttujat

## ## [[3]]

Tarkista tekijรคmuuttujat

## ## [[4]]

Tarkista tekijรคmuuttujat

## ## [[5]]

Tarkista tekijรคmuuttujat

## ## [[6]]

Tarkista tekijรคmuuttujat

Huomautus: Kรคytรค seuraava-painiketta siirtyรคksesi seuraavaan kaavioon

Tarkista tekijรคmuuttujat

Vaihe 3) Ominaisuussuunnittelu

Uudelleenlaadittu koulutus

Yllรค olevasta kaaviosta nรคet, ettรค muuttuvassa koulutuksessa on 16 tasoa. Tรคmรค on merkittรคvรครค, ja joillakin tasoilla on suhteellisen vรคhรคn havaintoja. Jos haluat parantaa tรคstรค muuttujasta saatavan tiedon mรครคrรครค, voit muotoilla sen uudelleen korkeammalle tasolle. Nimittรคin luot suurempia ryhmiรค, joilla on samanlainen koulutustaso. Esimerkiksi alhainen koulutus muuttuu keskeyttรคneiksi. Korkeammat koulutustasot muutetaan mestariksi.

Tรคssรค on yksityiskohta:

Vanha taso Uusi taso
Esikoulu lopettaa
10. Lopettaa
11. Lopettaa
12. Lopettaa
1.-4 Lopettaa
5th-6th Lopettaa
7th-8th Lopettaa
9. Lopettaa
HS-Grad HighGrad
Joku yliopisto yhteisรถ
Assoc-acdm yhteisรถ
Assoc-voc yhteisรถ
Alempi Alempi
Masters Masters
Professorikoulu Masters
Tohtorinarvo 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 Selitys

  • Kรคytรคmme verbiรค mutate dplyr-kirjastosta. Muutamme koulutuksen arvoja lauseella ifelse

Alla olevaan taulukkoon luot yhteenvetotilaston, josta nรคet, kuinka monta vuotta koulutusta (z-arvo) keskimรครคrin kestรครค kandidaatin, maisterin tai tohtorin tutkinnon saavuttamiseen.

recast_data % > %
	group_by(education) % > %
	summarize(average_educ_year = mean(educational.num),
		count = n()) % > %
	arrange(average_educ_year)

lรคhtรถ:

## # A tibble: 6 x 3
## education average_educ_year count			
##      <fctr>             <dbl> <int>
## 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

uudelleenlaaditun Marital-status

On myรถs mahdollista luoda alempia tasoja siviilisรครคtyรค varten. Seuraavassa koodissa muutat tasoa seuraavasti:

Vanha taso Uusi taso
Ei koskaan naimisissa Ei naimisissa
Aviopuoliso-poissa Ei naimisissa
Naimisissa-AF-puoliso Naimisissa
Naimisissa oleva puoliso
Asumuserossa Asumuserossa
Eronnut
Widows Leski
# Change level marry
recast_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")))))

Voit tarkistaa kunkin ryhmรคn yksilรถiden lukumรครคrรคn.

table(recast_data$marital.status)

lรคhtรถ:

## ##     Married Not_married   Separated       Widow
##       21165       15359        7727        1286

Vaihe 4) Yhteenvetotilasto

On aika tarkistaa tilastotietoja tavoitemuuttujistamme. Alla olevassa kaaviossa lasket niiden henkilรถiden prosenttiosuuden, jotka ansaitsevat yli 50 XNUMX sukupuolensa perusteella.

# Plot gender income
ggplot(recast_data, aes(x = gender, fill = income)) +
    geom_bar(position = "fill") +
    theme_classic()

lรคhtรถ:

Yhteenvetotilasto

Tarkista seuraavaksi, vaikuttaako henkilรถn alkuperรค hรคnen tuloihinsa.

# Plot origin income
ggplot(recast_data, aes(x = race, fill = income)) +
    geom_bar(position = "fill") +
    theme_classic() +
    theme(axis.text.x = element_text(angle = 90))

lรคhtรถ:

Yhteenvetotilasto

Tyรถtuntien mรครคrรค sukupuolen mukaan.

# box plot gender working time
ggplot(recast_data, aes(x = gender, y = hours.per.week)) +
    geom_boxplot() +
    stat_summary(fun.y = mean,
        geom = "point",
        size = 3,
        color = "steelblue") +
    theme_classic()

lรคhtรถ:

Yhteenvetotilasto

Laatikkokaavio vahvistaa, ettรค tyรถajanjako sopii eri ryhmiin. Laatikkokaaviossa molemmilla sukupuolilla ei ole homogeenisiรค havaintoja.

Voit tarkistaa viikoittaisen tyรถajan tiheyden koulutustyypin mukaan. Jakaumissa on useita erillisiรค valintoja. Se voidaan luultavasti selittรครค koulutustyypin mukaan.tract Yhdysvalloissa.

# Plot distribution working time by education
ggplot(recast_data, aes(x = hours.per.week)) +
    geom_density(aes(color = education), alpha = 0.5) +
    theme_classic()

Code Selitys

  • ggplot(recast_data, aes(x= tuntia.per.viikko)): Tiheyskaavio vaatii vain yhden muuttujan
  • geom_density(aes(vรคri = koulutus), alfa =0.5): geometrinen objekti tiheyden ohjaamiseen

lรคhtรถ:

Yhteenvetotilasto

Vahvistaaksesi ajatuksesi voit suorittaa yksisuuntaisen ANOVA testi:

anova <- aov(hours.per.week~education, recast_data)
summary(anova)

lรคhtรถ:

##                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 ' ' 1

ANOVA-testi vahvistaa ryhmien vรคlisen keskiarvon eron.

Ei-lineaarisuus

Ennen kuin suoritat mallin, voit nรคhdรค, liittyykรถ tyรถtuntien mรครคrรค ikรครคn.

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 Selitys

  • ggplot(recast_data, aes(x = ikรค, y = tuntia.per.viikko)): Aseta kaavion estetiikka
  • geom_point(aes(vรคri=tulo), koko =0.5): Muodosta pistekaavio
  • stat_smooth(): Lisรครค trendiviiva seuraavilla argumenteilla:
    • method='lm': Piirrรค sovitettu arvo, jos lineaarinen regressio
    • kaava = y~poly(x,2): Sovita polynomiregressio
    • se = TOSI: Lisรครค vakiovirhe
    • aes(vรคri=tulot): Jaa malli tulojen mukaan

lรคhtรถ:

Ei-lineaarisuus

Lyhyesti sanottuna, voit testata vuorovaikutustermejรค mallissa saadaksesi selville viikoittaisen tyรถajan ja muiden ominaisuuksien epรคlineaarisuuden vaikutuksen. On tรคrkeรครค havaita, missรค olosuhteissa tyรถaika vaihtelee.

Korrelaatio

Seuraava tarkistus on visualisoida muuttujien vรคlinen korrelaatio. Muunnat tekijรคtason tyypin numeeriseksi, jotta voit piirtรครค lรคmpรถkartan, joka sisรคltรครค Spearman-menetelmรคllรค lasketun korrelaatiokertoimen.

library(GGally)
# Convert data to numeric
corr <- 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 Selitys

  • data.frame(lapply(recast_data,as.integer)): Muunna tiedot numeerisiksi
  • ggcorr() piirtรครค lรคmpรถkartan seuraavilla argumenteilla:
    • method: Menetelmรค korrelaation laskemiseksi
    • nbreaks = 6: Taukojen lukumรครคrรค
    • hjust = 0.8: Sรครคtรครค muuttujan nimen sijaintia kaaviossa
    • etiketti = TOSI: Lisรครค tunnisteet ikkunoiden keskelle
    • label_size = 3: Kokotarrat
    • vรคri = "grey50"): Tarran vรคri

lรคhtรถ:

Korrelaatio

Vaihe 5) Harjoittelu/testisarja

Kaikki valvotut koneoppiminen tehtรคvรค edellyttรครค tietojen jakamista junajoukon ja testijoukon vรคlillรค. Voit kรคyttรครค muissa ohjatuissa opetusohjelmissa luomaasi "toimintoa" harjoitus-/testisarjan luomiseen.

set.seed(1234)
create_train_test <- function(data, size = 0.8, train = TRUE) {
    n_row = nrow(data)
    total_row = size * n_row
    train_sample <- 1: total_row
    if (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)

lรคhtรถ:

## [1] 36429     9
dim(data_test)

lรคhtรถ:

## [1] 9108    9

Vaihe 6) Rakenna malli

Jos haluat nรคhdรค, kuinka algoritmi toimii, kรคytรค glm()-pakettia. The Yleistetty lineaarinen malli on kokoelma malleja. Perussyntaksi on:

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")	

Olet valmis arvioimaan logistisen mallin tulotason jakamiseksi eri ominaisuuksien kesken.

formula <- income~.
logit <- glm(formula, data = data_train, family = 'binomial')
summary(logit)

Code Selitys

  • kaava <- tulo ~ .: Luo malli sopivaksi
  • logit <- glm(kaava, data = data_train, family = 'binomial'): Sovita logistinen malli (family = 'binomial') data_train-tietoihin.
  • summary(logit): Tulosta mallin yhteenveto

lรคhtรถ:

## 
## 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: 6

Mallimme yhteenveto paljastaa mielenkiintoisia tietoja. Logistisen regression suorituskykyรค arvioidaan tietyillรค keskeisillรค mittareilla.

  • AIC (Akaike Information Criteria): Tรคmรค vastaa R2 logistisessa regressiossa. Se mittaa sovituksen, kun parametrien mรครคrรครคn sovelletaan rangaistusta. Pienempi AIC arvot osoittavat, ettรค malli on lรคhempรคnรค totuutta.
  • Nollapoikkeama: Sopii malliin vain leikkauspisteen kanssa. Vapausaste on n-1. Voimme tulkita sen Chi-neliรถarvona (sovitettu arvo, joka eroaa todellisen arvon hypoteesin testauksesta).
  • Jรครคnnรถspoikkeama: Malli kaikilla muuttujilla. Se tulkitaan myรถs khin neliรถn hypoteesin testaamiseksi.
  • Fisher Scoring iteraatioiden mรครคrรค: Iteraatioiden mรครคrรค ennen konvergoimista.

Glm()-funktion tulos tallennetaan luetteloon. Alla oleva koodi nรคyttรครค kaikki saatavilla olevat kohteet logit-muuttujassa, jonka rakensimme arvioimaan logistista regressiota.

# Lista on erittรคin pitkรค, tulosta vain kolme ensimmรคistรค elementtiรค

lapply(logit, class)[1:3]

lรคhtรถ:

## $coefficients
## [1] "numeric"
## 
## $residuals
## [1] "numeric"
## 
## $fitted.values
## [1] "numeric"

Jokainen arvo voi olla esim.tracja lisรครค $-merkki ja sen perรครคn mittareiden nimet. Esimerkiksi tallensit mallin nimellรค logit. Esim.tracAIC-kriteereissรค kรคytรคt:

logit$aic

lรคhtรถ:

## [1] 27086.65

Vaihe 7) Arvioi mallin suorituskyky

Sekaannusmatriisi

sekaannusmatriisi on parempi valinta arvioida luokituksen tehokkuutta verrattuna eri mittareihin, jotka olet nรคhnyt aiemmin. Yleisenรค ajatuksena on laskea, kuinka monta kertaa todelliset esiintymรคt luokitellaan vรครคriksi.

Sekaannusmatriisi

Sekaannusmatriisin laskemiseksi sinulla on ensin oltava joukko ennusteita, jotta niitรค voidaan verrata todellisiin tavoitteisiin.

predict <- predict(logit, data_test, type = 'response')
# confusion matrix
table_mat <- table(data_test$income, predict > 0.5)
table_mat

Code Selitys

  • ennustaa(logit,data_testi, tyyppi = 'response'): Laske testijoukon ennuste. Aseta tyyppi = 'response' vastauksen todennรคkรถisyyden laskemiseksi.
  • table(data_test$income, ennustaa > 0.5): Laske sekaannusmatriisi. ennustaa > 0.5 tarkoittaa, ettรค se palauttaa 1, jos ennustetut todennรคkรถisyydet ovat yli 0.5, muuten 0.

lรคhtรถ:

##        
##         FALSE TRUE
##   <=50K  6310  495
##   >50K   1074 1229	

Jokainen sekoitusmatriisin rivi edustaa todellista kohdetta, kun taas jokainen sarake edustaa ennustettua kohdetta. Tรคmรคn matriisin ensimmรคisellรค rivillรค tarkastellaan alle 50 6241 tuloja (vรครคrรค luokka): 50 XNUMX luokiteltiin oikein henkilรถiksi, joiden tulot ovat alle XNUMX XNUMX (Tosi negatiivinen), kun taas loput luokiteltiin vรครคrin yli 50 XNUMX (Vรครคrรค positiivinen). Toisella rivillรค on yli 50 tk tulot, positiivinen luokka oli 1229 (Tosi positiivista), samalla kun Tosi negatiivinen oli 1074.

Voit laskea mallin tarkkuus summaamalla todellinen positiivinen + todellinen negatiivinen kokonaishavainto

Sekaannusmatriisi

accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
accuracy_Test

Code Selitys

  • summa(diag(taulukko_matto)): Diagonaalin summa
  • sum(table_mat): Matriisin summa.

lรคhtรถ:

## [1] 0.8277339

Malli nรคyttรครค kรคrsivรคn yhdestรค ongelmasta, se yliarvioi vรครคrien negatiivien mรครคrรคn. Tรคtรค kutsutaan tarkkuustestin paradoksi. Totesimme, ettรค tarkkuus on oikeiden ennusteiden suhde tapausten kokonaismรครคrรครคn. Meillรค voi olla suhteellisen korkea tarkkuus, mutta hyรถdytรถn malli. Se tapahtuu, kun on hallitseva luokka. Jos katsot taaksepรคin hรคmmennysmatriisia, voit nรคhdรค, ettรค useimmat tapaukset luokitellaan todellisiksi negatiivisiksi. Kuvittele nyt, ettรค malli luokitteli kaikki luokat negatiivisiksi (eli alle 50k). Sinulla olisi 75 prosentin tarkkuus (6718/6718+2257). Mallisi toimii paremmin, mutta sen on vaikea erottaa todellista positiivista todellisesta negatiivisesta.

Tรคllaisessa tilanteessa on parempi kรคyttรครค tiiviimpรครค mittaria. Voimme katsoa:

  • Tarkkuus = TP/(TP+FP)
  • Recall=TP/(TP+FN)

Tarkkuus vs muistaminen

Tarkkuus tarkastelee positiivisen ennusteen tarkkuutta. Palauttaa mieleen on positiivisten tapausten suhde, jotka luokittelija havaitsee oikein;

Voit rakentaa kaksi funktiota nรคiden kahden metriikan laskemiseksi

  1. Rakenna tarkkuus
precision <- function(matrix) {
	# True positive
    tp <- matrix[2, 2]
	# false positive
    fp <- matrix[1, 2]
    return (tp / (tp + fp))
}

Code Selitys

  • mat[1,1]: Palauta tietokehyksen ensimmรคisen sarakkeen ensimmรคinen solu eli tosipositiivinen
  • matto[1,2]; Palauta tietokehyksen toisen sarakkeen ensimmรคinen solu eli vรครคrรค positiivinen
recall <- function(matrix) {
# true positive
    tp <- matrix[2, 2]# false positive
    fn <- matrix[2, 1]
    return (tp / (tp + fn))
}

Code Selitys

  • mat[1,1]: Palauta tietokehyksen ensimmรคisen sarakkeen ensimmรคinen solu eli tosipositiivinen
  • matto[2,1]; Palauta tietokehyksen ensimmรคisen sarakkeen toinen solu eli vรครคrรค negatiivinen

Voit testata toimintojasi

prec <- precision(table_mat)
prec
rec <- recall(table_mat)
rec

lรคhtรถ:

## [1] 0.712877
## [2] 0.5336518

Kun malli sanoo, ettรค kyseessรค on yli 50 54 pitkรค henkilรถ, se pitรครค paikkansa vain 50 prosentissa tapauksista, ja se voi vaatia yli 72 XNUMX henkilรถitรค XNUMX prosentissa tapauksista.

Voit luoda Tarkkuus vs muistaminen pisteet tarkkuuden ja muistamisen perusteella. The Tarkkuus vs muistaminen on nรคiden kahden mittarin harmoninen keskiarvo, mikรค tarkoittaa, ettรค se antaa enemmรคn painoa alemmille arvoille.

Tarkkuus vs muistaminen

f1 <- 2 * ((prec * rec) / (prec + rec))
f1

lรคhtรถ:

## [1] 0.6103799

Precision vs Recall kompromissi

On mahdotonta saavuttaa sekรค suurta tarkkuutta ettรค korkeaa muistia.

Jos lisรครคmme tarkkuutta, oikea yksilรถ ennustetaan paremmin, mutta monet niistรค jรครคvรคt paitsi (alempi muistaminen). Joissakin tilanteissa suosittelemme suurempaa tarkkuutta kuin muistamista. Tarkkuuden ja muistamisen vรคlillรค on kovera suhde.

  • Kuvittele, sinun tรคytyy ennustaa, onko potilaalla sairaus. Haluat olla mahdollisimman tarkka.
  • Jos haluat havaita mahdolliset petolliset ihmiset kadulla kasvojentunnistuksen avulla, olisi parempi saada kiinni monet petollisiksi leimatut ihmiset, vaikka tarkkuus on alhainen. Poliisi voi vapauttaa petollisen henkilรถn.

ROC-kรคyrรค

Vastaanotin Operating Ominaisuus kรคyrรค on toinen yleinen tyรถkalu, jota kรคytetรครคn binรครคriluokituksessa. Se on hyvin samankaltainen kuin tarkkuus/palautuskรคyrรค, mutta sen sijaan, ettรค piirrettรคisiin tarkkuus vs. muistaminen, ROC-kรคyrรค nรคyttรครค todellisen positiivisen mรครคrรคn (eli palauttamisen) vรครคrรคn positiivisen nopeuden suhteen. Vรครคrien positiivisten tapausten osuus on virheellisesti positiivisiksi luokiteltujen negatiivisten tapausten suhde. Se on yhtรค suuri kuin yksi miinus todellinen negatiivinen korko. Todellista negatiivista korkoa kutsutaan myรถs erityispiirteet. Tรคstรค syystรค ROC-kรคyrรค piirretรครคn herkkyys (muistuta) vs. 1-spesifisyys

ROC-kรคyrรคn piirtรคmiseksi meidรคn on asennettava kirjasto nimeltรค RORC. Voimme lรถytรครค condasta kirjasto. Voit kirjoittaa koodin:

conda install -cr r-rocr โ€“kyllรค

Voimme piirtรครค ROC:n ennuste()- ja performance()-funktioilla.

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 Selitys

  • ennuste(ennustus, data_testi$tulo): ROCR-kirjaston on luotava ennusteobjekti syรถttรถtietojen muuttamiseksi
  • suorituskyky (ROCRpred, 'tpr', 'fpr'): Palauta kaksi yhdistelmรครค, jotka tuotetaan kaaviossa. Tรคssรค konstruoidaan tpr ja fpr. Tot piirrรค tarkkuus ja muista yhdessรค, kรคytรค "pre", "rec".

lรคhtรถ:

ROC-kรคyrรค

Vaihe 8) Paranna mallia

Voit yrittรครค lisรคtรค malliin epรคlineaarisuutta vuorovaikutuksella

  • ikรค ja tunnit viikossa
  • sukupuoli ja tunnit.per.viikko.

Sinun on kรคytettรคvรค pistetestiรค molempien mallien vertailuun

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_2

lรคhtรถ:

## [1] 0.6109181

Pisteet ovat hieman korkeammat kuin edellinen. Voit jatkaa tietojen kรคsittelyรค ja yrittรครค voittaa pisteet.

Yhteenveto

Voimme tiivistรครค funktion, jolla harjoitetaan logistista regressiota alla olevaan taulukkoon:

Paketti Tavoite Toiminto Perustelu
- Luo juna-/testitietojoukko create_train_set() tiedot, koko, juna
glm Harjoittele yleistetty lineaarinen malli glm() kaava, data, perhe*
glm Tee yhteenveto mallista yhteenveto() asennettu malli
pohja Tee ennustus ennustaa() sovitettu malli, tietojoukko, tyyppi = 'vastaus'
pohja Luo hรคmmennysmatriisi pรถytรค() y, ennusta()
pohja Luo tarkkuuspisteet summa(diag(taulukko())/summa(taulukko()
ROCR Luo ROC: Vaihe 1 Luo ennuste ennustus () ennustaa(), y
ROCR Luo ROC: Vaihe 2 Luo suorituskykyรค esitys() ennuste(), 'tpr', 'fpr'
ROCR Luo ROC: Vaihe 3 Piirrรค kaavio juoni () esitys()

Muut GLM mallityypit ovat:

โ€“ binomi: (linkki = "logit")

โ€“ gaussian: (linkki = "identiteetti")

โ€“ Gamma: (linkki = "kรครคnteinen")

โ€“ kรครคnteinen.gaussian: (linkki = "1/mu^2")

โ€“ poisson: (linkki = "loki")

โ€“ kvasi: (linkki = "identiteetti", varianssi = "vakio")

โ€“ kvasibinomi: (linkki = "logit")

โ€“ quasipoisson: (linkki = "loki")

Tiivistรค tรคmรค viesti seuraavasti: