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$ 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ş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
- 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
- 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 functionSayı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 >50KAdı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] 6Veri 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 1286Adı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 ' ' 1ANOVA 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 9dim(data_test)Çıktı:
## [1] 9108 9Adı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: 6Modelimizin ö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.65Adı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_matKod 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 1229Karışı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_TestKod Açıklama
- sum (diag (table_mat)): Köşegenin toplamı
- toplam (tablo_mat): Matrisin toplamı.
Çıktı:
## [1] 0.8277339Model 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.
- 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.5336518Model 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.6103799Hassasiyet 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.6109181Puan 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")