R'de GLM: Örneklerle Genelleştirilmiş Doğrusal Model

İçindekiler:

Anonim

Lojistik regresyon nedir?

Lojistik regresyon, bir sınıfı, yani bir olasılığı tahmin etmek için kullanılır. Lojistik regresyon, ikili bir sonucu doğru bir şekilde tahmin edebilir.

Bir kredinin birçok özelliğe bağlı olarak reddedilip reddedilmediğini / kabul edilip edilmediğini tahmin etmek istediğinizi hayal edin. Lojistik regresyon 0/1 biçimindedir. Bir kredi reddedilirse y = 0, kabul edilirse y = 1.

Lojistik regresyon modeli, lineer regresyon modelinden iki şekilde farklılık gösterir.

  • Her şeyden önce, lojistik regresyon bağımlı değişken (yani, 0 ve 1 vektörü) olarak yalnızca ikili (ikili) girdiyi kabul eder.
  • İkinci olarak, sonuç, S-şekilli olması nedeniyle sigmoid adı verilen aşağıdaki olasılıksal bağlantı fonksiyonu ile ölçülür :

Fonksiyonun çıkışı her zaman 0 ile 1 arasındadır. Aşağıdaki Resmi Kontrol Edin

Sigmoid işlevi 0'dan 1'e kadar değerler döndürür. Sınıflandırma görevi için, 0 veya 1 ayrı bir çıktıya ihtiyacımız var.

Sürekli bir akışı ayrık değere dönüştürmek için, 0,5'te bir karar sınırı belirleyebiliriz. Bu eşiğin üzerindeki tüm değerler 1 olarak sınıflandırılır

Bu eğitimde öğreneceksiniz

  • Lojistik regresyon nedir?
  • Genelleştirilmiş Kaplama Modeli (GLM) nasıl oluşturulur
  • Adım 1) Sürekli değişkenleri kontrol edin
  • Adım 2) Faktör değişkenlerini kontrol edin
  • Adım 3) Özellik mühendisliği
  • Adım 4) Özet İstatistik
  • Adım 5) Eğitim / test seti
  • Adım 6) Modeli oluşturun
  • Adım 7) Modelin performansını değerlendirin

Genelleştirilmiş Kaplama Modeli (GLM) nasıl oluşturulur

Lojistik regresyonu göstermek için yetişkin veri kümesini kullanalım . "Yetişkin", sınıflandırma görevi için harika bir veri kümesidir. Amaç, bir bireyin dolar cinsinden yıllık gelirinin 50.000'i aşıp aşmayacağını tahmin etmektir. Veri kümesi 46.033 gözlem ve on özellik içerir:

  • yaş: bireyin yaşı. Sayısal
  • eğitim: Bireyin eğitim seviyesi. Faktör.
  • marital.status: Bireyin medeni durumu. Faktör yani Hiç Evlenmemiş, Evli-sivil-eş,…
  • cinsiyet: Bireyin cinsiyeti. Faktör, yani Erkek veya Kadın
  • gelir: Hedef değişken. 50K'nın üzerinde veya altında gelir. Faktör yani> 50K, <= 50K

diğerleri arasında

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

Çıktı:

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şağıdaki gibi ilerleyeceğiz:

  • Adım 1: Sürekli değişkenleri kontrol edin
  • Adım 2: Faktör değişkenlerini kontrol edin
  • 3. Adım: Özellik mühendisliği
  • Adım 4: Özet istatistiği
  • Adım 5: Eğitim / test seti
  • 6. Adım: Modeli oluşturun
  • 7. Adım: Modelin performansını değerlendirin
  • 8. Adım: Modeli geliştirin

Göreviniz, hangi kişinin 50K'dan daha yüksek bir gelire sahip olacağını tahmin etmektir.

Bu eğiticide, gerçek bir veri kümesi üzerinde bir analiz gerçekleştirmek için her adım ayrıntılı olarak anlatılacaktır.

Adım 1) Sürekli değişkenleri kontrol edin

İlk adımda, sürekli değişkenlerin dağılımını görebilirsiniz.

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

Kod Açıklama

  • sürekli <- select_if (data_adult, is.numeric): Yalnızca sayısal sütunları seçmek için dplyr kitaplığından select_if () işlevini kullanın
  • özet (sürekli): Özet istatistiği yazdırın

Çıktı:

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

