GLM R-ben: Általánosított lineáris modell példával

Tartalomjegyzék:

Anonim

Mi a logisztikai regresszió?

A logisztikai regressziót egy osztály, azaz valószínűség előrejelzésére használják. A logisztikai regresszió pontosan megjósolhatja a bináris eredményt.

Képzelje el, hogy meg akarja jósolni, hogy a hitel elutasításra / elfogadásra kerül-e sok tulajdonság alapján. A logisztikai regresszió formája 0/1. y = 0, ha a hitelt elutasítják, y = 1, ha elfogadják.

A logisztikai regressziós modell két szempontból különbözik a lineáris regressziós modelltől.

  • Először is, a logisztikai regresszió csak dichotóm (bináris) bemenetet fogad el függő változóként (azaz 0 és 1 vektorként).
  • Másodszor, az eredmény mérjük a következő valószínűségi kapcsolatot nevezett funkció sigma miatt S-alakú .:

A funkció kimenete mindig 0 és 1 között van. Ellenőrizze az alábbi képet

A sigmoid függvény 0-tól 1-ig adja vissza az értékeket. Az osztályozási feladathoz 0 vagy 1 diszkrét kimenetre van szükségünk.

A folyamatos áramlás diszkrét értékre történő átalakításához beállíthatunk 0,5-re kötött döntést. A küszöbértéket meghaladó összes érték 1-es besorolású

Ebben az oktatóanyagban megtanulja

  • Mi a logisztikai regresszió?
  • Hogyan lehet létrehozni az általánosított bélésmodellt (GLM)
  • 1. lépés: Ellenőrizze a folyamatos változókat
  • 2. lépés: Ellenőrizze a faktorváltozókat
  • 3. lépés) Funkciótervezés
  • 4. lépés) Összefoglaló statisztika
  • 5. lépés) Vonat / tesztkészlet
  • 6. lépés: Készítse el a modellt
  • 7. lépés: Értékelje a modell teljesítményét

Hogyan lehet létrehozni az általánosított bélésmodellt (GLM)

Használjuk a felnőtt adatsort a logisztikai regresszió szemléltetésére. A "felnőtt" nagyszerű adatkészlet az osztályozási feladathoz. A cél annak megjósolása, hogy az egyén éves jövedelme dollárban meghaladja-e az 50 000-et. Az adatkészlet 46 033 megfigyelést és tíz jellemzőt tartalmaz:

  • kor: az egyén életkora. Numerikus
  • oktatás: Az egyén képzettségi szintje. Tényező.
  • családi állapot: az egyén családi állapota. Faktor, azaz soha nem házas, házas, házastárs,…
  • nem: Az egyén neme. Faktor, azaz Férfi vagy Nő
  • jövedelem: Célváltozó. 50 ezer feletti vagy alatti jövedelem. Faktor, azaz> 50K, <= 50K

többek között

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

Kimenet:

Observations: 48,842Variables: 10$ x  1, 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… 

A következőképpen fogunk eljárni:

  • 1. lépés: Ellenőrizze a folyamatos változókat
  • 2. lépés: Ellenőrizze a faktorváltozókat
  • 3. lépés: Funkciótervezés
  • 4. lépés: Összefoglaló statisztika
  • 5. lépés: Vonat / tesztkészlet
  • 6. lépés: Készítse el a modellt
  • 7. lépés: Értékelje a modell teljesítményét
  • 8. lépés: Javítsa a modellt

Az Ön feladata megjósolni, melyik egyénnek lesz 50 000-nél nagyobb bevétele.

Ebben az oktatóanyagban minden lépés részletes lesz, hogy elemezzen egy valós adatkészletet.

1. lépés: Ellenőrizze a folyamatos változókat

Az első lépésben láthatja a folyamatos változók eloszlását.

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

Kód Magyarázat

  • folyamatos <- select_if (data_adult, is.numeric): A select_if () függvény használatával a dplyr könyvtárból csak a numerikus oszlopokat választhatja ki
  • összefoglaló (folyamatos): Az összefoglaló statisztika kinyomtatása

Kimenet:

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

