{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Lojistik Regresyon Modeli Oluşturma - Ders 4\n", "\n", "![Lojistik ve doğrusal regresyon infografiği](../../../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png)\n", "\n", "#### **[Ders Öncesi Test](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n", "\n", "#### Giriş\n", "\n", "Regresyon üzerine olan bu son derste, temel *klasik* ML tekniklerinden biri olan Lojistik Regresyonu inceleyeceğiz. Bu tekniği, ikili kategorileri tahmin etmek için desenleri keşfetmek amacıyla kullanabilirsiniz. Bu şeker çikolata mı, değil mi? Bu hastalık bulaşıcı mı, değil mi? Bu müşteri bu ürünü seçecek mi, seçmeyecek mi?\n", "\n", "Bu derste şunları öğreneceksiniz:\n", "\n", "- Lojistik regresyon teknikleri\n", "\n", "✅ Bu tür regresyonla çalışmayı daha iyi anlamak için şu [Learn modülüne](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott) göz atabilirsiniz.\n", "\n", "## Ön Koşul\n", "\n", "Balkabağı verileriyle çalıştıktan sonra, üzerinde çalışabileceğimiz bir ikili kategori olduğunu fark edecek kadar aşina olduk: `Renk`.\n", "\n", "Şimdi, bazı değişkenlere dayanarak *belirli bir balkabağının muhtemelen hangi renkte olduğunu* (turuncu 🎃 veya beyaz 👻) tahmin etmek için bir lojistik regresyon modeli oluşturalım.\n", "\n", "> Neden regresyonla ilgili bir ders grubunda ikili sınıflandırmadan bahsediyoruz? Sadece dilsel kolaylık açısından, çünkü lojistik regresyon [aslında bir sınıflandırma yöntemi](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), ancak doğrusal tabanlı bir yöntemdir. Verileri sınıflandırmanın diğer yollarını bir sonraki ders grubunda öğrenin.\n", "\n", "Bu ders için aşağıdaki paketlere ihtiyacımız olacak:\n", "\n", "- `tidyverse`: [tidyverse](https://www.tidyverse.org/), veri bilimini daha hızlı, kolay ve eğlenceli hale getirmek için tasarlanmış bir [R paketleri koleksiyonudur](https://www.tidyverse.org/packages).\n", "\n", "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) çerçevesi, modelleme ve makine öğrenimi için bir [paketler koleksiyonudur](https://www.tidymodels.org/packages/).\n", "\n", "- `janitor`: [janitor paketi](https://github.com/sfirke/janitor), kirli verileri incelemek ve temizlemek için basit araçlar sağlar.\n", "\n", "- `ggbeeswarm`: [ggbeeswarm paketi](https://github.com/eclarke/ggbeeswarm), ggplot2 kullanarak beeswarm tarzı grafikler oluşturmak için yöntemler sunar.\n", "\n", "Bu paketleri şu şekilde yükleyebilirsiniz:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n", "\n", "Alternatif olarak, aşağıdaki script, bu modülü tamamlamak için gerekli paketlere sahip olup olmadığınızı kontrol eder ve eksikse sizin için yükler.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n", "\n", "pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **Soruyu Tanımlayın**\n", "\n", "Bizim amacımız için bunu bir ikili olarak ifade edeceğiz: 'Beyaz' veya 'Beyaz Değil'. Veri setimizde ayrıca 'çizgili' bir kategori var, ancak çok az örneği olduğu için bunu kullanmayacağız. Zaten veri setinden eksik değerleri çıkardığımızda bu kategori kayboluyor.\n", "\n", "> 🎃 Eğlenceli bilgi, bazen beyaz balkabaklarına 'hayalet' balkabakları diyoruz. Oyması çok kolay değil, bu yüzden turuncu olanlar kadar popüler değiller ama oldukça havalı görünüyorlar! Bu yüzden sorumuzu şu şekilde de yeniden formüle edebiliriz: 'Hayalet' veya 'Hayalet Değil'. 👻\n", "\n", "## **Lojistik Regresyon Hakkında**\n", "\n", "Lojistik regresyon, daha önce öğrendiğiniz doğrusal regresyondan birkaç önemli şekilde farklıdır.\n", "\n", "#### **İkili Sınıflandırma**\n", "\n", "Lojistik regresyon, doğrusal regresyonla aynı özellikleri sunmaz. İlki, `ikili bir kategori` (\"turuncu veya turuncu değil\") hakkında bir tahmin sunarken, ikincisi `sürekli değerler` tahmin edebilir, örneğin bir balkabağının kökeni ve hasat zamanı verildiğinde, *fiyatının ne kadar artacağı*.\n", "\n", "![Dasani Madipalli tarafından hazırlanan infografik](../../../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png)\n", "\n", "### Diğer Sınıflandırmalar\n", "\n", "Lojistik regresyonun başka türleri de vardır, bunlar arasında çok kategorili ve sıralı olanlar bulunur:\n", "\n", "- **Çok kategorili**, birden fazla kategoriye sahip olmayı içerir - \"Turuncu, Beyaz ve Çizgili\".\n", "\n", "- **Sıralı**, mantıksal olarak sıralanmış kategorileri içerir, örneğin sonuçlarımızı sınırlı sayıda boyuta göre sıralamak istersek (mini, küçük, orta, büyük, xl, xxl).\n", "\n", "![Çok kategorili vs sıralı regresyon](../../../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png)\n", "\n", "#### **Değişkenlerin İLİŞKİLİ Olması GEREKMEZ**\n", "\n", "Doğrusal regresyonun daha fazla ilişkili değişkenlerle daha iyi çalıştığını hatırlıyor musunuz? Lojistik regresyon bunun tersidir - değişkenlerin uyumlu olması gerekmez. Bu, zayıf korelasyonlara sahip olan bu veri için işe yarar.\n", "\n", "#### **Çok Temiz Veriye İhtiyacınız Var**\n", "\n", "Lojistik regresyon, daha fazla veri kullanırsanız daha doğru sonuçlar verir; küçük veri setimiz bu görev için ideal değil, bunu aklınızda bulundurun.\n", "\n", "✅ Lojistik regresyona uygun olabilecek veri türlerini düşünün\n", "\n", "## Alıştırma - Veriyi Düzenleyin\n", "\n", "Öncelikle, eksik değerleri çıkararak ve yalnızca bazı sütunları seçerek veriyi biraz temizleyin:\n", "\n", "1. Aşağıdaki kodu ekleyin:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Load the core tidyverse packages\n", "library(tidyverse)\n", "\n", "# Import the data and clean column names\n", "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n", " clean_names()\n", "\n", "# Select desired columns\n", "pumpkins_select <- pumpkins %>% \n", " select(c(city_name, package, variety, origin, item_size, color)) \n", "\n", "# Drop rows containing missing values and encode color as factor (category)\n", "pumpkins_select <- pumpkins_select %>% \n", " drop_na() %>% \n", " mutate(color = factor(color))\n", "\n", "# View the first few rows\n", "pumpkins_select %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yeni veri çerçevenize her zaman bir göz atabilirsiniz, aşağıdaki gibi [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) fonksiyonunu kullanarak:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "pumpkins_select %>% \n", " glimpse()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İkili sınıflandırma problemi yapacağımızı doğrulayalım:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Subset distinct observations in outcome column\n", "pumpkins_select %>% \n", " distinct(color)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Görselleştirme - kategorik grafik\n", "Şimdiye kadar balkabağı verilerini tekrar yüklediniz ve birkaç değişkeni içeren bir veri setini koruyacak şekilde temizlediniz, bunlar arasında Renk de bulunuyor. Hadi ggplot kütüphanesini kullanarak veri çerçevesini not defterinde görselleştirelim.\n", "\n", "ggplot kütüphanesi, verilerinizi görselleştirmek için bazı güzel yöntemler sunar. Örneğin, her Çeşit ve Renk için verilerin dağılımlarını kategorik bir grafikte karşılaştırabilirsiniz.\n", "\n", "1. Balkabağı verilerimizi kullanarak, her balkabağı kategorisi (turuncu veya beyaz) için bir renk eşlemesi belirterek geombar fonksiyonunu kullanarak böyle bir grafik oluşturun:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "# Specify colors for each value of the hue variable\n", "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n", "\n", "# Create the bar plot\n", "ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n", " geom_bar(position = \"dodge\") +\n", " scale_fill_manual(values = palette) +\n", " labs(y = \"Variety\", fill = \"Color\") +\n", " theme_minimal()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verilere bakarak, Renk verilerinin Çeşitlilik ile nasıl ilişkili olduğunu görebilirsiniz.\n", "\n", "✅ Bu kategorik grafiğe bakarak, hangi ilginç keşifleri hayal edebilirsiniz?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Veri Ön İşleme: Özellik Kodlama\n", "\n", "Kabak veri setimizdeki tüm sütunlar metin değerleri içeriyor. Kategorik verilerle çalışmak insanlar için sezgisel olsa da makineler için aynı durum geçerli değil. Makine öğrenimi algoritmaları sayılarla daha iyi çalışır. Bu nedenle, kodlama veri ön işleme aşamasında çok önemli bir adımdır; çünkü kategorik verileri sayısal verilere dönüştürmemizi sağlar ve bu süreçte hiçbir bilgi kaybı yaşanmaz. İyi bir kodlama, iyi bir model oluşturmanın temelini oluşturur.\n", "\n", "Özellik kodlama için iki ana kodlayıcı türü vardır:\n", "\n", "1. **Ordinal kodlayıcı**: Bu kodlayıcı, sıralı değişkenler için uygundur. Sıralı değişkenler, verilerin mantıksal bir sıralamayı takip ettiği kategorik değişkenlerdir. Örneğin, veri setimizdeki `item_size` sütunu gibi. Bu kodlayıcı, her kategorinin bir sayı ile temsil edildiği bir eşleme oluşturur. Bu sayı, sütundaki kategorinin sırasını ifade eder.\n", "\n", "2. **Kategorik kodlayıcı**: Bu kodlayıcı, nominal değişkenler için uygundur. Nominal değişkenler, verilerin mantıksal bir sıralamayı takip etmediği kategorik değişkenlerdir. Örneğin, veri setimizdeki `item_size` dışındaki tüm özellikler. Bu kodlama yöntemi \"one-hot encoding\" olarak adlandırılır. Her kategori, ikili bir sütunla temsil edilir: kodlanmış değişken, kabak o çeşide aitse 1, değilse 0 değerini alır.\n", "\n", "Tidymodels, veri ön işleme için başka bir kullanışlı paket sunar: [recipes](https://recipes.tidymodels.org/) - veri ön işleme için bir paket. Bir `recipe` tanımlayacağız; bu, tüm tahmin edici sütunların bir dizi tam sayıya kodlanması gerektiğini belirtir. Ardından, gerekli miktarları ve istatistikleri tahmin etmek için `prep` işlemini gerçekleştireceğiz ve son olarak yeni verilere hesaplamaları uygulamak için `bake` işlemini kullanacağız.\n", "\n", "> Normalde, recipes genellikle modelleme için bir ön işleyici olarak kullanılır. Bu durumda, bir veri setine modelleme için hazır hale getirilmesi amacıyla hangi adımların uygulanması gerektiğini tanımlar. Bu durumda, bir tarifi manuel olarak `prep` ve `bake` ile tahmin etmek yerine bir `workflow()` kullanmanız **şiddetle tavsiye edilir**. Bunu birazdan daha ayrıntılı göreceğiz.\n", ">\n", "> Ancak şu an için, recipes + prep + bake kullanarak bir veri setine hangi adımların uygulanması gerektiğini belirliyoruz. Bu adımları uygulayarak ön işlenmiş veriyi çıkarıyoruz.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Preprocess and extract data to allow some data analysis\n", "baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n", " # Define ordering for item_size column\n", " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n", " # Convert factors to numbers using the order defined above (Ordinal encoding)\n", " step_integer(item_size, zero_based = F) %>%\n", " # Encode all other predictors using one hot encoding\n", " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n", " prep(data = pumpkin_select) %>%\n", " bake(new_data = NULL)\n", "\n", "# Display the first few rows of preprocessed data\n", "baked_pumpkins %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "✅ Öğe Boyutu sütunu için bir sıralı kodlayıcı kullanmanın avantajları nelerdir?\n", "\n", "### Değişkenler arasındaki ilişkileri analiz etme\n", "\n", "Artık verilerimizi ön işleme tabi tuttuğumuza göre, özellikler ve etiket arasındaki ilişkileri analiz ederek modelin, özellikler verildiğinde etiketi ne kadar iyi tahmin edebileceği hakkında bir fikir edinebiliriz. Bu tür bir analizi gerçekleştirmenin en iyi yolu verileri görselleştirmektir. \n", "Bu analiz için tekrar ggplot geom_boxplot_ fonksiyonunu kullanacağız ve Öğe Boyutu, Çeşit ve Renk arasındaki ilişkileri kategorik bir grafikte görselleştireceğiz. Verileri daha iyi görselleştirmek için kodlanmış Öğe Boyutu sütununu ve kodlanmamış Çeşit sütununu kullanacağız.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Define the color palette\n", "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n", "\n", "# We need the encoded Item Size column to use it as the x-axis values in the plot\n", "pumpkins_select_plot<-pumpkins_select\n", "pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n", "\n", "# Create the grouped box plot\n", "ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n", " geom_boxplot() +\n", " facet_grid(variety ~ ., scales = \"free_x\") +\n", " scale_fill_manual(values = palette) +\n", " labs(x = \"Item Size\", y = \"\") +\n", " theme_minimal() +\n", " theme(strip.text = element_text(size = 12)) +\n", " theme(axis.text.x = element_text(size = 10)) +\n", " theme(axis.title.x = element_text(size = 12)) +\n", " theme(axis.title.y = element_blank()) +\n", " theme(legend.position = \"bottom\") +\n", " guides(fill = guide_legend(title = \"Color\")) +\n", " theme(panel.spacing = unit(0.5, \"lines\"))+\n", " theme(strip.text.y = element_text(size = 4, hjust = 0)) \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Bir swarm plot kullanın\n", "\n", "Renk, ikili bir kategori olduğu için (Beyaz veya Değil), görselleştirme için '[özel bir yaklaşım](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf)' gerektirir.\n", "\n", "Renk dağılımını item_size ile ilişkili olarak göstermek için bir `swarm plot` deneyin.\n", "\n", "[ggbeeswarm paketi](https://github.com/eclarke/ggbeeswarm)'ni kullanacağız. Bu paket, ggplot2 ile arı kovanı tarzı grafikler oluşturmak için yöntemler sağlar. Arı kovanı grafikleri, normalde üst üste binecek noktaları yan yana düşecek şekilde düzenlemenin bir yoludur.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Create beeswarm plots of color and item_size\n", "baked_pumpkins %>% \n", " mutate(color = factor(color)) %>% \n", " ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n", " geom_quasirandom() +\n", " scale_color_brewer(palette = \"Dark2\", direction = -1) +\n", " theme(legend.position = \"none\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Artık renklerin ikili kategorileri ile daha büyük boyut grubu arasındaki ilişki hakkında bir fikrimiz olduğuna göre, bir kabağın muhtemel rengini belirlemek için lojistik regresyonu inceleyelim.\n", "\n", "## Modelinizi oluşturun\n", "\n", "Sınıflandırma modelinizde kullanmak istediğiniz değişkenleri seçin ve veriyi eğitim ve test setlerine ayırın. [rsample](https://rsample.tidymodels.org/), Tidymodels içinde yer alan bir paket, verilerin verimli bir şekilde bölünmesi ve yeniden örneklenmesi için altyapı sağlar:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Split data into 80% for training and 20% for testing\n", "set.seed(2056)\n", "pumpkins_split <- pumpkins_select %>% \n", " initial_split(prop = 0.8)\n", "\n", "# Extract the data in each split\n", "pumpkins_train <- training(pumpkins_split)\n", "pumpkins_test <- testing(pumpkins_split)\n", "\n", "# Print out the first 5 rows of the training set\n", "pumpkins_train %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "🙌 Artık modeli, eğitim özelliklerini eğitim etiketi (renk) ile eşleştirerek eğitmeye hazırız.\n", "\n", "Verilerimizi modellemeye hazırlamak için yapılması gereken ön işleme adımlarını belirten bir tarif oluşturarak başlayacağız, yani: kategorik değişkenleri bir dizi tam sayıya kodlama. Tıpkı `baked_pumpkins` gibi, bir `pumpkins_recipe` oluşturuyoruz ancak bunu `prep` ve `bake` yapmıyoruz çünkü bu, birkaç adım sonra göreceğiniz bir iş akışına dahil edilecek.\n", "\n", "Tidymodels'de lojistik regresyon modelini belirtmenin oldukça fazla yolu vardır. `?logistic_reg()`'e bakabilirsiniz. Şimdilik, varsayılan `stats::glm()` motoru aracılığıyla bir lojistik regresyon modeli belirteceğiz.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Create a recipe that specifies preprocessing steps for modelling\n", "pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n", " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n", " step_integer(item_size, zero_based = F) %>% \n", " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n", "\n", "# Create a logistic model specification\n", "log_reg <- logistic_reg() %>% \n", " set_engine(\"glm\") %>% \n", " set_mode(\"classification\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Artık bir tarif ve model spesifikasyonuna sahip olduğumuza göre, bunları bir araya getirerek bir nesne oluşturmanın bir yolunu bulmamız gerekiyor. Bu nesne, önce veriyi ön işleme tabi tutacak (arka planda hazırlık + pişirme), modeli ön işlenmiş veri üzerinde eğitecek ve ayrıca olası son işlem aktivitelerine izin verecek.\n", "\n", "Tidymodels'da, bu kullanışlı nesne [`workflow`](https://workflows.tidymodels.org/) olarak adlandırılır ve modelleme bileşenlerinizi pratik bir şekilde bir arada tutar.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Bundle modelling components in a workflow\n", "log_reg_wf <- workflow() %>% \n", " add_recipe(pumpkins_recipe) %>% \n", " add_model(log_reg)\n", "\n", "# Print out the workflow\n", "log_reg_wf\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bir iş akışı *belirlendikten* sonra, bir model [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html) fonksiyonu kullanılarak `eğitilebilir`. İş akışı, bir tarifi tahmin edecek ve verileri eğitmeden önce ön işleyecektir, bu yüzden bunu manuel olarak prep ve bake kullanarak yapmamıza gerek kalmayacak.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Train the model\n", "wf_fit <- log_reg_wf %>% \n", " fit(data = pumpkins_train)\n", "\n", "# Print the trained workflow\n", "wf_fit\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Modelin eğitim sırasında öğrendiği katsayılar çıktı olarak gösterilir.\n", "\n", "Artık modeli eğitim verileriyle eğittik, test verileri üzerinde tahminler yapabiliriz. Bunun için [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) fonksiyonunu kullanabiliriz. Hadi başlayalım ve modelimizi test seti için etiketleri ve her etiket için olasılıkları tahmin etmek için kullanalım. Olasılık 0.5'ten büyük olduğunda tahmin edilen sınıf `WHITE`, aksi takdirde `ORANGE` olur.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Make predictions for color and corresponding probabilities\n", "results <- pumpkins_test %>% select(color) %>% \n", " bind_cols(wf_fit %>% \n", " predict(new_data = pumpkins_test)) %>%\n", " bind_cols(wf_fit %>%\n", " predict(new_data = pumpkins_test, type = \"prob\"))\n", "\n", "# Compare predictions\n", "results %>% \n", " slice_head(n = 10)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Çok güzel! Bu, lojistik regresyonun nasıl çalıştığına dair daha fazla bilgi sağlıyor.\n", "\n", "### Bir karmaşıklık matrisi ile daha iyi anlama\n", "\n", "Her tahmini, karşılık gelen \"gerçek değer\" ile karşılaştırmak, modelin ne kadar iyi tahmin yaptığını belirlemek için çok verimli bir yöntem değildir. Neyse ki, Tidymodels'in elinde birkaç numara daha var: [`yardstick`](https://yardstick.tidymodels.org/) - performans metriklerini kullanarak modellerin etkinliğini ölçmek için kullanılan bir paket.\n", "\n", "Sınıflandırma problemleriyle ilişkili performans metriklerinden biri [`karmaşıklık matrisi`](https://wikipedia.org/wiki/Confusion_matrix). Bir karmaşıklık matrisi, bir sınıflandırma modelinin ne kadar iyi performans gösterdiğini açıklar. Karmaşıklık matrisi, her sınıftaki kaç örneğin model tarafından doğru bir şekilde sınıflandırıldığını tablo halinde gösterir. Bizim durumumuzda, kaç turuncu balkabağının turuncu olarak sınıflandırıldığını ve kaç beyaz balkabağının beyaz olarak sınıflandırıldığını gösterecek; ayrıca karmaşıklık matrisi, **yanlış** kategorilere sınıflandırılanların sayısını da gösterir.\n", "\n", "Yardstick paketindeki [**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) fonksiyonu, gözlemlenen ve tahmin edilen sınıfların bu çapraz tablosunu hesaplar.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Confusion matrix for prediction results\n", "conf_mat(data = results, truth = color, estimate = .pred_class)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hadi karışıklık matrisini yorumlayalım. Modelimizden balkabaklarını iki ikili kategori arasında sınıflandırması isteniyor: kategori `beyaz` ve kategori `beyaz değil`.\n", "\n", "- Eğer modeliniz bir balkabağını beyaz olarak tahmin ederse ve gerçekte 'beyaz' kategorisine aitse, buna `doğru pozitif` denir ve bu, sol üstteki sayı ile gösterilir.\n", "\n", "- Eğer modeliniz bir balkabağını beyaz değil olarak tahmin ederse ve gerçekte 'beyaz' kategorisine aitse, buna `yanlış negatif` denir ve bu, sol alttaki sayı ile gösterilir.\n", "\n", "- Eğer modeliniz bir balkabağını beyaz olarak tahmin ederse ve gerçekte 'beyaz değil' kategorisine aitse, buna `yanlış pozitif` denir ve bu, sağ üstteki sayı ile gösterilir.\n", "\n", "- Eğer modeliniz bir balkabağını beyaz değil olarak tahmin ederse ve gerçekte 'beyaz değil' kategorisine aitse, buna `doğru negatif` denir ve bu, sağ alttaki sayı ile gösterilir.\n", "\n", "| Gerçek |\n", "|:-----:|\n", "\n", "\n", "| | | |\n", "|---------------|--------|-------|\n", "| **Tahmin** | BEYAZ | TURUNCU |\n", "| BEYAZ | DP | YP |\n", "| TURUNCU | YN | DN |\n", "\n", "Tahmin edebileceğiniz gibi, daha fazla doğru pozitif ve doğru negatif sayısına sahip olmak ve daha az yanlış pozitif ve yanlış negatif sayısına sahip olmak tercih edilir, bu da modelin daha iyi performans gösterdiğini ifade eder.\n", "\n", "Karışıklık matrisi faydalıdır çünkü bir sınıflandırma modelinin performansını daha iyi değerlendirmemize yardımcı olabilecek diğer metriklerin ortaya çıkmasını sağlar. Şimdi bunlardan bazılarını inceleyelim:\n", "\n", "🎓 Kesinlik: `DP/(DP + YP)` tahmin edilen pozitiflerin gerçekten pozitif olma oranı olarak tanımlanır. Ayrıca [pozitif öngörü değeri](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\") olarak da adlandırılır.\n", "\n", "🎓 Duyarlılık: `DP/(DP + YN)` gerçekte pozitif olan örnekler arasından pozitif sonuçların oranı olarak tanımlanır. Ayrıca `hassasiyet` olarak da bilinir.\n", "\n", "🎓 Özgüllük: `DN/(DN + YP)` gerçekte negatif olan örnekler arasından negatif sonuçların oranı olarak tanımlanır.\n", "\n", "🎓 Doğruluk: `DP + DN/(DP + DN + YP + YN)` Bir örnek için doğru bir şekilde tahmin edilen etiketlerin yüzdesi.\n", "\n", "🎓 F Ölçüsü: Kesinlik ve duyarlılığın ağırlıklı ortalaması, en iyi değer 1 ve en kötü değer 0'dır.\n", "\n", "Haydi bu metrikleri hesaplayalım!\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Combine metric functions and calculate them all at once\n", "eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n", "eval_metrics(data = results, truth = color, estimate = .pred_class)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bu modelin ROC eğrisini görselleştirin\n", "\n", "Hadi, sözde [`ROC eğrisi`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic)'ni görmek için bir görselleştirme daha yapalım:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Make a roc_curve\n", "results %>% \n", " roc_curve(color, .pred_ORANGE) %>% \n", " autoplot()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ROC eğrileri, bir sınıflandırıcının çıktısını doğru ve yanlış pozitifler açısından değerlendirmek için sıklıkla kullanılır. ROC eğrileri genellikle Y ekseninde `Doğru Pozitif Oranı`/Duyarlılık ve X ekseninde `Yanlış Pozitif Oranı`/1-Özgüllük gösterir. Bu nedenle, eğrinin dikliği ve orta çizgi ile eğri arasındaki boşluk önemlidir: eğrinin hızla yukarı çıkıp çizginin üzerine geçmesini istersiniz. Bizim durumumuzda, başlangıçta yanlış pozitifler vardır ve ardından çizgi düzgün bir şekilde yukarı çıkıp geçer.\n", "\n", "Son olarak, gerçek Eğri Altındaki Alanı hesaplamak için `yardstick::roc_auc()` kullanabiliriz. AUC'yi yorumlamanın bir yolu, modelin rastgele bir pozitif örneği rastgele bir negatif örnekten daha yüksek sıralama olasılığı olarak değerlendirilmesidir.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Calculate area under curve\n", "results %>% \n", " roc_auc(color, .pred_ORANGE)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sonuç yaklaşık `0.975`. AUC'nin 0 ile 1 arasında değiştiğini göz önünde bulundurursak, yüksek bir skor elde etmek istersiniz çünkü tahminlerinde %100 doğru olan bir modelin AUC değeri 1 olur; bu durumda model *oldukça iyi*.\n", "\n", "Gelecekteki sınıflandırma derslerinde, modelinizin skorlarını nasıl iyileştirebileceğinizi öğreneceksiniz (bu durumda dengesiz veriyle başa çıkmak gibi).\n", "\n", "## 🚀Meydan Okuma\n", "\n", "Lojistik regresyon hakkında keşfedilecek çok şey var! Ancak öğrenmenin en iyi yolu denemektir. Bu tür bir analize uygun bir veri seti bulun ve onunla bir model oluşturun. Ne öğreniyorsunuz? ipucu: İlginç veri setleri için [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets)'ı deneyin.\n", "\n", "## Gözden Geçirme ve Kendi Kendine Çalışma\n", "\n", "Stanford'dan [bu makalenin](https://web.stanford.edu/~jurafsky/slp3/5.pdf) ilk birkaç sayfasını okuyarak lojistik regresyonun bazı pratik kullanım alanlarını öğrenin. Şimdiye kadar incelediğimiz regresyon türlerinden hangisinin hangi görevler için daha uygun olduğunu düşünün. Hangisi daha iyi çalışır?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Feragatname**: \nBu belge, [Co-op Translator](https://github.com/Azure/co-op-translator) adlı yapay zeka çeviri hizmeti kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlama veya yanlış yorumlamalardan sorumlu değiliz.\n" ] } ], "metadata": { "anaconda-cloud": "", "kernelspec": { "display_name": "R", "langauge": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.1" }, "coopTranslator": { "original_hash": "feaf125f481a89c468fa115bf2aed580", "translation_date": "2025-09-06T13:37:00+00:00", "source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb", "language_code": "tr" } }, "nbformat": 4, "nbformat_minor": 1 }