Yukarıdaki tablodan, verilerin tamamen farklı ölçeklere ve saatlere sahip olduğunu görebilirsiniz. Hafta başına büyük aykırı değerlere sahiptir (son çeyreğe ve maksimum değere .ie bakın).

İki adımı izleyerek bununla başa çıkabilirsiniz:

  • 1: Saat / hafta dağılımının grafiğini çizin
  • 2: Sürekli değişkenleri standartlaştırın
  1. Dağılımı çizin

Saatlerin dağılımına daha yakından bakalım. Hafta başına

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

Çıktı:

Değişkenin çok sayıda aykırı değeri vardır ve iyi tanımlanmamış bir dağılım vardır. Haftalık saatlerin en yüksek yüzde 0,01'ini silerek bu sorunu kısmen çözebilirsiniz.

Temel kuantil sözdizimi:

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.

En yüksek yüzde 2'lik dilimi hesaplıyoruz

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

Kod Açıklama

  • kuantil (data_adult $ saat.per.hafta, 0,99): Çalışma süresinin yüzde 99'unun değerini hesaplayın

Çıktı:

## 99%## 80 

Nüfusun yüzde 98'i haftada 80 saatin altında çalışıyor.

Gözlemleri bu eşiğin üzerine düşürebilirsiniz. Dplyr kitaplığındaki filtreyi kullanırsınız.

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

Çıktı:

## [1] 45537 10 
  1. Sürekli değişkenleri standartlaştırın

Verileriniz aynı ölçeğe sahip olmadığından performansı artırmak için her bir sütunu standartlaştırabilirsiniz. Dplyr kütüphanesinden mutate_if fonksiyonunu kullanabilirsiniz. Temel sözdizimi şöyledir:

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

Sayısal sütunları aşağıdaki gibi standartlaştırabilirsiniz:

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

Kod Açıklama

  • mutate_if (is.numeric, funs (scale)): Koşul yalnızca sayısal sütun ve işlev ölçek

Çıktı:

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

Adım 2) Faktör değişkenlerini kontrol edin

Bu adımın iki amacı vardır:

  • Her kategorik sütundaki seviyeyi kontrol edin
  • Yeni seviyeleri tanımlayın

Bu adımı üç bölüme ayıracağız:

  • Kategorik sütunları seçin
  • Her sütunun çubuk grafiğini bir listede saklayın
  • Grafikleri yazdırın

Faktör sütunlarını aşağıdaki kod ile seçebiliriz:

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

Kod Açıklama

  • data.frame (select_if (data_adult, is.factor)): Faktör sütunlarını bir veri çerçevesi tipinde faktör olarak saklıyoruz. Kitaplık ggplot2, bir veri çerçevesi nesnesi gerektirir.

Çıktı:

## [1] 6 

Veri kümesi 6 kategorik değişken içerir

İkinci adım daha yeteneklidir. Veri çerçevesi faktöründeki her sütun için bir çubuk grafik çizmek istiyorsunuz. İşlemi otomatikleştirmek daha uygundur, özellikle de çok sayıda sütun olması durumunda.

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

Kod Açıklama

  • lapply (): Veri kümesinin tüm sütunlarında bir işlevi iletmek için lapply () işlevini kullanın. Çıkışı bir listede saklarsınız
  • function (x): Fonksiyon her x için işlenecektir. Burada x sütunlardır
  • ggplot (faktör, aes (get (x))) + geom_bar () + theme (axis.text.x = element_text (açı = 90)): Her x öğesi için bir çubuk karakter grafiği oluşturun. X'i sütun olarak döndürmek için get () içine eklemeniz gerekir.

Son adım nispeten kolaydır. 6 grafiği yazdırmak istiyorsunuz.

# Print the graphgraph

Çıktı:

## [[1]]

## ## [[2]]

## ## [[3]]

## ## [[4]]

## ## [[5]]

## ## [[6]]

Not: Sonraki grafiğe gitmek için sonraki düğmeyi kullanın

Adım 3) Özellik mühendisliği

Yeniden eğitim

Yukarıdaki grafikten, değişken eğitimin 16 seviyeye sahip olduğunu görebilirsiniz. Bu önemlidir ve bazı seviyelerin nispeten düşük sayıda gözlemleri vardır. Bu değişkenden alabileceğiniz bilgi miktarını iyileştirmek istiyorsanız, onu daha yüksek seviyeye yeniden düzenleyebilirsiniz. Yani, benzer eğitim düzeyine sahip daha büyük gruplar oluşturursunuz. Örneğin, düşük eğitim seviyesi okul terkine dönüştürülecektir. Daha yüksek eğitim seviyeleri, usta olarak değiştirilecek.