A fenti táblázatból láthatja, hogy az adatoknak teljesen különböző skálája és órája van. A per.weeks nagy outlierekkel rendelkezik (.ie nézze meg az utolsó kvartilis és a maximális értéket).

Két lépésben foglalkozhat vele:

  • 1: Ábrázolja az órák elosztását
  • 2: A folytonos változók szabványosítása
  1. Ábrázolja az eloszlást

Nézzük meg jobban az órák eloszlását.hétenként

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

Kimenet:

A változónak sok kiugró értéke van, és nincs jól definiált eloszlása. Részben megoldhatja ezt a problémát a heti órák felső 0,01 százalékának törlésével.

A kvantilis alapvető szintaxisa:

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.

Kiszámoljuk a felső 2 százalékos percentilis értékét

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

Kód Magyarázat

  • kvantilis (data_adult $ hour.per.week, .99): Számítsa ki a munkaidő 99 százalékának értékét

Kimenet:

## 99%## 80 

A lakosság 98 százaléka heti 80 óránál kevesebbet dolgozik.

A megfigyeléseket e küszöb fölé dobhatja. A dplyr könyvtár szűrőjét használja.

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

Kimenet:

## [1] 45537 10 
  1. A folyamatos változók egységesítése

Az egyes oszlopokat szabványosíthatja a teljesítmény javítása érdekében, mivel az adatok skálája nem azonos. Használhatja a mutate_if függvényt a dplyr könyvtárból. Az alapvető szintaxis:

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

A numerikus oszlopokat az alábbiak szerint szabványosíthatja:

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

Kód Magyarázat

  • mutate_if (is.numeric, funs (scale)): A feltétel csak numerikus oszlop, a függvény pedig skála

Kimenet:

## 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. lépés: Ellenőrizze a faktorváltozókat

Ennek a lépésnek két célja van:

  • Ellenőrizze az egyes kategóriák oszlopainak szintjét
  • Új szintek meghatározása

Ezt a lépést három részre osztjuk:

  • Válassza ki a kategorikus oszlopokat
  • Tárolja az oszlopok oszlopdiagramját egy listában
  • Nyomtassa ki a grafikonokat

Az alábbi kóddal kiválaszthatjuk a faktor oszlopokat:

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

Kód Magyarázat

  • data.frame (select_if (data_adult, is.factor)): A faktor oszlopokat faktorban tároljuk egy adatkeret típusba. A ggplot2 könyvtárhoz adatkeret objektumra van szükség.

Kimenet:

## [1] 6 

Az adatkészlet 6 kategorikus változót tartalmaz

A második lépés ügyesebb. Sávdiagramot kíván ábrázolni az adatkeret-tényező minden oszlopához. Kényelmesebb a folyamat automatizálása, különösen abban az esetben, ha sok oszlop van.

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

Kód Magyarázat

  • lapply (): Használja a lapply () függvényt egy függvény átadásához az adatkészlet összes oszlopában. A kimenetet egy listában tárolja
  • függvény (x): A függvény minden egyes x-hez feldolgozásra kerül. Itt x az oszlopok
  • ggplot (faktor, aes (get (x))) + geom_bar () + téma (tengely.szöveg.x = elem_szöveg (szög = 90)): Hozzon létre oszlopdiagramot minden x elemhez. Ne feledje, hogy az x oszlopként való visszaadásához fel kell vennie a get () mezőbe

Az utolsó lépés viszonylag könnyű. Ki akarja nyomtatni a 6 grafikont.

# Print the graphgraph

Kimenet:

## [[1]]

## ## [[2]]

## ## [[3]]

## ## [[4]]

## ## [[5]]

## ## [[6]]

Megjegyzés: A következő gombbal navigálhat a következő grafikonra

3. lépés) Funkciótervezés

Átdolgozott oktatás

A fenti grafikonból láthatja, hogy a változó oktatásnak 16 szintje van. Ez jelentős, és egyes szinteken viszonylag kevés megfigyelés található. Ha javítani kívánja a változó által megszerezhető információk mennyiségét, átdolgozhatja magasabb szintre. Ugyanis nagyobb csoportokat hoz létre, hasonló végzettséggel. Például az alacsony szintű oktatás lemorzsolódássá válik. A magasabb szintű oktatás mesterré változik.

