GLM in R: üldistatud lineaarne mudel koos näitega

Mis on logistiline regressioon?

Logistilist regressiooni kasutatakse klassi, st tõenäosuse ennustamiseks. Logistiline regressioon võib binaarset tulemust täpselt ennustada.

Kujutage ette, et soovite paljude tunnuste põhjal ennustada, kas laen keeldutakse/võttakse vastu. Logistiline regressioon on kujul 0/1. y = 0, kui laen lükatakse tagasi, y = 1, kui laen võetakse vastu.

Logistiline regressioonimudel erineb lineaarsest regressioonimudelist kahel viisil.

  • Esiteks aktsepteerib logistiline regressioon sõltuva muutujana ainult dihhotoomset (binaarset) sisendit (st vektorit 0 ja 1).
  • Teiseks mõõdetakse tulemust järgmise tõenäosusliku seose funktsiooniga sigmoidne tänu oma S-kujule.:

Logistiline regressioon

Funktsiooni väljund on alati vahemikus 0 kuni 1. Kontrollige allolevat pilti

Logistiline regressioon

Sigmoidfunktsioon tagastab väärtused vahemikus 0 kuni 1. Klassifitseerimisülesande jaoks vajame diskreetset väljundit 0 või 1.

Pideva voolu teisendamiseks diskreetseks väärtuseks saame määrata otsuse piiriks 0.5. Kõik väärtused, mis ületavad seda läve, klassifitseeritakse kui 1

Logistiline regressioon

Kuidas luua üldistatud lainerimudelit (GLM)

Kasutame täiskasvanud andmekogum logistilise regressiooni illustreerimiseks. "Täiskasvanu" on klassifitseerimisülesande jaoks suurepärane andmestik. Eesmärk on ennustada, kas üksikisiku aastane sissetulek dollarites ületab 50.000 46,033. Andmekogum sisaldab XNUMX XNUMX vaatlust ja kümmet funktsiooni:

  • vanus: isiku vanus. Numbriline
  • haridus: indiviidi haridustase. tegur.
  • perekonnaseis: Mariisiku staatus. Tegur, st mitte kunagi abielus, abielus-abikaasa, …
  • sugu: indiviidi sugu. Tegur, st mees või naine
  • sissetulek: Target muutuv. Sissetulek üle või alla 50 50. Tegur st >50K, <=XNUMXK

teiste seas

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

Väljund:

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

Toimime järgmiselt:

  • 1. samm: kontrollige pidevaid muutujaid
  • 2. samm: kontrollige tegurimuutujaid
  • 3. toiming: funktsioonide projekteerimine
  • 4. samm: kokkuvõtlik statistika
  • 5. samm: treening-/katsekomplekt
  • 6. samm: looge mudel
  • 7. samm: hinnake mudeli toimivust
  • 8. samm: täiustage mudelit

Teie ülesanne on ennustada, kelle tulu on suurem kui 50 XNUMX.

Selles õpetuses kirjeldatakse üksikasjalikult kõiki samme, et viia läbi reaalse andmestiku analüüs.

1. samm) Kontrollige pidevaid muutujaid

Esimeses etapis näete pidevate muutujate jaotust.

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

Koodi selgitus

  • pidev <- select_if(data_adult, is.numeric): Kasutage dplyr teegi funktsiooni select_if(), et valida ainult arvulised veerud
  • kokkuvõte (pidev): kokkuvõtliku statistika printimine

Väljund:

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

Ülaltoodud tabelist näete, et andmetel on täiesti erinevad skaalad ja tundide kohta nädalas on suured kõrvalekalded (st vaadake viimast kvartiili ja maksimumväärtust).

Saate sellega toime tulla kahe sammuga:

  • 1: Joonistage tundide.nädalas jaotus
  • 2: standardiseerige pidevad muutujad
  1. Joonistage jaotus

Vaatame lähemalt tundide.nädalas jaotust

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

Väljund:

Kontrollige pidevaid muutujaid

