You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1089 lines
41 KiB
1089 lines
41 KiB
{
|
|
"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:16:09+00:00",
|
|
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
|
|
"language_code": "sl"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# Zgradite regresijski model: linearni in polinomski regresijski modeli\n"
|
|
],
|
|
"metadata": {
|
|
"id": "EgQw8osnsUV-"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Linearna in polinomska regresija za določanje cen buč - Lekcija 3\n",
|
|
"<p>\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n",
|
|
"\n",
|
|
"#### Uvod\n",
|
|
"\n",
|
|
"Do sedaj ste raziskali, kaj regresija je, z vzorčnimi podatki, zbranimi iz nabora podatkov o cenah buč, ki ga bomo uporabljali skozi celotno lekcijo. Prav tako ste ga vizualizirali z uporabo `ggplot2`. 💪\n",
|
|
"\n",
|
|
"Zdaj ste pripravljeni, da se poglobite v regresijo za strojno učenje. V tej lekciji boste izvedeli več o dveh vrstah regresije: *osnovni linearni regresiji* in *polinomski regresiji*, skupaj z nekaj matematike, ki stoji za temi tehnikami.\n",
|
|
"\n",
|
|
"> V tem učnem načrtu predpostavljamo minimalno matematično predznanje in si prizadevamo, da bi bila vsebina dostopna študentom iz drugih področij. Zato bodite pozorni na opombe, 🧮 poudarke, diagrame in druga učna orodja, ki vam bodo pomagala pri razumevanju.\n",
|
|
"\n",
|
|
"#### Priprava\n",
|
|
"\n",
|
|
"Naj vas spomnimo, da nalagate te podatke, da bi si zastavili vprašanja o njih.\n",
|
|
"\n",
|
|
"- Kdaj je najboljši čas za nakup buč?\n",
|
|
"\n",
|
|
"- Kakšno ceno lahko pričakujem za zabojček miniaturnih buč?\n",
|
|
"\n",
|
|
"- Ali naj jih kupim v polovičnih košarah ali v škatlah velikosti 1 1/9 busha? Poglobimo se v te podatke.\n",
|
|
"\n",
|
|
"V prejšnji lekciji ste ustvarili `tibble` (sodobno reinterpretacijo podatkovnega okvira) in ga napolnili z delom izvirnega nabora podatkov, pri čemer ste standardizirali cene glede na bushel. S tem ste sicer pridobili približno 400 podatkovnih točk, vendar le za jesenske mesece. Morda lahko pridobimo še malo več podrobnosti o naravi podatkov, če jih še bolj očistimo? Bomo videli... 🕵️♀️\n",
|
|
"\n",
|
|
"Za to nalogo bomo potrebovali naslednje pakete:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka paketov za R](https://www.tidyverse.org/packages), zasnovana za hitrejše, enostavnejše in zabavnejše delo z znanostjo o podatkih!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je [okvir paketov](https://www.tidymodels.org/packages/) za modeliranje in strojno učenje.\n",
|
|
"\n",
|
|
"- `janitor`: Paket [janitor](https://github.com/sfirke/janitor) ponuja preprosta orodja za pregledovanje in čiščenje \"umazanih\" podatkov.\n",
|
|
"\n",
|
|
"- `corrplot`: Paket [corrplot](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) omogoča vizualno raziskovanje korelacijske matrike, ki podpira samodejno preurejanje spremenljivk za odkrivanje skritih vzorcev med njimi.\n",
|
|
"\n",
|
|
"Pakete lahko namestite z naslednjim ukazom:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
|
|
"\n",
|
|
"Spodnji skript preveri, ali imate nameščene potrebne pakete za dokončanje tega modula, in jih po potrebi namesti.\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": [
|
|
"## 1. Linearna regresijska premica\n",
|
|
"\n",
|
|
"Kot ste se naučili v Lekciji 1, je cilj linearne regresije narisati *premico* *najboljše prileganje*, da:\n",
|
|
"\n",
|
|
"- **Prikažete odnose med spremenljivkami**. Prikažete odnos med spremenljivkami.\n",
|
|
"\n",
|
|
"- **Napovedujete**. Naredite natančne napovedi, kje bi nov podatek padel v odnosu do te premice.\n",
|
|
"\n",
|
|
"Za risanje takšne premice uporabljamo statistično tehniko, imenovano **Regresija najmanjših kvadratov**. Izraz `najmanjši kvadrati` pomeni, da so vsi podatkovni točki okoli regresijske premice kvadrirani in nato sešteveni. Idealno je, da je končni seštevek čim manjši, saj želimo nizko število napak oziroma `najmanjše kvadrate`. Tako je premica najboljše prileganje tista, ki nam daje najnižjo vrednost za vsoto kvadriranih napak - od tod ime *regresija najmanjših kvadratov*.\n",
|
|
"\n",
|
|
"To počnemo, ker želimo modelirati premico, ki ima najmanjšo kumulativno razdaljo od vseh naših podatkovnih točk. Prav tako kvadriramo izraze pred seštevanjem, saj nas zanima njihova velikost in ne smer.\n",
|
|
"\n",
|
|
"> **🧮 Pokaži mi matematiko**\n",
|
|
">\n",
|
|
"> Ta premica, imenovana *premica najboljše prileganje*, se lahko izrazi z [enačbo](https://en.wikipedia.org/wiki/Simple_linear_regression):\n",
|
|
">\n",
|
|
"> Y = a + bX\n",
|
|
">\n",
|
|
"> `X` je '`pojasnjevalna spremenljivka` ali `napovednik`'. `Y` je '`odvisna spremenljivka` ali `rezultat`'. Naklon premice je `b`, `a` pa je presečišče z osjo y, kar se nanaša na vrednost `Y`, ko `X = 0`.\n",
|
|
">\n",
|
|
"\n",
|
|
"> \n",
|
|
" Infografika: Jen Looper\n",
|
|
">\n",
|
|
"> Najprej izračunajte naklon `b`.\n",
|
|
">\n",
|
|
"> Z drugimi besedami, in glede na prvotno vprašanje o podatkih o bučah: \"napovedati ceno buče na koš po mesecih\", bi `X` pomenil ceno, `Y` pa mesec prodaje.\n",
|
|
">\n",
|
|
"> \n",
|
|
" Infografika: Jen Looper\n",
|
|
"> \n",
|
|
"> Izračunajte vrednost Y. Če plačujete približno 4 USD, mora biti april!\n",
|
|
">\n",
|
|
"> Matematika, ki izračuna premico, mora prikazati naklon premice, ki je odvisen tudi od presečišča, oziroma kje se `Y` nahaja, ko `X = 0`.\n",
|
|
">\n",
|
|
"> Metodo izračuna teh vrednosti si lahko ogledate na spletni strani [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Obiščite tudi [ta kalkulator najmanjših kvadratov](https://www.mathsisfun.com/data/least-squares-calculator.html), da vidite, kako vrednosti številk vplivajo na premico.\n",
|
|
"\n",
|
|
"Ni tako strašno, kajne? 🤓\n",
|
|
"\n",
|
|
"#### Korelacija\n",
|
|
"\n",
|
|
"Še en izraz, ki ga je treba razumeti, je **Koeficient korelacije** med danima spremenljivkama X in Y. S pomočjo razsevnega diagrama lahko hitro vizualizirate ta koeficient. Diagram s podatkovnimi točkami, razporejenimi v urejeni premici, ima visoko korelacijo, medtem ko diagram s podatkovnimi točkami, razpršenimi povsod med X in Y, ima nizko korelacijo.\n",
|
|
"\n",
|
|
"Dober model linearne regresije bo tisti, ki ima visok (bližje 1 kot 0) koeficient korelacije z uporabo metode regresije najmanjših kvadratov s premico regresije.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "cdX5FRpvsoP5"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **2. Ples s podatki: ustvarjanje podatkovnega okvira za modeliranje**\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/janitor.jpg\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption>Umetniško delo @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"700\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WdUKXk7Bs8-V"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Naložite potrebne knjižnice in podatkovni niz. Podatke pretvorite v podatkovni okvir, ki vsebuje podmnožico podatkov:\n",
|
|
"\n",
|
|
"- Uporabite samo buče, katerih cena je določena na sod.\n",
|
|
"\n",
|
|
"- Datum pretvorite v mesec.\n",
|
|
"\n",
|
|
"- Izračunajte ceno kot povprečje najvišje in najnižje cene.\n",
|
|
"\n",
|
|
"- Ceno prilagodite tako, da odraža določanje cen glede na količino v sodu.\n",
|
|
"\n",
|
|
"> Te korake smo obravnavali v [prejšnji lekciji](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb).\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": [
|
|
"V duhu čiste avanture raziščimo [`paket janitor`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor), ki ponuja preproste funkcije za pregledovanje in čiščenje neurejenih podatkov. Na primer, poglejmo imena stolpcev za naše podatke:\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": [
|
|
"🤔 Lahko naredimo bolje. Spremenimo ta imena stolpcev v `friendR` tako, da jih pretvorimo v konvencijo [snake_case](https://en.wikipedia.org/wiki/Snake_case) z uporabo `janitor::clean_names`. Če želite izvedeti več o tej funkciji: `?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": [
|
|
"Veliko urejenosti 🧹! Zdaj pa ples s podatki z uporabo `dplyr`, kot v prejšnji lekciji! 💃\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": [
|
|
"Odlično delo!👌 Zdaj imate čist in urejen nabor podatkov, na katerem lahko zgradite svoj novi regresijski model!\n",
|
|
"\n",
|
|
"Kaj pravite na razpršeni diagram?\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": [
|
|
"Raztreseni diagram nas spomni, da imamo podatke le za mesece od avgusta do decembra. Verjetno potrebujemo več podatkov, da bi lahko sklepali na linearen način.\n",
|
|
"\n",
|
|
"Poglejmo si še enkrat naše podatke za modeliranje:\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": [
|
|
"Kaj če bi želeli napovedati `ceno` buče na podlagi stolpcev `mesto` ali `paket`, ki sta tipa znak? Ali pa še bolj preprosto, kako bi lahko našli korelacijo (ki zahteva, da sta oba njena vnosa številska) med, recimo, `paketom` in `ceno`? 🤷🤷\n",
|
|
"\n",
|
|
"Modeli strojnega učenja najbolje delujejo s številski lastnostmi namesto z besedilnimi vrednostmi, zato je običajno potrebno pretvoriti kategorijske lastnosti v številske predstavitve.\n",
|
|
"\n",
|
|
"To pomeni, da moramo najti način za preoblikovanje naših napovednih spremenljivk, da jih model lahko učinkoviteje uporabi, kar imenujemo `inženiring lastnosti`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "7hsHoxsStyjJ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. Predobdelava podatkov za modeliranje z recepti 👩🍳👨🍳\n",
|
|
"\n",
|
|
"Dejavnosti, ki preoblikujejo vrednosti napovedovalcev, da jih model lažje učinkovito uporabi, se imenujejo `inženiring značilnosti`.\n",
|
|
"\n",
|
|
"Različni modeli imajo različne zahteve glede predobdelave. Na primer, metoda najmanjših kvadratov zahteva `kodiranje kategornih spremenljivk`, kot so mesec, sorta in ime_mesta. To preprosto pomeni `pretvorbo` stolpca s `kategorničnimi vrednostmi` v enega ali več `številskih stolpcev`, ki nadomestijo izvirni stolpec.\n",
|
|
"\n",
|
|
"Na primer, predpostavimo, da vaši podatki vključujejo naslednjo kategornično značilnost:\n",
|
|
"\n",
|
|
"| mesto |\n",
|
|
"|:---------:|\n",
|
|
"| Denver |\n",
|
|
"| Nairobi |\n",
|
|
"| Tokio |\n",
|
|
"\n",
|
|
"Uporabite lahko *ordinalno kodiranje*, da vsaki kategoriji dodelite edinstveno celoštevilsko vrednost, kot je to:\n",
|
|
"\n",
|
|
"| mesto |\n",
|
|
"|:-----:|\n",
|
|
"| 0 |\n",
|
|
"| 1 |\n",
|
|
"| 2 |\n",
|
|
"\n",
|
|
"In to bomo storili s svojimi podatki!\n",
|
|
"\n",
|
|
"V tem razdelku bomo raziskali še en izjemen paket Tidymodels: [recipes](https://tidymodels.github.io/recipes/) - ki je zasnovan za pomoč pri predobdelavi podatkov **preden** treniramo model. V svojem jedru je recept objekt, ki določa, katere korake je treba uporabiti na podatkovnem naboru, da ga pripravimo za modeliranje.\n",
|
|
"\n",
|
|
"Zdaj pa ustvarimo recept, ki pripravi naše podatke za modeliranje tako, da za vse opazovanja v stolpcih napovedovalcev nadomesti edinstveno celoštevilsko vrednost:\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": [
|
|
"Super! 👏 Pravkar smo ustvarili naš prvi recept, ki določa izid (ceno) in ustrezne napovedne spremenljivke ter da morajo biti vsi stolpci napovednih spremenljivk kodirani v nabor celih števil 🙌! Hitro si poglejmo podrobnosti:\n",
|
|
"\n",
|
|
"- Klic funkcije `recipe()` s formulo pove receptu *vloge* spremenljivk, pri čemer uporablja podatke `new_pumpkins` kot referenco. Na primer, stolpec `price` je bil dodeljen vlogi `outcome` (izid), medtem ko so bili preostali stolpci dodeljeni vlogi `predictor` (napovednik).\n",
|
|
"\n",
|
|
"- `step_integer(all_predictors(), zero_based = TRUE)` določa, da morajo biti vsi napovedniki pretvorjeni v nabor celih števil, pri čemer se številčenje začne pri 0.\n",
|
|
"\n",
|
|
"Prepričani smo, da imate misli, kot so: \"To je tako kul!! Ampak kaj, če bi moral potrditi, da recepti dejansko delajo točno to, kar pričakujem? 🤔\"\n",
|
|
"\n",
|
|
"To je odlična misel! Vidite, ko je vaš recept definiran, lahko ocenite parametre, potrebne za dejansko predobdelavo podatkov, in nato pridobite obdelane podatke. Tega običajno ne potrebujete, ko uporabljate Tidymodels (v trenutku bomo videli običajno prakso -> `workflows`), vendar je to lahko koristno, ko želite narediti nekakšen pregled za potrditev, da recepti delajo, kar pričakujete.\n",
|
|
"\n",
|
|
"Za to boste potrebovali še dva glagola: `prep()` in `bake()`, in kot vedno, vam naši mali R prijatelji, ki jih je ustvarila [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations), pomagajo bolje razumeti to temo!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/recipes.png\"\n",
|
|
" width=\"550\"/>\n",
|
|
" <figcaption>Umetniško delo @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"550\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "KEiO0v7kuC9O"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"[`prep()`](https://recipes.tidymodels.org/reference/prep.html): oceni potrebne parametre iz učnega nabora, ki jih je mogoče kasneje uporabiti na drugih podatkovnih naborih. Na primer, za določen stolpec napovednika, kateremu opazovanju bo dodeljena cela števila 0, 1, 2 itd.\n",
|
|
"\n",
|
|
"[`bake()`](https://recipes.tidymodels.org/reference/bake.html): vzame pripravljeni recept in uporabi operacije na katerem koli podatkovnem naboru.\n",
|
|
"\n",
|
|
"Torej, pripravimo in uporabimo naše recepte, da resnično potrdimo, da bodo stolpci napovednikov v ozadju najprej kodirani, preden se model prilega.\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!🥳 Obdelani podatki `baked_pumpkins` imajo vse napovedne spremenljivke kodirane, kar potrjuje, da bodo koraki predobdelave, opredeljeni kot naš recept, delovali po pričakovanjih. To sicer otežuje branje, a je veliko bolj razumljivo za Tidymodels! Vzemite si čas, da ugotovite, katera opazovanja so bila preslikana v ustrezne celoštevilske vrednosti.\n",
|
|
"\n",
|
|
"Prav tako je vredno omeniti, da je `baked_pumpkins` podatkovni okvir, na katerem lahko izvajamo izračune.\n",
|
|
"\n",
|
|
"Na primer, poskusimo najti dobro korelacijo med dvema točkama vaših podatkov, da bi potencialno zgradili dober napovedni model. Za to bomo uporabili funkcijo `cor()`. Vnesite `?cor()`, da izveste več o funkciji.\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": [
|
|
"Kot se izkaže, obstaja le šibka povezava med mestom in ceno. Vendar pa je nekoliko boljša povezava med paketom in njegovo ceno. To ima smisel, kajne? Običajno velja, da večja kot je škatla s pridelki, višja je cena.\n",
|
|
"\n",
|
|
"Medtem pa poskusimo vizualizirati tudi korelacijsko matriko vseh stolpcev z uporabo paketa `corrplot`.\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": [
|
|
"🤩🤩 Veliko bolje.\n",
|
|
"\n",
|
|
"Dobro vprašanje, ki si ga lahko zdaj zastavimo glede teh podatkov, je: '`Kakšno ceno lahko pričakujem za določen paket buč?`' Pojdimo kar takoj k stvari!\n",
|
|
"\n",
|
|
"> Opomba: Ko **`bake()`** uporabite na pripravljenem receptu **`pumpkins_prep`** z **`new_data = NULL`**, pridobite obdelane (tj. kodirane) podatke za učenje. Če bi imeli drug nabor podatkov, na primer testni nabor, in bi želeli videti, kako bi recept predhodno obdelal te podatke, bi preprosto uporabili **`bake`** na **`pumpkins_prep`** z **`new_data = test_set`**.\n",
|
|
"\n",
|
|
"## 4. Izdelava modela linearne regresije\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografika avtorja Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YqXjLuWavNxW"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Zdaj, ko smo sestavili recept in dejansko potrdili, da bodo podatki ustrezno predobdelani, bomo zgradili regresijski model, da odgovorimo na vprašanje: `Kakšno ceno lahko pričakujem za določen paket buč?`\n",
|
|
"\n",
|
|
"#### Učenje linearnega regresijskega modela z uporabo učnega nabora\n",
|
|
"\n",
|
|
"Kot ste verjetno že ugotovili, je stolpec *price* `izhodna` spremenljivka, medtem ko je stolpec *package* `napovedna` spremenljivka.\n",
|
|
"\n",
|
|
"Za to bomo najprej razdelili podatke tako, da bo 80 % šlo v učni nabor in 20 % v testni nabor, nato pa definirali recept, ki bo kodiral napovedni stolpec v niz celih števil, in zgradili specifikacijo modela. Recepta ne bomo pripravili in uporabili, saj že vemo, da bo podatke predobdelal, kot je pričakovano.\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": [
|
|
"Odlično! Zdaj, ko imamo recept in specifikacijo modela, moramo najti način, kako ju združiti v objekt, ki bo najprej predobdelal podatke (v ozadju prep+bake), nato prilegal model na predobdelane podatke in omogočal tudi morebitne aktivnosti po obdelavi. Kako ti je to všeč za mirno vest!🤩\n",
|
|
"\n",
|
|
"V Tidymodels se ta priročen objekt imenuje [`workflow`](https://workflows.tidymodels.org/) in priročno združuje tvoje komponente modeliranja! To je tisto, kar bi v *Pythonu* imenovali *pipelines*.\n",
|
|
"\n",
|
|
"Torej, združimo vse skupaj v workflow!📦\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": [
|
|
"Poleg tega je mogoče potek dela prilagoditi/usposobiti na zelo podoben način, kot se lahko model.\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": [
|
|
"Iz modelnega izhoda lahko vidimo koeficiente, pridobljene med učenjem. Ti predstavljajo koeficiente premice najboljše prileganja, ki nam daje najnižjo skupno napako med dejansko in napovedano spremenljivko.\n",
|
|
"\n",
|
|
"#### Ocenjevanje uspešnosti modela z uporabo testnega nabora\n",
|
|
"\n",
|
|
"Čas je, da preverimo, kako se je model odrezal 📏! Kako to storimo?\n",
|
|
"\n",
|
|
"Zdaj, ko smo model naučili, ga lahko uporabimo za napovedovanje na testnem_naboru z uporabo `parsnip::predict()`. Nato lahko te napovedi primerjamo z dejanskimi vrednostmi oznak, da ocenimo, kako dobro (ali ne!) model deluje.\n",
|
|
"\n",
|
|
"Začnimo z izdelavo napovedi za testni nabor in nato združimo stolpce s testnim naborom.\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": [
|
|
"Da, pravkar ste trenirali model in ga uporabili za napovedovanje! 🔮 Je dober? Poglejmo, kako dobro deluje model!\n",
|
|
"\n",
|
|
"V Tidymodels to naredimo z uporabo `yardstick::metrics()`! Pri linearni regresiji se osredotočimo na naslednje metrike:\n",
|
|
"\n",
|
|
"- `Root Mean Square Error (RMSE)`: Kvadratni koren [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). To daje absolutno metriko v isti enoti kot oznaka (v tem primeru cena buče). Manjša kot je vrednost, boljši je model (v preprostem smislu predstavlja povprečno ceno, za katero so napovedi napačne!).\n",
|
|
"\n",
|
|
"- `Coefficient of Determination (običajno znan kot R-squared ali R2)`: Relativna metrika, pri kateri višja vrednost pomeni boljše prileganje modela. V bistvu ta metrika predstavlja, koliko variance med napovedanimi in dejanskimi vrednostmi oznak model lahko pojasni.\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": [
|
|
"Tam gre uspešnost modela. Poglejmo, ali lahko dobimo boljšo indikacijo z vizualizacijo razpršenega grafa paketa in cene, nato pa uporabimo napovedi za dodajanje črte najboljše prileganje.\n",
|
|
"\n",
|
|
"To pomeni, da bomo morali pripraviti in obdelati testni niz, da kodiramo stolpec paketa, nato pa to povežemo z napovedmi, ki jih je ustvaril naš model.\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": [
|
|
"Odlično! Kot lahko vidiš, linearni regresijski model ne posploši najbolje odnosa med paketom in njegovo ustrezno ceno.\n",
|
|
"\n",
|
|
"🎃 Čestitke, pravkar si ustvaril model, ki lahko pomaga napovedati ceno nekaj vrst buč. Tvoja praznična bučna njiva bo čudovita. Ampak verjetno lahko ustvariš še boljši model!\n",
|
|
"\n",
|
|
"## 5. Ustvari polinomski regresijski model\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "HOCqJXLTwtWI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Včasih naši podatki morda nimajo linearne povezave, vendar še vedno želimo napovedati rezultat. Polinomska regresija nam lahko pomaga pri napovedovanju bolj zapletenih nelinearnih povezav.\n",
|
|
"\n",
|
|
"Vzemimo na primer povezavo med embalažo in ceno v našem naboru podatkov o bučah. Čeprav je včasih med spremenljivkami linearna povezava - večja kot je buča po volumnu, višja je cena - te povezave včasih ni mogoče prikazati kot ravnino ali ravno črto.\n",
|
|
"\n",
|
|
"> ✅ Tukaj so [nekateri dodatni primeri](https://online.stat.psu.edu/stat501/lesson/9/9.8) podatkov, ki bi lahko uporabili polinomsko regresijo\n",
|
|
">\n",
|
|
"> Ponovno si oglejte povezavo med sorto in ceno na prejšnjem grafu. Ali se vam zdi, da bi moral ta raztros nujno analizirati z ravno črto? Morda ne. V tem primeru lahko poskusite polinomsko regresijo.\n",
|
|
">\n",
|
|
"> ✅ Polinomi so matematični izrazi, ki lahko vsebujejo eno ali več spremenljivk in koeficientov\n",
|
|
"\n",
|
|
"#### Učimo polinomski regresijski model z uporabo učnega nabora\n",
|
|
"\n",
|
|
"Polinomska regresija ustvari *ukrivljeno črto*, ki bolje ustreza nelinearnim podatkom.\n",
|
|
"\n",
|
|
"Poglejmo, ali bo polinomski model boljši pri napovedovanju. Sledili bomo nekoliko podobnemu postopku kot prej:\n",
|
|
"\n",
|
|
"- Ustvarite recept, ki določa korake predobdelave, ki jih je treba izvesti na naših podatkih, da jih pripravimo za modeliranje, tj. kodiranje napovedovalcev in izračunavanje polinomov stopnje *n*\n",
|
|
"\n",
|
|
"- Zgradite specifikacijo modela\n",
|
|
"\n",
|
|
"- Združite recept in specifikacijo modela v delovni tok\n",
|
|
"\n",
|
|
"- Ustvarite model z ujemanjem delovnega toka\n",
|
|
"\n",
|
|
"- Ocenite, kako dobro model deluje na testnih podatkih\n",
|
|
"\n",
|
|
"Pojdimo kar v akcijo!\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": [
|
|
"#### Ocenjevanje zmogljivosti modela\n",
|
|
"\n",
|
|
"👏👏 Ustvarili ste polinomski model, zdaj pa naredimo napovedi na testnem naboru!\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": [
|
|
"Juhu, ocenimo, kako se je model odrezal na testnem naboru z uporabo `yardstick::metrics()`.\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": [
|
|
"🤩🤩 Veliko boljša zmogljivost.\n",
|
|
"\n",
|
|
"`rmse` se je zmanjšal s približno 7 na približno 3, kar kaže na zmanjšano napako med dejansko ceno in napovedano ceno. To lahko *približno* interpretiramo kot povprečno napako napovedi, ki znaša približno 3 USD. `rsq` se je povečal s približno 0,4 na 0,8.\n",
|
|
"\n",
|
|
"Vse te metrike kažejo, da polinomski model deluje veliko bolje kot linearni model. Odlično delo!\n",
|
|
"\n",
|
|
"Poglejmo, ali lahko to vizualiziramo!\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": [
|
|
"Lahko vidite ukrivljeno črto, ki se bolje prilega vašim podatkom! 🤩\n",
|
|
"\n",
|
|
"To lahko naredite še bolj gladko, če podate polinomsko formulo funkciji `geom_smooth`, kot to:\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": [
|
|
"Tako kot gladka krivulja!🤩\n",
|
|
"\n",
|
|
"Tukaj je, kako bi naredili novo napoved:\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": [
|
|
"Napoved modela `polynomial` je smiselna, glede na razpršene grafe `price` in `package`! In, če je to boljši model kot prejšnji, ob pogledu na iste podatke, morate načrtovati proračun za te dražje buče!\n",
|
|
"\n",
|
|
"🏆 Odlično opravljeno! Ustvarili ste dva regresijska modela v eni lekciji. V zadnjem delu o regresiji se boste naučili o logistični regresiji za določanje kategorij.\n",
|
|
"\n",
|
|
"## **🚀Izziv**\n",
|
|
"\n",
|
|
"Preizkusite več različnih spremenljivk v tej beležki, da vidite, kako korelacija vpliva na natančnost modela.\n",
|
|
"\n",
|
|
"## [**Kvizi po predavanju**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
|
|
"\n",
|
|
"## **Pregled in samostojno učenje**\n",
|
|
"\n",
|
|
"V tej lekciji smo se naučili o linearni regresiji. Obstajajo tudi druge pomembne vrste regresije. Preberite o tehnikah Stepwise, Ridge, Lasso in Elasticnet. Dober tečaj za poglobljeno učenje je [Stanfordov tečaj statističnega učenja](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n",
|
|
"\n",
|
|
"Če želite izvedeti več o uporabi izjemnega okvira Tidymodels, si oglejte naslednje vire:\n",
|
|
"\n",
|
|
"- Spletna stran Tidymodels: [Začnite z Tidymodels](https://www.tidymodels.org/start/)\n",
|
|
"\n",
|
|
"- Max Kuhn in Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
|
|
"\n",
|
|
"###### **POSEBNA ZAHVALA:**\n",
|
|
"\n",
|
|
"[Allison Horst](https://twitter.com/allison_horst?lang=en) za ustvarjanje izjemnih ilustracij, ki naredijo R bolj prijazen in privlačen. Več ilustracij najdete v njeni [galeriji](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n"
|
|
],
|
|
"metadata": {
|
|
"id": "8zOLOWqMxzk5"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n"
|
|
]
|
|
}
|
|
]
|
|
} |