Itt van a részlet:

Régi szint

Új szint

Iskola előtti

kidobni

10.

Kidobni

11.

Kidobni

12.

Kidobni

1.-4

Kidobni

5.-6

Kidobni

7.-8

Kidobni

9.

Kidobni

HS-Grad

HighGrad

Néhány főiskolai

Közösség

Assoc-acdm

Közösség

Assoc-voc

Közösség

Agglegények

Agglegények

Mesterek

Mesterek

Prof-iskola

Mesterek

Doktorátus

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

Kód Magyarázat

  • A mutáció a dplyr könyvtárból igét használjuk. Az ifelse állítással megváltoztatjuk az oktatás értékeit

Az alábbi táblázatban összefoglaló statisztikát készít, hogy átlagosan megnézze, hány éves oktatás (z-érték) szükséges az alapképzéshez, a mesterképzéshez vagy a PhD-hoz való eljutáshoz.

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

Kimenet:

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

Átdolgozza a családi állapotot

Alacsonyabb szintek létrehozása a családi állapotra is lehetséges. A következő kódban a következőképpen módosítja a szintet:

Régi szint

Új szint

Sosem házasodott

Nem házas

Házas-házastárs hiányzik

Nem házas

Házas-AF-házastárs

házas

Házas-civ-házastárs

Elválasztott

Elválasztott

Elvált

Özvegyek

Özvegy

# 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")))))
Ellenőrizheti az egyes csoportok egyedszámát.
table(recast_data$marital.status)

Kimenet:

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

4. lépés) Összefoglaló statisztika

Ideje ellenőrizni néhány statisztikát a célváltozóinkról. Az alábbi grafikonon megszámolja azon nemek arányát, akik 50 000-nél többet keresnek.

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

Kimenet:

Ezután ellenőrizze, hogy az egyén származása befolyásolja-e keresetét.

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

Kimenet:

A munkaórák száma nemek szerint.

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

Kimenet:

A dobozdiagram megerősíti, hogy a munkaidő megoszlása ​​különböző csoportoknak felel meg. A dobozdiagramon mindkét nemnél nincsenek homogén megfigyelések.

Ellenőrizheti a heti munkaidő sűrűségét oktatás típusa szerint. Az eloszlásoknak sok különféle választásuk van. Valószínűleg az Egyesült Államokban megkötött szerződés típusával magyarázható.

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

Kód Magyarázat

  • ggplot (átdolgozás_adatok, aes (x = óra.hét.hét)): A sűrűségábrához csak egy változó szükséges
  • geom_densness (aes (szín = oktatás), alfa = 0.5): A sűrűség szabályozására szolgáló geometriai objektum

Kimenet:

Gondolatai megerősítéséhez egyirányú ANOVA tesztet hajthat végre:

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

Kimenet:

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

Az ANOVA teszt megerősíti a csoportok közötti átlagkülönbséget.

Nem-linearitás

A modell futtatása előtt megnézheti, hogy a ledolgozott órák száma összefügg-e az életkorral.

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

Kód Magyarázat

  • ggplot (átdolgozott_adatok, aes (x = életkor, y = óra.hét.hét)): A grafikon esztétikájának beállítása
  • geom_point (aes (szín = jövedelem), méret = 0.5): Konstruálja a pontdiagramot
  • stat_smooth (): Adja hozzá a trendvonalat a következő argumentumokkal:
    • method = 'lm': Ábrázolja az illesztett értéket, ha a lineáris regresszió
    • formula = y ~ poly (x, 2): Illesszen be egy polinomiális regressziót
    • se = IGAZ: Adja hozzá a standard hibát
    • aes (szín = jövedelem): Törd meg a modellt jövedelem szerint

Kimenet:

Dióhéjban kipróbálhatja az interakciós kifejezéseket a modellben, hogy felismerje a heti munkaidő és egyéb jellemzők közötti nemlineáris hatást. Fontos felismerni, hogy a munkaidő mely körülmények között tér el.