Muutujal on palju kõrvalekaldeid ja mitte täpselt määratletud jaotus. Saate selle probleemi osaliselt lahendada, kustutades nädalas ülemised 0.01 protsenti tundidest.

Kvantiili põhisüntaks:

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.

Arvutame ülemise 2 protsendi protsentiili

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

Koodi selgitus

  • quantile(data_adult$hours.per.week, .99): arvutab 99 protsendi tööajast väärtuse

Väljund:

## 99% 
##  80

98 protsenti elanikkonnast töötab alla 80 tunni nädalas.

Saate jätta vaatlused sellest künnisest kõrgemale. Kasutate filtrit alates dplyr raamatukogu.

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

Väljund:

## [1] 45537    10
  1. Standardiseerige pidevad muutujad

Toimivuse parandamiseks saate iga veeru standardida, kuna teie andmete skaala ei ole sama. Saate kasutada dplyr teegi funktsiooni mute_if. Põhiline süntaks 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

Saate numbrilisi veerge standardida järgmiselt.

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

Koodi selgitus

  • mute_if(is.numeric, funs(scale)): tingimus on ainult numbriline veerg ja funktsioon on skaala

Väljund:

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

2. samm) Kontrollige tegurimuutujaid

Sellel etapil on kaks eesmärki:

  • Kontrollige taset igas kategooria veerus
  • Määratlege uued tasemed

Jagame selle sammu kolmeks osaks:

  • Valige kategoorilised veerud
  • Salvestage iga veeru tulpdiagramm loendis
  • Printige graafikud

Saame valida teguriveerud alloleva koodiga:

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

Koodi selgitus

  • data.frame(select_if(data_adult, is.factor)): salvestame teguriveerud faktorina andmekaadri tüübis. Teek ggplot2 nõuab andmeraami objekti.

Väljund:

## [1] 6

Andmekogum sisaldab 6 kategoorilist muutujat

Teine samm on oskuslikum. Soovite andmeraami teguri iga veeru jaoks joonistada tulpdiagrammi. Protsessi on mugavam automatiseerida, eriti olukorras, kus veerge on palju.

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

Koodi selgitus

  • lapply(): Kasutage funktsiooni lapply() funktsiooni edastamiseks kõigis andmestiku veergudes. Salvestate väljundi loendisse
  • Funktsioon(x): funktsiooni töödeldakse iga x jaoks. Siin on x veerud
  • ggplot(faktor, aes(get(x))) + geom_bar()+ theme(axis.text.x = element_text(angle = 90)): looge iga x-elemendi jaoks tulpdiagramm. Pange tähele, et x-i tagastamiseks veeruna peate selle lisama get()

Viimane samm on suhteliselt lihtne. Soovite printida 6 graafikut.

# Print the graph
graph

Väljund:

## [[1]]

Kontrollige tegurimuutujaid

## ## [[2]]

Kontrollige tegurimuutujaid

## ## [[3]]

Kontrollige tegurimuutujaid

## ## [[4]]

Kontrollige tegurimuutujaid

## ## [[5]]

Kontrollige tegurimuutujaid

## ## [[6]]

Kontrollige tegurimuutujaid

Märkus. Järgmise graafiku juurde liikumiseks kasutage nuppu Järgmine

Kontrollige tegurimuutujaid

Samm 3) Funktsioonide projekteerimine

Haridus uuesti sõnastatud

Ülaltoodud graafikult näete, et muutuv haridus on 16 tasemega. See on märkimisväärne ja mõnel tasemel on vaatlusi suhteliselt vähe. Kui soovite parandada sellest muutujast saadava teabe hulka, saate selle ümber sõnastada kõrgemale tasemele. Nimelt loote suuremaid sarnase haridustasemega gruppe. Näiteks madal haridustase muudetakse väljalangevaks. Kõrgemad haridustasemed muudetakse meistriks.

Siin on detail:

Vana tase Uus tase
koolieelne välja kukkuma
10. Välja kukkuma
11. Välja kukkuma
12. Välja kukkuma
1.-4 Välja kukkuma
5th-6th Välja kukkuma
7th-8th Välja kukkuma
9. Välja kukkuma
HS-Grad HighGrad
Mingi kolledž kogukond
Assoc-acdm kogukond
Assoc-voc kogukond
Bakalaureuseõpe Bakalaureuseõpe
Masters Masters
Professionaalkool Masters
Doktorikraad 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")))))))

Koodi selgitus

  • Me kasutame dplyr raamatukogust verbi mute. Hariduse väärtushinnanguid muudame lausega ifelse

Allolevas tabelis loote kokkuvõtliku statistika, et näha, mitu aastat keskmiselt kulub haridusele (z-väärtus) bakalaureuse-, magistri- või doktorikraadini jõudmiseks.

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

Väljund:

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

Uuesti sõnastamine Marital-staatus

Samuti on võimalik luua madalamaid perekonnaseisu tasemeid. Järgmises koodis muudate taset järgmiselt:

Vana tase Uus tase
Ei abiellunud kunagi Ei ole abielus
Abielus-abikaasa-puudulik Ei ole abielus
Abielus-AF-abikaasa Abielus
Abielus-kodanik-abikaasa
Lahutatud Lahutatud
Lahutatud
Lese Lesk
# 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")))))

Saate kontrollida iga rühma kuuluvate isikute arvu.

table(recast_data$marital.status)

Väljund:

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

4. etapp) kokkuvõtlik statistika

On aeg vaadata statistikat meie sihtmuutujate kohta. Alloleval graafikul loendate nende inimeste protsenti, kes teenivad oma soo järgi üle 50 XNUMX.

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

Väljund:

Kokkuvõtlik statistika

Järgmisena kontrollige, kas isiku päritolu mõjutab tema sissetulekuid.

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

Väljund:

Kokkuvõtlik statistika

Töötundide arv soo järgi.

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

Väljund:

Kokkuvõtlik statistika

Kastigraafik kinnitab, et tööaja jaotus sobib erinevatele rühmadele. Kastdiagrammil pole mõlemal sugupoolel homogeenseid vaatlusi.

Iganädalase tööaja tihedust saate vaadata haridusliikide kaupa. Distributsioonidel on palju erinevaid valikuid. Seda saab ilmselt seletada USA lepingutüübiga.

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

Koodi selgitus

  • ggplot(recast_data, aes(x= hours.per.week)): tihedusgraafik nõuab ainult ühte muutujat
  • geom_density(aes(värv = haridus), alfa =0.5): geomeetriline objekt tiheduse juhtimiseks

Väljund:

Kokkuvõtlik statistika

Oma mõtete kinnitamiseks võite sooritada ühesuunalise ANOVA test:

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

Väljund:

##                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 test kinnitab rühmade keskmise erinevust.

Mittelineaarsus

Enne mudeli käivitamist näete, kas töötundide arv on vanusega seotud.

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

Koodi selgitus

  • ggplot(recast_data, aes(x = vanus, y = tunnid.nädalas)): määrake graafiku esteetika
  • geom_point(aes(värv=sissetulek), suurus =0.5): Koostage punktdiagramm
  • stat_smooth(): lisage trendijoon järgmiste argumentidega:
    • method='lm': joonistage sobitatud väärtus, kui lineaarse regressiooni
    • valem = y~poly(x,2): sobitada polünoomi regressioon
    • se = TRUE: lisage standardviga
    • aes(värv= sissetulek): jagage mudel sissetulekute järgi

Väljund:

Mittelineaarsus

Lühidalt, saate testida mudelis interaktsioonitermineid, et tuvastada mittelineaarsuse efekt nädalase tööaja ja muude funktsioonide vahel. Oluline on tuvastada, millistel tingimustel tööaeg erineb.

Korrelatsioon

Järgmine kontroll on muutujate vahelise korrelatsiooni visualiseerimine. Teisendate teguri taseme tüübi numbriliseks, et saaksite joonistada soojuskaardi, mis sisaldab Spearmani meetodiga arvutatud korrelatsioonikordajat.

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

