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-04T06:35:56+00:00",
|
|
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
|
|
"language_code": "hr"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "EgQw8osnsUV-"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Linearna i Polinomna Regresija za Određivanje Cijena Bundeva - 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 sada ste istražili što je regresija koristeći uzorke podataka prikupljenih iz skupa podataka o cijenama bundeva, koji ćemo koristiti tijekom ove lekcije. Također ste ih vizualizirali pomoću `ggplot2`. 💪\n",
|
|
"\n",
|
|
"Sada ste spremni dublje zaroniti u regresiju za strojno učenje. U ovoj lekciji naučit ćete više o dvije vrste regresije: *osnovnoj linearnoj regresiji* i *polinomnoj regresiji*, zajedno s nekim matematičkim osnovama ovih tehnika.\n",
|
|
"\n",
|
|
"> Tijekom ovog kurikuluma pretpostavljamo minimalno matematičko predznanje i nastojimo ga učiniti pristupačnim za studente iz drugih područja, pa obratite pažnju na bilješke, 🧮 napomene, dijagrame i druge alate za učenje koji će vam pomoći u razumijevanju.\n",
|
|
"\n",
|
|
"#### Priprema\n",
|
|
"\n",
|
|
"Podsjetnik: učitavate ove podatke kako biste mogli postavljati pitanja o njima.\n",
|
|
"\n",
|
|
"- Kada je najbolje vrijeme za kupnju bundeva?\n",
|
|
"\n",
|
|
"- Koju cijenu mogu očekivati za kutiju minijaturnih bundeva?\n",
|
|
"\n",
|
|
"- Trebam li ih kupiti u košarama od pola bušela ili u kutijama od 1 1/9 bušela? Nastavimo istraživati ove podatke.\n",
|
|
"\n",
|
|
"U prethodnoj lekciji kreirali ste `tibble` (modernu reinterpretaciju okvira podataka) i popunili ga dijelom izvornog skupa podataka, standardizirajući cijene prema bušelu. Međutim, na taj način uspjeli ste prikupiti samo oko 400 podataka i to samo za jesenske mjesece. Možda možemo dobiti malo više detalja o prirodi podataka ako ih dodatno očistimo? Vidjet ćemo... 🕵️♀️\n",
|
|
"\n",
|
|
"Za ovaj zadatak trebat će nam sljedeći paketi:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka R paketa](https://www.tidyverse.org/packages) osmišljena kako bi znanost o podacima bila brža, lakša i zabavnija!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) okvir je [zbirka paketa](https://www.tidymodels.org/packages/) za modeliranje i strojno učenje.\n",
|
|
"\n",
|
|
"- `janitor`: [janitor paket](https://github.com/sfirke/janitor) pruža jednostavne alate za pregled i čišćenje neurednih podataka.\n",
|
|
"\n",
|
|
"- `corrplot`: [corrplot paket](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) nudi vizualni alat za istraživanje korelacijskih matrica koji podržava automatsko preuređivanje varijabli kako bi se otkrili skriveni obrasci među varijablama.\n",
|
|
"\n",
|
|
"Možete ih instalirati pomoću:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
|
|
"\n",
|
|
"Skripta ispod provjerava imate li instalirane potrebne pakete za dovršetak ovog modula i instalira ih za vas ako nedostaju.\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": [
|
|
"Kasnije ćemo učitati ove sjajne pakete i učiniti ih dostupnima u našoj trenutnoj R sesiji. (Ovo je samo za ilustraciju, `pacman::p_load()` je to već učinio za vas)\n",
|
|
"\n",
|
|
"## 1. Linija linearne regresije\n",
|
|
"\n",
|
|
"Kao što ste naučili u Lekciji 1, cilj vježbe linearne regresije je moći nacrtati *liniju* *najboljeg* *prilagođavanja* kako bi se:\n",
|
|
"\n",
|
|
"- **Prikazali odnosi između varijabli**. Prikazali odnos između varijabli.\n",
|
|
"\n",
|
|
"- **Napravile predikcije**. Napravile točne predikcije o tome gdje bi novi podatkovni točkasti element mogao pasti u odnosu na tu liniju.\n",
|
|
"\n",
|
|
"Za crtanje ove vrste linije koristimo statističku tehniku zvanu **Regresija najmanjih kvadrata**. Pojam `najmanji kvadrati` znači da su sve podatkovne točke oko regresijske linije kvadrirane i zatim zbrojene. Idealno, taj konačni zbroj je što manji, jer želimo mali broj pogrešaka, odnosno `najmanje kvadrate`. Kao takva, linija najboljeg prilagođavanja je linija koja nam daje najnižu vrijednost za zbroj kvadriranih pogrešaka - otuda naziv *regresija najmanjih kvadrata*.\n",
|
|
"\n",
|
|
"To radimo jer želimo modelirati liniju koja ima najmanju kumulativnu udaljenost od svih naših podatkovnih točaka. Također kvadriramo članove prije zbrajanja jer nas zanima njihova veličina, a ne smjer.\n",
|
|
"\n",
|
|
"> **🧮 Pokaži mi matematiku**\n",
|
|
">\n",
|
|
"> Ova linija, nazvana *linija najboljeg prilagođavanja*, može se izraziti [jednadžbom](https://en.wikipedia.org/wiki/Simple_linear_regression):\n",
|
|
">\n",
|
|
"> Y = a + bX\n",
|
|
">\n",
|
|
"> `X` je '`objašnjavajuća varijabla` ili `prediktor`'. `Y` je '`ovisna varijabla` ili `ishod`'. Nagib linije je `b`, a `a` je presjek na osi y, koji se odnosi na vrijednost `Y` kada je `X = 0`.\n",
|
|
">\n",
|
|
"\n",
|
|
"> \n",
|
|
" Infografika: Jen Looper\n",
|
|
">\n",
|
|
"> Prvo, izračunajte nagib `b`.\n",
|
|
">\n",
|
|
"> Drugim riječima, i referirajući se na originalno pitanje o podacima o bundevama: \"predvidite cijenu bundeve po bušelu prema mjesecu\", `X` bi se odnosio na cijenu, a `Y` na mjesec prodaje.\n",
|
|
">\n",
|
|
"> \n",
|
|
" Infografika: Jen Looper\n",
|
|
"> \n",
|
|
"> Izračunajte vrijednost Y. Ako plaćate oko 4 dolara, mora da je travanj!\n",
|
|
">\n",
|
|
"> Matematika koja izračunava liniju mora pokazati nagib linije, koji također ovisi o presjeku, odnosno gdje se `Y` nalazi kada je `X = 0`.\n",
|
|
">\n",
|
|
"> Metodu izračuna ovih vrijednosti možete vidjeti na web stranici [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Također posjetite [ovaj kalkulator najmanjih kvadrata](https://www.mathsisfun.com/data/least-squares-calculator.html) kako biste vidjeli kako vrijednosti brojeva utječu na liniju.\n",
|
|
"\n",
|
|
"Nije tako strašno, zar ne? 🤓\n",
|
|
"\n",
|
|
"#### Korelacija\n",
|
|
"\n",
|
|
"Još jedan pojam koji treba razumjeti je **Koeficijent korelacije** između danih X i Y varijabli. Koristeći dijagram raspršenja, možete brzo vizualizirati ovaj koeficijent. Dijagram s podatkovnim točkama uredno raspoređenim u liniji ima visoku korelaciju, dok dijagram s podatkovnim točkama razbacanim svuda između X i Y ima nisku korelaciju.\n",
|
|
"\n",
|
|
"Dobar model linearne regresije bit će onaj koji ima visok (bliži 1 nego 0) Koeficijent korelacije koristeći metodu Regresije najmanjih kvadrata s regresijskom linijom.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "cdX5FRpvsoP5"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **2. Ples s podacima: stvaranje podatkovnog okvira za modeliranje**\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/janitor.jpg\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption>Ilustracija: @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"700\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WdUKXk7Bs8-V"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Učitajte potrebne biblioteke i skup podataka. Pretvorite podatke u podatkovni okvir koji sadrži podskup podataka:\n",
|
|
"\n",
|
|
"- Uzmite samo bundeve čija je cijena izražena po bušelu\n",
|
|
"\n",
|
|
"- Pretvorite datum u mjesec\n",
|
|
"\n",
|
|
"- Izračunajte cijenu kao prosjek visokih i niskih cijena\n",
|
|
"\n",
|
|
"- Pretvorite cijenu tako da odražava cijenu po količini bušela\n",
|
|
"\n",
|
|
"> Ove korake smo obradili u [prethodnoj 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": [
|
|
"U duhu čiste avanture, istražimo [`janitor package`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) koji pruža jednostavne funkcije za pregled i čišćenje neurednih podataka. Na primjer, pogledajmo nazive stupaca 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": [
|
|
"🤔 Možemo bolje. Hajdemo napraviti ove nazive stupaca `friendR` tako da ih pretvorimo u [snake_case](https://en.wikipedia.org/wiki/Snake_case) konvenciju koristeći `janitor::clean_names`. Za više informacija o ovoj 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": [
|
|
"Puno tidyR-a 🧹! Sada, ples s podacima koristeći `dplyr` kao u prethodnoj 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": [
|
|
"Dobar posao! 👌 Sada imate čist i uredan skup podataka na kojem možete izgraditi svoj novi regresijski model!\n",
|
|
"\n",
|
|
"Što kažete na scatter plot?\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": [
|
|
"Raspršeni graf nas podsjeća da imamo podatke o mjesecima samo od kolovoza do prosinca. Vjerojatno nam treba više podataka kako bismo mogli donositi zaključke na linearan način.\n",
|
|
"\n",
|
|
"Pogledajmo ponovno 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": [
|
|
"Što ako bismo željeli predvidjeti `cijenu` bundeve na temelju stupaca `grad` ili `paket`, koji su tipa znakova? Ili još jednostavnije, kako bismo mogli pronaći korelaciju (koja zahtijeva da oba ulaza budu numerička) između, recimo, `paket` i `cijena`? 🤷🤷\n",
|
|
"\n",
|
|
"Modeli strojnog učenja najbolje funkcioniraju s numeričkim značajkama, a ne tekstualnim vrijednostima, pa je općenito potrebno pretvoriti kategorijske značajke u numeričke reprezentacije.\n",
|
|
"\n",
|
|
"To znači da moramo pronaći način za preoblikovanje naših prediktora kako bismo ih učinili lakšima za učinkovito korištenje modela, proces poznat kao `inženjering značajki`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "7hsHoxsStyjJ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. Predprocesiranje podataka za modeliranje s recipes 👩🍳👨🍳\n",
|
|
"\n",
|
|
"Aktivnosti koje preoblikuju vrijednosti prediktora kako bi ih model mogao učinkovitije koristiti nazivaju se `inženjering značajki`.\n",
|
|
"\n",
|
|
"Različiti modeli imaju različite zahtjeve za predprocesiranje. Na primjer, metoda najmanjih kvadrata zahtijeva `kodiranje kategorijalnih varijabli` poput mjeseca, sorte i city_name. To jednostavno uključuje `prevođenje` stupca s `kategorijalnim vrijednostima` u jedan ili više `numeričkih stupaca` koji zamjenjuju originalni.\n",
|
|
"\n",
|
|
"Na primjer, pretpostavimo da vaši podaci uključuju sljedeću kategorijalnu značajku:\n",
|
|
"\n",
|
|
"| grad |\n",
|
|
"|:-------:|\n",
|
|
"| Denver |\n",
|
|
"| Nairobi |\n",
|
|
"| Tokio |\n",
|
|
"\n",
|
|
"Možete primijeniti *ordinalno kodiranje* kako biste zamijenili svaku kategoriju jedinstvenom cjelobrojnom vrijednošću, ovako:\n",
|
|
"\n",
|
|
"| grad |\n",
|
|
"|:----:|\n",
|
|
"| 0 |\n",
|
|
"| 1 |\n",
|
|
"| 2 |\n",
|
|
"\n",
|
|
"I upravo to ćemo učiniti s našim podacima!\n",
|
|
"\n",
|
|
"U ovom dijelu istražit ćemo još jedan fantastičan Tidymodels paket: [recipes](https://tidymodels.github.io/recipes/) - koji je osmišljen kako bi vam pomogao u predprocesiranju podataka **prije** treniranja vašeg modela. U svojoj srži, recept je objekt koji definira koje korake treba primijeniti na skup podataka kako bi bio spreman za modeliranje.\n",
|
|
"\n",
|
|
"Sada, kreirajmo recept koji priprema naše podatke za modeliranje zamjenom jedinstvenog cijelog broja za sve opažanja u stupcima prediktora:\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": [
|
|
"Sjajno! 👏 Upravo smo kreirali naš prvi recept koji specificira ishod (cijenu) i odgovarajuće prediktore te da svi stupci prediktora trebaju biti kodirani u skup cijelih brojeva 🙌! Hajdemo to brzo razložiti:\n",
|
|
"\n",
|
|
"- Poziv funkcije `recipe()` s formulom govori receptu *uloge* varijabli koristeći podatke `new_pumpkins` kao referencu. Na primjer, stupac `price` dodijeljen je ulozi `outcome`, dok su ostali stupci dodijeljeni ulozi `predictor`.\n",
|
|
"\n",
|
|
"- `step_integer(all_predictors(), zero_based = TRUE)` specificira da svi prediktori trebaju biti pretvoreni u skup cijelih brojeva, pri čemu numeriranje počinje od 0.\n",
|
|
"\n",
|
|
"Sigurni smo da možda razmišljate nešto poput: \"Ovo je tako super!! Ali što ako trebam potvrditi da recepti rade točno ono što očekujem? 🤔\"\n",
|
|
"\n",
|
|
"To je sjajna misao! Vidite, jednom kada definirate svoj recept, možete procijeniti parametre potrebne za stvarnu predobradu podataka, a zatim izvući obrađene podatke. Obično to ne trebate raditi kada koristite Tidymodels (vidjet ćemo uobičajenu konvenciju za trenutak -\\> `workflows`), ali može biti korisno kada želite napraviti neku vrstu provjere kako biste potvrdili da recepti rade ono što očekujete.\n",
|
|
"\n",
|
|
"Za to će vam trebati još dva glagola: `prep()` i `bake()`, a kao i uvijek, naši mali R prijatelji od strane [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) pomoći će vam da to bolje razumijete!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/recipes.png\"\n",
|
|
" width=\"550\"/>\n",
|
|
" <figcaption>Ilustracija @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"550\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "KEiO0v7kuC9O"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"[`prep()`](https://recipes.tidymodels.org/reference/prep.html): procjenjuje potrebne parametre iz skupa za treniranje koji se kasnije mogu primijeniti na druge skupove podataka. Na primjer, za određeni stupac prediktora, koja će se opažanja dodijeliti kao cijeli broj 0, 1, 2 itd.\n",
|
|
"\n",
|
|
"[`bake()`](https://recipes.tidymodels.org/reference/bake.html): uzima pripremljeni recept i primjenjuje operacije na bilo koji skup podataka.\n",
|
|
"\n",
|
|
"Dakle, pripremimo i primijenimo naše recepte kako bismo zaista potvrdili da će se stupci prediktora prvo kodirati prije nego što se model prilagodi.\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!🥳 Obradeni podaci `baked_pumpkins` imaju sve prediktore kodirane, što potvrđuje da će koraci predobrade definirani kao naš recept funkcionirati kako je očekivano. To ih čini teže čitljivima za vas, ali mnogo razumljivijima za Tidymodels! Odvojite malo vremena da otkrijete koja je opažanja mapirana na odgovarajući cijeli broj.\n",
|
|
"\n",
|
|
"Također je vrijedno spomenuti da je `baked_pumpkins` podatkovni okvir na kojem možemo provoditi izračune.\n",
|
|
"\n",
|
|
"Primjerice, pokušajmo pronaći dobru korelaciju između dvije točke vaših podataka kako bismo potencijalno izgradili dobar prediktivni model. Koristit ćemo funkciju `cor()` za to. Upišite `?cor()` kako biste saznali više 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": [
|
|
"Kako se ispostavilo, postoji samo slaba povezanost između Grada i Cijene. Međutim, postoji nešto bolja povezanost između Paketa i njegove Cijene. To ima smisla, zar ne? Obično, što je veća kutija proizvoda, to je viša cijena.\n",
|
|
"\n",
|
|
"Dok smo na toj temi, pokušajmo također vizualizirati matricu korelacije svih stupaca koristeći paket `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": [
|
|
"🤩🤩 Puno bolje.\n",
|
|
"\n",
|
|
"Dobro pitanje koje sada možemo postaviti o ovim podacima je: '`Koju cijenu mogu očekivati za određeni paket bundeva?`' Idemo odmah na to!\n",
|
|
"\n",
|
|
"> Napomena: Kada **`bake()`** pripremljeni recept **`pumpkins_prep`** s **`new_data = NULL`**, dobivate obrađene (tj. kodirane) podatke za treniranje. Ako imate drugi skup podataka, primjerice testni skup, i želite vidjeti kako bi recept obradio te podatke, jednostavno biste ispekli **`pumpkins_prep`** s **`new_data = test_set`**.\n",
|
|
"\n",
|
|
"## 4. Izgradnja modela linearne regresije\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografika od Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YqXjLuWavNxW"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sada kada smo izradili recept i zapravo potvrdili da će podaci biti pravilno predobrađeni, izgradimo regresijski model kako bismo odgovorili na pitanje: `Koju cijenu mogu očekivati za određeni paket bundeve?`\n",
|
|
"\n",
|
|
"#### Treniranje linearnog regresijskog modela koristeći skup za treniranje\n",
|
|
"\n",
|
|
"Kao što ste možda već zaključili, stupac *price* je `izlazna` varijabla, dok je stupac *package* `prediktorska` varijabla.\n",
|
|
"\n",
|
|
"Da bismo to postigli, prvo ćemo podijeliti podatke tako da 80% ide u skup za treniranje, a 20% u testni skup. Zatim ćemo definirati recept koji će kodirati prediktorski stupac u niz cijelih brojeva, a potom izraditi specifikaciju modela. Nećemo pripremati i peći naš recept jer već znamo da će pravilno predobraditi podatke.\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": [
|
|
"Bravo! Sada kada imamo recept i specifikaciju modela, trebamo pronaći način da ih spojimo u objekt koji će prvo unaprijed obraditi podatke (prep+bake iza kulisa), prilagoditi model na unaprijed obrađenim podacima i također omogućiti potencijalne aktivnosti post-obrade. Kako ti se to čini za mir u duši!🤩\n",
|
|
"\n",
|
|
"U Tidymodels-u, ovaj praktični objekt zove se [`workflow`](https://workflows.tidymodels.org/) i zgodno drži tvoje komponente modeliranja! Ovo bismo nazvali *pipelines* u *Pythonu*.\n",
|
|
"\n",
|
|
"Dakle, hajdemo sve spojiti u 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": [
|
|
"Uz to, tijek rada može se prilagoditi/trenirati na gotovo isti način kao i 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 modela možemo vidjeti koeficijente naučene tijekom treniranja. Oni predstavljaju koeficijente pravca najbolje prilagodbe koji nam daje najmanju ukupnu pogrešku između stvarne i predviđene varijable.\n",
|
|
"\n",
|
|
"#### Procjena performansi modela pomoću testnog skupa\n",
|
|
"\n",
|
|
"Vrijeme je da vidimo kako se model pokazao 📏! Kako to možemo učiniti?\n",
|
|
"\n",
|
|
"Sada kada smo istrenirali model, možemo ga koristiti za predviđanja na testnom_skupu koristeći `parsnip::predict()`. Zatim možemo usporediti ta predviđanja sa stvarnim vrijednostima oznaka kako bismo procijenili koliko dobro (ili ne!) model funkcionira.\n",
|
|
"\n",
|
|
"Krenimo s izradom predviđanja za testni skup, a zatim spojimo stupce s testnim skupom.\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, upravo ste trenirali model i koristili ga za predviđanja!🔮 Je li dobar? Hajdemo procijeniti izvedbu modela!\n",
|
|
"\n",
|
|
"U Tidymodels-u to radimo pomoću `yardstick::metrics()`! Za linearnu regresiju, usredotočimo se na sljedeće metrike:\n",
|
|
"\n",
|
|
"- `Root Mean Square Error (RMSE)`: Kvadratni korijen [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). Ovo daje apsolutnu metriku u istoj jedinici kao i oznaka (u ovom slučaju, cijena bundeve). Što je manja vrijednost, to je model bolji (u pojednostavljenom smislu, predstavlja prosječnu cijenu za koju su predviđanja pogrešna!).\n",
|
|
"\n",
|
|
"- `Coefficient of Determination (obično poznat kao R-squared ili R2)`: Relativna metrika u kojoj je veća vrijednost bolja za prilagodbu modela. U suštini, ova metrika predstavlja koliko varijance između predviđenih i stvarnih vrijednosti oznake model može objasniti.\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": [
|
|
"Evo kako izgleda izvedba modela. Pogledajmo možemo li dobiti bolji uvid vizualizacijom raspršenog dijagrama paketa i cijene, a zatim koristiti predviđanja za dodavanje linije najboljeg pristajanja.\n",
|
|
"\n",
|
|
"To znači da ćemo morati pripremiti i obraditi testni skup kako bismo kodirali stupac paketa, a zatim ga povezati s predviđanjima našeg modela.\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": [
|
|
"Super! Kao što možete vidjeti, model linearne regresije ne generalizira baš dobro odnos između paketa i njegove odgovarajuće cijene.\n",
|
|
"\n",
|
|
"🎃 Čestitamo, upravo ste stvorili model koji može pomoći u predviđanju cijene nekoliko vrsta bundeva. Vaš blagdanski vrt s bundevama bit će prekrasan. No, vjerojatno možete stvoriti još bolji model!\n",
|
|
"\n",
|
|
"## 5. Izgradite model polinomne regresije\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": [
|
|
"Ponekad naši podaci možda nemaju linearni odnos, ali i dalje želimo predvidjeti ishod. Polinomna regresija može nam pomoći u predviđanju složenijih nelinearnih odnosa.\n",
|
|
"\n",
|
|
"Uzmimo za primjer odnos između paketa i cijene u našem skupu podataka o bundevama. Iako ponekad postoji linearni odnos između varijabli - što je bundeva veća po volumenu, to je cijena viša - ponekad se ti odnosi ne mogu prikazati kao ravnina ili ravna linija.\n",
|
|
"\n",
|
|
"> ✅ Evo [nekoliko dodatnih primjera](https://online.stat.psu.edu/stat501/lesson/9/9.8) podataka koji bi mogli koristiti polinomnu regresiju\n",
|
|
">\n",
|
|
"> Pogledajte ponovno odnos između sorte i cijene na prethodnom grafu. Čini li se da bi ovaj dijagram raspršenja nužno trebao biti analiziran ravnom linijom? Možda ne. U tom slučaju možete pokušati s polinomnom regresijom.\n",
|
|
">\n",
|
|
"> ✅ Polinomi su matematički izrazi koji mogu sadržavati jednu ili više varijabli i koeficijenata\n",
|
|
"\n",
|
|
"#### Trenirajte model polinomne regresije koristeći skup za treniranje\n",
|
|
"\n",
|
|
"Polinomna regresija stvara *zakrivljenu liniju* kako bi bolje odgovarala nelinijarnim podacima.\n",
|
|
"\n",
|
|
"Pogledajmo hoće li polinomni model bolje predviđati rezultate. Slijedit ćemo postupak sličan onome koji smo koristili ranije:\n",
|
|
"\n",
|
|
"- Kreirajte recept koji specificira korake predobrade koje treba provesti na našim podacima kako bi bili spremni za modeliranje, tj. kodiranje prediktora i izračunavanje polinoma stupnja *n*\n",
|
|
"\n",
|
|
"- Izradite specifikaciju modela\n",
|
|
"\n",
|
|
"- Spojite recept i specifikaciju modela u tijek rada\n",
|
|
"\n",
|
|
"- Kreirajte model prilagođavanjem tijeka rada\n",
|
|
"\n",
|
|
"- Procijenite koliko dobro model radi na testnim podacima\n",
|
|
"\n",
|
|
"Krenimo odmah!\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": [
|
|
"#### Procjena performansi modela\n",
|
|
"\n",
|
|
"👏👏Izradili ste polinomni model, hajde da napravimo predikcije na testnom skupu!\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, hajdemo procijeniti kako se model pokazao na testnom skupu koristeći `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": [
|
|
"🤩🤩 Mnogo bolja izvedba.\n",
|
|
"\n",
|
|
"`rmse` se smanjio s otprilike 7 na otprilike 3, što ukazuje na smanjenu pogrešku između stvarne cijene i predviđene cijene. Ovo možete *približno* protumačiti kao da su, u prosjeku, netočne prognoze pogrešne za oko 3 USD. `rsq` se povećao s otprilike 0.4 na 0.8.\n",
|
|
"\n",
|
|
"Svi ovi pokazatelji ukazuju na to da polinomni model radi puno bolje od linearnog modela. Odlično obavljeno!\n",
|
|
"\n",
|
|
"Pogledajmo možemo li to vizualizirati!\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": [
|
|
"Možete vidjeti zakrivljenu liniju koja bolje odgovara vašim podacima! 🤩\n",
|
|
"\n",
|
|
"Možete je učiniti još glađom tako da proslijedite polinomsku formulu funkciji `geom_smooth` ovako:\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": [
|
|
"Baš poput glatke krivulje!🤩\n",
|
|
"\n",
|
|
"Evo kako možete napraviti novu predikciju:\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": [
|
|
"Predviđanje pomoću `polynomial model` ima smisla, s obzirom na raspršene grafikone `price` i `package`! I, ako je ovo bolji model od prethodnog, gledajući iste podatke, trebate planirati budžet za ove skuplje bundeve!\n",
|
|
"\n",
|
|
"🏆 Bravo! Napravili ste dva regresijska modela u jednoj lekciji. U završnom dijelu o regresiji naučit ćete o logističkoj regresiji za određivanje kategorija.\n",
|
|
"\n",
|
|
"## **🚀Izazov**\n",
|
|
"\n",
|
|
"Testirajte nekoliko različitih varijabli u ovoj bilježnici kako biste vidjeli kako korelacija utječe na točnost modela.\n",
|
|
"\n",
|
|
"## [**Kviz nakon predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
|
|
"\n",
|
|
"## **Pregled i samostalno učenje**\n",
|
|
"\n",
|
|
"U ovoj lekciji smo naučili o linearnoj regresiji. Postoje i drugi važni tipovi regresije. Pročitajte o tehnikama Stepwise, Ridge, Lasso i Elasticnet. Dobar tečaj za dodatno učenje je [Stanfordov tečaj o statističkom učenju](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n",
|
|
"\n",
|
|
"Ako želite saznati više o korištenju nevjerojatnog Tidymodels okvira, pogledajte sljedeće resurse:\n",
|
|
"\n",
|
|
"- Tidymodels web stranica: [Počnite s Tidymodels](https://www.tidymodels.org/start/)\n",
|
|
"\n",
|
|
"- Max Kuhn i Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
|
|
"\n",
|
|
"###### **HVALA:**\n",
|
|
"\n",
|
|
"[Allison Horst](https://twitter.com/allison_horst?lang=en) za stvaranje nevjerojatnih ilustracija koje čine R pristupačnijim i zanimljivijim. Pronađite više ilustracija u njenoj [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**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.\n"
|
|
]
|
|
}
|
|
]
|
|
} |