Korreláció

A következő ellenőrzés a változók közötti összefüggés vizualizálása. A faktorszintet numerikusra konvertálja, így megrajzolhatja a Spearman-módszerrel kiszámított korrelációs együtthatót tartalmazó hőtérképet.

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

Kód Magyarázat

  • data.frame (lapply (átdolgozott_adatok, as.integer)): Adatok konvertálása numerikusra
  • A ggcorr () a következő argumentumokkal ábrázolja a hőtérképet:
    • módszer: Módszer a korreláció kiszámítására
    • törések = 6: A törés száma
    • hjust = 0,8: A változó nevének vezérlési helye a diagramban
    • label = TRUE: Adjon címkéket az ablakok közepére
    • label_size = 3: Méretcímkék
    • color = "grey50"): A címke színe

Kimenet:

5. lépés) Vonat / tesztkészlet

Bármely felügyelt gépi tanulási feladathoz meg kell osztani az adatokat egy vonatsor és egy tesztkészlet között. A vonat / tesztkészlet létrehozásához használhatja a többi felügyelt oktatóanyagban létrehozott "funkciót".

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)

Kimenet:

## [1] 36429 9
dim(data_test)

Kimenet:

## [1] 9108 9 

6. lépés: Készítse el a modellt

Az algoritmus teljesítményének megtekintéséhez használja a glm () csomagot. Az Általánosított Lineáris Modell modellek gyűjteménye. Az alapvető szintaxis:

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

Készen áll arra, hogy megbecsülje a logisztikai modellt, hogy a jövedelemszintet fel lehessen osztani egy jellemzők között.

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

Kód Magyarázat

  • formula <- jövedelem ~.: Készítse el a modellt, hogy illeszkedjen
  • logit <- glm (formula, data = data_train, family = 'binomial'): Illesszen be egy logisztikai modellt (family = 'binomial') az data_train adatokhoz.
  • összefoglaló (logit): kinyomtatja a modell összefoglalóját

Kimenet:

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

Modellünk összefoglalása érdekes információkat tár fel. A logisztikai regresszió teljesítményét konkrét kulcsmutatókkal értékelik.

  • AIC (Akaike Information Criteria): Ez egyenértékű az R2 logisztikai regresszióban. Méri az illeszkedést, amikor a paraméterek számára büntetést alkalmaznak. A kisebb AIC értékek azt jelzik, hogy a modell közelebb áll az igazsághoz.
  • Null deviancia: Csak a metszettel illik a modellhez. A szabadság mértéke n-1. Értelmezhetjük Chi-négyzet értékként (illesztett érték eltér a tényleges érték hipotézis tesztjétől).
  • Maradék deviancia: Modell az összes változóval. Kí-négyzet hipotézistesztként is értelmezik.
  • A Fisher pontozási iterációinak száma: A konvergálás előtti iterációk száma.

A glm () függvény kimenete egy listában tárolódik. Az alábbi kód megmutatja az összes elemet, amely elérhető a logit változóban, amelyet a logisztikai regresszió értékelésére készítettünk.

# A lista nagyon hosszú, csak az első három elemet nyomtassa ki

lapply(logit, class)[1:3]

Kimenet:

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

Minden érték kibontható a $ jellel, majd a metrika nevével. Például a modellt logitként tárolta. Az AIC-kritériumok kibontásához használja:

logit$aic

Kimenet:

## [1] 27086.65

7. lépés: Értékelje a modell teljesítményét

Zavarzási mátrix

A zavartsági mátrix jobb választás az osztályozási teljesítmény értékeléséhez, a korábban bemutatott különböző mutatókhoz képest. Az általános elképzelés az, hogy megszámoljuk az igaz példányok hamis besorolását.

A zavartsági mátrix kiszámításához először meg kell adnia egy előrejelzéseket, hogy azok összehasonlíthatók legyenek a tényleges célokkal.

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