Koodi selgitus

  • data.frame(lapply(recast_data,as.integer)): teisenda andmed numbriteks
  • ggcorr() joonistab soojuskaardi järgmiste argumentidega:
    • meetod: korrelatsiooni arvutamise meetod
    • nbreaks = 6: Katkeste arv
    • hjust = 0.8: muutuja nime juhtpositsioon graafikul
    • silt = TRUE: lisage sildid akende keskele
    • label_size = 3: suurussildid
    • värv = “grey50”): sildi värv

Väljund:

Korrelatsioon

5. samm) Treeni/katsekomplekt

Igasugune järelevalve all masinõpe ülesanne nõuab andmete jagamist rongikoosseisu ja katsekomplekti vahel. Treeningu/testikomplekti loomiseks saate kasutada teistes juhendatud õppejuhendites loodud funktsiooni.

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)

Väljund:

## [1] 36429     9
dim(data_test)

Väljund:

## [1] 9108    9

6. samm) Ehitage mudel

Et näha, kuidas algoritm toimib, kasutage paketti glm(). The Üldistatud lineaarne mudel on mudelite kogu. Põhiline süntaks 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")	

Olete valmis hindama logistilist mudelit, et jagada sissetuleku tase funktsioonide komplekti vahel.

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

Koodi selgitus

  • valem <- sissetulek ~ .: Looge sobiv mudel
  • logit <- glm(valem, andmed = data_train, family = 'binomial'): sobitage logistiline mudel (pere = 'binomial') andmerongi andmetega.
  • summary(logit): printige mudeli kokkuvõte

Väljund:

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

Meie mudeli kokkuvõte paljastab huvitavat teavet. Logistilise regressiooni toimivust hinnatakse konkreetsete võtmemõõdikute abil.

  • AIC (Akaike teabekriteeriumid): see on samaväärne R2 logistilises regressioonis. See mõõdab sobivust, kui parameetrite arvule määratakse karistus. Väiksem AIC väärtused näitavad, et mudel on tõele lähemal.
  • Nullhälve: sobib mudeliga ainult lõikepunktiga. Vabadusaste on n-1. Saame tõlgendada seda kui hii-ruut väärtust (sobitatud väärtus, mis erineb tegeliku väärtuse hüpoteesi testimisest).
  • Jääkhälve: mudel kõigi muutujatega. Seda tõlgendatakse ka kui hii-ruudu hüpoteesi testimist.
  • Fisheri skoori iteratsioonide arv: iteratsioonide arv enne lähenemist.

Funktsiooni glm() väljund salvestatakse loendisse. Allolev kood näitab kõiki logiti muutujas saadaolevaid üksusi, mille koostasime logistilise regressiooni hindamiseks.

# Loend on väga pikk, printige ainult kolm esimest elementi

lapply(logit, class)[1:3]

Väljund:

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

Iga väärtuse saab ekstraheerida märgiga $, millele järgneb mõõdiku nimi. Näiteks salvestasite mudeli logitina. AIC-kriteeriumide eraldamiseks kasutage järgmist:

logit$aic

Väljund:

## [1] 27086.65

7. samm) Hinnake mudeli jõudlust

Segadusmaatriks

. segaduse maatriks on parem valik klassifitseerimise toimivuse hindamiseks võrreldes varem nähtud erinevate mõõdikutega. Üldine mõte on lugeda kordade arv, mil tõesed eksemplarid on klassifitseeritud Väärteks.

Segadusmaatriks

Segadusmaatriksi arvutamiseks peab teil esmalt olema ennustuste kogum, et neid saaks võrrelda tegelike sihtmärkidega.

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

Koodi selgitus

  • ennusta(logit,andmete_test, tüüp = 'response'): arvutab ennustuse testikomplektis. Määrake vastuse tõenäosuse arvutamiseks tüüp = 'response'.
  • tabel(andmed_test$sissetulek, ennustada > 0.5): arvutage segadusmaatriks. ennustada > 0.5 tähendab, et see tagastab 1, kui prognoositud tõenäosused on üle 0.5, muidu 0.

