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.
ML-For-Beginners/translations/et/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb

1083 lines
41 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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-10-11T12:24:35+00:00",
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
"language_code": "et"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Koosta regressioonimudel: lineaar- ja polünoomregressioonimudelid\n"
],
"metadata": {
"id": "EgQw8osnsUV-"
}
},
{
"cell_type": "markdown",
"source": [
"## Lineaarne ja polünoomne regressioon kõrvitsate hinnastamiseks - Õppetund 3\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/linear-polynomial.5523c7cb6576ccab.webp\"\n",
" width=\"800\"/>\n",
" <figcaption>Infograafika autor: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"#### Sissejuhatus\n",
"\n",
"Siiani olete uurinud, mis on regressioon, kasutades näidisandmeid kõrvitsate hinnastamise andmestikust, mida kasutame kogu selle õppetunni vältel. Olete seda ka visualiseerinud, kasutades `ggplot2`.💪\n",
"\n",
"Nüüd olete valmis süvenema regressiooni kasutamisse masinõppes. Selles õppetunnis õpite rohkem kahte tüüpi regressiooni kohta: *lihtne lineaarne regressioon* ja *polünoomne regressioon*, koos mõningate matemaatiliste alustega, mis neid tehnikaid toetavad.\n",
"\n",
"> Kogu selle õppekava jooksul eeldame minimaalset matemaatikaalast teadmist ja püüame muuta selle arusaadavaks teiste valdkondade õppijatele. Jälgige märkmeid, 🧮 selgitusi, diagramme ja teisi õppimist toetavaid vahendeid.\n",
"\n",
"#### Ettevalmistus\n",
"\n",
"Tuletame meelde, et laadite need andmed, et neilt küsimusi küsida.\n",
"\n",
"- Millal on parim aeg kõrvitsate ostmiseks?\n",
"\n",
"- Millist hinda võin oodata miniatuursete kõrvitsate kasti eest?\n",
"\n",
"- Kas peaksin ostma neid poole korvi kaupa või 1 1/9 korvi kasti kaupa? Uurime seda andmestikku edasi.\n",
"\n",
"Eelmises õppetunnis lõite `tibble` (kaasaegne andmeraami uuendus) ja täitsite selle osa algsest andmestikust, standardiseerides hinnad korvi järgi. Sellega suutsime koguda umbes 400 andmepunkti ja ainult sügiskuude kohta. Võib-olla saame andmete olemuse kohta rohkem teada, kui neid veelgi puhastame? Eks näeme... 🕵️‍♀️\n",
"\n",
"Selle ülesande jaoks vajame järgmisi pakette:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) on [R-pakettide kogum](https://www.tidyverse.org/packages), mis on loodud selleks, et muuta andmeteadus kiiremaks, lihtsamaks ja lõbusamaks!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) raamistik on [pakettide kogum](https://www.tidymodels.org/packages/) modelleerimiseks ja masinõppeks.\n",
"\n",
"- `janitor`: [janitor pakett](https://github.com/sfirke/janitor) pakub lihtsaid tööriistu määrdunud andmete uurimiseks ja puhastamiseks.\n",
"\n",
"- `corrplot`: [corrplot pakett](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) pakub visuaalset uurimisvahendit korrelatsioonimaatriksile, mis toetab automaatset muutujate ümberjärjestamist, et aidata tuvastada peidetud mustreid muutujate vahel.\n",
"\n",
"Saate need installida järgmiselt:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
"\n",
"Allolev skript kontrollib, kas teil on selle mooduli lõpetamiseks vajalikud paketid olemas, ja installib need vajadusel.\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": [
"Hiljem laadime need suurepärased paketid ja teeme need meie praeguses R-sessioonis kättesaadavaks. (See on lihtsalt illustratsiooniks, `pacman::p_load()` tegi selle juba teie eest ära)\n",
"\n",
"## 1. Lineaarse regressiooni joon\n",
"\n",
"Nagu õppisite 1. õppetunnis, on lineaarse regressiooni eesmärk olla võimeline joonistama *parima sobivuse joont*, et:\n",
"\n",
"- **Näidata muutujate seoseid**. Näidata muutujate omavahelist seost.\n",
"\n",
"- **Teha prognoose**. Teha täpseid prognoose selle kohta, kuhu uus andmepunkt selle joone suhtes paigutuks.\n",
"\n",
"Selle tüüpi joone joonistamiseks kasutame statistilist tehnikat, mida nimetatakse **väikseimate ruutude regressiooniks**. Termin `väikseimad ruudud` tähendab, et kõik regressioonijoone ümber olevad andmepunktid ruudustatakse ja seejärel liidetakse. Ideaalis on lõplik summa võimalikult väike, sest me soovime väikest vigade arvu ehk `väikseimad ruudud`. Seega on parima sobivuse joon see joon, mis annab meile väikseima ruutude vigade summa - sellest ka nimi *väikseimate ruutude regressioon*.\n",
"\n",
"Teeme seda, kuna soovime modelleerida joont, millel on kõige väiksem kumulatiivne kaugus kõigist meie andmepunktidest. Samuti ruudustame terminid enne nende liitmist, kuna meid huvitab nende suurus, mitte suund.\n",
"\n",
"> **🧮 Näita mulle matemaatikat**\n",
">\n",
"> Seda joont, mida nimetatakse *parima sobivuse jooneks*, saab väljendada [võrrandiga](https://en.wikipedia.org/wiki/Simple_linear_regression):\n",
">\n",
"> Y = a + bX\n",
">\n",
"> `X` on '`selgitav muutuja` või `ennustaja`'. `Y` on '`sõltuv muutuja` või `tulemus`'. Joone kalle on `b` ja `a` on y-teljel lõikepunkt, mis viitab `Y` väärtusele, kui `X = 0`.\n",
">\n",
"\n",
"> ![](../../../../../../2-Regression/3-Linear/solution/images/slope.png \"kalle = $y/x$\")\n",
" Infograafika: Jen Looper\n",
">\n",
"> Kõigepealt arvutage kalle `b`.\n",
">\n",
"> Teisisõnu, viidates meie kõrvitsate andmete algsele küsimusele: \"prognoosige kõrvitsa hind kuus müügi kuu järgi\", oleks `X` hind ja `Y` müügi kuu.\n",
">\n",
"> ![](../../../../../../translated_images/et/calculation.989aa7822020d9d0ba9fc781f1ab5192f3421be86ebb88026528aef33c37b0d8.png)\n",
" Infograafika: Jen Looper\n",
"> \n",
"> Arvutage Y väärtus. Kui maksate umbes 4 dollarit, peab olema aprill!\n",
">\n",
"> Matemaatika, mis arvutab joone, peab näitama joone kallet, mis sõltub ka lõikepunktist ehk sellest, kus `Y` asub, kui `X = 0`.\n",
">\n",
"> Saate vaadata nende väärtuste arvutamise meetodit [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) veebisaidil. Külastage ka [väikseimate ruutude kalkulaatorit](https://www.mathsisfun.com/data/least-squares-calculator.html), et näha, kuidas numbrite väärtused joont mõjutavad.\n",
"\n",
"Polegi nii hirmutav, eks? 🤓\n",
"\n",
"#### Korrelatsioon\n",
"\n",
"Veel üks termin, mida mõista, on **korrelatsioonikordaja** antud X ja Y muutujate vahel. Hajuvusdiagrammi abil saate kiiresti visualiseerida seda kordajat. Diagramm, kus andmepunktid on korrektselt joondatud, näitab kõrget korrelatsiooni, kuid diagramm, kus andmepunktid on X ja Y vahel juhuslikult hajutatud, näitab madalat korrelatsiooni.\n",
"\n",
"Hea lineaarse regressiooni mudel on selline, millel on kõrge (lähemal 1-le kui 0-le) korrelatsioonikordaja, kasutades väikseimate ruutude regressiooni meetodit koos regressioonijoonega.\n"
],
"metadata": {
"id": "cdX5FRpvsoP5"
}
},
{
"cell_type": "markdown",
"source": [
"## **2. Tants andmetega: andmeraami loomine, mida kasutatakse modelleerimiseks**\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/janitor.e4a77dd3d3e6a32e.webp\"\n",
" width=\"700\"/>\n",
" <figcaption>Kunstiteos: @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Kunstiteos: \\@allison_horst](../../../../../../translated_images/et/janitor.e4a77dd3d3e6a32e.webp){width=\"700\"}-->\n"
],
"metadata": {
"id": "WdUKXk7Bs8-V"
}
},
{
"cell_type": "markdown",
"source": [
"Laadi vajalikud teegid ja andmestik. Muuda andmed andmeraamiks, mis sisaldab andmete alamhulka:\n",
"\n",
"- Vali ainult kõrvitsad, mille hind on määratud buššeli järgi\n",
"\n",
"- Muuda kuupäev kuuks\n",
"\n",
"- Arvuta hind kõrge ja madala hinna keskmisena\n",
"\n",
"- Muuda hind, et see kajastaks buššeli koguse järgi määratud hinda\n",
"\n",
"> Käsitlesime neid samme [eelmises õppetükis](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": [
"Seiklushimu vaimus uurime [`janitor package`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor), mis pakub lihtsaid funktsioone määrdunud andmete uurimiseks ja puhastamiseks. Näiteks vaatame oma andmete veerunimesid:\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": [
"🤔 Me saame paremini. Muudame need veerunimed `friendR`-iks, teisendades need [snake_case](https://en.wikipedia.org/wiki/Snake_case) konventsiooniks, kasutades `janitor::clean_names`. Selle funktsiooni kohta lisateabe saamiseks: `?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": [
"Palju korda tehtud 🧹! Nüüd tants andmetega, kasutades `dplyr`-i nagu eelmises tunnis! 💃\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": [
"Tubli töö!👌 Sul on nüüd puhas ja korrastatud andmestik, mille põhjal saad luua oma uue regressioonimudeli!\n",
"\n",
"Kas sooviksid hajuvusdiagrammi?\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": [
"Hajuvälja diagram tuletab meelde, et meil on kuude andmed ainult augustist detsembrini. Tõenäoliselt vajame rohkem andmeid, et teha järeldusi lineaarsel viisil.\n",
"\n",
"Vaatame uuesti oma modelleerimisandmeid:\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": [
"Mis siis, kui tahaksime ennustada kõrvitsa `hinda` lähtudes `linna` või `pakendi` veergudest, mis on tekstivormingus? Või veel lihtsamalt, kuidas saaksime leida korrelatsiooni (mis eeldab, et mõlemad sisendid on numbrilised) näiteks `pakendi` ja `hinna` vahel? 🤷🤷\n",
"\n",
"Masinõppe mudelid töötavad kõige paremini numbriliste tunnustega, mitte tekstiväärtustega, seega tuleb tavaliselt kategoriseeritud tunnused teisendada numbrilisteks esitusteks.\n",
"\n",
"See tähendab, et peame leidma viisi, kuidas oma ennustajaid ümber vormindada, et mudel saaks neid tõhusamalt kasutada seda protsessi nimetatakse `tunnuste insenerimiseks`.\n"
],
"metadata": {
"id": "7hsHoxsStyjJ"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Andmete ettevalmistamine modelleerimiseks retseptidega 👩‍🍳👨‍🍳\n",
"\n",
"Tegevusi, mis muudavad ennustajate väärtused mudeli jaoks tõhusamaks kasutamiseks, nimetatakse `tunnuste insenerimiseks`.\n",
"\n",
"Erinevatel mudelitel on erinevad eeltöötluse nõuded. Näiteks vajab vähimruutude meetod `kategooriliste muutujate kodeerimist`, nagu kuu, sort ja city_name. See tähendab lihtsalt `kategooriliste väärtustega` veeru `tõlkimist` üheks või mitmeks `numbriliseks veeruks`, mis asendavad algse veeru.\n",
"\n",
"Näiteks, kui teie andmetes on järgmine kategooriline tunnus:\n",
"\n",
"| linn |\n",
"|:-------:|\n",
"| Denver |\n",
"| Nairobi |\n",
"| Tokyo |\n",
"\n",
"Võite rakendada *järjestikust kodeerimist*, et asendada iga kategooria unikaalse täisarvuga, näiteks nii:\n",
"\n",
"| linn |\n",
"|:----:|\n",
"| 0 |\n",
"| 1 |\n",
"| 2 |\n",
"\n",
"Ja just seda me oma andmetega teeme!\n",
"\n",
"Selles osas uurime veel üht suurepärast Tidymodels paketti: [recipes](https://tidymodels.github.io/recipes/) - mis on loodud selleks, et aidata teil oma andmeid **enne** mudeli treenimist eeltöödelda. Retsept on sisuliselt objekt, mis määratleb, milliseid samme tuleb andmekogumile rakendada, et see modelleerimiseks valmis saada.\n",
"\n",
"Nüüd loome retsepti, mis valmistab meie andmed modelleerimiseks ette, asendades ennustajate veergudes kõik vaatlused unikaalse täisarvuga:\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": [
"Vinge! 👏 Me just lõime oma esimese retsepti, mis määratleb tulemuse (hinna) ja selle vastavad ennustajad ning et kõik ennustajate veerud tuleks kodeerida täisarvudeks 🙌! Vaatame selle kiiresti üle:\n",
"\n",
"- `recipe()` funktsiooni kasutamine koos valemiga määrab retseptile muutujate *rollid*, kasutades `new_pumpkins` andmeid viitena. Näiteks on `price` veerule määratud `outcome` roll, samas kui ülejäänud veerud on määratud `predictor` rolliks.\n",
"\n",
"- `step_integer(all_predictors(), zero_based = TRUE)` määrab, et kõik ennustajad tuleks teisendada täisarvudeks, alustades nummerdamist nullist.\n",
"\n",
"Me usume, et sul võib tekkida mõtteid nagu: \"See on nii lahe!! Aga mis siis, kui ma tahaksin kinnitada, et retseptid teevad täpselt seda, mida ma ootan? 🤔\"\n",
"\n",
"See on suurepärane mõte! Vaata, kui retsept on määratletud, saad hinnata vajalikke parameetreid andmete eeltöötlemiseks ja seejärel andmed välja võtta. Tavaliselt ei ole seda vaja teha, kui kasutad Tidymodels'i (näeme peagi tavapärast lähenemist -> `workflows`), kuid see võib olla kasulik, kui tahad teha mingi kontrolli, et kinnitada, et retseptid toimivad ootuspäraselt.\n",
"\n",
"Selleks vajad kahte lisakäsku: `prep()` ja `bake()`, ning nagu alati, aitavad meie väikesed R-sõbrad [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) sul sellest paremini aru saada!\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/recipes.9ad10d8a4056bf89.webp\"\n",
" width=\"550\"/>\n",
" <figcaption>Illustratsioon autorilt @allison_horst</figcaption>\n"
],
"metadata": {
"id": "KEiO0v7kuC9O"
}
},
{
"cell_type": "markdown",
"source": [
"[`prep()`](https://recipes.tidymodels.org/reference/prep.html): hindab vajalikke parameetreid treeningandmestiku põhjal, mida saab hiljem rakendada teistele andmestikele. Näiteks, antud ennustaja veeru puhul, millisele vaatlusele määratakse täisarv 0, 1, 2 jne.\n",
"\n",
"[`bake()`](https://recipes.tidymodels.org/reference/bake.html): rakendab ettevalmistatud retsepti toimingud ükskõik millisele andmestikule.\n",
"\n",
"Seega, valmistame ette ja rakendame oma retseptid, et tõesti kinnitada, et sisemiselt kodeeritakse ennustaja veerud kõigepealt enne, kui mudel sobitatakse.\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": [
"Hurraa! 🥳 Töödeldud andmed `baked_pumpkins` sisaldavad kõiki kodeeritud ennustajaid, mis kinnitab, et meie retseptina määratletud eeltöötlusetapid toimivad ootuspäraselt. See muudab andmete lugemise keerulisemaks, kuid Tidymodelsile palju arusaadavamaks! Võta aega, et välja selgitada, milline vaatluse väärtus on vastavaks täisarvuks kaardistatud.\n",
"\n",
"Samuti tasub mainida, et `baked_pumpkins` on andmeraamistik, millel saame teha arvutusi.\n",
"\n",
"Näiteks proovime leida hea korrelatsiooni kahe andmepunkti vahel, et potentsiaalselt luua hea ennustav mudel. Selleks kasutame funktsiooni `cor()`. Kirjuta `?cor()`, et saada funktsiooni kohta rohkem teavet.\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": [
"Selgub, et linna ja hinna vahel on ainult nõrk korrelatsioon. Kuid pakendi ja selle hinna vahel on veidi parem korrelatsioon. See on loogiline, eks? Tavaliselt, mida suurem on tootepakend, seda kõrgem on hind.\n",
"\n",
"Kui me juba teemaga tegeleme, proovime visualiseerida ka kõigi veergude korrelatsioonimaatriksit, kasutades `corrplot` paketti.\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": [
"🤩🤩 Palju parem.\n",
"\n",
"Hea küsimus, mida nüüd selle andmestiku kohta küsida, oleks: '`Millist hinda võin oodata konkreetse kõrvitsapaketi eest?`' Sukeldume kohe teemasse!\n",
"\n",
"> Märkus: Kui **`küpsetate()`** ettevalmistatud retsepti **`pumpkins_prep`** koos **`new_data = NULL`**, siis saate töödeldud (st kodeeritud) treeningandmed. Kui teil oleks näiteks teine andmestik, näiteks testandmestik, ja sooviksite näha, kuidas retsept seda eeltöötleks, küpsetaksite lihtsalt **`pumpkins_prep`** koos **`new_data = test_set`**\n",
"\n",
"## 4. Lineaarse regressioonimudeli loomine\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/linear-polynomial.5523c7cb6576ccab.webp\"\n",
" width=\"800\"/>\n",
" <figcaption>Infograafik: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![Infograafik: Dasani Madipalli](../../../../../../translated_images/et/linear-polynomial.5523c7cb6576ccab.webp){width=\"800\"}-->\n"
],
"metadata": {
"id": "YqXjLuWavNxW"
}
},
{
"cell_type": "markdown",
"source": [
"Nüüd, kui oleme retsepti loonud ja kinnitanud, et andmed töödeldakse õigesti, ehitame regressioonimudeli, et vastata küsimusele: `Millist hinda võin oodata antud kõrvitsapakendi eest?`\n",
"\n",
"#### Treeni lineaarse regressiooni mudel treeningandmestiku abil\n",
"\n",
"Nagu te ilmselt juba aru saite, on veerg *price* `tulemusmuutuja`, samas kui veerg *package* on `ennustaja` muutuja.\n",
"\n",
"Selleks jagame esmalt andmed nii, et 80% läheb treeningandmestikku ja 20% testandmestikku, seejärel määratleme retsepti, mis kodeerib ennustaja veeru täisarvudeks, ja seejärel loome mudeli spetsifikatsiooni. Me ei valmista ega küpseta oma retsepti, kuna teame juba, et see töötleb andmeid ootuspäraselt.\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": [
"Tubli töö! Nüüd, kui meil on olemas retsept ja mudeli spetsifikatsioon, peame leidma viisi, kuidas need kokku siduda üheks objektiks, mis esmalt eeltöötleb andmed (kulisside taga toimub prep+bake), sobitab mudeli eeltöödeldud andmetega ja võimaldab ka võimalikke järeltöötluse tegevusi. Kuidas see kõlab sinu meelerahu jaoks!🤩\n",
"\n",
"Tidymodelsis nimetatakse seda mugavat objekti [`workflow`](https://workflows.tidymodels.org/) ja see hoiab mugavalt sinu modelleerimise komponente! Seda võiksime *Pythonis* nimetada *torujuhtmeteks* (*pipelines*).\n",
"\n",
"Nii et paneme kõik kokku ühte workflow'sse!📦\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": [
"👌 Peale selle saab töövoogu sobitada/treenida peaaegu samamoodi nagu mudelit.\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": [
"Mudeli väljundist näeme treeningu käigus õpitud koefitsiente. Need esindavad parima sobivuse joone koefitsiente, mis annavad meile tegeliku ja prognoositud muutuja vahelise väikseima üldise vea.\n",
"\n",
"#### Mudeli jõudluse hindamine testandmestiku abil\n",
"\n",
"On aeg näha, kuidas mudel toimis 📏! Kuidas me seda teeme?\n",
"\n",
"Nüüd, kui oleme mudeli treeninud, saame seda kasutada prognooside tegemiseks test_andmestiku jaoks, kasutades `parsnip::predict()`. Seejärel saame neid prognoose võrrelda tegelike märgiste väärtustega, et hinnata, kui hästi (või mitte!) mudel töötab.\n",
"\n",
"Alustame prognooside tegemisest testandmestiku jaoks ja seejärel ühendame veerud testandmestikuga.\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": [
"Jah, sa oled just mudeli treeninud ja kasutanud seda ennustuste tegemiseks!🔮 Kas see on hea? Vaatame mudeli jõudlust!\n",
"\n",
"Tidymodelsis teeme seda `yardstick::metrics()` abil! Lineaarse regressiooni puhul keskendume järgmistele mõõdikutele:\n",
"\n",
"- `Root Mean Square Error (RMSE)`: [MSE](https://en.wikipedia.org/wiki/Mean_squared_error) ruutjuur. See annab absoluutse mõõdiku samas ühikus kui silt (antud juhul kõrvitsa hind). Mida väiksem väärtus, seda parem mudel (lihtsustatult öeldes esindab see keskmist hinda, mille võrra ennustused eksivad!)\n",
"\n",
"- `Determineerimistegur (tavaliselt tuntud kui R-ruut või R2)`: Suhteline mõõdik, mille puhul suurem väärtus tähendab paremat mudeli sobivust. Sisuliselt esindab see mõõdik seda, kui palju mudel suudab selgitada ennustatud ja tegelike siltide väärtuste vahelise variatsiooni.\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": [
"Seal läks mudeli jõudlus. Vaatame, kas saame parema ülevaate, visualiseerides hajuvusdiagrammi, kus on pakett ja hind, ning kasutame tehtud ennustusi, et lisada parima sobivuse joon.\n",
"\n",
"See tähendab, et peame testkomplekti ette valmistama ja töötlema, et kodeerida paketi veerg ning seejärel siduda see meie mudeli tehtud ennustustega.\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": [
"Nagu näha, ei suuda lineaarne regressioonimudel eriti hästi üldistada seost paki ja selle vastava hinna vahel.\n",
"\n",
"🎃 Palju õnne, sa just lõid mudeli, mis aitab ennustada mõne kõrvitsasordi hinda. Sinu pühade kõrvitsapõld saab olema imeline. Kuid tõenäoliselt suudad luua veelgi parema mudeli!\n",
"\n",
"## 5. Loo polünoomse regressiooni mudel\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/linear-polynomial.5523c7cb6576ccab.webp\"\n",
" width=\"800\"/>\n",
" <figcaption>Infograafik: Dasani Madipalli</figcaption>\n"
],
"metadata": {
"id": "HOCqJXLTwtWI"
}
},
{
"cell_type": "markdown",
"source": [
"Mõnikord ei pruugi meie andmetel olla lineaarset seost, kuid me soovime siiski prognoosida tulemusi. Polünoomiline regressioon aitab meil teha prognoose keerukamate mittelineaarsete seoste korral.\n",
"\n",
"Võtame näiteks seose pakendi ja hinna vahel meie kõrvitsate andmestikus. Kuigi mõnikord on muutujate vahel lineaarne seos mida suurem on kõrvitsa maht, seda kõrgem hind , ei saa neid seoseid alati kujutada tasapinnana või sirgjoonena.\n",
"\n",
"> ✅ Siin on [veel mõned näited](https://online.stat.psu.edu/stat501/lesson/9/9.8) andmetest, mille puhul võiks kasutada polünoomilist regressiooni\n",
">\n",
"> Vaata uuesti seost sordi ja hinna vahel eelmises graafikus. Kas see hajusdiagramm tundub, et seda peaks tingimata analüüsima sirgjoonega? Võib-olla mitte. Sellisel juhul võid proovida polünoomilist regressiooni.\n",
">\n",
"> ✅ Polünoomid on matemaatilised avaldised, mis võivad koosneda ühest või mitmest muutujast ja kordajatest.\n",
"\n",
"#### Treeni polünoomilise regressiooni mudelit treeningandmestiku abil\n",
"\n",
"Polünoomiline regressioon loob *kõvera joone*, et paremini sobitada mittelineaarseid andmeid.\n",
"\n",
"Vaatame, kas polünoomiline mudel suudab prognoosides paremini toimida. Järgime sarnast protseduuri nagu varem:\n",
"\n",
"- Loo retsept, mis määrab kindlaks andmete eeltöötluse sammud, et need modelleerimiseks valmis saada, näiteks: ennustajate kodeerimine ja polünoomide arvutamine astmega *n*\n",
"\n",
"- Koosta mudeli spetsifikatsioon\n",
"\n",
"- Koonda retsept ja mudeli spetsifikatsioon töövoogu\n",
"\n",
"- Loo mudel, sobitades töövoogu\n",
"\n",
"- Hinda, kui hästi mudel testandmetel toimib\n",
"\n",
"Asume asja kallale!\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": [
"#### Hinda mudeli jõudlust\n",
"\n",
"👏👏Oled loonud polünoommudeli, teeme nüüd prognoose testandmestikul!\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, hindame, kuidas mudel testikomplektil toimis, kasutades `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": [
"🤩🤩 Palju parem jõudlus.\n",
"\n",
"`rmse` vähenes umbes 7-lt umbes 3-le, mis viitab väiksemale veale tegeliku hinna ja prognoositud hinna vahel. Seda võib *umbes* tõlgendada nii, et keskmiselt on valed prognoosid ekslikud umbes 3 dollari võrra. `rsq` suurenes umbes 0.4-lt 0.8-le.\n",
"\n",
"Kõik need mõõdikud näitavad, et polünoomiline mudel toimib palju paremini kui lineaarne mudel. Tubli töö!\n",
"\n",
"Vaatame, kas saame seda visualiseerida!\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": [
"Näete kõverjoont, mis sobib teie andmetega paremini! 🤩\n",
"\n",
"Saate selle veelgi sujuvamaks muuta, kui edastate polünoomvalemi `geom_smooth`-ile, näiteks nii:\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": [
"Nagu sujuv kõver!🤩\n",
"\n",
"Siin on, kuidas saaksid teha uue ennustuse:\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` ennustus tundub mõistlik, arvestades `price` ja `package` hajuvusdiagramme! Ja kui see mudel on parem kui eelmine, vaadates samu andmeid, siis tuleb eelarvesse lisada need kallimad kõrvitsad!\n",
"\n",
"🏆 Tubli töö! Sa lõid ühe tunni jooksul kaks regressioonimudelit. Regressiooni viimases osas õpid logistilist regressiooni, et määrata kategooriaid.\n",
"\n",
"## **🚀Väljakutse**\n",
"\n",
"Katseta mitmeid erinevaid muutujaid selles märkmikus, et näha, kuidas korrelatsioon vastab mudeli täpsusele.\n",
"\n",
"## [**Loengu järgne viktoriin**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
"\n",
"## **Ülevaade ja iseseisev õppimine**\n",
"\n",
"Selles tunnis õppisime lineaarset regressiooni. On ka teisi olulisi regressioonitüüpe. Loe Stepwise, Ridge, Lasso ja Elasticnet tehnikate kohta. Hea kursus, mida õppida, on [Stanfordi statistilise õppimise kursus](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n",
"\n",
"Kui soovid rohkem teada saada, kuidas kasutada suurepärast Tidymodels raamistikku, vaata järgmisi ressursse:\n",
"\n",
"- Tidymodels veebisait: [Alusta Tidymodelsiga](https://www.tidymodels.org/start/)\n",
"\n",
"- Max Kuhn ja Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
"\n",
"###### **TÄNUD:**\n",
"\n",
"[Allison Horst](https://twitter.com/allison_horst?lang=en) suurepäraste illustratsioonide loomise eest, mis muudavad R-i kasutamise sõbralikumaks ja kaasahaaravamaks. Leia rohkem illustratsioone tema [galeriist](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**Lahtiütlus**: \nSee dokument on tõlgitud, kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi püüame tagada täpsust, palun arvestage, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algkeeles tuleks lugeda autoriteetseks allikaks. Olulise teabe puhul on soovitatav kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valede tõlgenduste eest.\n"
]
}
]
}