Kód Magyarázat

  • prediktív (logit, data_test, type = 'response'): Számítsa ki a predikciót a tesztkészleten. Állítsa be a type = 'response' elemet a válasz valószínűségének kiszámításához.
  • táblázat (data_test $ jövedelem, előrejelzés> 0,5): Számítsa ki a zavaros mátrixot. prediktív> 0.5 azt jelenti, hogy 1-t ad vissza, ha az előrejelzett valószínűségek meghaladják a 0,5-et, máskülönben 0.

Kimenet:

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

A zavaros mátrix minden sora egy tényleges célt képvisel, míg minden oszlop egy előre jelzett célt. Ennek a mátrixnak az első sora a jövedelmet 50 000-nél alacsonyabbnak tartja (hamis osztály): 6241-et helyesen soroltak be olyan személyek közé, akik jövedelme alacsonyabb, mint 50 ezer ( igaz negatív ), míg a maradékot tévesen 50 ezer fölé sorolták ( hamis pozitív ). A második sor az 50 ezer feletti jövedelmet veszi figyelembe, a pozitív osztály 1229 volt ( True pozitív ), míg a True negatív 1074 volt.

Kiszámíthatja a modell pontosságát az összes pozitív megfigyelés pozitív és + negatív összeadásával

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

Kód Magyarázat

  • sum (diag (table_mat)): Az átló összege
  • sum (table_mat): A mátrix összege.

Kimenet:

## [1] 0.8277339 

Úgy tűnik, hogy a modell egy problémát szenved, túlbecsüli a hamis negatívumok számát. Ezt pontossági teszt paradoxonnak nevezzük . Megállapítottuk, hogy a pontosság a helyes előrejelzések és az esetek teljes számának aránya. Viszonylag nagy pontosságú, de haszontalan modellünk lehet. Akkor történik, ha van domináns osztály. Ha visszatekint a zavartsági mátrixra, láthatja, hogy az esetek többsége igaz negatívnak minősül. Képzelje el, hogy a modell az összes osztályt negatívnak (azaz 50k alatti) osztályozta. 75 százalékos pontosságú lenne (6718/6718 + 2257). A modelled jobban teljesít, de küzd az igazi pozitív és az igazi negatív megkülönböztetéséért.

Ilyen helyzetben előnyösebb egy tömörebb metrika. Megnézhetjük:

  • Pontosság = TP / (TP + FP)
  • Visszahívás = TP / (TP + FN)

Pontosság vs visszahívás

Precision nézi a pontosságot a pozitív előrejelzést. A visszahívás a pozitív esetek aránya, amelyeket az osztályozó helyesen észlelt;

E két mutató kiszámításához két függvényt szerkeszthet

  1. Konstrukció pontosság