İşte detay:

Eski seviye

Yeni seviye

Okulöncesi

bırakmak

10

Bırakmak

11'i

Bırakmak

12'si

Bırakmak

1.-4.

Bırakmak

5'inci-6'ncı

Bırakmak

7-8.

Bırakmak

9

Bırakmak

HS-Grad

HighGrad

Bazı üniversite

Topluluk

Doç-acdm

Topluluk

Doç-vok

Topluluk

Lisanslar

Lisanslar

Ustalar

Ustalar

Prof-okul

Ustalar

Doktora

Doktora

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

Kod Açıklama

  • Dplyr kütüphanesinden fiil mutatını kullanıyoruz. İfelse ifadesiyle eğitimin değerlerini değiştiriyoruz

Aşağıdaki tabloda, Lisans, Yüksek Lisans veya Doktora derecelerine ulaşmak için ortalama kaç yıllık eğitim (z-değeri) gerektiğini görmek için bir özet istatistik oluşturursunuz.

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

Çıktı:

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

Medeni durumu değiştir

Medeni durum için daha düşük seviyeler oluşturmak da mümkündür. Aşağıdaki kodda seviyeyi aşağıdaki gibi değiştirirsiniz:

Eski seviye

Yeni seviye

Hiç evlenmemiş

Bekar

Evli-eş-yok

Bekar

Evli-AF-eş

Evli

Evli-civ-eş

Ayrılmış

Ayrılmış

Boşanmış

Dullar

Dul

# 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")))))
Her gruptaki kişi sayısını kontrol edebilirsiniz.
table(recast_data$marital.status)

Çıktı:

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

Adım 4) Özet İstatistik

Hedef değişkenlerimizle ilgili bazı istatistikleri kontrol etmenin zamanı geldi. Aşağıdaki grafikte, cinsiyetlerine göre 50 binden fazla kazanan bireylerin yüzdesini sayıyorsunuz.

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

Çıktı:

Ardından, kişinin kökeninin kazançlarını etkileyip etkilemediğini kontrol edin.

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

Çıktı:

Cinsiyete göre çalışma saati sayısı.

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

Çıktı:

Kutu grafiği, çalışma süresi dağılımının farklı gruplara uyduğunu doğrulamaktadır. Kutu grafiğinde her iki cinsiyetin de homojen gözlemleri yoktur.

Haftalık çalışma süresinin yoğunluğunu eğitim türüne göre kontrol edebilirsiniz. Dağıtımların birçok farklı seçimi var. Muhtemelen ABD'deki sözleşme türü ile açıklanabilir.

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

Kod Açıklama

  • ggplot (recast_data, aes (x = hours.per.week)): Bir yoğunluk grafiği yalnızca bir değişken gerektirir
  • geom_density (aes (renk = eğitim), alfa = 0,5): Yoğunluğu kontrol etmek için geometrik nesne

Çıktı:

Düşüncelerinizi onaylamak için tek yönlü bir ANOVA testi yapabilirsiniz:

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

Çıktı:

## 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, gruplar arasındaki ortalama farkı doğrular.

Doğrusal olmama

Modeli çalıştırmadan önce, çalışılan saat sayısının yaşla ilgili olup olmadığını görebilirsiniz.

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

Kod Açıklama

  • ggplot (recast_data, aes (x = age, y = hours.per.week)): Grafiğin estetiğini ayarlayın
  • geom_point (aes (renk = gelir), boyut = 0.5): Nokta grafiğini oluşturun
  • stat_smooth (): Trend çizgisini aşağıdaki bağımsız değişkenlerle ekleyin:
    • method = 'lm': Doğrusal regresyon
    • formül = y ~ poli (x, 2): Bir polinom regresyonu uydur
    • se = TRUE: Standart hatayı ekleyin
    • aes (renk = gelir): Modeli gelire göre ayırın

Çıktı:

Özetle, haftalık çalışma süresi ile diğer özellikler arasındaki doğrusal olmayan etkiyi bulmak için modeldeki etkileşim terimlerini test edebilirsiniz. Çalışma süresinin hangi koşullarda farklı olduğunu tespit etmek önemlidir.

