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/ms/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb

447 lines
17 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_1-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
"translation_date": "2025-09-06T11:49:45+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "ms"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Pengenalan kepada Regresi - Pelajaran 1\n",
"\n",
"#### Memahami dalam konteks\n",
"\n",
"✅ Terdapat banyak jenis kaedah regresi, dan pilihan kaedah bergantung pada jawapan yang anda cari. Jika anda ingin meramalkan ketinggian yang mungkin untuk seseorang berdasarkan umur tertentu, anda akan menggunakan `linear regression`, kerana anda mencari **nilai berangka**. Jika anda berminat untuk mengetahui sama ada jenis masakan tertentu harus dianggap vegan atau tidak, anda sedang mencari **penentuan kategori**, jadi anda akan menggunakan `logistic regression`. Anda akan mempelajari lebih lanjut tentang logistic regression kemudian. Fikirkan sejenak tentang beberapa soalan yang boleh anda tanyakan kepada data, dan kaedah mana yang lebih sesuai.\n",
"\n",
"Dalam bahagian ini, anda akan bekerja dengan [set data kecil tentang diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Bayangkan anda ingin menguji rawatan untuk pesakit diabetes. Model Pembelajaran Mesin mungkin membantu anda menentukan pesakit mana yang akan memberi tindak balas lebih baik terhadap rawatan, berdasarkan gabungan pemboleh ubah. Malah model regresi yang sangat asas, apabila divisualisasikan, mungkin menunjukkan maklumat tentang pemboleh ubah yang dapat membantu anda mengatur ujian klinikal teori anda.\n",
"\n",
"Dengan itu, mari kita mulakan tugas ini!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
"\n",
"<!--![Karya seni oleh \\@allison_horst](../../../../../../2-Regression/1-Tools/images/encouRage.jpg)<br>Karya seni oleh @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Memuatkan set alat kita\n",
"\n",
"Untuk tugasan ini, kita memerlukan pakej berikut:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) adalah [koleksi pakej R](https://www.tidyverse.org/packages) yang direka untuk menjadikan sains data lebih pantas, mudah, dan menyeronokkan!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) adalah rangka kerja [koleksi pakej](https://www.tidymodels.org/packages/) untuk pemodelan dan pembelajaran mesin.\n",
"\n",
"Anda boleh memasangnya seperti berikut:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"Skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk melengkapkan modul ini dan memasangnya untuk anda jika ada yang tidak lengkap.\n"
],
"metadata": {
"id": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang, mari kita muatkan pakej-pakej hebat ini dan jadikannya tersedia dalam sesi R semasa kita. (Ini hanya untuk ilustrasi, `pacman::p_load()` sudah melakukannya untuk anda)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Dataset diabetes\n",
"\n",
"Dalam latihan ini, kita akan mempraktikkan kemahiran regresi dengan membuat ramalan menggunakan dataset diabetes. [Dataset diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) mengandungi `442 sampel` data berkaitan diabetes, dengan 10 pemboleh ubah ciri peramal, iaitu `umur`, `jantina`, `indeks jisim badan`, `tekanan darah purata`, dan `enam ukuran serum darah` serta pemboleh ubah hasil `y`: ukuran kuantitatif perkembangan penyakit satu tahun selepas garis dasar.\n",
"\n",
"|Bilangan pemerhatian|442|\n",
"|--------------------|:---|\n",
"|Bilangan peramal|10 lajur pertama adalah peramal berangka|\n",
"|Hasil/Sasaran|Lajur ke-11 adalah ukuran kuantitatif perkembangan penyakit satu tahun selepas garis dasar|\n",
"|Maklumat Peramal|- umur dalam tahun\n",
"||- jantina\n",
"||- bmi indeks jisim badan\n",
"||- bp tekanan darah purata\n",
"||- s1 tc, jumlah kolesterol serum\n",
"||- s2 ldl, lipoprotein ketumpatan rendah\n",
"||- s3 hdl, lipoprotein ketumpatan tinggi\n",
"||- s4 tch, jumlah kolesterol / HDL\n",
"||- s5 ltg, mungkin log tahap trigliserida serum\n",
"||- s6 glu, tahap gula dalam darah|\n",
"\n",
"> 🎓 Ingat, ini adalah pembelajaran terselia, dan kita memerlukan sasaran 'y' yang dinamakan.\n",
"\n",
"Sebelum anda boleh memanipulasi data menggunakan R, anda perlu mengimport data ke dalam memori R, atau membina sambungan ke data yang boleh digunakan oleh R untuk mengakses data secara jarak jauh.\n",
"\n",
"> Pakej [readr](https://readr.tidyverse.org/), yang merupakan sebahagian daripada Tidyverse, menyediakan cara yang pantas dan mesra untuk membaca data berbentuk segi empat tepat ke dalam R.\n",
"\n",
"Sekarang, mari kita muatkan dataset diabetes yang disediakan di URL sumber ini: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Selain itu, kita akan melakukan pemeriksaan asas pada data kita menggunakan `glimpse()` dan memaparkan 5 baris pertama menggunakan `slice()`.\n",
"\n",
"Sebelum kita melangkah lebih jauh, mari kita perkenalkan sesuatu yang akan anda temui dengan kerap dalam kod R 🥁🥁: operator paip `%>%`\n",
"\n",
"Operator paip (`%>%`) melaksanakan operasi dalam urutan logik dengan menghantar objek ke hadapan ke dalam fungsi atau ungkapan panggilan. Anda boleh menganggap operator paip sebagai mengatakan \"dan kemudian\" dalam kod anda.\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` menunjukkan bahawa data ini mempunyai 442 baris dan 11 lajur dengan semua lajur adalah daripada jenis data `double`\n",
"\n",
"<br>\n",
"\n",
"> glimpse() dan slice() adalah fungsi dalam [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, sebahagian daripada Tidyverse, adalah tatabahasa manipulasi data yang menyediakan satu set kata kerja yang konsisten untuk membantu anda menyelesaikan cabaran manipulasi data yang paling biasa\n",
"\n",
"<br>\n",
"\n",
"Sekarang kita sudah mempunyai data, mari kita tumpukan kepada satu ciri (`bmi`) untuk dijadikan sasaran dalam latihan ini. Ini memerlukan kita memilih lajur yang dikehendaki. Jadi, bagaimana kita boleh melakukannya?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) membolehkan kita *memilih* (dan secara opsyen menamakan semula) lajur dalam rangka data.\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Data Latihan dan Ujian\n",
"\n",
"Dalam pembelajaran terkawal, adalah amalan biasa untuk *membahagikan* data kepada dua subset; satu set (biasanya lebih besar) untuk melatih model, dan satu set \"simpanan\" yang lebih kecil untuk melihat bagaimana prestasi model.\n",
"\n",
"Sekarang kita mempunyai data yang sedia, kita boleh melihat sama ada mesin boleh membantu menentukan pembahagian logik antara nombor dalam dataset ini. Kita boleh menggunakan pakej [rsample](https://tidymodels.github.io/rsample/), yang merupakan sebahagian daripada rangka kerja Tidymodels, untuk mencipta objek yang mengandungi maklumat tentang *bagaimana* untuk membahagikan data, dan kemudian dua lagi fungsi rsample untuk mengekstrak set latihan dan ujian yang telah dicipta:\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Melatih model regresi linear dengan Tidymodels\n",
"\n",
"Sekarang kita bersedia untuk melatih model kita!\n",
"\n",
"Dalam Tidymodels, anda menentukan model menggunakan `parsnip()` dengan menyatakan tiga konsep:\n",
"\n",
"- **Jenis** model membezakan model seperti regresi linear, regresi logistik, model pokok keputusan, dan sebagainya.\n",
"\n",
"- **Mod** model merangkumi pilihan umum seperti regresi dan klasifikasi; beberapa jenis model menyokong kedua-duanya, manakala ada yang hanya mempunyai satu mod sahaja.\n",
"\n",
"- **Enjin** model adalah alat pengiraan yang akan digunakan untuk melatih model. Selalunya ini adalah pakej R, seperti **`\"lm\"`** atau **`\"ranger\"`**\n",
"\n",
"Maklumat pemodelan ini dirangkum dalam spesifikasi model, jadi mari kita bina satu!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"Selepas model telah *ditentukan*, model boleh `dianggarkan` atau `dilatih` menggunakan fungsi [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), biasanya dengan menggunakan formula dan beberapa data.\n",
"\n",
"`y ~ .` bermaksud kita akan memadankan `y` sebagai kuantiti/target yang diramal, dijelaskan oleh semua peramal/ciri iaitu `.` (dalam kes ini, kita hanya mempunyai satu peramal: `bmi`).\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"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 diramal.\n",
"<br>\n",
"\n",
"## 5. Buat ramalan pada set ujian\n",
"\n",
"Sekarang kita telah melatih model, kita boleh menggunakannya untuk meramal perkembangan penyakit y bagi dataset ujian menggunakan [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Ini akan digunakan untuk melukis garis antara kumpulan data.\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 💃🕺 Kami baru sahaja melatih model dan menggunakannya untuk membuat ramalan!\n",
"\n",
"Apabila membuat ramalan, konvensyen tidymodels adalah sentiasa menghasilkan tibble/data frame keputusan dengan nama lajur yang telah diseragamkan. Ini memudahkan untuk menggabungkan data asal dan ramalan dalam format yang boleh digunakan untuk operasi seterusnya seperti membuat plot.\n",
"\n",
"`dplyr::bind_cols()` menggabungkan pelbagai data frame secara efisien mengikut lajur.\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. Plot keputusan pemodelan\n",
"\n",
"Sekarang, masa untuk melihatnya secara visual 📈. Kita akan membuat plot taburan bagi semua nilai `y` dan `bmi` daripada set ujian, kemudian menggunakan ramalan untuk melukis garis di tempat yang paling sesuai, di antara kumpulan data model.\n",
"\n",
"R mempunyai beberapa sistem untuk membuat graf, tetapi `ggplot2` adalah salah satu yang paling elegan dan paling serba boleh. Ini membolehkan anda menyusun graf dengan **menggabungkan komponen bebas**.\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ Fikirkan sedikit tentang apa yang sedang berlaku di sini. Garis lurus sedang melalui banyak titik kecil data, tetapi apa sebenarnya yang sedang dilakukan? Bolehkah anda melihat bagaimana anda sepatutnya dapat menggunakan garis ini untuk meramalkan di mana titik data baru yang belum dilihat sepatutnya sesuai dalam hubungan dengan paksi y plot? Cuba ungkapkan dalam kata-kata kegunaan praktikal model ini.\n",
"\n",
"Tahniah, anda telah membina model regresi linear pertama anda, membuat ramalan dengannya, dan memaparkannya dalam plot!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"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 yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
]
}
]
}