Kurs
Bu eğitimdeki kodu çevrimiçi olarak çalıştırın ve düzenleyin
Kodu çalıştırLojistik regresyon, ikili sonuçları tahmin etmek için basit ama güçlü bir modeldir. Yani bir şeyin olup olmayacağını. Bu, denetimli makine öğrenimi için bir sınıflandırma model türüdür.
Lojistik regresyon neredeyse her sektörde—pazarlama, sağlık, sosyal bilimler ve diğerleri—kullanılır ve her veri bilimcisinin araç setinin vazgeçilmez bir parçasıdır.
Bu eğitimden en iyi şekilde yararlanmak için R hakkında temel düzeyde çalışma bilgisine ihtiyacınız var. İlgili bir model türü olan doğrusal regresyon hakkında bilgi sahibi olmak da faydalıdır. Bunun için R ile Doğrusal Regresyon Eğitimi yazısını okuyun.
Lojistik Regresyona Genel Bakış
Diyelim ki bugünün güneşli bir gün olup olmayacağını tahmin etmek istiyorsunuz. İki olası sonuç vardır: "güneşli" veya "güneşli değil". Sonuç değişkeni, "hedef değişken" veya "bağımlı değişken" olarak da bilinir.
Sonucu etkileyebilecek birçok değişken vardır; ‘bir önceki günün sıcaklığı’, ‘hava basıncı’ vb. Bu etkileyen değişkenler sırasıyla özellikler, bağımsız değişkenler veya yordayıcılar olarak bilinir—bu terimlerin hepsi aynı anlama gelir.
Diğer örnekler arasında bir müşterinin ürününüzü satın alıp almayacağı, bir e-postanın spam olup olmadığı, bir işlemin sahtecilik içerip içermediği ve bir ilacın hastayı iyileştirip iyileştirmeyeceği sayılabilir.
Lojistik regresyon nasıl çalışır?
Lojistik regresyon, hedef değişkenin etiketli bir sınıfa/kategoriye ait olma olasılığını tahmin etmek için yordayıcı ve hedef değişkenler arasında mümkün olan en iyi uyumu bulur.
Doğrusal regresyon, sonuçları özelliklerden tahmin eden en iyi doğruyu bulmaya çalışır. Şu şekilde bir denklem oluşturur
y_predictions = intercept + slope * features
ve kesişim ve eğimin en iyi olası değerlerini bulmak için optimizasyondan yararlanır.
Lojistik regresyon da benzer şekilde çalışır, ancak sonucu bir kategori olasılıkları üzerinden regresyona tabi tutar. Denklemin sağ tarafını dönüştürmek için bir sigmoid fonksiyonu (lojistik dağılımın kümülatif dağılım fonksiyonu) kullanır.
y_predictions = logistic_cdf(intercept + slope * features)
Yine, model kesişim ve eğimin en iyi olası değerlerini bulmak için optimizasyon kullanır.
Lojistik regresyonun algoritması doğrusal regresyon denklemiyle çok benzer olduğundan, "genelleştirilmiş doğrusal modeller" olarak adlandırılan bir model ailesinin parçasıdır. Bu nedenle lojistik regresyon bir sınıflandırma modeli olmasına rağmen adında "regresyon" geçer.
Sigmoid fonksiyon aşağıdaki görselde S-şeklinde bir eğriye benzer. Gerçek sayılı girdi değerlerini alır ve bunları 0 ile 1 arasına dönüştürür (her iki uçtan daraltarak; yani negatif değerleri 0'a ve çok yüksek pozitifleri 1'e). Ayrıca, bu olasılıkların üzerine uygulandığında çıktıyı kategorilere veya sınıflara ayıran belirleyici unsur eşik değeridir.

