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.
1084 lines
43 KiB
1084 lines
43 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-06T11:33:27+00:00",
|
|
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
|
|
"language_code": "ms"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "EgQw8osnsUV-"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Regresi Linear dan Polinomial untuk Penentuan Harga Labu - Pelajaran 3\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"#### Pengenalan\n",
|
|
"\n",
|
|
"Setakat ini, anda telah meneroka apa itu regresi dengan data sampel yang dikumpulkan daripada dataset harga labu yang akan kita gunakan sepanjang pelajaran ini. Anda juga telah memvisualisasikannya menggunakan `ggplot2`. 💪\n",
|
|
"\n",
|
|
"Kini anda bersedia untuk mendalami regresi untuk pembelajaran mesin. Dalam pelajaran ini, anda akan mempelajari lebih lanjut tentang dua jenis regresi: *regresi linear asas* dan *regresi polinomial*, bersama dengan beberapa matematik yang mendasari teknik-teknik ini.\n",
|
|
"\n",
|
|
"> Sepanjang kurikulum ini, kami mengandaikan pengetahuan matematik yang minimum, dan berusaha menjadikannya mudah diakses untuk pelajar dari bidang lain, jadi perhatikan nota, 🧮 penjelasan, diagram, dan alat pembelajaran lain untuk membantu pemahaman.\n",
|
|
"\n",
|
|
"#### Persediaan\n",
|
|
"\n",
|
|
"Sebagai peringatan, anda memuatkan data ini untuk menjawab soalan-soalan mengenainya.\n",
|
|
"\n",
|
|
"- Bilakah masa terbaik untuk membeli labu?\n",
|
|
"\n",
|
|
"- Berapakah harga yang boleh saya jangkakan untuk satu kotak labu mini?\n",
|
|
"\n",
|
|
"- Patutkah saya membelinya dalam bakul setengah gantang atau dalam kotak 1 1/9 gantang? Mari kita teruskan menyelidik data ini.\n",
|
|
"\n",
|
|
"Dalam pelajaran sebelumnya, anda telah mencipta `tibble` (penyusunan semula moden bagi bingkai data) dan mengisinya dengan sebahagian daripada dataset asal, menstandardkan harga mengikut gantang. Dengan melakukan itu, bagaimanapun, anda hanya dapat mengumpulkan kira-kira 400 titik data dan hanya untuk bulan-bulan musim luruh. Mungkin kita boleh mendapatkan sedikit lebih banyak perincian tentang sifat data ini dengan membersihkannya lebih lanjut? Kita akan lihat... 🕵️♀️\n",
|
|
"\n",
|
|
"Untuk tugasan ini, kita memerlukan pakej berikut:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) ialah [koleksi pakej R](https://www.tidyverse.org/packages) yang direka untuk menjadikan sains data lebih pantas, mudah dan menyeronokkan!\n",
|
|
"\n",
|
|
"- `tidymodels`: Rangka kerja [tidymodels](https://www.tidymodels.org/) ialah [koleksi pakej](https://www.tidymodels.org/packages/) untuk pemodelan dan pembelajaran mesin.\n",
|
|
"\n",
|
|
"- `janitor`: Pakej [janitor](https://github.com/sfirke/janitor) menyediakan alat kecil yang mudah untuk memeriksa dan membersihkan data yang kotor.\n",
|
|
"\n",
|
|
"- `corrplot`: Pakej [corrplot](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) menyediakan alat penerokaan visual pada matriks korelasi yang menyokong penyusunan semula pembolehubah secara automatik untuk membantu mengesan pola tersembunyi antara pembolehubah.\n",
|
|
"\n",
|
|
"Anda boleh memasangnya seperti berikut:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
|
|
"\n",
|
|
"Skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk melengkapkan modul ini dan memasangnya untuk anda sekiranya ia tidak tersedia.\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": [
|
|
"Kami akan memuatkan pakej-pakej hebat ini dan menjadikannya tersedia dalam sesi R semasa kita. (Ini hanya untuk ilustrasi, `pacman::p_load()` sudah melakukannya untuk anda)\n",
|
|
"\n",
|
|
"## 1. Garis regresi linear\n",
|
|
"\n",
|
|
"Seperti yang anda pelajari dalam Pelajaran 1, tujuan latihan regresi linear adalah untuk dapat melukis *garis* *terbaik* untuk:\n",
|
|
"\n",
|
|
"- **Menunjukkan hubungan pemboleh ubah**. Menunjukkan hubungan antara pemboleh ubah.\n",
|
|
"\n",
|
|
"- **Membuat ramalan**. Membuat ramalan yang tepat tentang di mana titik data baru akan berada dalam hubungan dengan garis tersebut.\n",
|
|
"\n",
|
|
"Untuk melukis jenis garis ini, kita menggunakan teknik statistik yang dipanggil **Regresi Kuadrat Terkecil**. Istilah `kuadrat terkecil` bermaksud semua titik data di sekitar garis regresi dikira kuadratnya dan kemudian dijumlahkan. Sebaiknya, jumlah akhir itu sekecil mungkin, kerana kita mahukan bilangan kesalahan yang rendah, atau `kuadrat terkecil`. Oleh itu, garis terbaik adalah garis yang memberikan nilai terendah untuk jumlah kesalahan kuadrat - maka nama *regresi kuadrat terkecil*.\n",
|
|
"\n",
|
|
"Kita melakukannya kerana kita ingin memodelkan garis yang mempunyai jarak kumulatif paling kecil dari semua titik data kita. Kita juga mengkuadratkan istilah sebelum menjumlahkannya kerana kita lebih mengambil berat tentang magnitudnya daripada arahnya.\n",
|
|
"\n",
|
|
"> **🧮 Tunjukkan matematiknya**\n",
|
|
">\n",
|
|
"> Garis ini, yang dipanggil *garis terbaik* boleh dinyatakan dengan [persamaan](https://en.wikipedia.org/wiki/Simple_linear_regression):\n",
|
|
">\n",
|
|
"> Y = a + bX\n",
|
|
">\n",
|
|
"> `X` adalah '`pemboleh ubah penjelas` atau `peramal`'. `Y` adalah '`pemboleh ubah bergantung` atau `hasil`'. Kecerunan garis adalah `b` dan `a` adalah pintasan-y, yang merujuk kepada nilai `Y` apabila `X = 0`.\n",
|
|
">\n",
|
|
"\n",
|
|
"> \n",
|
|
" Infografik oleh Jen Looper\n",
|
|
">\n",
|
|
"> Pertama, kira kecerunan `b`.\n",
|
|
">\n",
|
|
"> Dalam erti kata lain, dan merujuk kepada soalan asal data labu kita: \"ramalkan harga labu per gantang mengikut bulan\", `X` merujuk kepada harga dan `Y` merujuk kepada bulan jualan.\n",
|
|
">\n",
|
|
"> \n",
|
|
" Infografik oleh Jen Looper\n",
|
|
"> \n",
|
|
"> Kira nilai Y. Jika anda membayar sekitar \\$4, itu mesti bulan April!\n",
|
|
">\n",
|
|
"> Matematik yang mengira garis mesti menunjukkan kecerunan garis, yang juga bergantung pada pintasan, atau di mana `Y` berada apabila `X = 0`.\n",
|
|
">\n",
|
|
"> Anda boleh melihat kaedah pengiraan untuk nilai-nilai ini di laman web [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Juga lawati [Kalkulator Kuadrat Terkecil](https://www.mathsisfun.com/data/least-squares-calculator.html) untuk melihat bagaimana nilai-nilai angka mempengaruhi garis.\n",
|
|
"\n",
|
|
"Tidak begitu menakutkan, kan? 🤓\n",
|
|
"\n",
|
|
"#### Korelasi\n",
|
|
"\n",
|
|
"Satu lagi istilah yang perlu difahami ialah **Pekali Korelasi** antara pemboleh ubah X dan Y yang diberikan. Dengan menggunakan plot taburan, anda boleh dengan cepat memvisualisasikan pekali ini. Plot dengan titik data yang tersebar dalam garis yang kemas mempunyai korelasi tinggi, tetapi plot dengan titik data yang tersebar di mana-mana antara X dan Y mempunyai korelasi rendah.\n",
|
|
"\n",
|
|
"Model regresi linear yang baik adalah model yang mempunyai Pekali Korelasi tinggi (lebih dekat kepada 1 daripada 0) menggunakan kaedah Regresi Kuadrat Terkecil dengan garis regresi.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "cdX5FRpvsoP5"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **2. Menari dengan data: mencipta rangka data yang akan digunakan untuk pemodelan**\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/janitor.jpg\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"700\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "WdUKXk7Bs8-V"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Muatkan perpustakaan dan set data yang diperlukan. Tukarkan data kepada bingkai data yang mengandungi subset data:\n",
|
|
"\n",
|
|
"- Hanya ambil labu yang harganya berdasarkan unit bushel\n",
|
|
"\n",
|
|
"- Tukarkan tarikh kepada bulan\n",
|
|
"\n",
|
|
"- Kira harga sebagai purata harga tinggi dan rendah\n",
|
|
"\n",
|
|
"- Tukarkan harga untuk mencerminkan harga berdasarkan kuantiti bushel\n",
|
|
"\n",
|
|
"> Kami telah membincangkan langkah-langkah ini dalam [pelajaran sebelumnya](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": [
|
|
"Dalam semangat pengembaraan sejati, mari kita terokai [`pakej janitor`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) yang menyediakan fungsi mudah untuk memeriksa dan membersihkan data yang kotor. Sebagai contoh, mari kita lihat nama lajur untuk data kita:\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": [
|
|
"🤔 Kita boleh lakukan dengan lebih baik. Mari jadikan nama lajur ini `friendR` dengan menukarkannya kepada konvensyen [snake_case](https://en.wikipedia.org/wiki/Snake_case) menggunakan `janitor::clean_names`. Untuk mengetahui lebih lanjut tentang fungsi ini: `?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": [
|
|
"Bersihkan data dengan lebih kemas 🧹! Sekarang, mari menari dengan data menggunakan `dplyr` seperti dalam pelajaran sebelum ini! 💃\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": [
|
|
"Kerja yang bagus!👌 Anda kini mempunyai set data yang bersih dan teratur untuk membina model regresi baharu anda!\n",
|
|
"\n",
|
|
"Bagaimana dengan plot serakan?\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": [
|
|
"Plot taburan mengingatkan kita bahawa kita hanya mempunyai data bulan dari Ogos hingga Disember. Kita mungkin memerlukan lebih banyak data untuk dapat membuat kesimpulan secara linear.\n",
|
|
"\n",
|
|
"Mari kita lihat semula data pemodelan kita:\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": [
|
|
"Bagaimana jika kita ingin meramalkan `price` labu berdasarkan kolum `city` atau `package` yang merupakan jenis karakter? Atau lebih mudah lagi, bagaimana kita boleh mencari korelasi (yang memerlukan kedua-dua inputnya bersifat numerik) antara, contohnya, `package` dan `price`? 🤷🤷\n",
|
|
"\n",
|
|
"Model pembelajaran mesin berfungsi dengan lebih baik menggunakan ciri-ciri numerik berbanding nilai teks, jadi secara amnya anda perlu menukar ciri-ciri kategori kepada representasi numerik.\n",
|
|
"\n",
|
|
"Ini bermaksud kita perlu mencari cara untuk memformat semula peramal kita supaya lebih mudah digunakan oleh model secara efektif, satu proses yang dikenali sebagai `feature engineering`.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "7hsHoxsStyjJ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. Pra-pemprosesan data untuk pemodelan dengan resipi 👩🍳👨🍳\n",
|
|
"\n",
|
|
"Aktiviti yang menstruktur semula nilai peramal untuk menjadikannya lebih mudah digunakan oleh model secara berkesan dikenali sebagai `feature engineering`.\n",
|
|
"\n",
|
|
"Model yang berbeza mempunyai keperluan pra-pemprosesan yang berbeza. Sebagai contoh, kaedah kuasa dua terkecil memerlukan `pengekodan pemboleh ubah kategori` seperti bulan, jenis, dan nama bandar. Ini melibatkan `menerjemahkan` satu lajur dengan `nilai kategori` kepada satu atau lebih `lajur berangka` yang menggantikan lajur asal.\n",
|
|
"\n",
|
|
"Sebagai contoh, andaikan data anda mengandungi ciri kategori berikut:\n",
|
|
"\n",
|
|
"| bandar |\n",
|
|
"|:---------:|\n",
|
|
"| Denver |\n",
|
|
"| Nairobi |\n",
|
|
"| Tokyo |\n",
|
|
"\n",
|
|
"Anda boleh menggunakan *pengekodan ordinal* untuk menggantikan setiap kategori dengan nilai integer unik, seperti ini:\n",
|
|
"\n",
|
|
"| bandar |\n",
|
|
"|:------:|\n",
|
|
"| 0 |\n",
|
|
"| 1 |\n",
|
|
"| 2 |\n",
|
|
"\n",
|
|
"Dan itulah yang akan kita lakukan pada data kita!\n",
|
|
"\n",
|
|
"Dalam bahagian ini, kita akan meneroka satu lagi pakej Tidymodels yang hebat: [recipes](https://tidymodels.github.io/recipes/) - yang direka untuk membantu anda memproses data anda **sebelum** melatih model anda. Pada asasnya, resipi adalah objek yang menentukan langkah-langkah yang perlu diterapkan pada set data untuk menjadikannya sedia untuk pemodelan.\n",
|
|
"\n",
|
|
"Sekarang, mari kita cipta resipi yang menyediakan data kita untuk pemodelan dengan menggantikan integer unik bagi semua pemerhatian dalam lajur peramal:\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": [
|
|
"Hebat! 👏 Kita baru sahaja mencipta resipi pertama yang menentukan hasil (harga) dan peramal yang sepadan, serta memastikan semua lajur peramal ditukar kepada satu set nombor bulat 🙌! Mari kita pecahkan langkah-langkahnya:\n",
|
|
"\n",
|
|
"- Panggilan kepada `recipe()` dengan formula memberitahu resipi tentang *peranan* pemboleh ubah menggunakan data `new_pumpkins` sebagai rujukan. Sebagai contoh, lajur `price` telah diberikan peranan sebagai `outcome`, manakala lajur-lajur lain diberikan peranan sebagai `predictor`.\n",
|
|
"\n",
|
|
"- `step_integer(all_predictors(), zero_based = TRUE)` menentukan bahawa semua peramal perlu ditukar kepada satu set nombor bulat dengan penomboran bermula dari 0.\n",
|
|
"\n",
|
|
"Kami pasti anda mungkin berfikir: \"Ini sangat menarik!! Tetapi bagaimana jika saya perlu memastikan bahawa resipi ini benar-benar melakukan apa yang saya harapkan? 🤔\"\n",
|
|
"\n",
|
|
"Itu adalah pemikiran yang hebat! Anda lihat, setelah resipi anda ditentukan, anda boleh menganggarkan parameter yang diperlukan untuk memproses data, dan kemudian mengekstrak data yang telah diproses. Anda biasanya tidak perlu melakukan ini apabila menggunakan Tidymodels (kita akan lihat konvensyen biasa sebentar lagi-\\> `workflows`), tetapi ia boleh berguna apabila anda ingin melakukan semakan untuk memastikan resipi berfungsi seperti yang diharapkan.\n",
|
|
"\n",
|
|
"Untuk itu, anda memerlukan dua kata kerja tambahan: `prep()` dan `bake()`, dan seperti biasa, rakan kecil R kita oleh [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) membantu anda memahami ini dengan lebih baik!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/recipes.png\"\n",
|
|
" width=\"550\"/>\n",
|
|
" <figcaption>Karya oleh @allison_horst</figcaption>\n"
|
|
],
|
|
"metadata": {
|
|
"id": "KEiO0v7kuC9O"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"[`prep()`](https://recipes.tidymodels.org/reference/prep.html): menganggarkan parameter yang diperlukan daripada set latihan yang kemudiannya boleh digunakan pada set data lain. Sebagai contoh, untuk satu lajur peramal tertentu, pemerhatian mana yang akan diberikan integer 0 atau 1 atau 2 dan sebagainya.\n",
|
|
"\n",
|
|
"[`bake()`](https://recipes.tidymodels.org/reference/bake.html): mengambil resipi yang telah disediakan dan melaksanakan operasi pada mana-mana set data.\n",
|
|
"\n",
|
|
"Dengan itu, mari kita sediakan dan laksanakan resipi kita untuk benar-benar mengesahkan bahawa di sebalik tabir, lajur peramal akan terlebih dahulu dikodkan sebelum model dipasang.\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!🥳 Data yang telah diproses `baked_pumpkins` mempunyai semua peramal yang telah dikodkan, mengesahkan bahawa langkah-langkah praproses yang ditakrifkan sebagai resipi kita akan berfungsi seperti yang diharapkan. Ini menjadikannya lebih sukar untuk anda baca tetapi jauh lebih mudah difahami oleh Tidymodels! Luangkan masa untuk mengetahui pemerhatian mana yang telah dipetakan kepada integer yang sepadan.\n",
|
|
"\n",
|
|
"Perlu juga disebutkan bahawa `baked_pumpkins` adalah bingkai data yang kita boleh lakukan pengiraan ke atasnya.\n",
|
|
"\n",
|
|
"Sebagai contoh, mari kita cuba mencari korelasi yang baik antara dua titik data anda untuk berpotensi membina model ramalan yang baik. Kita akan menggunakan fungsi `cor()` untuk melakukannya. Taipkan `?cor()` untuk mengetahui lebih lanjut tentang fungsi tersebut.\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": [
|
|
"Ternyata, terdapat hanya hubungan yang lemah antara Bandar dan Harga. Namun, terdapat sedikit hubungan yang lebih baik antara Pakej dan Harganya. Itu masuk akal, bukan? Biasanya, semakin besar kotak hasil, semakin tinggi harganya.\n",
|
|
"\n",
|
|
"Sementara kita sedang melakukannya, mari kita cuba dan visualkan matriks korelasi bagi semua lajur menggunakan pakej `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": [
|
|
"🤩🤩 Lebih baik lagi.\n",
|
|
"\n",
|
|
"Satu soalan yang bagus untuk ditanya sekarang ialah: '`Berapakah harga yang boleh saya jangkakan untuk satu pakej labu tertentu?`' Mari kita teruskan!\n",
|
|
"\n",
|
|
"> Nota: Apabila anda **`bake()`** resipi yang telah disediakan **`pumpkins_prep`** dengan **`new_data = NULL`**, anda akan mengekstrak data latihan yang telah diproses (iaitu, yang telah dikodkan). Jika anda mempunyai set data lain, contohnya set ujian, dan ingin melihat bagaimana resipi akan memprosesnya, anda hanya perlu bake **`pumpkins_prep`** dengan **`new_data = test_set`**\n",
|
|
"\n",
|
|
"## 4. Bina model regresi linear\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YqXjLuWavNxW"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Sekarang kita telah membina resipi dan mengesahkan bahawa data akan diproses dengan betul, mari kita bina model regresi untuk menjawab soalan: `Berapakah harga yang boleh saya jangkakan untuk satu pakej labu tertentu?`\n",
|
|
"\n",
|
|
"#### Latih model regresi linear menggunakan set latihan\n",
|
|
"\n",
|
|
"Seperti yang mungkin telah anda perhatikan, kolum *price* adalah pemboleh ubah `hasil` manakala kolum *package* adalah pemboleh ubah `peramal`.\n",
|
|
"\n",
|
|
"Untuk melakukannya, kita akan mula dengan membahagikan data di mana 80% akan dimasukkan ke dalam set latihan dan 20% ke dalam set ujian, kemudian mendefinisikan resipi yang akan mengekod kolum peramal ke dalam satu set integer, dan seterusnya membina spesifikasi model. Kita tidak akan menyediakan dan memanggang resipi kita kerana kita sudah tahu ia akan memproses data seperti yang diharapkan.\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": [
|
|
"Kerja yang bagus! Sekarang kita sudah ada resipi dan spesifikasi model, kita perlu cari cara untuk menggabungkan kedua-duanya ke dalam satu objek yang akan terlebih dahulu memproses data (prep+bake di belakang tabir), melatih model pada data yang telah diproses, dan juga membolehkan aktiviti pasca-pemprosesan dilakukan jika perlu. Bagaimana dengan itu untuk ketenangan fikiran anda!🤩\n",
|
|
"\n",
|
|
"Dalam Tidymodels, objek yang mudah ini dipanggil [`workflow`](https://workflows.tidymodels.org/) dan ia dengan mudah menyimpan komponen pemodelan anda! Ini adalah apa yang kita panggil *pipelines* dalam *Python*.\n",
|
|
"\n",
|
|
"Jadi, mari kita gabungkan semuanya ke dalam satu 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": [
|
|
"Sebagai tambahan, aliran kerja boleh disesuaikan/dilatih dengan cara yang hampir sama seperti 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": [
|
|
"Dari output model, kita dapat melihat pekali yang dipelajari semasa latihan. Pekali ini mewakili pekali garis terbaik yang memberikan ralat keseluruhan paling rendah antara pemboleh ubah sebenar dan yang diramalkan.\n",
|
|
"\n",
|
|
"#### Menilai prestasi model menggunakan set ujian\n",
|
|
"\n",
|
|
"Sudah tiba masanya untuk melihat bagaimana prestasi model 📏! Bagaimana kita melakukannya?\n",
|
|
"\n",
|
|
"Sekarang setelah kita melatih model, kita boleh menggunakannya untuk membuat ramalan bagi test_set menggunakan `parsnip::predict()`. Kemudian kita boleh membandingkan ramalan ini dengan nilai label sebenar untuk menilai sejauh mana (atau tidak!) model berfungsi.\n",
|
|
"\n",
|
|
"Mari kita mulakan dengan membuat ramalan untuk set ujian kemudian gabungkan lajur dengan set ujian.\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": [
|
|
"Ya, anda baru sahaja melatih model dan menggunakannya untuk membuat ramalan! 🔮 Adakah ia bagus? Mari kita nilai prestasi model tersebut!\n",
|
|
"\n",
|
|
"Dalam Tidymodels, kita lakukan ini menggunakan `yardstick::metrics()`! Untuk regresi linear, mari kita fokus pada metrik berikut:\n",
|
|
"\n",
|
|
"- `Root Mean Square Error (RMSE)`: Punca kuasa dua daripada [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). Ini memberikan metrik mutlak dalam unit yang sama seperti label (dalam kes ini, harga labu). Nilai yang lebih kecil menunjukkan model yang lebih baik (secara ringkas, ia mewakili purata harga di mana ramalan adalah salah!).\n",
|
|
"\n",
|
|
"- `Coefficient of Determination (biasanya dikenali sebagai R-squared atau R2)`: Metrik relatif di mana nilai yang lebih tinggi menunjukkan kesesuaian model yang lebih baik. Secara asasnya, metrik ini mewakili sejauh mana varians antara nilai label yang diramal dan sebenar dapat dijelaskan oleh model.\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": [
|
|
"Prestasi model menurun. Mari kita lihat jika kita boleh mendapatkan petunjuk yang lebih baik dengan memvisualisasikan plot taburan pakej dan harga, kemudian menggunakan ramalan yang dibuat untuk melapiskan garis terbaik.\n",
|
|
"\n",
|
|
"Ini bermaksud kita perlu menyediakan dan memproses set ujian untuk mengekodkan lajur pakej, kemudian menggabungkannya dengan ramalan yang dibuat oleh model kita.\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": [
|
|
"Hebat! Seperti yang anda lihat, model regresi linear tidak benar-benar menggambarkan hubungan antara pakej dan harga yang sepadan dengan baik.\n",
|
|
"\n",
|
|
"🎃 Tahniah, anda baru sahaja mencipta model yang boleh membantu meramalkan harga beberapa jenis labu. Ladang labu percutian anda pasti akan kelihatan indah. Tetapi anda mungkin boleh mencipta model yang lebih baik!\n",
|
|
"\n",
|
|
"## 5. Bina model regresi polinomial\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/linear-polynomial.png\"\n",
|
|
" width=\"800\"/>\n",
|
|
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"<!--{width=\"800\"}-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "HOCqJXLTwtWI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Kadang-kadang data kita mungkin tidak mempunyai hubungan linear, tetapi kita masih ingin meramalkan hasil. Regresi polinomial boleh membantu kita membuat ramalan untuk hubungan tidak linear yang lebih kompleks.\n",
|
|
"\n",
|
|
"Sebagai contoh, lihat hubungan antara pakej dan harga dalam set data labu kita. Walaupun kadang-kadang terdapat hubungan linear antara pemboleh ubah - semakin besar labu dari segi isipadu, semakin tinggi harganya - kadang-kadang hubungan ini tidak boleh diplotkan sebagai satah atau garis lurus.\n",
|
|
"\n",
|
|
"> ✅ Berikut adalah [beberapa contoh lagi](https://online.stat.psu.edu/stat501/lesson/9/9.8) data yang boleh menggunakan regresi polinomial\n",
|
|
">\n",
|
|
"> Lihat semula hubungan antara Jenis kepada Harga dalam plot sebelumnya. Adakah scatterplot ini kelihatan seperti ia semestinya perlu dianalisis dengan garis lurus? Mungkin tidak. Dalam kes ini, anda boleh mencuba regresi polinomial.\n",
|
|
">\n",
|
|
"> ✅ Polinomial adalah ekspresi matematik yang mungkin terdiri daripada satu atau lebih pemboleh ubah dan koefisien\n",
|
|
"\n",
|
|
"#### Latih model regresi polinomial menggunakan set latihan\n",
|
|
"\n",
|
|
"Regresi polinomial mencipta *garis melengkung* untuk lebih sesuai dengan data tidak linear.\n",
|
|
"\n",
|
|
"Mari kita lihat sama ada model polinomial akan memberikan prestasi yang lebih baik dalam membuat ramalan. Kita akan mengikuti prosedur yang agak serupa seperti yang kita lakukan sebelum ini:\n",
|
|
"\n",
|
|
"- Cipta resipi yang menentukan langkah-langkah praproses yang perlu dilakukan pada data kita untuk menjadikannya sedia untuk pemodelan iaitu: pengekodan pemboleh ubah dan pengiraan polinomial darjah *n*\n",
|
|
"\n",
|
|
"- Bina spesifikasi model\n",
|
|
"\n",
|
|
"- Gabungkan resipi dan spesifikasi model ke dalam satu aliran kerja\n",
|
|
"\n",
|
|
"- Cipta model dengan menyesuaikan aliran kerja\n",
|
|
"\n",
|
|
"- Nilai sejauh mana model berprestasi pada data ujian\n",
|
|
"\n",
|
|
"Mari kita teruskan!\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": [
|
|
"#### Menilai prestasi model\n",
|
|
"\n",
|
|
"👏👏Anda telah membina model polinomial, mari buat ramalan pada set ujian!\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, mari kita menilai bagaimana model berprestasi pada test_set menggunakan `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": [
|
|
"🤩🤩 Prestasi yang jauh lebih baik.\n",
|
|
"\n",
|
|
"`rmse` menurun daripada kira-kira 7 kepada kira-kira 3, menunjukkan pengurangan ralat antara harga sebenar dan harga yang diramal. Anda boleh *secara longgar* mentafsirkan ini sebagai bermaksud bahawa secara purata, ramalan yang salah adalah tersasar sekitar \\$3. `rsq` meningkat daripada kira-kira 0.4 kepada 0.8.\n",
|
|
"\n",
|
|
"Semua metrik ini menunjukkan bahawa model polinomial berprestasi jauh lebih baik daripada model linear. Kerja yang bagus!\n",
|
|
"\n",
|
|
"Mari kita lihat jika kita boleh menggambarkannya!\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": [
|
|
"Anda boleh melihat garis lengkung yang lebih sesuai dengan data anda! 🤩\n",
|
|
"\n",
|
|
"Anda boleh menjadikannya lebih lancar dengan memberikan formula polinomial kepada `geom_smooth` seperti ini:\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": [
|
|
"Sama seperti lengkung yang lancar!🤩\n",
|
|
"\n",
|
|
"Berikut adalah cara untuk membuat ramalan baru:\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": [
|
|
"Ramalan `polynomial model` memang masuk akal, berdasarkan plot taburan `price` dan `package`! Dan, jika ini adalah model yang lebih baik daripada yang sebelumnya, melihat data yang sama, anda perlu merancang bajet untuk labu yang lebih mahal ini!\n",
|
|
"\n",
|
|
"🏆 Tahniah! Anda telah mencipta dua model regresi dalam satu pelajaran. Dalam bahagian terakhir mengenai regresi, anda akan belajar tentang regresi logistik untuk menentukan kategori.\n",
|
|
"\n",
|
|
"## **🚀Cabaran**\n",
|
|
"\n",
|
|
"Uji beberapa pemboleh ubah yang berbeza dalam notebook ini untuk melihat bagaimana korelasi berkait dengan ketepatan model.\n",
|
|
"\n",
|
|
"## [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
|
|
"\n",
|
|
"## **Ulasan & Kajian Kendiri**\n",
|
|
"\n",
|
|
"Dalam pelajaran ini, kita telah belajar tentang Regresi Linear. Terdapat jenis Regresi lain yang penting. Baca tentang teknik Stepwise, Ridge, Lasso dan Elasticnet. Kursus yang baik untuk belajar lebih lanjut ialah [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n",
|
|
"\n",
|
|
"Jika anda ingin belajar lebih lanjut tentang cara menggunakan rangka kerja Tidymodels yang hebat, sila semak sumber berikut:\n",
|
|
"\n",
|
|
"- Laman web Tidymodels: [Mulakan dengan Tidymodels](https://www.tidymodels.org/start/)\n",
|
|
"\n",
|
|
"- Max Kuhn dan Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
|
|
"\n",
|
|
"###### **TERIMA KASIH KEPADA:**\n",
|
|
"\n",
|
|
"[Allison Horst](https://twitter.com/allison_horst?lang=en) kerana mencipta ilustrasi yang hebat yang menjadikan R lebih mesra dan menarik. Cari lebih banyak ilustrasi di [galerinya](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**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
|
|
]
|
|
}
|
|
]
|
|
} |