precision <- function(matrix) {# True positivetp <- matrix[2, 2]# false positivefp <- matrix[1, 2]return (tp / (tp + fp))}

Kód Magyarázat

  • mat [1,1]: Adja vissza az adatkeret első oszlopának első celláját, vagyis az igaz pozitív értéket
  • szőnyeg [1,2]; Adja vissza az adatkeret második oszlopának első celláját, vagyis a hamis pozitív értéket
recall <- function(matrix) {# true positivetp <- matrix[2, 2]# false positivefn <- matrix[2, 1]return (tp / (tp + fn))}

Kód Magyarázat

  • mat [1,1]: Adja vissza az adatkeret első oszlopának első celláját, vagyis az igaz pozitív értéket
  • szőnyeg [2,1]; Visszaadja az adatkeret első oszlopának második celláját, vagyis a hamis negatív értéket

Kipróbálhatja funkcióit

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

Kimenet:

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

Amikor a modell azt mondja, hogy 50k feletti egyénről van szó, az esetek csupán 54 százalékában helyes, és az esetek 72 százalékában 50k feletti egyedeket követelhet.

A a két mutató harmonikus középértéke, vagyis nagyobb súlyt ad az alacsonyabb értékeknek.

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

Kimenet:

## [1] 0.6103799 

Precíziós és visszahívási kompromisszum

Lehetetlen mind nagy pontosság, mind nagy visszahívás.

Ha növeljük a pontosságot, a jó egyént jobban megjósolhatjuk, de sokukat hiányolnánk (alacsonyabb visszahívás). Bizonyos helyzetekben a nagyobb pontosságot részesítjük előnyben, mint a visszahívást. Homorú kapcsolat van a precizitás és a visszahívás között.

  • Képzelje el, meg kell jósolnia, hogy a betegnek van-e betegsége. A lehető legpontosabb akar lenni.
  • Ha arcfelismeréssel kell észlelnie a potenciális csaló embereket az utcán, jobb, ha sok embert elkapnak, akiket csalárdnak titulálnak, annak ellenére, hogy a pontosság alacsony. A rendőrség szabadon engedheti a nem csaló személyt.

A ROC görbe

A vevő működési jellemzői görbe egy másik gyakori eszköz, amelyet bináris osztályozással használnak. Nagyon hasonlít a precíziós / visszahívási görbéhez, de a pontosság kontra visszahívás helyett a ROC görbe a valódi pozitív arányt (azaz a visszahívást) mutatja a hamis pozitív arányhoz képest. A hamis pozitív arány a helytelenül pozitívnak minősített negatív esetek aránya. Ez egyenlő egy mínusz valódi negatív rátával. A valódi negatív arányt specifitásnak is nevezzük . Ezért a ROC görbe ábrázolja az érzékenységet (visszahívást) az 1-specifitáshoz képest

A ROC görbe ábrázolásához telepítenünk kell egy RORC nevű könyvtárat. A társasházi könyvtárban megtalálhatjuk. Beírhatja a kódot:

conda install -cr r-rocr - igen

Ábrázolhatjuk a ROC-t a predikció () és a teljesítmény () függvényekkel.

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

Kód Magyarázat

  • predikció (predikció, data_test $ jövedelem): A ROCR könyvtárnak létre kell hoznia egy predikciós objektumot a bemeneti adatok átalakításához
  • teljesítmény (ROCRpred, 'tpr', 'fpr'): adja vissza a grafikonon előállítandó két kombinációt. Itt a tpr és az fpr felépül. A pontosság és a visszahívás teljes ábrázolása, használja a "prec", a "rec" kifejezéseket.

Kimenet:

8. lépés: Javítsa a modellt

Megpróbálhatja a nem-linearitást hozzáadni a modellhez a kölcsönhatással

  • kor és órák.hétenként
  • nem és órák.hétenként.

Mindkét modell összehasonlításához használja a pontszám tesztet

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

Kimenet:

## [1] 0.6109181 

A pontszám valamivel magasabb, mint az előző. Folytathatja az adatok feldolgozását, hogy megpróbálja legyőzni a pontszámot.

Összegzés

Az alábbi táblázatban összefoglalhatjuk a logisztikai regresszió képzésének függvényét:

Csomag

Célkitűzés

funkció

érv

-

Hozzon létre vonat / teszt adatkészletet

create_train_set ()

adatok, méret, vonat

glm

Képezzen egy általánosított lineáris modellt

glm ()

képlet, adat, család *

glm

Foglalja össze a modellt

összefoglaló ()

felszerelt modell

bázis

Tegyen jóslatot

megjósolni ()

illesztett modell, adatkészlet, type = 'response'

bázis

Hozzon létre egy zavart mátrixot

asztal()

y, megjósolni ()

bázis

Pontossági pontszám létrehozása

összeg (diag (táblázat ()) / összeg (táblázat ()

ROCR

ROC létrehozása: 1. lépés Jóslás létrehozása

jóslat ()

megjósolni (), y

ROCR

ROC létrehozása: 2. lépés Teljesítmény létrehozása

teljesítmény()

predikció (), 'tpr', 'fpr'

ROCR

ROC létrehozása: 3. lépés Ábrázolja a grafikont

cselekmény()

teljesítmény()

A többi GLM típus a következő:

- binomiális: (link = "logit")

- gaussian: (link = "identitás")

- Gamma: (link = "inverz")

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

- poisson: (link = "log")

- kvázi: (link = "azonosság", variancia = "állandó")

- kvazibinomiális: (link = "logit")

- quasipoisson: (link = "log")