Väljund:

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

Segadusmaatriksi iga rida tähistab tegelikku sihtmärki, samas kui iga veerg tähistab prognoositavat sihtmärki. Selle maatriksi esimene rida arvestab sissetulekuid, mis on väiksemad kui 50 6241 (klass False): 50 liigitati õigesti isikuteks, kelle sissetulek on alla XNUMX XNUMX (Tõeline negatiivne), samas kui ülejäänud klassifitseeriti valesti üle 50 XNUMX (Valepositiivne). Teisel real on tulud üle 50k, positiivne klass oli 1229 (Tõeliselt positiivne), samal ajal kui Tõeline negatiivne oli 1074.

Saate arvutada mudeli täpsus tõelise positiivse + tõelise negatiivse summeerimisel kogu vaatluse kohta

Segadusmaatriks

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

Koodi selgitus

  • summa(diag(tabel_matt)): diagonaali summa
  • summa(tabeli_matt): maatriksi summa.

Väljund:

## [1] 0.8277339

Näib, et mudelil on üks probleem, see hindab valede negatiivsete arvu üle. Seda nimetatakse täpsustesti paradoks. Me väitsime, et täpsus on õigete ennustuste suhe juhtumite koguarvusse. Meil võib olla suhteliselt kõrge täpsus, kuid kasutu mudel. See juhtub siis, kui on domineeriv klass. Kui vaatate tagasi segaduste maatriksile, näete, et enamik juhtumeid on klassifitseeritud tõeliselt negatiivseteks. Kujutage nüüd ette, mudel klassifitseeris kõik klassid negatiivseteks (st alla 50 75). Teie täpsus oleks 6718 protsenti (6718/2257+XNUMX). Teie modell toimib paremini, kuid tal on raske eristada tõelist positiivset tõelisest negatiivsest.

Sellises olukorras on parem kasutada kokkuvõtlikumat mõõdikut. Saame vaadata:

  • Täpsus = TP/(TP+FP)
  • Meenuta = TP/(TP+FN)

Täpsus vs meenutamine

Täpsus vaatleb positiivse ennustuse täpsust. Tagasikutsumine on klassifikaatori poolt õigesti tuvastatud positiivsete juhtumite suhe;

Nende kahe mõõdiku arvutamiseks saate koostada kaks funktsiooni

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

Koodi selgitus

  • mat[1,1]: tagastab andmeraami esimese veeru esimese lahtri, st tõelise positiivse
  • matt[1,2]; Tagastab andmeraami teise veeru esimese lahtri, st valepositiivse
recall <- function(matrix) {
# true positive
    tp <- matrix[2, 2]# false positive
    fn <- matrix[2, 1]
    return (tp / (tp + fn))
}

Koodi selgitus

  • mat[1,1]: tagastab andmeraami esimese veeru esimese lahtri, st tõelise positiivse
  • matt[2,1]; Tagastab andmeraami esimese veeru teise lahtri, st valenegatiivse

Saate oma funktsioone testida

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

Väljund:

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

Kui mudel ütleb, et see on üle 50 54 vanus isik, on see õige vaid 50 protsendil juhtudest ja 72 protsendil juhtudel võib see nõuda üle XNUMX XNUMX vanuste isikute kohta.

Saate luua Täpsus vs meenutamine skoor täpsuse ja meeldetuletuse põhjal. The Täpsus vs meenutamine on nende kahe mõõdiku harmooniline keskmine, mis tähendab, et see annab suurema kaalu madalamatele väärtustele.

Täpsus vs meenutamine

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

Väljund:

## [1] 0.6103799

Kompromiss täpsuse ja tagasikutsumisega

On võimatu saavutada nii suurt täpsust kui ka suurt meeldejäämist.