Korelasyon

Bir sonraki kontrol, değişkenler arasındaki korelasyonu görselleştirmektir. Faktör seviyesi türünü, Spearman yöntemiyle hesaplanan korelasyon katsayısını içeren bir ısı haritasını çizebilmek için sayısal hale dönüştürürsünüz.

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

Kod Açıklama

  • data.frame (lapply (recast_data, as.integer)): Verileri sayısal hale dönüştür
  • ggcorr () aşağıdaki bağımsız değişkenlerle ısı haritasını çizer:
    • yöntem: Korelasyonu hesaplama yöntemi
    • nbreaks = 6: Mola sayısı
    • hjust = 0.8: Grafikteki değişken adının kontrol konumu
    • etiket = DOĞRU: Pencerelerin ortasına etiket ekleyin
    • label_size = 3: "Boyut etiketleri"
    • color = "grey50"): Etiketin rengi

Çıktı:

Adım 5) Eğitim / test seti

Denetlenen herhangi bir makine öğrenimi görevi, verileri bir tren seti ile bir test seti arasında bölmeyi gerektirir. Bir eğitim / test seti oluşturmak için diğer denetimli öğrenim eğitimlerinde oluşturduğunuz "işlevi" kullanabilirsiniz.

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)

Çıktı:

## [1] 36429 9
dim(data_test)

Çıktı:

## [1] 9108 9 

Adım 6) Modeli oluşturun

Algoritmanın nasıl çalıştığını görmek için glm () paketini kullanırsınız. Genelleştirilmiş Lineer Modeli modellerinin topluluğudur. Temel sözdizimi şöyledir:

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

Gelir düzeyini bir dizi özellik arasında bölmek için lojistik modeli tahmin etmeye hazırsınız.

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

Kod Açıklama

  • formül <- gelir ~.: Uyacak modeli oluşturun
  • logit <- glm (formula, data = data_train, family = 'binomial'): data_train verileriyle bir lojistik modeli (aile = 'iki terimli') uydurun.
  • özet (logit): Modelin özetini yazdırın

Çıktı:

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

Modelimizin özeti ilginç bilgiler ortaya koyuyor. Lojistik regresyonun performansı, belirli temel ölçütlerle değerlendirilir.

  • AIC (Akaike Bilgi Kriterleri): Bu, lojistik regresyondaki R2'nin eşdeğeridir . Parametre sayısına ceza uygulandığında uyumu ölçer. Daha küçük AIC değerleri, modelin gerçeğe daha yakın olduğunu gösterir.
  • Boş sapma: Modele yalnızca kesişimle uyar. Serbestlik derecesi n-1'dir. Bunu Ki-kare değeri olarak yorumlayabiliriz (uygun değer gerçek değer hipotezi testinden farklıdır).
  • Artık Sapma: Tüm değişkenlerle modelleyin. Aynı zamanda bir Ki-kare hipotez testi olarak yorumlanır.
  • Fisher Scoring yinelemelerinin sayısı: Yakınsamadan önceki yineleme sayısı.

Glm () işlevinin çıktısı bir listede saklanır. Aşağıdaki kod, lojistik regresyonu değerlendirmek için oluşturduğumuz logit değişkeninde bulunan tüm öğeleri göstermektedir.

# Liste çok uzun, yalnızca ilk üç öğeyi yazdırın

lapply(logit, class)[1:3]

Çıktı:

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

Her değer, metriklerin adının ardından $ işareti ile çıkarılabilir. Örneğin, modeli logit olarak sakladınız. AIC kriterlerini çıkarmak için şunları kullanırsınız:

logit$aic

Çıktı:

## [1] 27086.65

Adım 7) Modelin performansını değerlendirin

Karışıklık Matrisi

Karışıklık matrisi daha önce gördüğümüz farklı ölçümler ile karşılaştırıldığında sınıflandırma performansını değerlendirmek için daha iyi bir seçimdir. Genel fikir, Gerçek örneklerin kaç kez Yanlış olarak sınıflandırıldığını saymaktır.

Karışıklık matrisini hesaplamak için, önce gerçek hedeflerle karşılaştırılabilecekleri bir dizi tahmine sahip olmanız gerekir.

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