Karmaşık kavramlar örneklerle açıklandığında en iyi anlaşılır; bu yüzden LR algoritmasının nasıl çalıştığını anlamak için bir benzetme yapalım. LR modelinin, kullanıcının konumu, satın alma tutarı, IP adresi vb. gibi birden fazla sahtecilik göstergesini inceleyerek sahte bir işlemi tespit etmekle görevlendirildiğini varsayalım. Amaç, verilen bir işlemin meşru mu yoksa sahte mi olduğunu belirleme olasılığını tahmin etmektir – bu da hedef değişkeni oluşturur.
Model, yordayıcıların hedef değişken üzerindeki etkisine göre onlara ağırlıklar atar ve bunları birleştirerek normalize edilmiş bir skor veya sahtecilik olasılığını hesaplar.
Veri Kümesi
Portekizli bir bankanın telefonla yürüttüğü bir doğrudan pazarlama kampanyası veri setini kullanacağız. Kampanyanın amacı, y değişkeniyle temsil edilen vadeli mevduat aboneliklerini (abonelik var/yok) satmaktır. Lojistik regresyon modelinin amacı, müşterinin demografik bilgiler gibi öznitelikleri olarak adlandırılan yordayıcı değişkenlere dayanarak bir abonelik satın alıp almayacağını tahmin etmektir.

Bu veri kümesi ve birçok faydalı veri kümesi için veri sözlüğünü DataCamp’in web sitesinde bulabilirsiniz.
|
Değişken |
Açıklama |
Detaylar |
|
age |
müşterinin yaşı |
|
|
job |
iş türü |
kategorik: "admin.","blue-collar","entrepreneur","housemaid","management","retired","self-employed","services","student","technician","unemployed","unknown" |
|
marital |
medeni durum |
kategorik: "divorced","married","single","unknown"; not: "divorced" boşanmış veya dul anlamına gelir |
|
education |
müşterinin en yüksek derecesi |
kategorik: "basic.4y","basic.6y","basic.9y","high.school","illiterate","professional.course","university.degree","unknown" |
|
default |
temerrüde düşmüş kredi var mı? |
kategorik: "no","yes","unknown" |
|
housing |
konut kredisi var mı? |
kategorik: "no","yes","unknown" |
|
loan |
ihtiyaç kredisi var mı? |
kategorik: "no","yes","unknown" |
|
contact |
iletişim türü |
kategorik: "cellular","telephone" |
|
month |
yılın son iletişim ayı |
kategorik: "jan", "feb", "mar", ..., "nov", "dec" |
|
day_of_week |
haftanın son iletişim günü |
kategorik: "mon","tue","wed","thu","fri" |
|
campaign |
bu kampanyada müşteriyle iletişim kurulan sayısı |
sayısal, son iletişimi içerir |
|
pdays |
önceki bir kampanyadan bu yana müşteriyle en son iletişimden geçen gün sayısı |
sayısal; 999, müşteriye daha önce ulaşılamadığını belirtir |
|
previous |
bu kampanyadan önce bu müşteri için yapılan iletişim sayısı |
sayısal |
|
poutcome |
önceki pazarlama kampanyasının sonucu |
kategorik: "failure","nonexistent","success" |
|
emp.var.rate |
istihdam değişim oranı - üç aylık gösterge |
sayısal |
|
cons.price.idx |
tüketici fiyat endeksi - aylık gösterge |
sayısal |
|
cons.conf.idx |
tüketici güven endeksi - aylık gösterge |
sayısal |
|
euribor3m |
euribor 3 ay oranı - günlük gösterge |
sayısal |
|
nr.employed |
çalışan sayısı - üç aylık gösterge |
sayısal |
|
y |
müşteri vadeli mevduata abone oldu mu? |
ikili: "yes","no" |
Lojistik Regresyon İş Akışı
Tam makine öğrenimi iş akışı Makine Öğrenimi İş Akışına Yeni Başlayanlar İçin Rehber infografiğinde ele alınmıştır. Burada veri hazırlama ve modelleme adımlarına odaklanacağız. Özellikle şunları kapsayacağız:
- Verilerin eğitim ve test kümelerine ayrılması
- Modelin kurulması (eğitilmesi)
- Tahminlerin yapılması
- Model performansının değerlendirilmesi
- Hiperparametre ayarı
Lojistik Regresyon Paketleri
R'de lojistik regresyon modellemek için iki popüler iş akışı vardır: base-R ve tidymodels.
Base-R iş akışı daha basittir ve modeli kurmak ve özetini üretmek için glm() ve summary() gibi fonksiyonları içerir.
Tidymodels iş akışı, birden fazla modeli daha kolay yönetmeye ve farklı model türleriyle çalışmak için tutarlı bir arayüz sunmaya olanak tanır.
Bu eğitimde tidymodels iş akışını kullanacağız.
Veriyi Görselleştirme
library() fonksiyonunu çağırarak tidymodels paketini içe aktarın.
Veri kümesi, Avrupa tarzı biçimlendirmeye sahip (ondalıklar için virgül ve ayırıcı olarak noktalı virgül) bir CSV dosyasında. Bunu readr paketinden read_csv2() ile okuyacağız.
Hedef değişken y'yi modelleme için bir faktör değişkenine dönüştürün.
ggplot() fonksiyonunu kullanarak her bir iş mesleğinin y'ye göre sayımını çizin.
library(readr)
library(tidymodels)
# Read the dataset and convert the target variable to a factor
bank_df <- read_csv2("bank-full.csv")
bank_df$y = as.factor(bank_df$y)
# Plot job occupation against the target variable
ggplot(bank_df, aes(job, fill = y)) +
geom_bar() +
coord_flip()

