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$ 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…
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
- Á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.weekKimenet:
## [1] 45537 10
- 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 functionA 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 >50K2. 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] 6Az 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 graphgraphKimenet:
## [[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 12864. 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 ' ' 1Az 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 9dim(data_test)Kimenet:
## [1] 9108 96. 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: 6Modellü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$aicKimenet:
## [1] 27086.657. 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_matKó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 1229A 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_TestKó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
- 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)recKimenet:
## [1] 0.712877## [2] 0.5336518Amikor 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))f1Kimenet:
## [1] 0.6103799Precí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_2Kimenet:
## [1] 0.6109181A 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")