Kod Açıklama

  • tahmin (logit, data_test, type = 'response'): Test setindeki tahmini hesaplayın. Yanıt olasılığını hesaplamak için tür = 'yanıt' olarak ayarlayın.
  • tablo (veri_testi $ gelir, tahmin> 0.5): Karışıklık matrisini hesaplayın. tahmin> 0.5, tahmin edilen olasılıklar 0.5'in üzerindeyse 1, aksi takdirde 0 döndürdüğü anlamına gelir.

Çıktı:

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

Karışıklık matrisindeki her satır gerçek bir hedefi temsil ederken, her sütun tahmin edilen bir hedefi temsil eder. Bu matrisin ilk satırı, 50.000'den düşük geliri kabul eder (Yanlış sınıf): 6241, 50.000'den düşük gelire sahip bireyler olarak doğru şekilde sınıflandırılırken ( Gerçek negatif ), geri kalan, yanlış bir şekilde 50.000'in üzerinde ( Yanlış pozitif ) olarak sınıflandırılmıştır . İkinci satır 50.000'in üzerindeki geliri kabul eder, pozitif sınıf 1229 ( Gerçek pozitif ) ve Gerçek negatif 1074'tür.

Toplam gözlem üzerinden gerçek pozitif + gerçek negatifi toplayarak model doğruluğunu hesaplayabilirsiniz.

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

Kod Açıklama

  • sum (diag (table_mat)): Köşegenin toplamı
  • toplam (tablo_mat): Matrisin toplamı.

Çıktı:

## [1] 0.8277339 