Verilerin Ayrılması
Modeli kurmak için bir eğitim kümesi ve modeli değerlendirmek için bir test kümesi olacak şekilde veri kümesini ayıralım; böylece eğitilen modelin görülmemiş bir veri kümesinde de çalıştığından emin olalım.
Verileri eğitim ve test kümesine ayırma işlemi initial_split() fonksiyonu ve eğitim veri oranını tanımlayan prop niteliği kullanılarak yapılabilir.
# Split data into train and test
set.seed(421)
split <- initial_split(bank_df, prop = 0.8, strata = y)
train <- split %>%
training()
test <- split %>%
testing()
Modelin Kurulması ve Değerlendirilmesi
Modeli oluşturmak için bir logistic_reg() modeli tanımlayın. Bu, düzenlileştirme miktarını kontrol eden mixture ve penalty argümanlarına ihtiyaç duyar. Mixture değeri 1 ise lasso, 0 ise ridge regresyonu ifade eder. Aradaki değerler de mümkündür. Penalty argümanı, düzenlileştirmenin gücünü belirtir.
Mixture ve penalty için "double" kayan noktalı sayılar geçirmeniz gerektiğini unutmayın.
set_engine() ile "motoru" (hesaplamaları çalıştırmak için kullanılan arka uç yazılımı) ayarlayın. Birkaç seçenek vardır: Varsayılan motor "glm"dir ve klasik bir lojistik regresyon yapar. Bu, her katsayı için p-değerleri verdiği ve her katsayının önemini anlamayı kolaylaştırdığı için istatistikçiler tarafından sıklıkla tercih edilir.
Burada "glmnet" motorunu kullanacağız. Bu, düzenlileştirmeye izin verdiği için makine öğrenimi bilimcileri tarafından tercih edilir; özellikle çok sayıda özelliğiniz varsa tahminleri iyileştirebilir. (Python'da scikit-learn paketi, lojistik regresyonda varsayılan olarak bir miktar düzenlileştirme içerir.)
Önceki adımda oluşturulan eğitim verisi üzerinde modeli eğitmek için fit() metodunu çağırın. Bu, ilk argüman olarak bir formül alır. Formülün sol tarafına hedef değişkeni (burada y) yazarsınız. Sağ tarafına ise istediğiniz özellikleri dahil edebilirsiniz. Nokta, "formülün sol tarafında yazılmayan tüm değişkenleri kullan" anlamına gelir. Formül yazımı hakkında daha fazla bilgi için R Formül Eğitimi'ni okuyun.
# Train a logistic regression model
model <- logistic_reg(mixture = double(1), penalty = double(1)) %>%
set_engine("glmnet") %>%
set_mode("classification") %>%
fit(y ~ ., data = train)
# Model summary
tidy(model)
Çıktı aşağıda gösterilmiştir; estimate sütunu yordayıcının katsayılarını temsil eder.
# A tibble: 43 × 3
term estimate penalty
<chr> <dbl> <dbl>
1 (Intercept) -2.59 0
2 age -0.000477 0
3 jobblue-collar -0.183 0
4 jobentrepreneur -0.206 0
5 jobhousemaid -0.270 0
6 jobmanagement -0.0190 0
7 jobretired 0.360 0
8 jobself-employed -0.101 0
9 jobservices -0.105 0
10 jobstudent 0.415 0
# ... with 33 more rows
# ℹ Use `print(n = ...)` to see more rows
Tahmin yapma
predict() fonksiyonunu kullanarak test verisi üzerinde tahmin yapın. Tahmin türünü seçebilirsiniz.
- type = "class", her gözlem için en olası hedef değeri döndürür. Burada, modelin müşterinin vadeli mevduata abone olma olasılığına göre "yes" veya "no" dönecektir.
- type = "prob", her gözlem için her hedef değerinin olasılığını döndürür. Burada, her gözlem için toplamı bire eşit olan "yes" olasılığı ile "no" olasılığını döndürecektir.
# Class Predictions
pred_class <- predict(model,
new_data = test,
type = "class")
# Class Probabilities
pred_proba <- predict(model,
new_data = test,
type = "prob")
Modeli accuracy() fonksiyonunu kullanarak değerlendirin; truth argümanını y olarak ve estimate argümanını da önceki adımdaki tahminler olacak şekilde verin.
results <- test %>%
select(y) %>%
bind_cols(pred_class, pred_proba)
accuracy(results, truth = y, estimate = .pred_class)
Hiperparametre Ayarı
Mixture ve penalty argümanlarına ("hiperparametreler") belirli değerler vermek yerine, ayarlama yaparak modelin tahmin gücünü optimize edebilirsiniz.
Fikir, modeli hiperparametrelerin farklı değerleriyle çok kez çalıştırıp hangisinin en iyi tahminleri verdiğini görmektir.
- logistic_reg() fonksiyonunda mixture ve penalty argümanlarını tune() çağrısı olarak ayarlayın.
- grid_regular() fonksiyonunu kullanarak mixture ve penalty için olası değerlerden bir ızgara tanımlayın.
- workflow() fonksiyonu, modeli birçok kez çalıştırdığınızda ihtiyaç duyulan, model ayrıntılarını depolamak için bir nesne oluşturur.
- select_best() fonksiyonunu kullanarak en iyi modeli seçin. "En iyi"yi tanımlayan metrikler arasından seçim yapabilirsiniz. Burada "alıcı işletim karakteristiği eğrisi altında kalan alan" (ROC AUC) metriğini kullanacağız.
# Define the logistic regression model with penalty and mixture hyperparameters
log_reg <- logistic_reg(mixture = tune(), penalty = tune(), engine = "glmnet")
# Define the grid search for the hyperparameters
grid <- grid_regular(mixture(), penalty(), levels = c(mixture = 4, penalty = 3))
# Define the workflow for the model
log_reg_wf <- workflow() %>%
add_model(log_reg) %>%
add_formula(y ~ .)
# Define the resampling method for the grid search
folds <- vfold_cv(train, v = 5)
# Tune the hyperparameters using the grid search
log_reg_tuned <- tune_grid(
log_reg_wf,
resamples = folds,
grid = grid,
control = control_grid(save_pred = TRUE)
)
select_best(log_reg_tuned, metric = "roc_auc")
# A tibble: 1 × 3
penalty mixture .config
<dbl> <dbl> <chr>
1 0.0000000001 0 Preprocessor1_Model01
Daha Fazla Değerlendirme Metrikleri
En iyi hiperparametreleri kullanarak:
- Bir lojistik regresyon modeli eğitelim
- Test kümesi üzerinde tahmin üretelim
- Gerçek değerler ve tahminleri kullanarak bir karmaşıklık matrisi (confusion matrix) oluşturalım
# Fit the model using the optimal hyperparameters
log_reg_final <- logistic_reg(penalty = 0.0000000001, mixture = 0) %>%
set_engine("glmnet") %>%
set_mode("classification") %>%
fit(y~., data = train)
# Evaluate the model performance on the testing set
pred_class <- predict(log_reg_final,
new_data = test,
type = "class")
results <- test %>%
select(y) %>%
bind_cols(pred_class, pred_proba)
# Create confusion matrix
conf_mat(results, truth = y,
estimate = .pred_class)
Truth
Prediction no yes
no 7838 738
yes 147 320
Kesinliği (pozitif öngörü değeri, doğru pozitiflerin tahmin edilen pozitiflere oranı) precision() fonksiyonu ile hesaplayabilirsiniz.
precision(results, truth = y,
estimate = .pred_class)
# A tibble: 1 × 3
.metric .estimator .estimate
<chr> <chr> <dbl>
1 precision binary 0.914
Benzer şekilde, duyarlılığı (hassasiyet, doğru pozitiflerin gerçek pozitiflere oranı) recall() fonksiyonu ile hesaplayabilirsiniz.
recall(results, truth = y,
estimate = .pred_class)
# A tibble: 1 × 3
.metric .estimator .estimate
<chr> <chr> <dbl>
1 recall binary 0.982
Abonelik satın alma kararını etkileyen değişkenleri anlayalım. Lojistik regresyon bağlamında katsayılar, hedef değişkenin tek tek yordayıcılara ne kadar duyarlı olduğunu belirler. Katsayıların değeri ne kadar yüksekse önemleri de o kadar fazladır. Değişkenleri katsayılarının mutlak değerine göre azalan sırada sıralayın ve mutlak değeri 0,5’ten büyük olan katsayıları görüntüleyin.
coeff <- tidy(log_reg_final) %>%
arrange(desc(abs(estimate))) %>%
filter(abs(estimate) > 0.5)
# A tibble: 10 × 3
term estimate penalty
<chr> <dbl> <dbl>
1 (Intercept) -2.59 0.0000000001
2 poutcomesuccess 2.08 0.0000000001
3 monthmar 1.62 0.0000000001
4 monthoct 1.08 0.0000000001
5 monthsep 1.03 0.0000000001
6 contactunknown -1.01 0.0000000001
7 monthdec 0.861 0.0000000001
8 monthjan -0.820 0.0000000001
9 housingyes -0.550 0.0000000001
10 monthnov -0.517 0.0000000001
Özellik önemini ggplot() fonksiyonunu kullanarak görselleştirin.
ggplot(coeff, aes(x = term, y = estimate, fill = term)) + geom_col() + coord_flip()

Bir Sonraki Seviyeye Taşıyın
Böylece, tidymodels paketini kullanarak bir lojistik regresyon modelinin nasıl eğitilip değerlendirileceğini gösteren bu eğitimin sonuna geldik. Ayrıca model sonuçlarının nasıl yorumlanacağını ve özellik önemi gibi görsellerin nasıl çizileceğini de ele aldık.
Tidymodels ile yapay zekâ modellerini oluşturma hakkında daha fazla bilgi edinmek istiyorsanız, R'de tidymodels ile Modelleme kursuna göz atın. Base-R yaklaşımıyla modelleme için R'de Regresyona Giriş, R'de Orta Düzey Regresyon ve R'de Genelleştirilmiş Doğrusal Modeller kurslarına bakın.