Kui me suurendame täpsust, ennustatakse õiget isikut paremini, kuid me jätaksime paljud neist kahe silma vahele (väiksem meeldetuletus). Mõnes olukorras eelistame suuremat täpsust kui tagasikutsumist. Täpsuse ja meenutamise vahel on nõgus seos.

  • Kujutage ette, peate ennustama, kas patsiendil on haigus. Tahad olla võimalikult täpne.
  • Kui teil on vaja näotuvastuse abil tuvastada tänaval potentsiaalseid petturid, oleks parem tabada palju petturiteks märgitud inimesi, kuigi täpsus on madal. Politseil on võimalik mittepetturlik isik vabastada.

ROC kõver

. Vastuvõtja Operating Iseloomulik kõver on teine ​​levinud tööriist, mida kasutatakse binaarse klassifikatsiooni korral. See on väga sarnane täpsuse/tagasikutsumise kõveraga, kuid täpsuse ja meeldetuletamise kõvera asemel näitab ROC kõver tõelist positiivset määra (st tagasikutsumist) valepositiivse määra suhtes. Valepositiivsuse määr on negatiivsete juhtumite suhe, mis on valesti positiivseteks liigitatud. See on võrdne ühega, millest on lahutatud tegelik negatiivne määr. Nimetatakse ka tõeliseks negatiivseks määraks spetsiifilisus. Siit ka ROC kõvera joonised tundlikkus (meenutamine) versus 1-spetsiifilisus

ROC-kõvera joonistamiseks peame installima raamatukogu nimega RORC. Kondast leiame raamatukogu. Saate sisestada koodi:

conda install -cr r-rocr –jah

ROC-i saame joonistada funktsioonide ennustus () ja performance () abil.

library(ROCR)
ROCRpred <- prediction(predict, data_test$income)
ROCRperf <- performance(ROCRpred, 'tpr', 'fpr')
plot(ROCRperf, colorize = TRUE, text.adj = c(-0.2, 1.7))

Koodi selgitus

  • ennustus(prognoos, data_test$income): ROCR-i teek peab sisendandmete teisendamiseks looma ennustusobjekti
  • performance (ROCRpred, 'tpr', 'fpr'): tagastab kaks kombinatsiooni graafikus loomiseks. Siin konstrueeritakse tpr ja fpr. Joonistage graafiku täpsus ja meeldetuletus koos, kasutage "pre", "rec".

Väljund:

ROC kõver

Step 8) Parandage mudelit

Võite proovida lisada mudelile mittelineaarsust interaktsiooniga

  • vanus ja tunnid.nädalas
  • sugu ja tunnid.nädalas.

Mõlema mudeli võrdlemiseks peate kasutama skoori testi

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

Väljund:

## [1] 0.6109181

Hinne on eelmisest pisut kõrgem. Võite jätkata andmete kallal töötamist ja püüda tulemust ületada.

kokkuvõte

Logistilise regressiooni treenimise funktsiooni saame kokku võtta allolevas tabelis:

Pakend Eesmärk funktsioon Argument
- Loo rongi-/katseandmekogum create_train_set() andmed, suurus, rong
glm Treenige üldistatud lineaarset mudelit glm() valem, andmed, perekond*
glm Tehke mudelist kokkuvõte kokkuvõte() varustatud mudel
baas Tehke ennustus ennustama () sobitatud mudel, andmestik, tüüp = 'vastus'
baas Looge segaduse maatriks tabel () y, ennusta()
baas Looge täpsusskoor summa(diag(tabel())/summa(tabel()
ROCR Loo ROC: 1. samm Loo ennustus ennustus () ennustama(), y
ROCR Looge ROC: 2. samm Loo jõudlus jõudlus () ennustus (), 'tpr', 'fpr'
ROCR Looge ROC: 3. samm Joonistage graafik süžee() jõudlus ()

Teine GLM mudelite tüübid on järgmised:

– binoom: (link = "logit")

– gaussi keel: (link = "identiteet")

- Gamma: (link = "vastupidine")

– inverse.gaussian: (link = "1/mu^2")

– poisson: (link = "log")

– kvaasi: (link = "identiteet", dispersioon = "konstant"

– kvaasibinoomiline: (link = "logit")

– kvaasipoisson: (link = "log")