Model bir problemden muzdarip görünüyor, yanlış negatiflerin sayısını olduğundan fazla tahmin ediyor. Buna doğruluk testi paradoksu denir . Doğruluğun, doğru tahminlerin toplam vaka sayısına oranı olduğunu belirttik. Nispeten yüksek doğruluğa sahip olabiliriz, ancak işe yaramaz bir model. Hakim bir sınıf olduğunda olur. Karışıklık matrisine dönüp bakarsanız, vakaların çoğunun gerçek negatif olarak sınıflandırıldığını görebilirsiniz. Şimdi, modelin tüm sınıfları negatif olarak sınıflandırdığını düşünün (yani 50k'den düşük). Yüzde 75'lik bir doğruluğa sahip olursunuz (6718/6718 + 2257). Modeliniz daha iyi performans gösteriyor ancak gerçek pozitif ile gerçek negatifi ayırt etmekte zorlanıyor.

Böyle bir durumda, daha kısa bir metriğe sahip olunması tercih edilir. Bakabiliriz:

  • Hassasiyet = TP / (TP + FP)
  • Geri çağırma = TP / (TP + FN)

Hassasiyet ve Geri Çağırma

Kesinlik , pozitif tahminin doğruluğuna bakar. Geri çağırma , sınıflandırıcı tarafından doğru şekilde algılanan pozitif örneklerin oranıdır;

Bu iki ölçümü hesaplamak için iki işlev oluşturabilirsiniz.

  1. Hassas inşa edin
precision <- function(matrix) {# True positivetp <- matrix[2, 2]# false positivefp <- matrix[1, 2]return (tp / (tp + fp))}

Kod Açıklama

  • mat [1,1]: Veri çerçevesinin ilk sütununun ilk hücresini döndürür, yani gerçek pozitif
  • mat [1,2]; Veri çerçevesinin ikinci sütununun ilk hücresini döndürür, yani yanlış pozitif
recall <- function(matrix) {# true positivetp <- matrix[2, 2]# false positivefn <- matrix[2, 1]return (tp / (tp + fn))}

Kod Açıklama

  • mat [1,1]: Veri çerçevesinin ilk sütununun ilk hücresini döndürür, yani gerçek pozitif
  • mat [2,1]; Veri çerçevesinin ilk sütununun ikinci hücresini, yani yanlış negatifi döndür

Fonksiyonlarınızı test edebilirsiniz

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

Çıktı:

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

Model 50.000'in üzerinde bir birey olduğunu söylediğinde, vakanın sadece yüzde 54'ünde doğrudur ve vakanın yüzde 72'sinde 50.000'in üzerinde bireyler talep edebilmektedir.

Alt değerlere daha fazla ağırlık veren, yani bu iki ölçüm bir harmonik ortalamasıdır.

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

Çıktı:

## [1] 0.6103799 

Hassasiyet ve Geri Çağırma Değişimi

Hem yüksek hassasiyete hem de yüksek geri çağırmaya sahip olmak imkansızdır.

Hassasiyeti arttırırsak, doğru kişi daha iyi tahmin edilir, ancak çoğunu kaçırırız (daha düşük hatırlama). Bazı durumlarda, geri çağırmadan daha yüksek hassasiyeti tercih ederiz. Kesinlik ve geri çağırma arasında içbükey bir ilişki vardır.

  • Düşünün, bir hastanın bir hastalığı olup olmadığını tahmin etmeniz gerekiyor. Mümkün olduğunca kesin olmak istersiniz.
  • Yüz tanıma yoluyla sokaktaki potansiyel sahtekar kişileri tespit etmeniz gerekiyorsa, hassasiyeti düşük olsa bile sahtekar olarak etiketlenen birçok kişiyi yakalamak daha iyi olacaktır. Polis, sahtekar olmayan kişiyi serbest bırakabilecektir.

ROC eğrisi

Alıcı çalışma karakteristiği eğrisi ikili sınıflandırma ile kullanılan bir başka yaygın bir araçtır. Kesinlik / geri çağırma eğrisine çok benzer, ancak kesinliği geri çağırmaya karşı çizmek yerine, ROC eğrisi yanlış pozitif orana karşı gerçek pozitif oranı (yani geri çağırma) gösterir. Yanlış pozitif oranı, hatalı şekilde pozitif olarak sınıflandırılan negatif örneklerin oranıdır. Bir eksi gerçek negatif orana eşittir. Gerçek negatif orana özgüllük de denir . Bu nedenle, ROC eğrisi, duyarlılığı (geri çağırma) 1-özgüllük ile karşılaştırır.

ROC eğrisini çizmek için, RORC adlı bir kitaplık kurmamız gerekir. Conda kütüphanesinde bulabiliriz. Kodu yazabilirsiniz:

conda install -cr r-rocr - evet

ROC'yi tahmin () ve performance () işlevleriyle çizebiliriz.

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

Kod Açıklama

  • tahmin (tahmin, veri testi $ gelir): ROCR kitaplığının, giriş verilerini dönüştürmek için bir tahmin nesnesi oluşturması gerekir.
  • performans (ROCRpred, 'tpr', 'fpr'): Grafikte üretmek için iki kombinasyonu döndürün. Burada tpr ve fpr oluşturulur. Kesinlik ve hatırlamayı birlikte çizin, "prek", "kayıt" kullanın.

Çıktı:

Adım 8) Modeli geliştirin

Arasındaki etkileşim ile modele doğrusal olmama eklemeyi deneyebilirsiniz.

  • yaş ve saat. hafta başına
  • cinsiyet ve saat. hafta başına.

Her iki modeli de karşılaştırmak için puan testini kullanmanız gerekir

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

Çıktı:

## [1] 0.6109181 

Puan bir öncekinden biraz daha yüksek. Veriler üzerinde çalışmaya devam edebilir ve skoru geçmeyi deneyebilirsiniz.

Özet

Aşağıdaki tabloda bir lojistik regresyon eğitme işlevini özetleyebiliriz:

Paket içeriği

Amaç

işlevi

tartışma

-

Eğitim / test veri kümesi oluştur

create_train_set ()

veri, boyut, eğitim

glm

Genelleştirilmiş Doğrusal Model Eğitin

glm ()

formül, veri, aile *

glm

Modeli özetleyin

özet ()

takılı model

temel

Tahmin etmek

tahmin ()

takılan model, veri kümesi, tür = 'yanıt'

temel

Bir kafa karışıklığı matrisi oluşturun

tablo ()

y, tahmin ()

temel

Doğruluk puanı oluşturun

toplam (diag (tablo ()) / toplam (tablo ()

ROCR

ROC Oluşturun: Adım 1 Tahmin Oluşturun

tahmin ()

tahmin (), y

ROCR

ROC oluşturun: 2. Adım Performans oluşturun

verim()

tahmin (), 'tpr', 'fpr'

ROCR

ROC Oluşturun: Adım 3 Çizim grafiği

arsa()

verim()

Diğer GLM tipi modeller şunlardır:

- iki terimli: (link = "logit")

- gauss: (link = "kimlik")

- Gama: (link = "ters")

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

- poisson: (link = "log")

- quasi: (bağlantı = "kimlik", varyans = "sabit")

- yarı terimli: (link = "logit")

- quasipoisson: (link = "log")