{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_3-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "5015d65d61ba75a223bfc56c273aa174", "translation_date": "2025-09-06T13:24:39+00:00", "source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb", "language_code": "tr" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "EgQw8osnsUV-" } }, { "cell_type": "markdown", "source": [ "## Kabak Fiyatlandırması için Doğrusal ve Polinom Regresyon - Ders 3\n", "

\n", " \n", "

Dasani Madipalli tarafından hazırlanan bilgi grafiği
\n", "\n", "\n", "\n", "\n", "#### Giriş\n", "\n", "Şimdiye kadar, bu derste kullanacağımız kabak fiyatlandırma veri setinden toplanan örnek verilerle regresyonun ne olduğunu keşfettiniz. Ayrıca bunu `ggplot2` kullanarak görselleştirdiniz. 💪\n", "\n", "Artık ML için regresyona daha derinlemesine dalmaya hazırsınız. Bu derste, iki tür regresyon hakkında daha fazla bilgi edineceksiniz: *temel doğrusal regresyon* ve *polinom regresyon*, bu tekniklerin altında yatan matematikle birlikte.\n", "\n", "> Bu müfredat boyunca, matematik bilgisi gereksinimini minimumda tutmayı hedefliyoruz ve diğer alanlardan gelen öğrenciler için erişilebilir hale getirmeye çalışıyoruz. Bu nedenle notlar, 🧮 matematiksel açıklamalar, diyagramlar ve kavramayı kolaylaştıracak diğer öğrenme araçlarına dikkat edin.\n", "\n", "#### Hazırlık\n", "\n", "Hatırlatma olarak, bu veriyi yükleyerek ona sorular sormayı amaçlıyorsunuz.\n", "\n", "- Kabak almak için en iyi zaman ne zaman?\n", "\n", "- Mini kabakların bir kasasının fiyatı ne kadar olabilir?\n", "\n", "- Kabakları yarım sepetlik sepetlerde mi yoksa 1 1/9 sepetlik kutularda mı almalıyım? Bu veriyi daha fazla incelemeye devam edelim.\n", "\n", "Önceki derste, bir `tibble` (veri çerçevesinin modern bir yeniden tasarımı) oluşturdunuz ve orijinal veri setinin bir kısmını fiyatlandırmayı sepet başına standartlaştırarak doldurdunuz. Ancak bunu yaparak, yalnızca yaklaşık 400 veri noktası ve yalnızca sonbahar ayları için veri toplayabildiniz. Belki veriyi daha fazla temizleyerek onun doğası hakkında biraz daha ayrıntı elde edebiliriz? Göreceğiz... 🕵️‍♀️\n", "\n", "Bu görev 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", "- `corrplot`: [corrplot paketi](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html), değişkenler arasındaki gizli desenleri tespit etmeye yardımcı olmak için otomatik değişken sıralamasını destekleyen korelasyon matrisinde görsel bir keşif aracı sağlar.\n", "\n", "Bu paketleri şu şekilde yükleyebilirsiniz:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n", "\n", "Aşağıdaki script, bu modülü tamamlamak için gereken paketlere sahip olup olmadığınızı kontrol eder ve eksik olanları sizin için yükler.\n" ], "metadata": { "id": "WqQPS1OAsg3H" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n", "\n", "pacman::p_load(tidyverse, tidymodels, janitor, corrplot)" ], "outputs": [], "metadata": { "id": "tA4C2WN3skCf", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0" } }, { "cell_type": "markdown", "source": [ "Bu harika paketleri daha sonra yükleyip mevcut R oturumumuzda kullanılabilir hale getireceğiz. (Bu sadece bir örnekleme için, `pacman::p_load()` bunu zaten sizin için yapıyor)\n", "\n", "## 1. Bir doğrusal regresyon çizgisi\n", "\n", "1. Derste öğrendiğiniz gibi, doğrusal regresyon çalışmasının amacı, aşağıdakilere en uygun *çizgiyi* çizebilmektir:\n", "\n", "- **Değişken ilişkilerini göstermek**. Değişkenler arasındaki ilişkiyi göstermek.\n", "\n", "- **Tahminlerde bulunmak**. Yeni bir veri noktasının bu çizgiye göre nerede yer alacağını doğru bir şekilde tahmin etmek.\n", "\n", "Bu tür bir çizgiyi çizmek için **En Küçük Kareler Regresyonu** adı verilen bir istatistiksel teknik kullanırız. `En küçük kareler` terimi, regresyon çizgisinin çevresindeki tüm veri noktalarının karelerinin alınması ve ardından toplanması anlamına gelir. İdeal olarak, bu toplam mümkün olduğunca küçük olmalıdır, çünkü daha az hata, yani `en küçük kareler` istiyoruz. Bu nedenle, en uygun çizgi, kare hataların toplamı için en düşük değeri veren çizgidir - bu yüzden adı *en küçük kareler regresyonu*.\n", "\n", "Bunu yapmamızın nedeni, tüm veri noktalarımızdan en az toplam mesafeye sahip bir çizgi modellemek istememizdir. Ayrıca, büyüklüğüyle ilgilendiğimiz için terimleri toplama işleminden önce karesini alırız, yönüyle değil.\n", "\n", "> **🧮 Matematiği Göster**\n", ">\n", "> Bu çizgi, *en uygun çizgi* olarak adlandırılır ve [bir denklemle](https://en.wikipedia.org/wiki/Simple_linear_regression) ifade edilebilir:\n", ">\n", "> Y = a + bX\n", ">\n", "> `X`, '`açıklayıcı değişken` veya `tahmin edici`'dir. `Y`, '`bağımlı değişken` veya `sonuç`'tur. Çizginin eğimi `b` ve `a` ise y-keseni, yani `X = 0` olduğunda `Y`'nin değerini ifade eder.\n", ">\n", "\n", "> ![](../../../../../../2-Regression/3-Linear/solution/images/slope.png \"eğim = $y/x$\")\n", " Jen Looper tarafından hazırlanan infografik\n", ">\n", "> İlk olarak, eğim `b` hesaplanır.\n", ">\n", "> Başka bir deyişle, ve kabak verilerimizin orijinal sorusuna atıfta bulunarak: \"Bir ay boyunca bir kabak sepetinin fiyatını tahmin edin\", `X` fiyatı ifade ederken, `Y` satış ayını ifade eder.\n", ">\n", "> ![](../../../../../../2-Regression/3-Linear/solution/images/calculation.png)\n", " Jen Looper tarafından hazırlanan infografik\n", "> \n", "> `Y` değerini hesaplayın. Eğer yaklaşık 4 dolar ödüyorsanız, bu Nisan olmalı!\n", ">\n", "> Çizgiyi hesaplayan matematik, çizginin eğimini göstermelidir, bu da aynı zamanda kesişim noktasına, yani `X = 0` olduğunda `Y`'nin konumuna bağlıdır.\n", ">\n", "> Bu değerlerin hesaplama yöntemini [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) web sitesinde gözlemleyebilirsiniz. Ayrıca, sayıların değerlerinin çizgiyi nasıl etkilediğini görmek için [bu En Küçük Kareler hesaplayıcısını](https://www.mathsisfun.com/data/least-squares-calculator.html) ziyaret edin.\n", "\n", "Korkutucu değil, değil mi? 🤓\n", "\n", "#### Korelasyon\n", "\n", "Anlamanız gereken bir diğer terim, verilen X ve Y değişkenleri arasındaki **Korelasyon Katsayısı**dır. Bir dağılım grafiği kullanarak bu katsayıyı hızlıca görselleştirebilirsiniz. Verilerin düzgün bir çizgi üzerinde sıralandığı bir grafik yüksek korelasyona sahiptir, ancak X ve Y arasında her yere dağılmış veri noktalarına sahip bir grafik düşük korelasyona sahiptir.\n", "\n", "İyi bir doğrusal regresyon modeli, En Küçük Kareler Regresyonu yöntemiyle ve bir regresyon çizgisiyle yüksek (1'e daha yakın, 0'dan uzak) bir Korelasyon Katsayısına sahip olan modeldir.\n" ], "metadata": { "id": "cdX5FRpvsoP5" } }, { "cell_type": "markdown", "source": [ "## **2. Verilerle dans: modelleme için kullanılacak bir veri çerçevesi oluşturma**\n", "\n", "

\n", " \n", "

@allison_horst tarafından yapılmış bir sanat eseri
\n", "\n", "\n", "\n" ], "metadata": { "id": "WdUKXk7Bs8-V" } }, { "cell_type": "markdown", "source": [ "Gerekli kütüphaneleri ve veri setini yükleyin. Verileri, aşağıdaki alt küme verilerini içeren bir veri çerçevesine dönüştürün:\n", "\n", "- Sadece kile başına fiyatlandırılan kabakları alın\n", "\n", "- Tarihi bir aya dönüştürün\n", "\n", "- Fiyatı, yüksek ve düşük fiyatların ortalaması olarak hesaplayın\n", "\n", "- Fiyatı, kile miktarına göre fiyatlandırmayı yansıtacak şekilde dönüştürün\n", "\n", "> Bu adımları [önceki derste](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb) ele almıştık.\n" ], "metadata": { "id": "fMCtu2G2s-p8" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the core Tidyverse packages\n", "library(tidyverse)\n", "library(lubridate)\n", "\n", "# Import the pumpkins data\n", "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n", "\n", "\n", "# Get a glimpse and dimensions of the data\n", "glimpse(pumpkins)\n", "\n", "\n", "# Print the first 50 rows of the data set\n", "pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "ryMVZEEPtERn" } }, { "cell_type": "markdown", "source": [ "Saf bir macera ruhuyla, kirli verileri incelemek ve temizlemek için basit işlevler sağlayan [`janitor paketi`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor)'ni keşfedelim. Örneğin, verilerimiz için sütun adlarına bir göz atalım:\n" ], "metadata": { "id": "xcNxM70EtJjb" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Return column names\n", "pumpkins %>% \n", " names()" ], "outputs": [], "metadata": { "id": "5XtpaIigtPfW" } }, { "cell_type": "markdown", "source": [ "🤔 Daha iyisini yapabiliriz. Bu sütun adlarını [snake_case](https://en.wikipedia.org/wiki/Snake_case) kuralına dönüştürerek `janitor::clean_names` kullanarak `friendR` yapalım. Bu fonksiyon hakkında daha fazla bilgi edinmek için: `?clean_names`\n" ], "metadata": { "id": "IbIqrMINtSHe" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Clean names to the snake_case convention\n", "pumpkins <- pumpkins %>% \n", " clean_names(case = \"snake\")\n", "\n", "# Return column names\n", "pumpkins %>% \n", " names()" ], "outputs": [], "metadata": { "id": "a2uYvclYtWvX" } }, { "cell_type": "markdown", "source": [ "Çok düzenli 🧹! Şimdi, önceki derste olduğu gibi `dplyr` kullanarak verilerle bir dans! 💃\n" ], "metadata": { "id": "HfhnuzDDtaDd" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Select desired columns\n", "pumpkins <- pumpkins %>% \n", " select(variety, city_name, package, low_price, high_price, date)\n", "\n", "\n", "\n", "# Extract the month from the dates to a new column\n", "pumpkins <- pumpkins %>%\n", " mutate(date = mdy(date),\n", " month = month(date)) %>% \n", " select(-date)\n", "\n", "\n", "\n", "# Create a new column for average Price\n", "pumpkins <- pumpkins %>% \n", " mutate(price = (low_price + high_price)/2)\n", "\n", "\n", "# Retain only pumpkins with the string \"bushel\"\n", "new_pumpkins <- pumpkins %>% \n", " filter(str_detect(string = package, pattern = \"bushel\"))\n", "\n", "\n", "# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n", "new_pumpkins <- new_pumpkins %>% \n", " mutate(price = case_when(\n", " str_detect(package, \"1 1/9\") ~ price/(1.1),\n", " str_detect(package, \"1/2\") ~ price*2,\n", " TRUE ~ price))\n", "\n", "# Relocate column positions\n", "new_pumpkins <- new_pumpkins %>% \n", " relocate(month, .before = variety)\n", "\n", "\n", "# Display the first 5 rows\n", "new_pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "X0wU3gQvtd9f" } }, { "cell_type": "markdown", "source": [ "Tebrikler! 👌 Artık yeni regresyon modelinizi oluşturabileceğiniz temiz ve düzenli bir veri setine sahipsiniz!\n", "\n", "Bir dağılım grafiği ister misiniz?\n" ], "metadata": { "id": "UpaIwaxqth82" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Set theme\n", "theme_set(theme_light())\n", "\n", "# Make a scatter plot of month and price\n", "new_pumpkins %>% \n", " ggplot(mapping = aes(x = month, y = price)) +\n", " geom_point(size = 1.6)\n" ], "outputs": [], "metadata": { "id": "DXgU-j37tl5K" } }, { "cell_type": "markdown", "source": [ "Bir dağılım grafiği, elimizde yalnızca Ağustos'tan Aralık'a kadar olan ay verilerinin bulunduğunu hatırlatıyor. Doğrusal bir şekilde sonuçlara varabilmek için muhtemelen daha fazla veriye ihtiyacımız var.\n", "\n", "Modelleme verilerimize tekrar bir göz atalım:\n" ], "metadata": { "id": "Ve64wVbwtobI" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Display first 5 rows\n", "new_pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "HFQX2ng1tuSJ" } }, { "cell_type": "markdown", "source": [ "Bir kabağın `fiyatını`, karakter türündeki `şehir` veya `paket` sütunlarına dayanarak tahmin etmek isteseydik ne olurdu? Ya da daha basit bir şekilde, örneğin `paket` ve `fiyat` arasında (her iki girdinin de sayısal olması gerektiği) korelasyonu nasıl bulabilirdik? 🤷🤷\n", "\n", "Makine öğrenimi modelleri, metin değerlerinden ziyade sayısal özelliklerle daha iyi çalışır, bu nedenle genellikle kategorik özellikleri sayısal temsillere dönüştürmeniz gerekir.\n", "\n", "Bu, tahmin edicilerimizi bir modelin etkili bir şekilde kullanmasını kolaylaştıracak şekilde yeniden biçimlendirme yolunu bulmamız gerektiği anlamına gelir; bu sürece `özellik mühendisliği` denir.\n" ], "metadata": { "id": "7hsHoxsStyjJ" } }, { "cell_type": "markdown", "source": [ "## 3. Modeller için verileri tariflerle ön işleme 👩‍🍳👨‍🍳\n", "\n", "Tahmin edici değerleri yeniden biçimlendirerek bir modelin bunları daha etkili kullanmasını sağlama faaliyetlerine `özellik mühendisliği` denir.\n", "\n", "Farklı modellerin farklı ön işleme gereksinimleri vardır. Örneğin, en küçük kareler yöntemi `ay, çeşit ve şehir_adı gibi kategorik değişkenlerin kodlanmasını` gerektirir. Bu, basitçe `kategorik değerler` içeren bir sütunun, orijinal sütunun yerine geçen bir veya daha fazla `sayısal sütuna` dönüştürülmesini içerir.\n", "\n", "Örneğin, verilerinizde aşağıdaki kategorik özellik bulunduğunu varsayalım:\n", "\n", "| şehir |\n", "|:--------:|\n", "| Denver |\n", "| Nairobi |\n", "| Tokyo |\n", "\n", "*Ordinal kodlama* uygulayarak her kategoriye benzersiz bir tam sayı değeri atayabilirsiniz, şöyle:\n", "\n", "| şehir |\n", "|:-----:|\n", "| 0 |\n", "| 1 |\n", "| 2 |\n", "\n", "Ve işte bunu verilerimize uygulayacağız!\n", "\n", "Bu bölümde, verilerinizi modelinizi eğitmeden **önce** ön işleme konusunda size yardımcı olmak için tasarlanmış bir başka harika Tidymodels paketi olan [recipes](https://tidymodels.github.io/recipes/) paketini keşfedeceğiz. Temelde bir tarif, bir veri setine modelleme için hazır hale getirmek amacıyla hangi adımların uygulanması gerektiğini tanımlayan bir nesnedir.\n", "\n", "Şimdi, tahmin edici sütunlardaki tüm gözlemler için benzersiz bir tam sayı atayarak verilerimizi modelleme için hazırlayan bir tarif oluşturalım:\n" ], "metadata": { "id": "AD5kQbcvt3Xl" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Specify a recipe\n", "pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n", " step_integer(all_predictors(), zero_based = TRUE)\n", "\n", "\n", "# Print out the recipe\n", "pumpkins_recipe" ], "outputs": [], "metadata": { "id": "BNaFKXfRt9TU" } }, { "cell_type": "markdown", "source": [ "Harika! 👏 İlk tarifimizi oluşturduk ve bu tarif bir sonucu (fiyat) ve buna karşılık gelen tahmin edicileri belirtiyor, ayrıca tüm tahmin edici sütunların bir dizi tam sayıya kodlanması gerektiğini ifade ediyor 🙌! Hadi bunu hızlıca parçalarına ayıralım:\n", "\n", "- `recipe()` çağrısı, bir formül ile birlikte, `new_pumpkins` verilerini referans alarak değişkenlerin *rollerini* tarife bildirir. Örneğin, `price` sütunu bir `outcome` rolüne atanmışken, diğer sütunlar bir `predictor` rolüne atanmıştır.\n", "\n", "- `step_integer(all_predictors(), zero_based = TRUE)` tüm tahmin edicilerin 0'dan başlayan bir numaralandırma ile bir dizi tam sayıya dönüştürülmesi gerektiğini belirtir.\n", "\n", "Eminiz ki şu tür düşünceleriniz olabilir: \"Bu çok havalı!! Ama ya tariflerin tam olarak beklediğim gibi çalıştığını doğrulamam gerekirse? 🤔\"\n", "\n", "Bu harika bir düşünce! Görüyorsunuz, tarifiniz bir kez tanımlandıktan sonra, veriyi gerçekten ön işlemek için gereken parametreleri tahmin edebilir ve ardından işlenmiş veriyi çıkarabilirsiniz. Tidymodels kullanırken genellikle bunu yapmanız gerekmez (birazdan normal yöntemi göreceğiz-\\> `workflows`), ancak tariflerin beklediğiniz gibi çalıştığını doğrulamak için bir tür kontrol yapmak istediğinizde işe yarayabilir.\n", "\n", "Bunun için iki ek fiile ihtiyacınız olacak: `prep()` ve `bake()`. Her zamanki gibi, [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) tarafından hazırlanan küçük R arkadaşlarımız bunu daha iyi anlamanıza yardımcı oluyor!\n", "\n", "

\n", " \n", "

@allison_horst tarafından yapılmış sanat eseri
\n" ], "metadata": { "id": "KEiO0v7kuC9O" } }, { "cell_type": "markdown", "source": [ "[`prep()`](https://recipes.tidymodels.org/reference/prep.html): bir eğitim setinden gerekli parametreleri tahmin eder ve bu parametreler daha sonra diğer veri setlerine uygulanabilir. Örneğin, belirli bir tahmin edici sütunu için hangi gözlem 0, 1, 2 gibi bir tam sayı ile atanacak.\n", "\n", "[`bake()`](https://recipes.tidymodels.org/reference/bake.html): hazırlanmış bir tarifi alır ve işlemleri herhangi bir veri setine uygular.\n", "\n", "Öyleyse, tariflerimizi hazırlayıp uygulayalım ve gerçekten doğrulayalım ki perde arkasında tahmin edici sütunlar önce kodlanacak, ardından bir model oluşturulacak.\n" ], "metadata": { "id": "Q1xtzebuuTCP" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Prep the recipe\n", "pumpkins_prep <- prep(pumpkins_recipe)\n", "\n", "# Bake the recipe to extract a preprocessed new_pumpkins data\n", "baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n", "\n", "# Print out the baked data set\n", "baked_pumpkins %>% \n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "FGBbJbP_uUUn" } }, { "cell_type": "markdown", "source": [ "Woo-hoo!🥳 İşlenmiş veri `baked_pumpkins` tüm tahmin edicilerinin kodlandığını doğruladı, bu da tarif olarak tanımlanan ön işleme adımlarının beklendiği gibi çalışacağını gösteriyor. Bu, sizin için okumayı zorlaştırabilir ama Tidymodels için çok daha anlaşılır hale getirir! Hangi gözlemin ilgili bir tam sayıya eşlendiğini bulmak için biraz zaman ayırın.\n", "\n", "Ayrıca, `baked_pumpkins` üzerinde hesaplamalar yapabileceğimiz bir veri çerçevesi olduğunu belirtmekte fayda var.\n", "\n", "Örneğin, verilerinizdeki iki nokta arasında iyi bir korelasyon bulmaya çalışabiliriz, böylece potansiyel olarak iyi bir tahmin modeli oluşturabiliriz. Bunu yapmak için `cor()` fonksiyonunu kullanacağız. Fonksiyon hakkında daha fazla bilgi edinmek için `?cor()` yazabilirsiniz.\n" ], "metadata": { "id": "1dvP0LBUueAW" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Find the correlation between the city_name and the price\n", "cor(baked_pumpkins$city_name, baked_pumpkins$price)\n", "\n", "# Find the correlation between the package and the price\n", "cor(baked_pumpkins$package, baked_pumpkins$price)\n" ], "outputs": [], "metadata": { "id": "3bQzXCjFuiSV" } }, { "cell_type": "markdown", "source": [ "Görünüşe göre, Şehir ve Fiyat arasında yalnızca zayıf bir ilişki var. Ancak Paket ve Fiyatı arasında biraz daha iyi bir ilişki bulunuyor. Bu mantıklı, değil mi? Genelde, ürün kutusu ne kadar büyükse, fiyat da o kadar yüksek olur.\n", "\n", "Bu sırada, tüm sütunların bir korelasyon matrisini `corrplot` paketi kullanarak görselleştirmeyi de deneyelim.\n" ], "metadata": { "id": "BToPWbgjuoZw" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the corrplot package\n", "library(corrplot)\n", "\n", "# Obtain correlation matrix\n", "corr_mat <- cor(baked_pumpkins %>% \n", " # Drop columns that are not really informative\n", " select(-c(low_price, high_price)))\n", "\n", "# Make a correlation plot between the variables\n", "corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")" ], "outputs": [], "metadata": { "id": "ZwAL3ksmutVR" } }, { "cell_type": "markdown", "source": [ "🤩🤩 Çok daha iyi.\n", "\n", "Bu verilerle şimdi sorulabilecek iyi bir soru şu olabilir: '`Belirli bir kabak paketi için hangi fiyatı bekleyebilirim?`' Haydi başlayalım!\n", "\n", "> Not: **`pumpkins_prep`** tarifini **`new_data = NULL`** ile **`bake()`** ettiğinizde, işlenmiş (yani kodlanmış) eğitim verilerini elde edersiniz. Örneğin, başka bir veri setiniz (örneğin bir test seti) varsa ve bir tarifin onu nasıl ön işleyeceğini görmek istiyorsanız, **`pumpkins_prep`** tarifini **`new_data = test_set`** ile **`bake()`** etmeniz yeterlidir.\n", "\n", "## 4. Doğrusal regresyon modeli oluşturun\n", "\n", "

\n", " \n", "

Dasani Madipalli tarafından hazırlanan bilgi grafiği
\n", "\n", "\n", "\n" ], "metadata": { "id": "YqXjLuWavNxW" } }, { "cell_type": "markdown", "source": [ "Artık bir tarif oluşturduğumuza ve verilerin uygun şekilde ön işleneceğini doğruladığımıza göre, şimdi şu soruyu yanıtlamak için bir regresyon modeli oluşturalım: `Belirli bir kabak paketi için hangi fiyatı bekleyebilirim?`\n", "\n", "#### Eğitim seti kullanarak bir doğrusal regresyon modeli eğitin\n", "\n", "Muhtemelen zaten fark etmişsinizdir, *price* sütunu `sonuç` değişkeni iken *package* sütunu `tahmin edici` değişkendir.\n", "\n", "Bunu yapmak için, önce verileri %80'i eğitim setine ve %20'si test setine gidecek şekilde böleceğiz, ardından tahmin edici sütunu bir dizi tam sayıya kodlayacak bir tarif tanımlayacağız ve ardından bir model spesifikasyonu oluşturacağız. Tarifimizi hazırlayıp pişirmeyeceğiz çünkü verileri beklendiği gibi ön işleyeceğini zaten biliyoruz.\n" ], "metadata": { "id": "Pq0bSzCevW-h" } }, { "cell_type": "code", "execution_count": null, "source": [ "set.seed(2056)\n", "# Split the data into training and test sets\n", "pumpkins_split <- new_pumpkins %>% \n", " initial_split(prop = 0.8)\n", "\n", "\n", "# Extract training and test data\n", "pumpkins_train <- training(pumpkins_split)\n", "pumpkins_test <- testing(pumpkins_split)\n", "\n", "\n", "\n", "# Create a recipe for preprocessing the data\n", "lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n", " step_integer(all_predictors(), zero_based = TRUE)\n", "\n", "\n", "\n", "# Create a linear model specification\n", "lm_spec <- linear_reg() %>% \n", " set_engine(\"lm\") %>% \n", " set_mode(\"regression\")" ], "outputs": [], "metadata": { "id": "CyoEh_wuvcLv" } }, { "cell_type": "markdown", "source": [ "Harika iş çıkardınız! Artık bir tarifimiz ve bir model spesifikasyonumuz olduğuna göre, bunları bir araya getirip, önce veriyi ön işleme (arka planda hazırlık + pişirme), ardından ön işlenmiş veri üzerinde modeli eğitme ve potansiyel olarak son işlem aktivitelerine olanak tanıyan bir nesneye dönüştürmenin bir yolunu bulmamız gerekiyor. İçiniz rahatladı mı!🤩\n", "\n", "Tidymodels'de, bu kullanışlı nesne [`workflow`](https://workflows.tidymodels.org/) olarak adlandırılır ve modelleme bileşenlerinizi pratik bir şekilde barındırır! Python'da buna *pipelines* derdik.\n", "\n", "O halde her şeyi bir workflow içinde bir araya getirelim!📦\n" ], "metadata": { "id": "G3zF_3DqviFJ" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Hold modelling components in a workflow\n", "lm_wf <- workflow() %>% \n", " add_recipe(lm_pumpkins_recipe) %>% \n", " add_model(lm_spec)\n", "\n", "# Print out the workflow\n", "lm_wf" ], "outputs": [], "metadata": { "id": "T3olroU3v-WX" } }, { "cell_type": "markdown", "source": [ "Üstelik, bir iş akışı tıpkı bir model gibi uygun hale getirilebilir/eğitilebilir.\n" ], "metadata": { "id": "zd1A5tgOwEPX" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Train the model\n", "lm_wf_fit <- lm_wf %>% \n", " fit(data = pumpkins_train)\n", "\n", "# Print the model coefficients learned \n", "lm_wf_fit" ], "outputs": [], "metadata": { "id": "NhJagFumwFHf" } }, { "cell_type": "markdown", "source": [ "Model çıktısından, eğitim sırasında öğrenilen katsayıları görebiliriz. Bu katsayılar, gerçek ve tahmin edilen değişken arasındaki toplam hatayı en aza indiren en iyi uyum çizgisinin katsayılarını temsil eder.\n", "\n", "#### Test seti kullanarak model performansını değerlendirme\n", "\n", "Modelin nasıl performans gösterdiğini görme zamanı 📏! Bunu nasıl yaparız?\n", "\n", "Artık modeli eğittiğimize göre, test_set için tahminler yapmak için `parsnip::predict()` fonksiyonunu kullanabiliriz. Ardından, bu tahminleri gerçek etiket değerleriyle karşılaştırarak modelin ne kadar iyi (ya da kötü!) çalıştığını değerlendirebiliriz.\n", "\n", "Hadi test seti için tahminler yaparak başlayalım ve ardından sütunları test setine bağlayalım.\n" ], "metadata": { "id": "_4QkGtBTwItF" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make predictions for the test set\n", "predictions <- lm_wf_fit %>% \n", " predict(new_data = pumpkins_test)\n", "\n", "\n", "# Bind predictions to the test set\n", "lm_results <- pumpkins_test %>% \n", " select(c(package, price)) %>% \n", " bind_cols(predictions)\n", "\n", "\n", "# Print the first ten rows of the tibble\n", "lm_results %>% \n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "UFZzTG0gwTs9" } }, { "cell_type": "markdown", "source": [ "Evet, bir model eğittiniz ve tahminler yapmak için kullandınız!🔮 Peki, bu model ne kadar iyi? Hadi modelin performansını değerlendirelim!\n", "\n", "Tidymodels'de bunu `yardstick::metrics()` kullanarak yapıyoruz! Lineer regresyon için şu metriklere odaklanalım:\n", "\n", "- `Root Mean Square Error (RMSE)`: [MSE](https://en.wikipedia.org/wiki/Mean_squared_error)'nin karekökü. Bu, etiketle (bu durumda bir kabağın fiyatı) aynı birimde mutlak bir metrik sağlar. Değer ne kadar küçükse, model o kadar iyidir (basit bir anlamda, tahminlerin ortalama olarak ne kadar yanlış olduğunu temsil eder!)\n", "\n", "- `Coefficient of Determination (genellikle R-squared veya R2 olarak bilinir)`: Daha yüksek bir değerin daha iyi bir uyumu temsil ettiği göreceli bir metrik. Temelde, bu metrik modelin tahmin edilen ve gerçek etiket değerleri arasındaki varyansın ne kadarını açıklayabildiğini gösterir.\n" ], "metadata": { "id": "0A5MjzM7wW9M" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Evaluate performance of linear regression\n", "metrics(data = lm_results,\n", " truth = price,\n", " estimate = .pred)" ], "outputs": [], "metadata": { "id": "reJ0UIhQwcEH" } }, { "cell_type": "markdown", "source": [ "Model performansı düşüyor. Paket ve fiyatın bir dağılım grafiğini görselleştirerek daha iyi bir gösterge elde edip, ardından yapılan tahminleri kullanarak en iyi uyum çizgisini üzerine ekleyebilir miyiz, bir bakalım.\n", "\n", "Bu, test setini hazırlayıp işleyerek paket sütununu kodlamamız ve ardından bunu modelimizin yaptığı tahminlerle birleştirmemiz gerektiği anlamına geliyor.\n" ], "metadata": { "id": "fdgjzjkBwfWt" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Encode package column\n", "package_encode <- lm_pumpkins_recipe %>% \n", " prep() %>% \n", " bake(new_data = pumpkins_test) %>% \n", " select(package)\n", "\n", "\n", "# Bind encoded package column to the results\n", "lm_results <- lm_results %>% \n", " bind_cols(package_encode %>% \n", " rename(package_integer = package)) %>% \n", " relocate(package_integer, .after = package)\n", "\n", "\n", "# Print new results data frame\n", "lm_results %>% \n", " slice_head(n = 5)\n", "\n", "\n", "# Make a scatter plot\n", "lm_results %>% \n", " ggplot(mapping = aes(x = package_integer, y = price)) +\n", " geom_point(size = 1.6) +\n", " # Overlay a line of best fit\n", " geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n", " xlab(\"package\")\n", " \n" ], "outputs": [], "metadata": { "id": "R0nw719lwkHE" } }, { "cell_type": "markdown", "source": [ "Harika! Gördüğünüz gibi, doğrusal regresyon modeli bir paketin fiyatı ile arasındaki ilişkiyi gerçekten iyi bir şekilde genelleştiremiyor.\n", "\n", "🎃 Tebrikler, birkaç çeşit kabak fiyatını tahmin etmeye yardımcı olabilecek bir model oluşturdunuz. Tatil kabak bahçeniz harika görünecek. Ancak muhtemelen daha iyi bir model oluşturabilirsiniz!\n", "\n", "## 5. Polinom regresyon modeli oluşturun\n", "\n", "

\n", " \n", "

Dasani Madipalli tarafından hazırlanan bilgi grafiği
\n", "\n", "\n", "\n" ], "metadata": { "id": "HOCqJXLTwtWI" } }, { "cell_type": "markdown", "source": [ "Bazen verilerimiz doğrusal bir ilişkiye sahip olmayabilir, ancak yine de bir sonucu tahmin etmek isteyebiliriz. Polinom regresyon, daha karmaşık doğrusal olmayan ilişkiler için tahmin yapmamıza yardımcı olabilir.\n", "\n", "Örneğin, kabak veri setimizdeki paket ve fiyat arasındaki ilişkiyi ele alalım. Bazen değişkenler arasında doğrusal bir ilişki olabilir - kabak hacmi büyüdükçe fiyatın artması gibi - ancak bazen bu ilişkiler bir düzlem veya doğru olarak çizilemez.\n", "\n", "> ✅ İşte [polinom regresyon](https://online.stat.psu.edu/stat501/lesson/9/9.8) kullanabilecek verilere dair bazı örnekler\n", ">\n", "> Önceki grafikte Çeşit ve Fiyat arasındaki ilişkiye tekrar bir göz atın. Bu dağılım grafiği mutlaka bir doğru ile analiz edilmesi gereken bir ilişki gibi mi görünüyor? Belki de hayır. Bu durumda, polinom regresyonu deneyebilirsiniz.\n", ">\n", "> ✅ Polinomlar, bir veya daha fazla değişken ve katsayıdan oluşabilen matematiksel ifadelerdir.\n", "\n", "#### Eğitim seti kullanarak bir polinom regresyon modeli eğitin\n", "\n", "Polinom regresyon, doğrusal olmayan verilere daha iyi uyum sağlamak için *eğri bir çizgi* oluşturur.\n", "\n", "Bir polinom modelinin tahmin yapmada daha iyi performans gösterip göstermeyeceğini görelim. Daha önce izlediğimiz prosedüre benzer bir yol izleyerek devam edeceğiz:\n", "\n", "- Verilerimizi modellemeye hazırlamak için uygulanması gereken ön işleme adımlarını belirten bir tarif oluşturun, örneğin: tahmin edicileri kodlama ve *n* dereceli polinomlar hesaplama\n", "\n", "- Bir model spesifikasyonu oluşturun\n", "\n", "- Tarif ve model spesifikasyonunu bir iş akışında birleştirin\n", "\n", "- İş akışını uydurarak bir model oluşturun\n", "\n", "- Modelin test verilerinde ne kadar iyi performans gösterdiğini değerlendirin\n", "\n", "Haydi başlayalım!\n" ], "metadata": { "id": "VcEIpRV9wzYr" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Specify a recipe\r\n", "poly_pumpkins_recipe <-\r\n", " recipe(price ~ package, data = pumpkins_train) %>%\r\n", " step_integer(all_predictors(), zero_based = TRUE) %>% \r\n", " step_poly(all_predictors(), degree = 4)\r\n", "\r\n", "\r\n", "# Create a model specification\r\n", "poly_spec <- linear_reg() %>% \r\n", " set_engine(\"lm\") %>% \r\n", " set_mode(\"regression\")\r\n", "\r\n", "\r\n", "# Bundle recipe and model spec into a workflow\r\n", "poly_wf <- workflow() %>% \r\n", " add_recipe(poly_pumpkins_recipe) %>% \r\n", " add_model(poly_spec)\r\n", "\r\n", "\r\n", "# Create a model\r\n", "poly_wf_fit <- poly_wf %>% \r\n", " fit(data = pumpkins_train)\r\n", "\r\n", "\r\n", "# Print learned model coefficients\r\n", "poly_wf_fit\r\n", "\r\n", " " ], "outputs": [], "metadata": { "id": "63n_YyRXw3CC" } }, { "cell_type": "markdown", "source": [ "#### Model performansını değerlendirin\n", "\n", "👏👏Bir polinom modeli oluşturdunuz, şimdi test seti üzerinde tahminler yapalım!\n" ], "metadata": { "id": "-LHZtztSxDP0" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make price predictions on test data\r\n", "poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n", " bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n", " relocate(.pred, .after = last_col())\r\n", "\r\n", "\r\n", "# Print the results\r\n", "poly_results %>% \r\n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "YUFpQ_dKxJGx" } }, { "cell_type": "markdown", "source": [ "Woo-hoo, hadi `yardstick::metrics()` kullanarak modelin test_set üzerindeki performansını değerlendirelim.\n" ], "metadata": { "id": "qxdyj86bxNGZ" } }, { "cell_type": "code", "execution_count": null, "source": [ "metrics(data = poly_results, truth = price, estimate = .pred)" ], "outputs": [], "metadata": { "id": "8AW5ltkBxXDm" } }, { "cell_type": "markdown", "source": [ "🤩🤩 Çok daha iyi performans.\n", "\n", "`rmse` yaklaşık 7'den yaklaşık 3'e düştü, bu da gerçek fiyat ile tahmin edilen fiyat arasındaki hatanın azaldığını gösteriyor. Bunu *kabaca* şu şekilde yorumlayabilirsiniz: Ortalama olarak, yanlış tahminler yaklaşık \\$3 kadar yanlıştır. `rsq` yaklaşık 0.4'ten 0.8'e yükseldi.\n", "\n", "Tüm bu metrikler, polinom modelinin doğrusal modelden çok daha iyi performans gösterdiğini gösteriyor. Harika iş!\n", "\n", "Hadi bunu görselleştirebilir miyiz bir bakalım!\n" ], "metadata": { "id": "6gLHNZDwxYaS" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Bind encoded package column to the results\r\n", "poly_results <- poly_results %>% \r\n", " bind_cols(package_encode %>% \r\n", " rename(package_integer = package)) %>% \r\n", " relocate(package_integer, .after = package)\r\n", "\r\n", "\r\n", "# Print new results data frame\r\n", "poly_results %>% \r\n", " slice_head(n = 5)\r\n", "\r\n", "\r\n", "# Make a scatter plot\r\n", "poly_results %>% \r\n", " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n", " geom_point(size = 1.6) +\r\n", " # Overlay a line of best fit\r\n", " geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n", " xlab(\"package\")\r\n" ], "outputs": [], "metadata": { "id": "A83U16frxdF1" } }, { "cell_type": "markdown", "source": [ "Verilerinize daha iyi uyan bir eğri çizgisi görebilirsiniz! 🤩\n", "\n", "Bunu daha da düzgün hale getirmek için `geom_smooth` fonksiyonuna bir polinom formülü geçirerek şu şekilde yapabilirsiniz:\n" ], "metadata": { "id": "4U-7aHOVxlGU" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a scatter plot\r\n", "poly_results %>% \r\n", " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n", " geom_point(size = 1.6) +\r\n", " # Overlay a line of best fit\r\n", " geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n", " xlab(\"package\")" ], "outputs": [], "metadata": { "id": "5vzNT0Uexm-w" } }, { "cell_type": "markdown", "source": [ "Tıpkı pürüzsüz bir eğri gibi!🤩\n", "\n", "İşte yeni bir tahmin yapmanın yolu:\n" ], "metadata": { "id": "v9u-wwyLxq4G" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a hypothetical data frame\r\n", "hypo_tibble <- tibble(package = \"bushel baskets\")\r\n", "\r\n", "# Make predictions using linear model\r\n", "lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n", "\r\n", "# Make predictions using polynomial model\r\n", "poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n", "\r\n", "# Return predictions in a list\r\n", "list(\"linear model prediction\" = lm_pred, \r\n", " \"polynomial model prediction\" = poly_pred)\r\n" ], "outputs": [], "metadata": { "id": "jRPSyfQGxuQv" } }, { "cell_type": "markdown", "source": [ "`polynomial model` tahmini, `price` ve `package` dağılım grafikleri göz önüne alındığında mantıklı görünüyor! Ve eğer bu model önceki modelden daha iyiyse, aynı verilere bakarak, bu daha pahalı kabaklar için bütçe ayırmanız gerekecek!\n", "\n", "🏆 Tebrikler! Bir derste iki regresyon modeli oluşturdunuz. Regresyonun son bölümünde, kategorileri belirlemek için lojistik regresyonu öğreneceksiniz.\n", "\n", "## **🚀Meydan Okuma**\n", "\n", "Bu not defterinde birkaç farklı değişkeni test edin ve korelasyonun model doğruluğuyla nasıl ilişkili olduğunu görün.\n", "\n", "## [**Ders sonrası test**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n", "\n", "## **Gözden Geçirme ve Kendi Kendine Çalışma**\n", "\n", "Bu derste Doğrusal Regresyon hakkında bilgi edindik. Regresyonun diğer önemli türleri de vardır. Stepwise, Ridge, Lasso ve Elasticnet teknikleri hakkında okuyun. Daha fazla bilgi edinmek için çalışabileceğiniz iyi bir kurs [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n", "\n", "Harika Tidymodels çerçevesini nasıl kullanacağınızı öğrenmek istiyorsanız, lütfen aşağıdaki kaynaklara göz atın:\n", "\n", "- Tidymodels web sitesi: [Tidymodels ile Başlayın](https://www.tidymodels.org/start/)\n", "\n", "- Max Kuhn ve Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n", "\n", "###### **TEŞEKKÜRLER:**\n", "\n", "[R için daha sıcak ve ilgi çekici hale getiren harika illüstrasyonları oluşturan Allison Horst](https://twitter.com/allison_horst?lang=en). Daha fazla illüstrasyonu onun [galerisinde](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) bulabilirsiniz.\n" ], "metadata": { "id": "8zOLOWqMxzk5" } }, { "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" ] } ] }