Merge pull request #864 from microsoft/update-translations

🌐 Update translations via Co-op Translator
pull/865/head
Lee Stott 2 weeks ago committed by GitHub
commit df77575a77
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,447 @@
{
"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"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,46 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3-final"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"coopTranslator": {
"original_hash": "1b2ab303ac6c604a34c6ca7a49077fc7",
"translation_date": "2025-09-06T11:52:56+00:00",
"source_file": "2-Regression/2-Data/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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 perhatian 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"
]
}
]
}

@ -0,0 +1,670 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_2-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
"translation_date": "2025-09-06T11:54:32+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "ms"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Bina model regresi: sediakan dan visualkan data\n",
"\n",
"## **Regresi Linear untuk Labu - Pelajaran 2**\n",
"#### Pengenalan\n",
"\n",
"Sekarang anda telah dilengkapi dengan alat yang diperlukan untuk mula membina model pembelajaran mesin menggunakan Tidymodels dan Tidyverse, anda bersedia untuk mula bertanya soalan kepada data anda. Semasa anda bekerja dengan data dan menerapkan penyelesaian ML, adalah sangat penting untuk memahami cara bertanya soalan yang betul untuk membuka potensi dataset anda dengan tepat.\n",
"\n",
"Dalam pelajaran ini, anda akan belajar:\n",
"\n",
"- Cara menyediakan data anda untuk pembinaan model.\n",
"\n",
"- Cara menggunakan `ggplot2` untuk visualisasi data.\n",
"\n",
"Soalan yang perlu dijawab akan menentukan jenis algoritma ML yang akan anda gunakan. Dan kualiti jawapan yang anda peroleh sangat bergantung pada sifat data anda.\n",
"\n",
"Mari kita lihat ini dengan melalui latihan praktikal.\n",
"\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Karya seni oleh \\@allison_horst](../../../../../../2-Regression/2-Data/images/unruly_data.jpg)<br>Karya seni oleh \\@allison_horst-->\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Mengimport data labu dan memanggil Tidyverse\n",
"\n",
"Kita akan memerlukan pakej-pakej berikut untuk memproses dan menganalisis pelajaran ini:\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",
"Anda boleh memasangnya seperti berikut:\n",
"\n",
"`install.packages(c(\"tidyverse\"))`\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 belum dipasang.\n"
],
"metadata": {
"id": "dc5WhyVdXAjR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse)"
],
"outputs": [],
"metadata": {
"id": "GqPYUZgfXOBt"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang, mari kita hidupkan beberapa pakej dan muatkan [data](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) yang disediakan untuk pelajaran ini!\n"
],
"metadata": {
"id": "kvjDTPDSXRr2"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core Tidyverse packages\n",
"library(tidyverse)\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 =50)"
],
"outputs": [],
"metadata": {
"id": "VMri-t2zXqgD"
}
},
{
"cell_type": "markdown",
"source": [
"Satu `glimpse()` pantas menunjukkan terdapat kekosongan dan campuran antara rentetan (`chr`) dan data berangka (`dbl`). `Date` adalah jenis karakter dan terdapat juga satu lajur pelik yang dipanggil `Package` di mana datanya adalah campuran antara `sacks`, `bins` dan nilai-nilai lain. Data ini, sebenarnya, agak bersepah 😤.\n",
"\n",
"Sebenarnya, tidaklah biasa untuk menerima dataset yang sudah siap sepenuhnya untuk digunakan bagi mencipta model ML secara langsung. Tetapi jangan risau, dalam pelajaran ini, anda akan belajar cara menyediakan dataset mentah menggunakan pustaka R standard 🧑‍🔧. Anda juga akan belajar pelbagai teknik untuk memvisualkan data.📈📊\n",
"<br>\n",
"\n",
"> Ulang kaji: Operator paip (`%>%`) melaksanakan operasi dalam urutan logik dengan menghantar objek ke hadapan ke dalam fungsi atau ekspresi panggilan. Anda boleh menganggap operator paip sebagai mengatakan \"dan kemudian\" dalam kod anda.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Periksa data yang hilang\n",
"\n",
"Salah satu isu paling biasa yang perlu ditangani oleh saintis data ialah data yang tidak lengkap atau hilang. R mewakili nilai yang hilang, atau tidak diketahui, dengan nilai sentinel khas: `NA` (Not Available).\n",
"\n",
"Jadi, bagaimana kita tahu bahawa rangka data mengandungi nilai yang hilang?\n",
"<br>\n",
"- Salah satu cara yang mudah adalah dengan menggunakan fungsi asas R `anyNA` yang mengembalikan objek logik `TRUE` atau `FALSE`.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Hebat, nampaknya ada beberapa data yang hilang! Itu adalah tempat yang baik untuk bermula.\n",
"\n",
"- Cara lain adalah dengan menggunakan fungsi `is.na()` yang menunjukkan elemen lajur individu yang hilang dengan nilai logik `TRUE`.\n"
],
"metadata": {
"id": "mU-7-SB6YokF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "W-DxDOR4YxSW"
}
},
{
"cell_type": "markdown",
"source": [
"Baiklah, sudah selesai tetapi dengan bingkai data yang besar seperti ini, ia akan menjadi tidak efisien dan hampir mustahil untuk menyemak semua baris dan lajur secara individu😴.\n",
"\n",
"- Cara yang lebih intuitif adalah dengan mengira jumlah nilai yang hilang untuk setiap lajur:\n"
],
"metadata": {
"id": "xUWxipKYY0o7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" colSums()"
],
"outputs": [],
"metadata": {
"id": "ZRBWV6P9ZArL"
}
},
{
"cell_type": "markdown",
"source": [
"Data yang hilang mungkin tidak menjadi masalah untuk tugasan ini. Mari kita lihat apa yang akan dibawa oleh analisis lanjut.\n",
"\n",
"> Bersama-sama dengan set pakej dan fungsi yang hebat, R mempunyai dokumentasi yang sangat baik. Sebagai contoh, gunakan `help(colSums)` atau `?colSums` untuk mengetahui lebih lanjut tentang fungsi tersebut.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Tatabahasa untuk Manipulasi Data\n",
"\n",
"<p>\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![Karya seni oleh \\@allison_horst](../../../../../../2-Regression/2-Data/images/dplyr_wrangling.png)<br/>Karya seni oleh \\@allison_horst-->\n"
],
"metadata": {
"id": "o4jLY5-VZO2C"
}
},
{
"cell_type": "markdown",
"source": [
"[`dplyr`](https://dplyr.tidyverse.org/), sebuah pakej dalam Tidyverse, adalah tatabahasa manipulasi data yang menyediakan satu set kata kerja yang konsisten untuk membantu anda menyelesaikan cabaran manipulasi data yang paling biasa. Dalam bahagian ini, kita akan meneroka beberapa kata kerja dplyr!\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` ialah fungsi dalam pakej `dplyr` yang membantu anda memilih lajur untuk disimpan atau dikecualikan.\n",
"\n",
"Untuk menjadikan rangka data anda lebih mudah digunakan, buang beberapa lajur dengan menggunakan `select()`, dan simpan hanya lajur yang anda perlukan.\n",
"\n",
"Sebagai contoh, dalam latihan ini, analisis kita akan melibatkan lajur `Package`, `Low Price`, `High Price` dan `Date`. Mari kita pilih lajur-lajur ini.\n"
],
"metadata": {
"id": "x3VGMAGBZiUr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(Package, `Low Price`, `High Price`, Date)\n",
"\n",
"\n",
"# Print data set\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "F_FgxQnVZnM0"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::mutate()\n",
"\n",
"`mutate()` adalah fungsi dalam pakej `dplyr` yang membantu anda mencipta atau mengubah suai lajur, sambil mengekalkan lajur yang sedia ada.\n",
"\n",
"Struktur umum `mutate` adalah:\n",
"\n",
"`data %>% mutate(new_column_name = what_it_contains)`\n",
"\n",
"Mari kita cuba menggunakan `mutate` dengan lajur `Date` dengan melakukan operasi berikut:\n",
"\n",
"1. Tukarkan tarikh (yang kini dalam jenis karakter) kepada format bulan (ini adalah tarikh AS, jadi formatnya adalah `MM/DD/YYYY`).\n",
"\n",
"2. Ekstrak bulan daripada tarikh ke dalam lajur baru.\n",
"\n",
"Dalam R, pakej [lubridate](https://lubridate.tidyverse.org/) memudahkan kerja dengan data tarikh-masa. Jadi, mari kita gunakan `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` dan lihat bagaimana untuk mencapai objektif di atas. Kita boleh membuang lajur `Date` kerana kita tidak akan memerlukannya lagi dalam operasi seterusnya.\n"
],
"metadata": {
"id": "2KKo0Ed9Z1VB"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load lubridate\n",
"library(lubridate)\n",
"\n",
"pumpkins <- pumpkins %>% \n",
" # Convert the Date column to a date object\n",
" mutate(Date = mdy(Date)) %>% \n",
" # Extract month from Date\n",
" mutate(Month = month(Date)) %>% \n",
" # Drop Date column\n",
" select(-Date)\n",
"\n",
"# View the first few rows\n",
"pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "5joszIVSZ6xe"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 🤩\n",
"\n",
"Seterusnya, mari kita cipta lajur baru `Price`, yang mewakili harga purata labu. Sekarang, mari kita ambil purata daripada lajur `Low Price` dan `High Price` untuk mengisi lajur Price yang baru.\n"
],
"metadata": {
"id": "nIgLjNMCZ-6Y"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new column Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
"\n",
"# View the first few rows of the data\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "Zo0BsqqtaJw2"
}
},
{
"cell_type": "markdown",
"source": [
"Yeees!💪\n",
"\n",
"\"Tapi tunggu!\", anda akan berkata selepas meneliti keseluruhan set data dengan `View(pumpkins)`, \"Ada sesuatu yang pelik di sini!\"🤔\n",
"\n",
"Jika anda melihat pada lajur `Package`, labu dijual dalam pelbagai konfigurasi. Ada yang dijual dalam ukuran `1 1/9 bushel`, ada yang dalam ukuran `1/2 bushel`, ada yang dijual per labu, ada yang per paun, dan ada yang dalam kotak besar dengan lebar yang berbeza-beza.\n",
"\n",
"Mari kita sahkan ini:\n"
],
"metadata": {
"id": "p77WZr-9aQAR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Verify the distinct observations in Package column\n",
"pumpkins %>% \n",
" distinct(Package)"
],
"outputs": [],
"metadata": {
"id": "XISGfh0IaUy6"
}
},
{
"cell_type": "markdown",
"source": [
"Hebat!👏\n",
"\n",
"Labu nampaknya sangat sukar untuk ditimbang secara konsisten, jadi mari kita tapis dengan memilih hanya labu yang mempunyai perkataan *bushel* dalam lajur `Package` dan letakkan ini dalam kerangka data baharu `new_pumpkins`.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() dan stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): menghasilkan subset data yang hanya mengandungi **baris** yang memenuhi syarat anda, dalam kes ini, labu dengan string *bushel* dalam lajur `Package`.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): mengesan kehadiran atau ketiadaan corak dalam satu string.\n",
"\n",
"Pakej [`stringr`](https://github.com/tidyverse/stringr) menyediakan fungsi mudah untuk operasi string yang biasa.\n"
],
"metadata": {
"id": "L8Qfcs92ageF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Retain only pumpkins with \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(Package, \"bushel\"))\n",
"\n",
"# Get the dimensions of the new data\n",
"dim(new_pumpkins)\n",
"\n",
"# View a few rows of the new data\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "hy_SGYREampd"
}
},
{
"cell_type": "markdown",
"source": [
"Anda boleh lihat bahawa kami telah mengecilkan kepada kira-kira 415 baris data yang mengandungi labu mengikut jumlah besar.🤩\n",
"<br>\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Tapi tunggu! Ada satu perkara lagi yang perlu dilakukan**\n",
"\n",
"Adakah anda perasan bahawa jumlah bushel berbeza untuk setiap baris? Anda perlu menormalkan harga supaya anda menunjukkan harga per bushel, bukan per 1 1/9 atau 1/2 bushel. Masa untuk melakukan sedikit matematik untuk menyeragamkannya.\n",
"\n",
"Kita akan menggunakan fungsi [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) untuk *mutate* lajur Harga bergantung kepada beberapa syarat. `case_when` membolehkan anda memvektorkan beberapa pernyataan `if_else()`.\n"
],
"metadata": {
"id": "mLpw2jH4a0tx"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Convert the price if the Package contains fractional bushel values\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(Price = case_when(\n",
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
" TRUE ~ Price))\n",
"\n",
"# View the first few rows of the data\n",
"new_pumpkins %>% \n",
" slice_head(n = 30)"
],
"outputs": [],
"metadata": {
"id": "P68kLVQmbM6I"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang, kita boleh menganalisis harga per unit berdasarkan ukuran bushel mereka. Namun, semua kajian tentang bushel labu ini menunjukkan betapa `pentingnya` untuk `memahami sifat data anda`!\n",
"\n",
"> ✅ Menurut [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), berat bushel bergantung pada jenis hasil tanaman, kerana ia adalah ukuran isipadu. \"Sebagai contoh, satu bushel tomato sepatutnya mempunyai berat 56 paun... Daun dan sayur-sayuran mengambil lebih banyak ruang dengan berat yang kurang, jadi satu bushel bayam hanya 20 paun.\" Semuanya agak rumit! Jangan susahkan diri dengan membuat penukaran bushel kepada paun, sebaliknya tetapkan harga berdasarkan bushel. Namun, semua kajian tentang bushel labu ini menunjukkan betapa pentingnya untuk memahami sifat data anda!\n",
">\n",
"> ✅ Adakah anda perasan bahawa labu yang dijual dalam setengah bushel sangat mahal? Bolehkah anda fikirkan sebabnya? Petunjuk: labu kecil jauh lebih mahal daripada yang besar, mungkin kerana terdapat lebih banyak labu kecil dalam satu bushel, memandangkan ruang yang tidak digunakan oleh satu labu pai besar yang berongga.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang akhirnya, demi sedikit pengembaraan 💁‍♀️, mari kita pindahkan juga lajur Bulan ke posisi pertama iaitu `sebelum` lajur `Pakej`.\n",
"\n",
"`dplyr::relocate()` digunakan untuk menukar kedudukan lajur.\n"
],
"metadata": {
"id": "qql1SowfbdnP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new data frame new_pumpkins\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(Month, .before = Package)\n",
"\n",
"new_pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "JJ1x6kw8bixF"
}
},
{
"cell_type": "markdown",
"source": [
"Kerja yang bagus!👌 Anda kini mempunyai set data yang bersih dan teratur untuk membina model regresi baharu anda!\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Visualisasi data dengan ggplot2\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"<!--![Infografik oleh Dasani Madipalli](../../../../../../2-Regression/2-Data/images/data-visualization.png){width=\"600\"}-->\n",
"\n",
"Terdapat satu pepatah *bijak* yang berbunyi seperti ini:\n",
"\n",
"> \"Graf mudah telah membawa lebih banyak maklumat kepada pemikiran penganalisis data berbanding alat lain.\" --- John Tukey\n",
"\n",
"Sebahagian daripada peranan saintis data adalah untuk menunjukkan kualiti dan sifat data yang mereka sedang kerjakan. Untuk melakukan ini, mereka sering mencipta visualisasi yang menarik, atau plot, graf, dan carta, yang menunjukkan pelbagai aspek data. Dengan cara ini, mereka dapat menunjukkan hubungan dan jurang secara visual yang mungkin sukar untuk dikesan.\n",
"\n",
"Visualisasi juga boleh membantu menentukan teknik pembelajaran mesin yang paling sesuai untuk data tersebut. Sebagai contoh, scatterplot yang kelihatan mengikuti satu garis menunjukkan bahawa data tersebut adalah calon yang baik untuk latihan regresi linear.\n",
"\n",
"R menawarkan beberapa sistem untuk membuat graf, tetapi [`ggplot2`](https://ggplot2.tidyverse.org/index.html) adalah salah satu yang paling elegan dan serba boleh. `ggplot2` membolehkan anda menyusun graf dengan **menggabungkan komponen-komponen bebas**.\n",
"\n",
"Mari kita mulakan dengan scatter plot mudah untuk lajur Price dan Month.\n",
"\n",
"Jadi dalam kes ini, kita akan bermula dengan [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), menyediakan set data dan pemetaan estetik (dengan [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) kemudian menambah lapisan (seperti [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) untuk scatter plot.\n"
],
"metadata": {
"id": "mYSH6-EtbvNa"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plots\n",
"theme_set(theme_light())\n",
"\n",
"# Create a scatter plot\n",
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
"p + geom_point()"
],
"outputs": [],
"metadata": {
"id": "g2YjnGeOcLo4"
}
},
{
"cell_type": "markdown",
"source": [
"Adakah ini plot yang berguna 🤷? Adakah apa-apa mengenainya mengejutkan anda?\n",
"\n",
"Ia tidak begitu berguna kerana apa yang dilakukan hanyalah memaparkan data anda sebagai taburan titik dalam bulan tertentu. \n",
"<br>\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **Bagaimana kita menjadikannya berguna?**\n",
"\n",
"Untuk memaparkan carta dengan data yang berguna, anda biasanya perlu mengelompokkan data dengan cara tertentu. Sebagai contoh, dalam kes kita, mencari harga purata labu untuk setiap bulan akan memberikan lebih banyak pandangan terhadap corak asas dalam data kita. Ini membawa kita kepada satu lagi ciri **dplyr**:\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"Pengagregatan berkelompok dalam R boleh dikira dengan mudah menggunakan\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` mengubah unit analisis daripada keseluruhan dataset kepada kumpulan individu seperti setiap bulan.\n",
"\n",
"- `dplyr::summarize()` mencipta kerangka data baharu dengan satu lajur untuk setiap pembolehubah pengelompokan dan satu lajur untuk setiap statistik ringkasan yang telah anda tentukan.\n",
"\n",
"Sebagai contoh, kita boleh menggunakan `dplyr::group_by() %>% summarize()` untuk mengelompokkan labu berdasarkan lajur **Month** dan kemudian mencari **harga purata** untuk setiap bulan.\n"
],
"metadata": {
"id": "jMakvJZIcVkh"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price))"
],
"outputs": [],
"metadata": {
"id": "6kVSUa2Bcilf"
}
},
{
"cell_type": "markdown",
"source": [
"Ringkas!✨\n",
"\n",
"Ciri-ciri kategori seperti bulan lebih sesuai diwakili menggunakan plot bar 📊. Lapisan yang bertanggungjawab untuk carta bar adalah `geom_bar()` dan `geom_col()`. Rujuk `?geom_bar` untuk mengetahui lebih lanjut.\n",
"\n",
"Jom kita buat satu!\n"
],
"metadata": {
"id": "Kds48GUBcj3W"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month then plot a bar chart\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price)) %>% \r\n",
" ggplot(aes(x = Month, y = mean_price)) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"Pumpkin Price\")"
],
"outputs": [],
"metadata": {
"id": "VNbU1S3BcrxO"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩Ini adalah visualisasi data yang lebih berguna! Ia kelihatan menunjukkan bahawa harga tertinggi untuk labu berlaku pada bulan September dan Oktober. Adakah itu memenuhi jangkaan anda? Mengapa atau mengapa tidak?\n",
"\n",
"Tahniah kerana telah menyelesaikan pelajaran kedua 👏! Anda telah menyediakan data anda untuk pembinaan model, kemudian menemui lebih banyak maklumat menggunakan visualisasi!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"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 perhatian 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"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,128 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Harga Labu\n",
"\n",
"Muatkan perpustakaan dan set data yang diperlukan. Tukarkan data kepada dataframe yang mengandungi subset data:\n",
"\n",
"- Hanya ambil labu yang harganya berdasarkan bushel\n",
"- Tukarkan tarikh kepada bulan\n",
"- Kira harga sebagai purata daripada harga tinggi dan rendah\n",
"- Tukarkan harga untuk mencerminkan harga berdasarkan kuantiti bushel\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from datetime import datetime\n",
"\n",
"pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
"\n",
"pumpkins.head()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
"\n",
"columns_to_select = ['Package', 'Variety', 'City Name', 'Low Price', 'High Price', 'Date']\n",
"pumpkins = pumpkins.loc[:, columns_to_select]\n",
"\n",
"price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
"\n",
"month = pd.DatetimeIndex(pumpkins['Date']).month\n",
"day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)\n",
"\n",
"new_pumpkins = pd.DataFrame(\n",
" {'Month': month, \n",
" 'DayOfYear' : day_of_year, \n",
" 'Variety': pumpkins['Variety'], \n",
" 'City': pumpkins['City Name'], \n",
" 'Package': pumpkins['Package'], \n",
" 'Low Price': pumpkins['Low Price'],\n",
" 'High Price': pumpkins['High Price'], \n",
" 'Price': price})\n",
"\n",
"new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/1.1\n",
"new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price*2\n",
"\n",
"new_pumpkins.head()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot pencar asas 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"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.scatter('Month','Price',data=new_pumpkins)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"plt.scatter('DayOfYear','Price',data=new_pumpkins)"
]
},
{
"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 perhatian 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"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3-final"
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "b032d371c75279373507f003439a577e",
"translation_date": "2025-09-06T11:29:19+00:00",
"source_file": "2-Regression/3-Linear/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,269 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Jenis Labu dan Warna\n",
"\n",
"Muatkan perpustakaan dan dataset yang diperlukan. Tukarkan data kepada dataframe yang mengandungi subset data:\n",
"\n",
"Mari kita lihat hubungan antara warna dan jenis\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>City Name</th>\n",
" <th>Type</th>\n",
" <th>Package</th>\n",
" <th>Variety</th>\n",
" <th>Sub Variety</th>\n",
" <th>Grade</th>\n",
" <th>Date</th>\n",
" <th>Low Price</th>\n",
" <th>High Price</th>\n",
" <th>Mostly Low</th>\n",
" <th>...</th>\n",
" <th>Unit of Sale</th>\n",
" <th>Quality</th>\n",
" <th>Condition</th>\n",
" <th>Appearance</th>\n",
" <th>Storage</th>\n",
" <th>Crop</th>\n",
" <th>Repack</th>\n",
" <th>Trans Mode</th>\n",
" <th>Unnamed: 24</th>\n",
" <th>Unnamed: 25</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4/29/17</td>\n",
" <td>270.0</td>\n",
" <td>280.0</td>\n",
" <td>270.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>E</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>5/6/17</td>\n",
" <td>270.0</td>\n",
" <td>280.0</td>\n",
" <td>270.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>E</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>9/24/16</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>9/24/16</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>11/5/16</td>\n",
" <td>90.0</td>\n",
" <td>100.0</td>\n",
" <td>90.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 26 columns</p>\n",
"</div>"
],
"text/plain": [
" City Name Type Package Variety Sub Variety Grade Date \\\n",
"0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n",
"1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
"2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
"3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
"4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
"\n",
" Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n",
"0 270.0 280.0 270.0 ... NaN NaN NaN \n",
"1 270.0 280.0 270.0 ... NaN NaN NaN \n",
"2 160.0 160.0 160.0 ... NaN NaN NaN \n",
"3 160.0 160.0 160.0 ... NaN NaN NaN \n",
"4 90.0 100.0 90.0 ... NaN NaN NaN \n",
"\n",
" Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
"0 NaN NaN NaN E NaN NaN NaN \n",
"1 NaN NaN NaN E NaN NaN NaN \n",
"2 NaN NaN NaN N NaN NaN NaN \n",
"3 NaN NaN NaN N NaN NaN NaN \n",
"4 NaN NaN NaN N NaN NaN NaN \n",
"\n",
"[5 rows x 26 columns]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"full_pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
"\n",
"full_pumpkins.head()\n"
]
},
{
"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"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.1"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "dee08c2b49057b0de8b6752c4dbca368",
"translation_date": "2025-09-06T11:40:28+00:00",
"source_file": "2-Regression/4-Logistic/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,686 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Bina model regresi logistik - Pelajaran 4\n",
"\n",
"![Infografik regresi logistik vs. linear](../../../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png)\n",
"\n",
"#### **[Kuiz pra-kuliah](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n",
"\n",
"#### Pengenalan\n",
"\n",
"Dalam pelajaran terakhir mengenai Regresi ini, salah satu teknik asas *klasik* ML, kita akan melihat Regresi Logistik. Anda boleh menggunakan teknik ini untuk mengenal pasti corak bagi meramalkan kategori binari. Adakah gula-gula ini coklat atau tidak? Adakah penyakit ini berjangkit atau tidak? Adakah pelanggan ini akan memilih produk ini atau tidak?\n",
"\n",
"Dalam pelajaran ini, anda akan belajar:\n",
"\n",
"- Teknik untuk regresi logistik\n",
"\n",
"✅ Tingkatkan pemahaman anda tentang bekerja dengan jenis regresi ini dalam [modul pembelajaran ini](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott)\n",
"\n",
"## Prasyarat\n",
"\n",
"Setelah bekerja dengan data labu, kita kini cukup biasa dengannya untuk menyedari bahawa terdapat satu kategori binari yang boleh kita gunakan: `Color`.\n",
"\n",
"Mari kita bina model regresi logistik untuk meramalkan, berdasarkan beberapa pemboleh ubah, *warna apa yang mungkin dimiliki oleh labu tertentu* (oren 🎃 atau putih 👻).\n",
"\n",
"> Mengapa kita bercakap tentang klasifikasi binari dalam kumpulan pelajaran mengenai regresi? Hanya untuk kemudahan linguistik, kerana regresi logistik adalah [sebenarnya kaedah klasifikasi](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), walaupun ia berasaskan linear. Ketahui cara lain untuk mengklasifikasikan data dalam kumpulan pelajaran seterusnya.\n",
"\n",
"Untuk pelajaran 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",
"- `ggbeeswarm`: Pakej [ggbeeswarm](https://github.com/eclarke/ggbeeswarm) menyediakan kaedah untuk mencipta plot gaya beeswarm menggunakan ggplot2.\n",
"\n",
"Anda boleh memasangnya seperti berikut:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n",
"\n",
"Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk melengkapkan modul ini dan memasangnya untuk anda jika ia tiada.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## **Tentukan soalan**\n",
"\n",
"Untuk tujuan kita, kita akan menyatakannya sebagai binari: 'Putih' atau 'Bukan Putih'. Terdapat juga kategori 'berjalur' dalam dataset kita tetapi terdapat sedikit contoh mengenainya, jadi kita tidak akan menggunakannya. Ia akan hilang apabila kita membuang nilai null daripada dataset, bagaimanapun.\n",
"\n",
"> 🎃 Fakta menarik, kadang-kadang kita memanggil labu putih sebagai labu 'hantu'. Ia tidak mudah untuk diukir, jadi ia tidak sepopular labu oren tetapi ia kelihatan menarik! Jadi kita juga boleh merumuskan semula soalan kita sebagai: 'Hantu' atau 'Bukan Hantu'. 👻\n",
"\n",
"## **Tentang regresi logistik**\n",
"\n",
"Regresi logistik berbeza daripada regresi linear, yang telah anda pelajari sebelum ini, dalam beberapa cara penting.\n",
"\n",
"#### **Klasifikasi binari**\n",
"\n",
"Regresi logistik tidak menawarkan ciri yang sama seperti regresi linear. Regresi logistik memberikan ramalan tentang `kategori binari` (\"oren atau bukan oren\") manakala regresi linear mampu meramalkan `nilai berterusan`, contohnya berdasarkan asal labu dan masa penuaian, *berapa banyak harga labu akan meningkat*.\n",
"\n",
"![Infografik oleh Dasani Madipalli](../../../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png)\n",
"\n",
"### Klasifikasi lain\n",
"\n",
"Terdapat jenis regresi logistik lain, termasuk multinomial dan ordinal:\n",
"\n",
"- **Multinomial**, yang melibatkan lebih daripada satu kategori - \"Oren, Putih, dan Berjalur\".\n",
"\n",
"- **Ordinal**, yang melibatkan kategori yang teratur, berguna jika kita ingin menyusun hasil kita secara logik, seperti labu kita yang disusun mengikut bilangan saiz yang terhad (mini,kecil,sederhana,besar,xl,xxl).\n",
"\n",
"![Regresi multinomial vs ordinal](../../../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png)\n",
"\n",
"#### **Pembolehubah TIDAK perlu berkorelasi**\n",
"\n",
"Ingat bagaimana regresi linear berfungsi lebih baik dengan pembolehubah yang lebih berkorelasi? Regresi logistik adalah sebaliknya - pembolehubah tidak perlu sejajar. Ini sesuai untuk data ini yang mempunyai korelasi yang agak lemah.\n",
"\n",
"#### **Anda memerlukan banyak data yang bersih**\n",
"\n",
"Regresi logistik akan memberikan hasil yang lebih tepat jika anda menggunakan lebih banyak data; dataset kecil kita tidak optimum untuk tugas ini, jadi ingatlah perkara ini.\n",
"\n",
"✅ Fikirkan tentang jenis data yang sesuai untuk regresi logistik\n",
"\n",
"## Latihan - kemaskan data\n",
"\n",
"Pertama, bersihkan data sedikit, buang nilai null dan pilih hanya beberapa kolum:\n",
"\n",
"1. Tambahkan kod berikut:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Load the core tidyverse packages\n",
"library(tidyverse)\n",
"\n",
"# Import the data and clean column names\n",
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n",
" clean_names()\n",
"\n",
"# Select desired columns\n",
"pumpkins_select <- pumpkins %>% \n",
" select(c(city_name, package, variety, origin, item_size, color)) \n",
"\n",
"# Drop rows containing missing values and encode color as factor (category)\n",
"pumpkins_select <- pumpkins_select %>% \n",
" drop_na() %>% \n",
" mutate(color = factor(color))\n",
"\n",
"# View the first few rows\n",
"pumpkins_select %>% \n",
" slice_head(n = 5)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Anda sentiasa boleh melihat sekilas dataframe baharu anda dengan menggunakan fungsi [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) seperti di bawah:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"pumpkins_select %>% \n",
" glimpse()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mari kita pastikan bahawa kita sebenarnya akan melakukan masalah klasifikasi binari:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Subset distinct observations in outcome column\n",
"pumpkins_select %>% \n",
" distinct(color)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Visualisasi - plot kategori\n",
"Pada masa ini, anda telah memuatkan semula data labu dan membersihkannya untuk mengekalkan dataset yang mengandungi beberapa pemboleh ubah, termasuk Warna. Mari visualisasikan dataframe dalam notebook menggunakan perpustakaan ggplot.\n",
"\n",
"Perpustakaan ggplot menawarkan beberapa cara menarik untuk memvisualisasikan data anda. Sebagai contoh, anda boleh membandingkan taburan data untuk setiap Jenis dan Warna dalam plot kategori.\n",
"\n",
"1. Cipta plot seperti ini dengan menggunakan fungsi geombar, menggunakan data labu kita, dan menentukan pemetaan warna untuk setiap kategori labu (oren atau putih):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "python"
}
},
"outputs": [],
"source": [
"# Specify colors for each value of the hue variable\n",
"palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
"\n",
"# Create the bar plot\n",
"ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n",
" geom_bar(position = \"dodge\") +\n",
" scale_fill_manual(values = palette) +\n",
" labs(y = \"Variety\", fill = \"Color\") +\n",
" theme_minimal()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dengan memerhatikan data, anda dapat melihat bagaimana data Warna berkaitan dengan Variasi.\n",
"\n",
"✅ Berdasarkan plot kategori ini, apakah beberapa penerokaan menarik yang boleh anda bayangkan?\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Pra-pemprosesan Data: Pengekodan Ciri\n",
"\n",
"Dataset labu kita mengandungi nilai string untuk semua kolumnya. Bekerja dengan data kategori adalah intuitif untuk manusia tetapi tidak untuk mesin. Algoritma pembelajaran mesin berfungsi dengan baik dengan nombor. Itulah sebabnya pengekodan adalah langkah yang sangat penting dalam fasa pra-pemprosesan data, kerana ia membolehkan kita menukar data kategori kepada data berangka tanpa kehilangan sebarang maklumat. Pengekodan yang baik membawa kepada pembinaan model yang baik.\n",
"\n",
"Untuk pengekodan ciri, terdapat dua jenis pengekod utama:\n",
"\n",
"1. **Ordinal encoder**: Ia sesuai untuk pemboleh ubah ordinal, iaitu pemboleh ubah kategori di mana datanya mengikuti susunan logik, seperti kolum `item_size` dalam dataset kita. Ia mencipta pemetaan di mana setiap kategori diwakili oleh nombor, yang merupakan susunan kategori dalam kolum tersebut.\n",
"\n",
"2. **Categorical encoder**: Ia sesuai untuk pemboleh ubah nominal, iaitu pemboleh ubah kategori di mana datanya tidak mengikuti susunan logik, seperti semua ciri selain daripada `item_size` dalam dataset kita. Ia adalah pengekodan satu-hot, yang bermaksud setiap kategori diwakili oleh kolum binari: pemboleh ubah yang dikodkan adalah sama dengan 1 jika labu tergolong dalam Variety tersebut dan 0 jika tidak.\n",
"\n",
"Tidymodels menyediakan satu lagi pakej yang berguna: [recipes](https://recipes.tidymodels.org/) - pakej untuk pra-pemprosesan data. Kita akan mendefinisikan `recipe` yang menentukan bahawa semua kolum peramal harus dikodkan kepada satu set integer, `prep` untuk menganggarkan kuantiti dan statistik yang diperlukan oleh sebarang operasi, dan akhirnya `bake` untuk menerapkan pengiraan kepada data baharu.\n",
"\n",
"> Biasanya, recipes biasanya digunakan sebagai pra-pemproses untuk pemodelan di mana ia menentukan langkah-langkah yang harus diterapkan pada dataset untuk menjadikannya siap untuk pemodelan. Dalam kes ini, **sangat disarankan** agar anda menggunakan `workflow()` daripada menganggarkan recipe secara manual menggunakan prep dan bake. Kita akan melihat semua ini sebentar lagi.\n",
">\n",
"> Walau bagaimanapun, buat masa ini, kita menggunakan recipes + prep + bake untuk menentukan langkah-langkah yang harus diterapkan pada dataset untuk menjadikannya siap untuk analisis data dan kemudian mengekstrak data yang telah dipra-pemproses dengan langkah-langkah yang diterapkan.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Preprocess and extract data to allow some data analysis\n",
"baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n",
" # Define ordering for item_size column\n",
" step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
" # Convert factors to numbers using the order defined above (Ordinal encoding)\n",
" step_integer(item_size, zero_based = F) %>%\n",
" # Encode all other predictors using one hot encoding\n",
" step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n",
" prep(data = pumpkin_select) %>%\n",
" bake(new_data = NULL)\n",
"\n",
"# Display the first few rows of preprocessed data\n",
"baked_pumpkins %>% \n",
" slice_head(n = 5)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"✅ Apakah kelebihan menggunakan ordinal encoder untuk lajur Item Size?\n",
"\n",
"### Menganalisis hubungan antara pemboleh ubah\n",
"\n",
"Sekarang kita telah memproses data kita, kita boleh menganalisis hubungan antara ciri-ciri dan label untuk mendapatkan gambaran tentang sejauh mana model dapat meramalkan label berdasarkan ciri-ciri tersebut. Cara terbaik untuk melakukan analisis seperti ini adalah dengan memplotkan data. \n",
"Kita akan menggunakan semula fungsi ggplot geom_boxplot_ untuk memvisualisasikan hubungan antara Item Size, Variety, dan Color dalam plot kategori. Untuk memplotkan data dengan lebih baik, kita akan menggunakan lajur Item Size yang telah dikodkan dan lajur Variety yang tidak dikodkan.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Define the color palette\n",
"palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
"\n",
"# We need the encoded Item Size column to use it as the x-axis values in the plot\n",
"pumpkins_select_plot<-pumpkins_select\n",
"pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n",
"\n",
"# Create the grouped box plot\n",
"ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n",
" geom_boxplot() +\n",
" facet_grid(variety ~ ., scales = \"free_x\") +\n",
" scale_fill_manual(values = palette) +\n",
" labs(x = \"Item Size\", y = \"\") +\n",
" theme_minimal() +\n",
" theme(strip.text = element_text(size = 12)) +\n",
" theme(axis.text.x = element_text(size = 10)) +\n",
" theme(axis.title.x = element_text(size = 12)) +\n",
" theme(axis.title.y = element_blank()) +\n",
" theme(legend.position = \"bottom\") +\n",
" guides(fill = guide_legend(title = \"Color\")) +\n",
" theme(panel.spacing = unit(0.5, \"lines\"))+\n",
" theme(strip.text.y = element_text(size = 4, hjust = 0)) \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Gunakan plot swarm\n",
"\n",
"Oleh kerana Color adalah kategori binari (Putih atau Tidak), ia memerlukan '[pendekatan khusus](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf) untuk visualisasi'.\n",
"\n",
"Cuba gunakan `plot swarm` untuk menunjukkan taburan warna berdasarkan item_size.\n",
"\n",
"Kami akan menggunakan [pakej ggbeeswarm](https://github.com/eclarke/ggbeeswarm) yang menyediakan kaedah untuk mencipta plot gaya beeswarm menggunakan ggplot2. Plot beeswarm adalah cara untuk memplotkan titik-titik yang biasanya bertindih supaya ia jatuh bersebelahan antara satu sama lain.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Create beeswarm plots of color and item_size\n",
"baked_pumpkins %>% \n",
" mutate(color = factor(color)) %>% \n",
" ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n",
" geom_quasirandom() +\n",
" scale_color_brewer(palette = \"Dark2\", direction = -1) +\n",
" theme(legend.position = \"none\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sekarang kita mempunyai gambaran tentang hubungan antara kategori binari warna dan kumpulan saiz yang lebih besar, mari kita terokai regresi logistik untuk menentukan kemungkinan warna bagi labu tertentu.\n",
"\n",
"## Bina model anda\n",
"\n",
"Pilih pemboleh ubah yang ingin anda gunakan dalam model klasifikasi dan bahagikan data kepada set latihan dan ujian. [rsample](https://rsample.tidymodels.org/), sebuah pakej dalam Tidymodels, menyediakan infrastruktur untuk pembahagian data dan pensampelan semula yang cekap:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Split data into 80% for training and 20% for testing\n",
"set.seed(2056)\n",
"pumpkins_split <- pumpkins_select %>% \n",
" initial_split(prop = 0.8)\n",
"\n",
"# Extract the data in each split\n",
"pumpkins_train <- training(pumpkins_split)\n",
"pumpkins_test <- testing(pumpkins_split)\n",
"\n",
"# Print out the first 5 rows of the training set\n",
"pumpkins_train %>% \n",
" slice_head(n = 5)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙌 Kita kini bersedia untuk melatih model dengan memadankan ciri latihan kepada label latihan (warna).\n",
"\n",
"Kita akan mulakan dengan mencipta resipi yang menentukan langkah-langkah prapemprosesan yang perlu dilakukan pada data kita untuk mempersiapkannya bagi pemodelan, iaitu: mengekod pembolehubah kategori kepada satu set integer. Sama seperti `baked_pumpkins`, kita mencipta `pumpkins_recipe` tetapi tidak melakukan `prep` dan `bake` kerana ia akan dimasukkan ke dalam aliran kerja, yang akan anda lihat dalam beberapa langkah seterusnya.\n",
"\n",
"Terdapat beberapa cara untuk menentukan model regresi logistik dalam Tidymodels. Lihat `?logistic_reg()`. Buat masa ini, kita akan menentukan model regresi logistik melalui enjin lalai `stats::glm()`.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Create a recipe that specifies preprocessing steps for modelling\n",
"pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n",
" step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
" step_integer(item_size, zero_based = F) %>% \n",
" step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n",
"\n",
"# Create a logistic model specification\n",
"log_reg <- logistic_reg() %>% \n",
" set_engine(\"glm\") %>% \n",
" set_mode(\"classification\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sekarang kita mempunyai resipi dan spesifikasi model, kita perlu mencari 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 yang berpotensi.\n",
"\n",
"Dalam Tidymodels, objek yang mudah ini dipanggil [`workflow`](https://workflows.tidymodels.org/) dan dengan mudah menyimpan komponen pemodelan anda.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Bundle modelling components in a workflow\n",
"log_reg_wf <- workflow() %>% \n",
" add_recipe(pumpkins_recipe) %>% \n",
" add_model(log_reg)\n",
"\n",
"# Print out the workflow\n",
"log_reg_wf\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Selepas aliran kerja *ditentukan*, model boleh `dilatih` menggunakan fungsi [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html). Aliran kerja ini akan menganggarkan resipi dan memproses data sebelum latihan, jadi kita tidak perlu melakukannya secara manual menggunakan prep dan bake.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Train the model\n",
"wf_fit <- log_reg_wf %>% \n",
" fit(data = pumpkins_train)\n",
"\n",
"# Print the trained workflow\n",
"wf_fit\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Model ini mencetak pekali yang dipelajari semasa latihan.\n",
"\n",
"Sekarang kita telah melatih model menggunakan data latihan, kita boleh membuat ramalan pada data ujian menggunakan [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Mari kita mulakan dengan menggunakan model untuk meramalkan label bagi set ujian kita dan kebarangkalian untuk setiap label. Apabila kebarangkalian lebih daripada 0.5, kelas ramalan adalah `WHITE`, jika tidak, `ORANGE`.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Make predictions for color and corresponding probabilities\n",
"results <- pumpkins_test %>% select(color) %>% \n",
" bind_cols(wf_fit %>% \n",
" predict(new_data = pumpkins_test)) %>%\n",
" bind_cols(wf_fit %>%\n",
" predict(new_data = pumpkins_test, type = \"prob\"))\n",
"\n",
"# Compare predictions\n",
"results %>% \n",
" slice_head(n = 10)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sangat bagus! Ini memberikan lebih banyak pemahaman tentang bagaimana regresi logistik berfungsi.\n",
"\n",
"### Pemahaman yang lebih baik melalui matriks kekeliruan\n",
"\n",
"Membandingkan setiap ramalan dengan nilai sebenar \"ground truth\" yang sepadan bukanlah cara yang sangat efisien untuk menentukan sejauh mana model meramal dengan baik. Nasib baik, Tidymodels mempunyai beberapa helah lagi: [`yardstick`](https://yardstick.tidymodels.org/) - sebuah pakej yang digunakan untuk mengukur keberkesanan model menggunakan metrik prestasi.\n",
"\n",
"Salah satu metrik prestasi yang berkaitan dengan masalah klasifikasi ialah [`matriks kekeliruan`](https://wikipedia.org/wiki/Confusion_matrix). Matriks kekeliruan menerangkan sejauh mana prestasi model klasifikasi. Matriks kekeliruan menyusun berapa banyak contoh dalam setiap kelas yang diklasifikasikan dengan betul oleh model. Dalam kes kita, ia akan menunjukkan berapa banyak labu oren yang diklasifikasikan sebagai oren dan berapa banyak labu putih yang diklasifikasikan sebagai putih; matriks kekeliruan juga menunjukkan berapa banyak yang diklasifikasikan ke dalam kategori yang **salah**.\n",
"\n",
"Fungsi [**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) daripada yardstick mengira tabulasi silang ini bagi kelas yang diperhatikan dan diramal.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Confusion matrix for prediction results\n",
"conf_mat(data = results, truth = color, estimate = .pred_class)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mari kita tafsirkan matriks kekeliruan. Model kita diminta untuk mengklasifikasikan labu kepada dua kategori binari, kategori `putih` dan kategori `bukan-putih`.\n",
"\n",
"- Jika model anda meramalkan labu sebagai putih dan ia sebenarnya tergolong dalam kategori 'putih', kita panggil ini sebagai `benar positif`, ditunjukkan oleh nombor di sudut kiri atas.\n",
"\n",
"- Jika model anda meramalkan labu sebagai bukan putih dan ia sebenarnya tergolong dalam kategori 'putih', kita panggil ini sebagai `salah negatif`, ditunjukkan oleh nombor di sudut kiri bawah.\n",
"\n",
"- Jika model anda meramalkan labu sebagai putih dan ia sebenarnya tergolong dalam kategori 'bukan-putih', kita panggil ini sebagai `salah positif`, ditunjukkan oleh nombor di sudut kanan atas.\n",
"\n",
"- Jika model anda meramalkan labu sebagai bukan putih dan ia sebenarnya tergolong dalam kategori 'bukan-putih', kita panggil ini sebagai `benar negatif`, ditunjukkan oleh nombor di sudut kanan bawah.\n",
"\n",
"| Kebenaran |\n",
"|:-----:|\n",
"\n",
"\n",
"| | | |\n",
"|---------------|--------|-------|\n",
"| **Diramal** | PUTIH | OREN |\n",
"| PUTIH | TP | FP |\n",
"| OREN | FN | TN |\n",
"\n",
"Seperti yang anda mungkin telah teka, adalah lebih baik untuk mempunyai bilangan benar positif dan benar negatif yang lebih besar serta bilangan salah positif dan salah negatif yang lebih kecil, yang menunjukkan bahawa model berprestasi lebih baik.\n",
"\n",
"Matriks kekeliruan sangat berguna kerana ia menghasilkan metrik lain yang dapat membantu kita menilai prestasi model klasifikasi dengan lebih baik. Mari kita lihat beberapa daripadanya:\n",
"\n",
"🎓 Ketepatan: `TP/(TP + FP)` ditakrifkan sebagai nisbah ramalan positif yang sebenarnya positif. Juga dikenali sebagai [nilai ramalan positif](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\").\n",
"\n",
"🎓 Ingatan: `TP/(TP + FN)` ditakrifkan sebagai nisbah hasil positif daripada jumlah sampel yang sebenarnya positif. Juga dikenali sebagai `sensitiviti`.\n",
"\n",
"🎓 Kekhususan: `TN/(TN + FP)` ditakrifkan sebagai nisbah hasil negatif daripada jumlah sampel yang sebenarnya negatif.\n",
"\n",
"🎓 Ketepatan: `TP + TN/(TP + TN + FP + FN)` Peratusan label yang diramal dengan tepat untuk satu sampel.\n",
"\n",
"🎓 Ukuran F: Purata wajaran antara ketepatan dan ingatan, dengan nilai terbaik adalah 1 dan nilai terburuk adalah 0.\n",
"\n",
"Mari kita kira metrik-metrik ini!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Combine metric functions and calculate them all at once\n",
"eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n",
"eval_metrics(data = results, truth = color, estimate = .pred_class)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Visualisasikan lengkung ROC model ini\n",
"\n",
"Mari kita lakukan satu lagi visualisasi untuk melihat apa yang dipanggil sebagai [`lengkung ROC`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Make a roc_curve\n",
"results %>% \n",
" roc_curve(color, .pred_ORANGE) %>% \n",
" autoplot()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Graf ROC sering digunakan untuk mendapatkan gambaran tentang output pengklasifikasi dari segi positif benar vs. positif palsu. Graf ROC biasanya memaparkan `True Positive Rate`/Sensitiviti pada paksi Y, dan `False Positive Rate`/1-Spesifisiti pada paksi X. Oleh itu, kecuraman graf dan ruang antara garis tengah dengan graf adalah penting: anda mahukan graf yang cepat naik dan melepasi garis tersebut. Dalam kes kita, terdapat positif palsu pada permulaan, dan kemudian garis tersebut naik dan melepasi dengan betul.\n",
"\n",
"Akhir sekali, mari gunakan `yardstick::roc_auc()` untuk mengira Nilai Kawasan Di Bawah Graf (Area Under the Curve) yang sebenar. Salah satu cara untuk mentafsirkan AUC adalah sebagai kebarangkalian bahawa model meletakkan contoh positif rawak lebih tinggi daripada contoh negatif rawak.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Calculate area under curve\n",
"results %>% \n",
" roc_auc(color, .pred_ORANGE)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hasilnya adalah sekitar `0.975`. Memandangkan AUC berkisar dari 0 hingga 1, anda mahukan skor yang tinggi, kerana model yang 100% tepat dalam ramalannya akan mempunyai AUC sebanyak 1; dalam kes ini, model ini *agak baik*.\n",
"\n",
"Dalam pelajaran akan datang mengenai klasifikasi, anda akan belajar cara meningkatkan skor model anda (seperti menangani data yang tidak seimbang dalam kes ini).\n",
"\n",
"## 🚀Cabaran\n",
"\n",
"Terdapat banyak lagi yang boleh diterokai mengenai regresi logistik! Tetapi cara terbaik untuk belajar adalah dengan mencuba. Cari dataset yang sesuai untuk jenis analisis ini dan bina model dengannya. Apa yang anda pelajari? tip: cuba [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) untuk dataset yang menarik.\n",
"\n",
"## Kajian & Pembelajaran Kendiri\n",
"\n",
"Baca beberapa halaman pertama [kertas kerja dari Stanford ini](https://web.stanford.edu/~jurafsky/slp3/5.pdf) mengenai beberapa kegunaan praktikal untuk regresi logistik. Fikirkan tentang tugas-tugas yang lebih sesuai untuk satu jenis regresi berbanding yang lain yang telah kita pelajari sehingga kini. Apa yang akan berfungsi dengan terbaik?\n"
]
},
{
"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 perhatian 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"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"langauge": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "feaf125f481a89c468fa115bf2aed580",
"translation_date": "2025-09-06T11:42:46+00:00",
"source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,267 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "5fa2e8f4584c78250ca9729b46562ceb",
"translation_date": "2025-09-06T12:21:26+00:00",
"source_file": "3-Web-App/1-Web-App/solution/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" datetime city state country shape \\\n",
"0 10/10/1949 20:30 san marcos tx us cylinder \n",
"1 10/10/1949 21:00 lackland afb tx NaN light \n",
"2 10/10/1955 17:00 chester (uk/england) NaN gb circle \n",
"3 10/10/1956 21:00 edna tx us circle \n",
"4 10/10/1960 20:00 kaneohe hi us light \n",
"\n",
" duration (seconds) duration (hours/min) \\\n",
"0 2700.0 45 minutes \n",
"1 7200.0 1-2 hrs \n",
"2 20.0 20 seconds \n",
"3 20.0 1/2 hour \n",
"4 900.0 15 minutes \n",
"\n",
" comments date posted latitude \\\n",
"0 This event took place in early fall around 194... 4/27/2004 29.883056 \n",
"1 1949 Lackland AFB&#44 TX. Lights racing acros... 12/16/2005 29.384210 \n",
"2 Green/Orange circular disc over Chester&#44 En... 1/21/2008 53.200000 \n",
"3 My older brother and twin sister were leaving ... 1/17/2004 28.978333 \n",
"4 AS a Marine 1st Lt. flying an FJ4B fighter/att... 1/22/2004 21.418056 \n",
"\n",
" longitude \n",
"0 -97.941111 \n",
"1 -98.581082 \n",
"2 -2.916667 \n",
"3 -96.645833 \n",
"4 -157.803611 "
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>datetime</th>\n <th>city</th>\n <th>state</th>\n <th>country</th>\n <th>shape</th>\n <th>duration (seconds)</th>\n <th>duration (hours/min)</th>\n <th>comments</th>\n <th>date posted</th>\n <th>latitude</th>\n <th>longitude</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>10/10/1949 20:30</td>\n <td>san marcos</td>\n <td>tx</td>\n <td>us</td>\n <td>cylinder</td>\n <td>2700.0</td>\n <td>45 minutes</td>\n <td>This event took place in early fall around 194...</td>\n <td>4/27/2004</td>\n <td>29.883056</td>\n <td>-97.941111</td>\n </tr>\n <tr>\n <th>1</th>\n <td>10/10/1949 21:00</td>\n <td>lackland afb</td>\n <td>tx</td>\n <td>NaN</td>\n <td>light</td>\n <td>7200.0</td>\n <td>1-2 hrs</td>\n <td>1949 Lackland AFB&amp;#44 TX. Lights racing acros...</td>\n <td>12/16/2005</td>\n <td>29.384210</td>\n <td>-98.581082</td>\n </tr>\n <tr>\n <th>2</th>\n <td>10/10/1955 17:00</td>\n <td>chester (uk/england)</td>\n <td>NaN</td>\n <td>gb</td>\n <td>circle</td>\n <td>20.0</td>\n <td>20 seconds</td>\n <td>Green/Orange circular disc over Chester&amp;#44 En...</td>\n <td>1/21/2008</td>\n <td>53.200000</td>\n <td>-2.916667</td>\n </tr>\n <tr>\n <th>3</th>\n <td>10/10/1956 21:00</td>\n <td>edna</td>\n <td>tx</td>\n <td>us</td>\n <td>circle</td>\n <td>20.0</td>\n <td>1/2 hour</td>\n <td>My older brother and twin sister were leaving ...</td>\n <td>1/17/2004</td>\n <td>28.978333</td>\n <td>-96.645833</td>\n </tr>\n <tr>\n <th>4</th>\n <td>10/10/1960 20:00</td>\n <td>kaneohe</td>\n <td>hi</td>\n <td>us</td>\n <td>light</td>\n <td>900.0</td>\n <td>15 minutes</td>\n <td>AS a Marine 1st Lt. flying an FJ4B fighter/att...</td>\n <td>1/22/2004</td>\n <td>21.418056</td>\n <td>-157.803611</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 23
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"ufos = pd.read_csv('../data/ufos.csv')\n",
"ufos.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['us', nan, 'gb', 'ca', 'au', 'de'], dtype=object)"
]
},
"metadata": {},
"execution_count": 24
}
],
"source": [
"\n",
"ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})\n",
"\n",
"ufos.Country.unique()\n",
"\n",
"# 0 au, 1 ca, 2 de, 3 gb, 4 us"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"<class 'pandas.core.frame.DataFrame'>\nInt64Index: 25863 entries, 2 to 80330\nData columns (total 4 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 Seconds 25863 non-null float64\n 1 Country 25863 non-null object \n 2 Latitude 25863 non-null float64\n 3 Longitude 25863 non-null float64\ndtypes: float64(3), object(1)\nmemory usage: 1010.3+ KB\n"
]
}
],
"source": [
"ufos.dropna(inplace=True)\n",
"\n",
"ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]\n",
"\n",
"ufos.info()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Seconds Country Latitude Longitude\n",
"2 20.0 3 53.200000 -2.916667\n",
"3 20.0 4 28.978333 -96.645833\n",
"14 30.0 4 35.823889 -80.253611\n",
"23 60.0 4 45.582778 -122.352222\n",
"24 3.0 3 51.783333 -0.783333"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Seconds</th>\n <th>Country</th>\n <th>Latitude</th>\n <th>Longitude</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2</th>\n <td>20.0</td>\n <td>3</td>\n <td>53.200000</td>\n <td>-2.916667</td>\n </tr>\n <tr>\n <th>3</th>\n <td>20.0</td>\n <td>4</td>\n <td>28.978333</td>\n <td>-96.645833</td>\n </tr>\n <tr>\n <th>14</th>\n <td>30.0</td>\n <td>4</td>\n <td>35.823889</td>\n <td>-80.253611</td>\n </tr>\n <tr>\n <th>23</th>\n <td>60.0</td>\n <td>4</td>\n <td>45.582778</td>\n <td>-122.352222</td>\n </tr>\n <tr>\n <th>24</th>\n <td>3.0</td>\n <td>3</td>\n <td>51.783333</td>\n <td>-0.783333</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 26
}
],
"source": [
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])\n",
"\n",
"ufos.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"Selected_features = ['Seconds','Latitude','Longitude']\n",
"\n",
"X = ufos[Selected_features]\n",
"y = ufos['Country']\n",
"\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
" \"this warning.\", FutureWarning)\n",
" precision recall f1-score support\n",
"\n",
" 0 1.00 1.00 1.00 41\n",
" 1 1.00 0.02 0.05 250\n",
" 2 0.00 0.00 0.00 8\n",
" 3 0.94 1.00 0.97 131\n",
" 4 0.95 1.00 0.97 4743\n",
"\n",
" accuracy 0.95 5173\n",
" macro avg 0.78 0.60 0.60 5173\n",
"weighted avg 0.95 0.95 0.93 5173\n",
"\n",
"Predicted labels: [4 4 4 ... 3 4 4]\n",
"Accuracy: 0.9512855209742895\n",
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/metrics/classification.py:1437: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n"
]
}
],
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score, classification_report \n",
"from sklearn.linear_model import LogisticRegression\n",
"model = LogisticRegression()\n",
"model.fit(X_train, y_train)\n",
"predictions = model.predict(X_test)\n",
"\n",
"print(classification_report(y_test, predictions))\n",
"print('Predicted labels: ', predictions)\n",
"print('Accuracy: ', accuracy_score(y_test, predictions))\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[3]\n"
]
}
],
"source": [
"import pickle\n",
"model_filename = 'ufo-model.pkl'\n",
"pickle.dump(model, open(model_filename,'wb'))\n",
"\n",
"model = pickle.load(open('ufo-model.pkl','rb'))\n",
"print(model.predict([[50,44,-12]]))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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 perhatian 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"
]
}
]
}

@ -0,0 +1,39 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "d544ef384b7ba73757d830a72372a7f2",
"translation_date": "2025-09-06T12:33:34+00:00",
"source_file": "4-Classification/1-Introduction/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"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"
]
}
]
}

@ -0,0 +1,725 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
"translation_date": "2025-09-06T12:36:14+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "ms"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"Bina model klasifikasi: Masakan Asia dan India yang Lazat\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Pengenalan kepada klasifikasi: Bersihkan, sediakan, dan visualisasikan data anda\n",
"\n",
"Dalam empat pelajaran ini, anda akan meneroka fokus asas pembelajaran mesin klasik - *klasifikasi*. Kami akan melalui penggunaan pelbagai algoritma klasifikasi dengan dataset tentang semua masakan hebat dari Asia dan India. Harap anda lapar!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Raikan masakan pan-Asia dalam pelajaran ini! Imej oleh Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Raikan masakan pan-Asia dalam pelajaran ini! Imej oleh Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Klasifikasi adalah satu bentuk [pembelajaran terkawal](https://wikipedia.org/wiki/Supervised_learning) yang mempunyai banyak persamaan dengan teknik regresi. Dalam klasifikasi, anda melatih model untuk meramalkan kategori mana sesuatu item tergolong. Jika pembelajaran mesin berkaitan dengan meramalkan nilai atau nama kepada sesuatu menggunakan dataset, maka klasifikasi biasanya terbahagi kepada dua kumpulan: *klasifikasi binari* dan *klasifikasi pelbagai kelas*.\n",
"\n",
"Ingat:\n",
"\n",
"- **Regresi linear** membantu anda meramalkan hubungan antara pembolehubah dan membuat ramalan tepat tentang di mana titik data baru akan berada dalam hubungan dengan garis tersebut. Sebagai contoh, anda boleh meramalkan nilai berangka seperti *berapa harga labu pada bulan September berbanding Disember*.\n",
"\n",
"- **Regresi logistik** membantu anda menemui \"kategori binari\": pada titik harga ini, *adakah labu ini berwarna oren atau tidak-oren*?\n",
"\n",
"Klasifikasi menggunakan pelbagai algoritma untuk menentukan cara lain dalam menentukan label atau kelas titik data. Mari kita bekerja dengan data masakan ini untuk melihat sama ada, dengan memerhatikan sekumpulan bahan, kita boleh menentukan asal-usul masakannya.\n",
"\n",
"### [**Kuiz sebelum pelajaran**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Pengenalan**\n",
"\n",
"Klasifikasi adalah salah satu aktiviti asas bagi penyelidik pembelajaran mesin dan saintis data. Daripada klasifikasi asas nilai binari (\"adakah e-mel ini spam atau tidak?\"), kepada klasifikasi imej kompleks dan segmentasi menggunakan penglihatan komputer, sentiasa berguna untuk dapat menyusun data ke dalam kelas dan bertanya soalan mengenainya.\n",
"\n",
"Untuk menyatakan proses ini dengan cara yang lebih saintifik, kaedah klasifikasi anda mencipta model ramalan yang membolehkan anda memetakan hubungan antara pembolehubah input kepada pembolehubah output.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Masalah binari vs. pelbagai kelas untuk algoritma klasifikasi. Infografik oleh Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Sebelum memulakan proses membersihkan data kita, memvisualisasikannya, dan menyediakannya untuk tugas ML kita, mari kita pelajari sedikit tentang pelbagai cara pembelajaran mesin boleh digunakan untuk mengklasifikasikan data.\n",
"\n",
"Berasal daripada [statistik](https://wikipedia.org/wiki/Statistical_classification), klasifikasi menggunakan pembelajaran mesin klasik menggunakan ciri-ciri seperti `smoker`, `weight`, dan `age` untuk menentukan *kemungkinan menghidap penyakit X*. Sebagai teknik pembelajaran terkawal yang serupa dengan latihan regresi yang anda lakukan sebelum ini, data anda dilabelkan dan algoritma ML menggunakan label tersebut untuk mengklasifikasikan dan meramalkan kelas (atau 'ciri') dataset dan menetapkannya kepada kumpulan atau hasil.\n",
"\n",
"✅ Luangkan masa untuk membayangkan dataset tentang masakan. Apakah yang boleh dijawab oleh model pelbagai kelas? Apakah yang boleh dijawab oleh model binari? Bagaimana jika anda ingin menentukan sama ada sesuatu masakan cenderung menggunakan fenugreek? Bagaimana jika anda ingin melihat sama ada, dengan kehadiran beg runcit penuh dengan bunga lawang, artichoke, kembang kol, dan lobak pedas, anda boleh mencipta hidangan India yang tipikal?\n",
"\n",
"### **Hello 'classifier'**\n",
"\n",
"Soalan yang ingin kita tanyakan kepada dataset masakan ini sebenarnya adalah soalan **pelbagai kelas**, kerana kita mempunyai beberapa kemungkinan masakan kebangsaan untuk bekerja. Berdasarkan sekumpulan bahan, kelas mana daripada banyak kelas ini yang sesuai dengan data?\n",
"\n",
"Tidymodels menawarkan beberapa algoritma berbeza untuk digunakan bagi mengklasifikasikan data, bergantung pada jenis masalah yang ingin anda selesaikan. Dalam dua pelajaran seterusnya, anda akan belajar tentang beberapa algoritma ini.\n",
"\n",
"#### **Prasyarat**\n",
"\n",
"Untuk pelajaran ini, kita memerlukan pakej berikut untuk membersihkan, menyediakan dan memvisualisasikan data kita:\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",
"- `DataExplorer`: Pakej [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) bertujuan untuk mempermudah dan mengautomasi proses EDA dan penjanaan laporan.\n",
"\n",
"- `themis`: Pakej [themis](https://themis.tidymodels.org/) menyediakan Langkah Resipi Tambahan untuk Menangani Data Tidak Seimbang.\n",
"\n",
"Anda boleh memasangnya seperti berikut:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk melengkapkan modul ini dan memasangnya untuk anda jika ia tidak ada.\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"Kita akan memuatkan pakej-pakej hebat ini kemudian dan menjadikannya tersedia dalam sesi R semasa kita. (Ini hanya untuk ilustrasi, `pacman::p_load()` sudah melakukannya untuk anda)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Latihan - bersihkan dan seimbangkan data anda\n",
"\n",
"Tugas pertama sebelum memulakan projek ini adalah untuk membersihkan dan **menyeimbangkan** data anda bagi mendapatkan hasil yang lebih baik.\n",
"\n",
"Mari kita kenali data ini!🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [
"Menarik! Dari pandangan, lajur pertama adalah sejenis lajur `id`. Mari kita dapatkan sedikit lagi maklumat tentang data ini.\n"
],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"Daripada output, kita dapat melihat bahawa kita mempunyai `2448` baris dan `385` lajur serta `0` nilai yang hilang. Kita juga mempunyai 1 lajur diskret, *cuisine*.\n",
"\n",
"## Latihan - mempelajari tentang masakan\n",
"\n",
"Sekarang kerja mula menjadi lebih menarik. Mari kita terokai pengagihan data, mengikut jenis masakan.\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"Terdapat bilangan masakan yang terhad, tetapi pengagihan data tidak sekata. Anda boleh membetulkannya! Sebelum itu, terokai sedikit lagi.\n",
"\n",
"Seterusnya, mari kita tetapkan setiap masakan ke dalam tibble masing-masing dan ketahui berapa banyak data yang tersedia (baris, lajur) bagi setiap masakan.\n",
"\n",
"> [Tibble](https://tibble.tidyverse.org/) ialah kerangka data moden.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"## **Latihan - Meneroka bahan utama mengikut masakan menggunakan dplyr**\n",
"\n",
"Sekarang anda boleh menyelami data dengan lebih mendalam dan mengetahui apakah bahan-bahan tipikal bagi setiap jenis masakan. Anda perlu membersihkan data berulang yang boleh menyebabkan kekeliruan antara jenis masakan, jadi mari kita pelajari masalah ini.\n",
"\n",
"Cipta fungsi `create_ingredient()` dalam R yang mengembalikan dataframe bahan. Fungsi ini akan bermula dengan membuang satu lajur yang tidak berguna dan menyusun bahan-bahan mengikut kiraan mereka.\n",
"\n",
"Struktur asas fungsi dalam R adalah:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Pengenalan ringkas kepada fungsi dalam R boleh didapati [di sini](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Mari kita teruskan! Kita akan menggunakan [kata kerja dplyr](https://dplyr.tidyverse.org/) yang telah kita pelajari dalam pelajaran sebelum ini. Sebagai imbasan:\n",
"\n",
"- `dplyr::select()`: membantu anda memilih lajur **mana** yang ingin disimpan atau dikecualikan.\n",
"\n",
"- `dplyr::pivot_longer()`: membantu anda untuk \"memanjangkan\" data, meningkatkan bilangan baris dan mengurangkan bilangan lajur.\n",
"\n",
"- `dplyr::group_by()` dan `dplyr::summarise()`: membantu anda mencari statistik ringkasan untuk kumpulan yang berbeza, dan menyusunnya dalam jadual yang kemas.\n",
"\n",
"- `dplyr::filter()`: mencipta subset data yang hanya mengandungi baris yang memenuhi syarat anda.\n",
"\n",
"- `dplyr::mutate()`: membantu anda mencipta atau mengubah suai lajur.\n",
"\n",
"Lihat tutorial [*seni*-penuh learnr ini](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) oleh Allison Horst, yang memperkenalkan beberapa fungsi pengendalian data berguna dalam dplyr *(sebahagian daripada Tidyverse)*.\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"Sekarang kita boleh menggunakan fungsi ini untuk mendapatkan gambaran tentang sepuluh bahan paling popular mengikut masakan. Mari kita cuba dengan `thai_df`.\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"Dalam bahagian sebelumnya, kami menggunakan `geom_col()`, mari lihat bagaimana anda boleh menggunakan `geom_bar` juga, untuk mencipta carta bar. Gunakan `?geom_bar` untuk bacaan lanjut.\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"Bagaimana pula dengan masakan Cina?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [
"Akhirnya, plotkan bahan-bahan Korea.\n"
],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"Daripada visualisasi data, kita kini boleh menghapuskan bahan-bahan yang paling biasa dan sering menyebabkan kekeliruan antara masakan yang berbeza, menggunakan `dplyr::select()`.\n",
"\n",
"Semua orang suka nasi, bawang putih dan halia!\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## Pra-pemprosesan data menggunakan resipi 👩‍🍳👨‍🍳 - Menangani data tidak seimbang ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Karya oleh @allison_horst</figcaption>\n",
"\n",
"Memandangkan pelajaran ini berkaitan dengan masakan, kita perlu meletakkan `resipi` dalam konteks.\n",
"\n",
"Tidymodels menyediakan satu lagi pakej yang menarik: `recipes` - pakej untuk pra-pemprosesan data.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Mari kita lihat semula pengagihan masakan kita.\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"Seperti yang anda lihat, terdapat pengagihan yang agak tidak seimbang dalam bilangan jenis masakan. Masakan Korea hampir 3 kali ganda lebih banyak daripada masakan Thai. Data yang tidak seimbang sering memberi kesan negatif terhadap prestasi model. Fikirkan tentang klasifikasi binari. Jika kebanyakan data anda adalah daripada satu kelas, model ML akan cenderung meramalkan kelas tersebut lebih kerap, hanya kerana terdapat lebih banyak data untuknya. Mengimbangkan data mengambil data yang condong dan membantu menghapuskan ketidakseimbangan ini. Banyak model berprestasi terbaik apabila bilangan pemerhatian adalah sama dan, oleh itu, cenderung menghadapi kesukaran dengan data yang tidak seimbang.\n",
"\n",
"Terdapat dua cara utama untuk menangani set data yang tidak seimbang:\n",
"\n",
"- menambah pemerhatian kepada kelas minoriti: `Over-sampling` contohnya menggunakan algoritma SMOTE\n",
"\n",
"- mengeluarkan pemerhatian daripada kelas majoriti: `Under-sampling`\n",
"\n",
"Sekarang mari kita tunjukkan cara menangani set data yang tidak seimbang menggunakan `recipe`. Recipe boleh dianggap sebagai pelan tindakan yang menerangkan langkah-langkah yang perlu diterapkan pada set data untuk menjadikannya sedia untuk analisis data.\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"Mari kita pecahkan langkah-langkah prapemprosesan kita.\n",
"\n",
"- Panggilan kepada `recipe()` dengan formula memberitahu resipi tentang *peranan* pemboleh ubah menggunakan data `df_select` sebagai rujukan. Sebagai contoh, lajur `cuisine` telah diberikan peranan `outcome` manakala lajur-lajur lain telah diberikan peranan `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) mencipta *spesifikasi* langkah resipi yang secara sintetik menjana contoh baharu bagi kelas minoriti menggunakan jiran terdekat bagi kes-kes ini.\n",
"\n",
"Sekarang, jika kita ingin melihat data yang telah dipraproses, kita perlu [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) dan [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) resipi kita.\n",
"\n",
"`prep()`: menganggarkan parameter yang diperlukan daripada set latihan yang kemudiannya boleh digunakan pada set data lain.\n",
"\n",
"`bake()`: mengambil resipi yang telah dipraproses dan menerapkan operasi tersebut pada mana-mana set data.\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [
"Mari kita periksa pengagihan masakan kita dan bandingkannya dengan data yang tidak seimbang.\n"
],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"Yum! Data ini bersih, seimbang, dan sangat lazat 😋!\n",
"\n",
"> Biasanya, resipi digunakan sebagai prapemproses untuk pemodelan di mana ia menentukan langkah-langkah yang perlu diterapkan pada set data supaya ia sedia untuk pemodelan. Dalam kes ini, `workflow()` biasanya digunakan (seperti yang telah kita lihat dalam pelajaran sebelumnya) daripada menganggarkan resipi secara manual.\n",
">\n",
"> Oleh itu, anda biasanya tidak perlu **`prep()`** dan **`bake()`** resipi apabila menggunakan tidymodels, tetapi ia adalah fungsi yang berguna untuk dimiliki dalam alat anda untuk mengesahkan bahawa resipi berfungsi seperti yang anda harapkan, seperti dalam kes kita.\n",
">\n",
"> Apabila anda **`bake()`** resipi yang telah dipraproses dengan **`new_data = NULL`**, anda akan mendapat kembali data yang anda berikan semasa mendefinisikan resipi, tetapi telah melalui langkah-langkah prapemprosesan.\n",
"\n",
"Mari kita simpan salinan data ini untuk digunakan dalam pelajaran akan datang:\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"CSV baharu ini kini boleh didapati dalam folder data utama.\n",
"\n",
"**🚀Cabaran**\n",
"\n",
"Kurikulum ini mengandungi beberapa set data yang menarik. Selidiki folder `data` dan lihat jika ada yang mengandungi set data yang sesuai untuk klasifikasi binari atau multi-kelas? Soalan apa yang anda akan tanya tentang set data ini?\n",
"\n",
"## [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Ulasan & Kajian Kendiri**\n",
"\n",
"- Lihat [pakej themis](https://github.com/tidymodels/themis). Apakah teknik lain yang boleh kita gunakan untuk menangani data yang tidak seimbang?\n",
"\n",
"- Laman rujukan model Tidy [laman web rujukan](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham dan G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### TERIMA KASIH KEPADA:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) kerana mencipta ilustrasi yang menakjubkan 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",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) dan [Jen Looper](https://www.twitter.com/jenlooper) kerana mencipta versi asal modul ini dalam Python ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"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 perhatian 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"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,41 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "68829b06b4dcd512d3327849191f4d7f",
"translation_date": "2025-09-06T12:21:44+00:00",
"source_file": "4-Classification/2-Classifiers-1/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# Bina Model Klasifikasi\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"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"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,281 @@
{
"cells": [
{
"source": [
"# Bina Model Klasifikasi\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"from sklearn.svm import SVC\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 4
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy is 0.8181818181818182\n"
]
}
],
"source": [
"lr = LogisticRegression(multi_class='ovr',solver='liblinear')\n",
"model = lr.fit(X_train, np.ravel(y_train))\n",
"\n",
"accuracy = model.score(X_test, y_test)\n",
"print (\"Accuracy is {}\".format(accuracy))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"ingredients: Index(['artemisia', 'black_pepper', 'mushroom', 'shiitake', 'soy_sauce',\n 'vegetable_oil'],\n dtype='object')\ncuisine: korean\n"
]
}
],
"source": [
"# test an item\n",
"print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')\n",
"print(f'cuisine: {y_test.iloc[50]}')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" 0\n",
"korean 0.392231\n",
"chinese 0.372872\n",
"japanese 0.218825\n",
"thai 0.013427\n",
"indian 0.002645"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>0</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>korean</th>\n <td>0.392231</td>\n </tr>\n <tr>\n <th>chinese</th>\n <td>0.372872</td>\n </tr>\n <tr>\n <th>japanese</th>\n <td>0.218825</td>\n </tr>\n <tr>\n <th>thai</th>\n <td>0.013427</td>\n </tr>\n <tr>\n <th>indian</th>\n <td>0.002645</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"#rehsape to 2d array and transpose\n",
"test= X_test.iloc[50].values.reshape(-1, 1).T\n",
"# predict with score\n",
"proba = model.predict_proba(test)\n",
"classes = model.classes_\n",
"# create df with classes and scores\n",
"resultdf = pd.DataFrame(data=proba, columns=classes)\n",
"\n",
"# create df to show results\n",
"topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\n",
"topPrediction.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.75 0.73 0.74 223\n indian 0.93 0.88 0.90 255\n japanese 0.78 0.78 0.78 253\n korean 0.87 0.86 0.86 236\n thai 0.76 0.84 0.80 232\n\n accuracy 0.82 1199\n macro avg 0.82 0.82 0.82 1199\nweighted avg 0.82 0.82 0.82 1199\n\n"
]
}
],
"source": [
"y_pred = model.predict(X_test)\r\n",
"print(classification_report(y_test,y_pred))"
]
},
{
"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 perhatian 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"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "9408506dd864f2b6e334c62f80c0cfcc",
"translation_date": "2025-09-06T12:22:03+00:00",
"source_file": "4-Classification/2-Classifiers-1/solution/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,163 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"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"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "15a83277036572e0773229b5f21c1e12",
"translation_date": "2025-09-06T12:28:03+00:00",
"source_file": "4-Classification/3-Classifiers-2/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,650 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "lesson_12-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "fab50046ca413a38939d579f8432274f",
"translation_date": "2025-09-06T12:29:34+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "ms"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"Bina model klasifikasi: Masakan Asia dan India yang Lazat\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## Pengelasan Masakan 2\n",
"\n",
"Dalam pelajaran pengelasan kedua ini, kita akan meneroka `lebih banyak cara` untuk mengelaskan data kategori. Kita juga akan mempelajari implikasi memilih satu pengelas berbanding yang lain.\n",
"\n",
"### [**Kuiz Pra-Kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **Prasyarat**\n",
"\n",
"Kami mengandaikan bahawa anda telah menyelesaikan pelajaran sebelumnya kerana kita akan membawa beberapa konsep yang telah dipelajari sebelum ini.\n",
"\n",
"Untuk pelajaran 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`: Kerangka [tidymodels](https://www.tidymodels.org/) adalah [koleksi pakej](https://www.tidymodels.org/packages/) untuk pemodelan dan pembelajaran mesin.\n",
"\n",
"- `themis`: Pakej [themis](https://themis.tidymodels.org/) menyediakan Langkah Resipi Tambahan untuk Menangani Data Tidak Seimbang.\n",
"\n",
"Anda boleh memasangnya seperti berikut:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk menyelesaikan modul ini dan memasangnya untuk anda jika ia tiada.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vZ57IuUxgyQt"
},
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "z22M-pj4g07x"
},
"source": [
"## **1. Peta pengelasan**\n",
"\n",
"Dalam [pelajaran sebelumnya](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1), kita cuba menjawab soalan: bagaimana kita memilih antara pelbagai model? Sebahagian besarnya bergantung pada ciri-ciri data dan jenis masalah yang ingin kita selesaikan (contohnya pengelasan atau regresi?)\n",
"\n",
"Sebelumnya, kita telah mempelajari tentang pelbagai pilihan yang anda ada ketika mengelaskan data menggunakan helaian rujukan Microsoft. Rangka kerja Pembelajaran Mesin Python, Scikit-learn, menawarkan helaian rujukan yang serupa tetapi lebih terperinci yang boleh membantu anda menyempitkan pilihan estimator anda (istilah lain untuk pengelas):\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> Petua: [lawati peta ini secara dalam talian](https://scikit-learn.org/stable/tutorial/machine_learning_map/) dan klik sepanjang laluan untuk membaca dokumentasi. \n",
"> \n",
"> [Laman rujukan Tidymodels](https://www.tidymodels.org/find/parsnip/#models) juga menyediakan dokumentasi yang sangat baik tentang pelbagai jenis model.\n",
"\n",
"### **Rancangan** 🗺️\n",
"\n",
"Peta ini sangat berguna apabila anda mempunyai pemahaman yang jelas tentang data anda, kerana anda boleh 'berjalan' di sepanjang laluannya untuk membuat keputusan:\n",
"\n",
"- Kami mempunyai \\>50 sampel\n",
"\n",
"- Kami ingin meramal kategori\n",
"\n",
"- Kami mempunyai data berlabel\n",
"\n",
"- Kami mempunyai kurang daripada 100K sampel\n",
"\n",
"- ✨ Kami boleh memilih Linear SVC\n",
"\n",
"- Jika itu tidak berjaya, kerana kami mempunyai data berangka\n",
"\n",
" - Kami boleh mencuba ✨ KNeighbors Classifier\n",
"\n",
" - Jika itu juga tidak berjaya, cuba ✨ SVC dan ✨ Ensemble Classifiers\n",
"\n",
"Ini adalah laluan yang sangat berguna untuk diikuti. Sekarang, mari kita teruskan dengan menggunakan rangka kerja pemodelan [tidymodels](https://www.tidymodels.org/): satu koleksi pakej R yang konsisten dan fleksibel yang dibangunkan untuk menggalakkan amalan statistik yang baik 😊.\n",
"\n",
"## 2. Bahagikan data dan tangani set data yang tidak seimbang.\n",
"\n",
"Daripada pelajaran sebelumnya, kita belajar bahawa terdapat satu set bahan biasa merentasi masakan kita. Selain itu, terdapat pengagihan yang agak tidak seimbang dalam bilangan masakan.\n",
"\n",
"Kita akan menangani perkara ini dengan\n",
"\n",
"- Membuang bahan yang paling biasa yang mencetuskan kekeliruan antara masakan yang berbeza, menggunakan `dplyr::select()`.\n",
"\n",
"- Menggunakan `recipe` yang memproses data untuk bersedia untuk pemodelan dengan menggunakan algoritma `over-sampling`.\n",
"\n",
"Kita sudah melihat perkara di atas dalam pelajaran sebelumnya, jadi ini sepatutnya mudah 🥳!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6tj_rN00hClA"
},
"source": [
"# Load the core Tidyverse and Tidymodels packages\n",
"library(tidyverse)\n",
"library(tidymodels)\n",
"\n",
"# Load the original cuisines data\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
"\n",
"# Drop id column, rice, garlic and ginger from our original data set\n",
"df_select <- df %>% \n",
" select(-c(1, rice, garlic, ginger)) %>%\n",
" # Encode cuisine column as categorical\n",
" mutate(cuisine = factor(cuisine))\n",
"\n",
"\n",
"# Create data split specification\n",
"set.seed(2056)\n",
"cuisines_split <- initial_split(data = df_select,\n",
" strata = cuisine,\n",
" prop = 0.7)\n",
"\n",
"# Extract the data in each split\n",
"cuisines_train <- training(cuisines_split)\n",
"cuisines_test <- testing(cuisines_split)\n",
"\n",
"# Display distribution of cuisines in the training set\n",
"cuisines_train %>% \n",
" count(cuisine) %>% \n",
" arrange(desc(n))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zFin5yw3hHb1"
},
"source": [
"### Menangani Data Tidak Seimbang\n",
"\n",
"Data tidak seimbang sering memberi kesan negatif terhadap prestasi model. Kebanyakan model berfungsi dengan baik apabila bilangan pemerhatian adalah sama dan, oleh itu, cenderung menghadapi kesukaran dengan data yang tidak seimbang.\n",
"\n",
"Terdapat dua cara utama untuk menangani set data tidak seimbang:\n",
"\n",
"- menambah pemerhatian kepada kelas minoriti: `Over-sampling` contohnya menggunakan algoritma SMOTE yang secara sintetik menghasilkan contoh baharu bagi kelas minoriti menggunakan jiran terdekat bagi kes-kes ini.\n",
"\n",
"- mengurangkan pemerhatian daripada kelas majoriti: `Under-sampling`\n",
"\n",
"Dalam pelajaran sebelumnya, kami telah menunjukkan cara menangani set data tidak seimbang menggunakan `recipe`. Recipe boleh dianggap sebagai pelan tindakan yang menerangkan langkah-langkah yang perlu diterapkan pada set data untuk menjadikannya sedia untuk analisis data. Dalam kes kita, kita mahu mempunyai pengagihan yang sama dalam bilangan masakan kita untuk `training set` kita. Mari kita teruskan.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cRzTnHolhLWd"
},
"source": [
"# Load themis package for dealing with imbalanced data\n",
"library(themis)\n",
"\n",
"# Create a recipe for preprocessing training data\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
" step_smote(cuisine) \n",
"\n",
"# Print recipe\n",
"cuisines_recipe"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KxOQ2ORhhO81"
},
"source": [
"Sekarang kita bersedia untuk melatih model 👩‍💻👨‍💻!\n",
"\n",
"## 3. Melangkaui model regresi multinomial\n",
"\n",
"Dalam pelajaran sebelumnya, kita telah melihat model regresi multinomial. Mari kita terokai beberapa model yang lebih fleksibel untuk klasifikasi.\n",
"\n",
"### Support Vector Machines\n",
"\n",
"Dalam konteks klasifikasi, `Support Vector Machines` adalah teknik pembelajaran mesin yang cuba mencari *hyperplane* yang \"paling baik\" memisahkan kelas-kelas. Mari kita lihat contoh mudah:\n",
"\n",
"<p >\n",
" <img src=\"../../images/svm.png\"\n",
" width=\"300\"/>\n",
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C4Wsd0vZhXYu"
},
"source": [
"H1~ tidak memisahkan kelas. H2~ memisahkan, tetapi hanya dengan margin kecil. H3~ memisahkan dengan margin maksimum.\n",
"\n",
"#### Pengelas Linear Support Vector\n",
"\n",
"Support-Vector clustering (SVC) adalah sebahagian daripada keluarga teknik ML Support-Vector machines. Dalam SVC, hyperplane dipilih untuk memisahkan `kebanyakan` pemerhatian latihan dengan betul, tetapi `mungkin salah klasifikasi` beberapa pemerhatian. Dengan membenarkan beberapa titik berada di sisi yang salah, SVM menjadi lebih tahan terhadap outlier dan dengan itu memberikan generalisasi yang lebih baik kepada data baharu. Parameter yang mengawal pelanggaran ini dirujuk sebagai `cost` yang mempunyai nilai lalai 1 (lihat `help(\"svm_poly\")`).\n",
"\n",
"Mari kita cipta SVC linear dengan menetapkan `degree = 1` dalam model SVM polinomial.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vJpp6nuChlBz"
},
"source": [
"# Make a linear SVC specification\n",
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svc_linear_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svc_linear_spec)\n",
"\n",
"# Print out workflow\n",
"svc_linear_wf"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDs8cWNkhoqu"
},
"source": [
"Sekarang kita telah menangkap langkah-langkah prapemprosesan dan spesifikasi model ke dalam *workflow*, kita boleh terus melatih SVC linear dan menilai hasilnya pada masa yang sama. Untuk metrik prestasi, mari kita cipta satu set metrik yang akan menilai: `accuracy`, `sensitivity`, `Positive Predicted Value` dan `F Measure`.\n",
"\n",
"> `augment()` akan menambah lajur untuk ramalan kepada data yang diberikan.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "81wiqcwuhrnq"
},
"source": [
"# Train a linear SVC model\n",
"svc_linear_fit <- svc_linear_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svc_linear_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0UFQvHf-huo3"
},
"source": [
"#### Mesin Vektor Sokongan\n",
"\n",
"Mesin vektor sokongan (SVM) adalah lanjutan daripada pengklasifikasi vektor sokongan untuk menyesuaikan sempadan tidak linear antara kelas. Secara asasnya, SVM menggunakan *helah kernel* untuk memperluaskan ruang ciri bagi menyesuaikan hubungan tidak linear antara kelas. Salah satu fungsi kernel yang popular dan sangat fleksibel yang digunakan oleh SVM ialah *Fungsi asas radial.* Mari kita lihat bagaimana ia berprestasi pada data kita.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-KX4S8mzhzmp"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Make an RBF SVM specification\n",
"svm_rbf_spec <- svm_rbf() %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svm_rbf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svm_rbf_spec)\n",
"\n",
"\n",
"# Train an RBF model\n",
"svm_rbf_fit <- svm_rbf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svm_rbf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QBFSa7WSh4HQ"
},
"source": [
"Lebih baik 🤩!\n",
"\n",
"> ✅ Sila lihat:\n",
">\n",
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), Hands-on Machine Learning dengan R\n",
">\n",
"> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning with Applications in R\n",
">\n",
"> untuk bacaan lanjut.\n",
"\n",
"### Pengelas Neighbor Terdekat\n",
"\n",
"*K*-nearest neighbor (KNN) adalah algoritma di mana setiap pemerhatian diramal berdasarkan *keserupaan* dengan pemerhatian lain.\n",
"\n",
"Mari kita sesuaikan satu dengan data kita.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "k4BxxBcdh9Ka"
},
"source": [
"# Make a KNN specification\n",
"knn_spec <- nearest_neighbor() %>% \n",
" set_engine(\"kknn\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"knn_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(knn_spec)\n",
"\n",
"# Train a boosted tree model\n",
"knn_wf_fit <- knn_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"knn_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HaegQseriAcj"
},
"source": [
"Model ini nampaknya tidak berfungsi dengan baik. Mungkin dengan mengubah argumen model (lihat `help(\"nearest_neighbor\")`) akan meningkatkan prestasi model. Pastikan untuk mencubanya.\n",
"\n",
"> ✅ Sila lihat:\n",
">\n",
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
">\n",
"> untuk mengetahui lebih lanjut tentang pengklasifikasi *K*-Nearest Neighbors.\n",
"\n",
"### Pengklasifikasi Ensemble\n",
"\n",
"Algoritma ensemble berfungsi dengan menggabungkan beberapa penganggar asas untuk menghasilkan model yang optimum sama ada melalui:\n",
"\n",
"`bagging`: menggunakan *fungsi purata* pada koleksi model asas\n",
"\n",
"`boosting`: membina urutan model yang saling melengkapi untuk meningkatkan prestasi ramalan.\n",
"\n",
"Mari kita mulakan dengan mencuba model Random Forest, yang membina koleksi besar pokok keputusan kemudian menggunakan fungsi purata untuk menghasilkan model keseluruhan yang lebih baik.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "49DPoVs6iK1M"
},
"source": [
"# Make a random forest specification\n",
"rf_spec <- rand_forest() %>% \n",
" set_engine(\"ranger\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"rf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(rf_spec)\n",
"\n",
"# Train a random forest model\n",
"rf_wf_fit <- rf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"rf_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "RGVYwC_aiUWc"
},
"source": [
"Kerja yang bagus 👏!\n",
"\n",
"Mari kita juga cuba dengan model Boosted Tree.\n",
"\n",
"Boosted Tree mendefinisikan kaedah ensemble yang mencipta satu siri pokok keputusan secara berurutan di mana setiap pokok bergantung pada hasil pokok sebelumnya dalam usaha untuk mengurangkan ralat secara beransur-ansur. Ia memberi tumpuan kepada berat item yang diklasifikasikan secara salah dan menyesuaikan padanan untuk pengklasifikasi seterusnya bagi membetulkan.\n",
"\n",
"Terdapat pelbagai cara untuk memadankan model ini (lihat `help(\"boost_tree\")`). Dalam contoh ini, kita akan memadankan Boosted trees melalui enjin `xgboost`.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Py1YWo-micWs"
},
"source": [
"# Make a boosted tree specification\n",
"boost_spec <- boost_tree(trees = 200) %>% \n",
" set_engine(\"xgboost\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"boost_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(boost_spec)\n",
"\n",
"# Train a boosted tree model\n",
"boost_wf_fit <- boost_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"boost_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zNQnbuejigZM"
},
"source": [
"> ✅ Sila lihat:\n",
">\n",
"> - [Machine Learning for Social Scientists](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
">\n",
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
">\n",
"> - <https://algotech.netlify.app/blog/xgboost/> - Membincangkan model AdaBoost yang merupakan alternatif yang baik kepada xgboost.\n",
">\n",
"> untuk mempelajari lebih lanjut tentang pengelas Ensemble.\n",
"\n",
"## 4. Tambahan - membandingkan pelbagai model\n",
"\n",
"Kita telah melatih sejumlah besar model dalam makmal ini 🙌. Ia boleh menjadi membosankan atau membebankan untuk mencipta banyak aliran kerja daripada pelbagai set pemprosesan awal dan/atau spesifikasi model, kemudian mengira metrik prestasi satu persatu.\n",
"\n",
"Mari kita lihat jika kita boleh menyelesaikan ini dengan mencipta satu fungsi yang melatih senarai aliran kerja pada set latihan, kemudian mengembalikan metrik prestasi berdasarkan set ujian. Kita akan menggunakan `map()` dan `map_dfr()` daripada pakej [purrr](https://purrr.tidyverse.org/) untuk menerapkan fungsi kepada setiap elemen dalam senarai.\n",
"\n",
"> Fungsi [`map()`](https://purrr.tidyverse.org/reference/map.html) membolehkan anda menggantikan banyak gelung for dengan kod yang lebih ringkas dan mudah dibaca. Tempat terbaik untuk mempelajari fungsi [`map()`](https://purrr.tidyverse.org/reference/map.html) adalah dalam [bab iterasi](http://r4ds.had.co.nz/iteration.html) dalam buku R for Data Science.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Qzb7LyZnimd2"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"# Define a function that returns performance metrics\n",
"compare_models <- function(workflow_list, train_set, test_set){\n",
" \n",
" suppressWarnings(\n",
" # Fit each model to the train_set\n",
" map(workflow_list, fit, data = train_set) %>% \n",
" # Make predictions on the test set\n",
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
" # Select desired columns\n",
" select(model, cuisine, .pred_class) %>% \n",
" # Evaluate model performance\n",
" group_by(model) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
" ungroup()\n",
" )\n",
" \n",
"} # End of function"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Fwa712sNisDA"
},
"source": []
},
{
"cell_type": "code",
"metadata": {
"id": "3i4VJOi2iu-a"
},
"source": [
"# Make a list of workflows\n",
"workflow_list <- list(\n",
" \"svc\" = svc_linear_wf,\n",
" \"svm\" = svm_rbf_wf,\n",
" \"knn\" = knn_wf,\n",
" \"random_forest\" = rf_wf,\n",
" \"xgboost\" = boost_wf)\n",
"\n",
"# Call the function\n",
"set.seed(2056)\n",
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
"\n",
"# Print out performance metrics\n",
"perf_metrics %>% \n",
" group_by(.metric) %>% \n",
" arrange(desc(.estimate)) %>% \n",
" slice_head(n=7)\n",
"\n",
"# Compare accuracy\n",
"perf_metrics %>% \n",
" filter(.metric == \"accuracy\") %>% \n",
" arrange(desc(.estimate))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KuWK_lEli4nW"
},
"source": [
"[**workflowset**](https://workflowsets.tidymodels.org/) membolehkan pengguna mencipta dan dengan mudah melatih sejumlah besar model, tetapi ia kebanyakannya direka untuk digunakan bersama teknik pensampelan semula seperti `cross-validation`, satu pendekatan yang kita belum bincangkan.\n",
"\n",
"## **🚀Cabaran**\n",
"\n",
"Setiap teknik ini mempunyai sejumlah besar parameter yang boleh anda ubah suai, contohnya `cost` dalam SVM, `neighbors` dalam KNN, `mtry` (Predictor yang Dipilih Secara Rawak) dalam Random Forest.\n",
"\n",
"Selidik parameter lalai untuk setiap satu dan fikirkan apa maksud mengubah suai parameter ini terhadap kualiti model.\n",
"\n",
"Untuk mengetahui lebih lanjut tentang model tertentu dan parameternya, gunakan: `help(\"model\")` contohnya `help(\"rand_forest\")`\n",
"\n",
"> Dalam amalan, kita biasanya *menganggar* *nilai terbaik* untuk parameter ini dengan melatih banyak model pada `set data simulasi` dan mengukur sejauh mana prestasi semua model ini. Proses ini dipanggil **tuning**.\n",
"\n",
"### [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **Ulasan & Kajian Kendiri**\n",
"\n",
"Terdapat banyak istilah teknikal dalam pelajaran ini, jadi luangkan masa untuk menyemak [senarai ini](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) istilah berguna!\n",
"\n",
"#### TERIMA KASIH KEPADA:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) kerana mencipta ilustrasi yang menakjubkan 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",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) dan [Jen Looper](https://www.twitter.com/jenlooper) kerana mencipta versi asal modul ini dalam Python ♥️\n",
"\n",
"Selamat Belajar,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Duta Pelajar Microsoft Learn Emas.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"569\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
]
},
{
"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 perhatian 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"
]
}
]
}

@ -0,0 +1,302 @@
{
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 2
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Cuba pengelas yang berbeza\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.svm import SVC\n",
"from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"\n",
"C = 10\n",
"# Create different classifiers.\n",
"classifiers = {\n",
" 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),\n",
" 'KNN classifier': KNeighborsClassifier(C),\n",
" 'SVC': SVC(),\n",
" 'RFST': RandomForestClassifier(n_estimators=100),\n",
" 'ADA': AdaBoostClassifier(n_estimators=100)\n",
" \n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy (train) for Linear SVC: 76.4% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.64 0.66 0.65 242\n",
" indian 0.91 0.86 0.89 236\n",
" japanese 0.72 0.73 0.73 245\n",
" korean 0.83 0.75 0.79 234\n",
" thai 0.75 0.82 0.78 242\n",
"\n",
" accuracy 0.76 1199\n",
" macro avg 0.77 0.76 0.77 1199\n",
"weighted avg 0.77 0.76 0.77 1199\n",
"\n",
"Accuracy (train) for KNN classifier: 70.7% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.65 0.63 0.64 242\n",
" indian 0.84 0.81 0.82 236\n",
" japanese 0.60 0.81 0.69 245\n",
" korean 0.89 0.53 0.67 234\n",
" thai 0.69 0.75 0.72 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.73 0.71 0.71 1199\n",
"weighted avg 0.73 0.71 0.71 1199\n",
"\n",
"Accuracy (train) for SVC: 80.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.71 0.69 0.70 242\n",
" indian 0.92 0.92 0.92 236\n",
" japanese 0.77 0.78 0.77 245\n",
" korean 0.87 0.77 0.82 234\n",
" thai 0.75 0.86 0.80 242\n",
"\n",
" accuracy 0.80 1199\n",
" macro avg 0.80 0.80 0.80 1199\n",
"weighted avg 0.80 0.80 0.80 1199\n",
"\n",
"Accuracy (train) for RFST: 82.8% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.80 0.75 0.77 242\n",
" indian 0.90 0.91 0.90 236\n",
" japanese 0.82 0.78 0.80 245\n",
" korean 0.85 0.82 0.83 234\n",
" thai 0.78 0.89 0.83 242\n",
"\n",
" accuracy 0.83 1199\n",
" macro avg 0.83 0.83 0.83 1199\n",
"weighted avg 0.83 0.83 0.83 1199\n",
"\n",
"Accuracy (train) for ADA: 71.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.60 0.57 0.58 242\n",
" indian 0.87 0.84 0.86 236\n",
" japanese 0.71 0.60 0.65 245\n",
" korean 0.68 0.78 0.72 234\n",
" thai 0.70 0.78 0.74 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.71 0.71 0.71 1199\n",
"weighted avg 0.71 0.71 0.71 1199\n",
"\n"
]
}
],
"source": [
"n_classifiers = len(classifiers)\n",
"\n",
"for index, (name, classifier) in enumerate(classifiers.items()):\n",
" classifier.fit(X_train, np.ravel(y_train))\n",
"\n",
" y_pred = classifier.predict(X_test)\n",
" accuracy = accuracy_score(y_test, y_pred)\n",
" print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\n",
" print(classification_report(y_test,y_pred))"
]
},
{
"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"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "7ea2b714669c823a596d986ba2d5739f",
"translation_date": "2025-09-06T12:28:21+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,41 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "2f3e0d9e9ac5c301558fb8bf733ac0cb",
"translation_date": "2025-09-06T12:27:30+00:00",
"source_file": "4-Classification/4-Applied/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"Bina pencadang masakan\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"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"
]
}
]
}

@ -0,0 +1,292 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "49325d6dd12a3628fc64fa7ccb1a80ff",
"translation_date": "2025-09-06T12:27:46+00:00",
"source_file": "4-Classification/4-Applied/solution/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# Bina pencadang masakan\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: skl2onnx in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n",
"Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (3.8.0)\n",
"Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.19.2)\n",
"Requirement already satisfied: onnx>=1.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.9.0)\n",
"Requirement already satisfied: six in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from skl2onnx) (1.12.0)\n",
"Requirement already satisfied: onnxconverter-common<1.9,>=1.6.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.8.1)\n",
"Requirement already satisfied: scikit-learn>=0.19 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (0.24.2)\n",
"Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.4.1)\n",
"Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->skl2onnx) (45.1.0)\n",
"Requirement already satisfied: typing-extensions>=3.6.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnx>=1.2.1->skl2onnx) (3.10.0.0)\n",
"Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (2.1.0)\n",
"Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (0.16.0)\n",
"\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
"You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"!pip install skl2onnx"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd \n"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 60
}
],
"source": [
"data = pd.read_csv('../../data/cleaned_cuisines.csv')\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 61
}
],
"source": [
"X = data.iloc[:,2:]\n",
"X.head()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" cuisine\n",
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>cuisine</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>1</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>2</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>3</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>4</th>\n <td>indian</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 62
}
],
"source": [
"y = data[['cuisine']]\n",
"y.head()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.svm import SVC\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"SVC(C=10, kernel='linear', probability=True, random_state=0)"
]
},
"metadata": {},
"execution_count": 65
}
],
"source": [
"model = SVC(kernel='linear', C=10, probability=True,random_state=0)\n",
"model.fit(X_train,y_train.values.ravel())\n"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
"y_pred = model.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.72 0.70 0.71 236\n indian 0.91 0.88 0.89 243\n japanese 0.80 0.75 0.77 240\n korean 0.80 0.81 0.81 230\n thai 0.76 0.85 0.80 250\n\n accuracy 0.80 1199\n macro avg 0.80 0.80 0.80 1199\nweighted avg 0.80 0.80 0.80 1199\n\n"
]
}
],
"source": [
"print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [],
"source": [
"from skl2onnx import convert_sklearn\n",
"from skl2onnx.common.data_types import FloatTensorType\n",
"\n",
"initial_type = [('float_input', FloatTensorType([None, 380]))]\n",
"options = {id(model): {'nocl': True, 'zipmap': False}}\n",
"onx = convert_sklearn(model, initial_types=initial_type, options=options)\n",
"with open(\"./model.onnx\", \"wb\") as f:\n",
" f.write(onx.SerializeToString())\n",
"\n",
"\n"
]
},
{
"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 perhatian 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"
]
}
]
}

@ -0,0 +1,50 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python383jvsc74a57bd0e134e05457d34029b6460cd73bbf1ed73f339b5b6d98c95be70b69eba114fe95",
"display_name": "Python 3.8.3 64-bit (conda)"
},
"coopTranslator": {
"original_hash": "40e0707e96b3e1899a912776006264f9",
"translation_date": "2025-09-06T12:06:34+00:00",
"source_file": "5-Clustering/1-Visualize/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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 perhatian 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"
]
}
]
}

@ -0,0 +1,499 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Analisis Muzik Nigeria yang diambil dari Spotify**\n",
"\n",
"Pengelompokan adalah sejenis [Pembelajaran Tanpa Pengawasan](https://wikipedia.org/wiki/Unsupervised_learning) yang mengandaikan bahawa dataset tidak berlabel atau inputnya tidak dipadankan dengan output yang telah ditentukan. Ia menggunakan pelbagai algoritma untuk menyusun data yang tidak berlabel dan menyediakan kumpulan berdasarkan corak yang dikenalpasti dalam data.\n",
"\n",
"[**Kuiz sebelum kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Pengenalan**\n",
"\n",
"[Pengelompokan](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) sangat berguna untuk penerokaan data. Mari kita lihat sama ada ia boleh membantu mengenal pasti trend dan corak dalam cara penonton Nigeria menikmati muzik.\n",
"\n",
"> ✅ Luangkan masa untuk memikirkan kegunaan pengelompokan. Dalam kehidupan sebenar, pengelompokan berlaku apabila anda mempunyai timbunan pakaian dan perlu menyusun pakaian ahli keluarga anda 🧦👕👖🩲. Dalam sains data, pengelompokan berlaku apabila cuba menganalisis pilihan pengguna, atau menentukan ciri-ciri dataset yang tidak berlabel. Pengelompokan, dalam satu cara, membantu memahami kekacauan, seperti laci stokin.\n",
"\n",
"Dalam persekitaran profesional, pengelompokan boleh digunakan untuk menentukan perkara seperti segmentasi pasaran, menentukan kumpulan umur yang membeli barangan tertentu, sebagai contoh. Kegunaan lain adalah pengesanan anomali, mungkin untuk mengesan penipuan daripada dataset transaksi kad kredit. Atau anda mungkin menggunakan pengelompokan untuk menentukan tumor dalam kumpulan imbasan perubatan.\n",
"\n",
"✅ Luangkan masa untuk memikirkan bagaimana anda mungkin pernah menemui pengelompokan 'di alam liar', dalam perbankan, e-dagang, atau perniagaan.\n",
"\n",
"> 🎓 Menariknya, analisis pengelompokan berasal dari bidang Antropologi dan Psikologi pada tahun 1930-an. Bolehkah anda bayangkan bagaimana ia mungkin digunakan?\n",
"\n",
"Sebagai alternatif, anda boleh menggunakannya untuk mengelompokkan hasil carian - seperti pautan membeli-belah, imej, atau ulasan, sebagai contoh. Pengelompokan berguna apabila anda mempunyai dataset yang besar yang ingin anda kurangkan dan pada dataset tersebut anda ingin melakukan analisis yang lebih terperinci, jadi teknik ini boleh digunakan untuk mempelajari data sebelum model lain dibina.\n",
"\n",
"✅ Setelah data anda diatur dalam kelompok, anda memberikan Id kelompok, dan teknik ini boleh berguna apabila ingin mengekalkan privasi dataset; anda boleh merujuk kepada titik data dengan Id kelompoknya, dan bukannya data yang lebih mendedahkan. Bolehkah anda memikirkan sebab lain mengapa anda merujuk kepada Id kelompok dan bukannya elemen lain dalam kelompok untuk mengenal pasti data tersebut?\n",
"\n",
"### Memulakan pengelompokan\n",
"\n",
"> 🎓 Cara kita mencipta kelompok banyak berkaitan dengan cara kita mengumpulkan titik data ke dalam kumpulan. Mari kita terokai beberapa istilah:\n",
">\n",
"> 🎓 ['Transduktif' vs. 'Induktif'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Inferens transduktif diperoleh daripada kes latihan yang diperhatikan yang memetakan kepada kes ujian tertentu. Inferens induktif diperoleh daripada kes latihan yang memetakan kepada peraturan umum yang hanya kemudian digunakan pada kes ujian.\n",
">\n",
"> Contoh: Bayangkan anda mempunyai dataset yang hanya sebahagiannya berlabel. Beberapa perkara adalah 'rekod', beberapa 'cd', dan beberapa kosong. Tugas anda adalah memberikan label untuk yang kosong. Jika anda memilih pendekatan induktif, anda akan melatih model mencari 'rekod' dan 'cd', dan menerapkan label tersebut pada data yang tidak berlabel. Pendekatan ini akan menghadapi kesukaran mengklasifikasikan perkara yang sebenarnya 'kaset'. Pendekatan transduktif, sebaliknya, menangani data yang tidak diketahui ini dengan lebih berkesan kerana ia berfungsi untuk mengelompokkan item serupa bersama-sama dan kemudian menerapkan label pada kumpulan. Dalam kes ini, kelompok mungkin mencerminkan 'benda muzik bulat' dan 'benda muzik segi empat'.\n",
">\n",
"> 🎓 ['Geometri tidak rata' vs. 'rata'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Berasal daripada istilah matematik, geometri tidak rata vs. rata merujuk kepada ukuran jarak antara titik sama ada dengan kaedah geometri 'rata' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) atau 'tidak rata' (bukan Euclidean).\n",
">\n",
"> 'Rata' dalam konteks ini merujuk kepada geometri Euclidean (bahagian daripadanya diajar sebagai geometri 'dataran'), dan tidak rata merujuk kepada geometri bukan Euclidean. Apa kaitan geometri dengan pembelajaran mesin? Nah, sebagai dua bidang yang berakar dalam matematik, mesti ada cara umum untuk mengukur jarak antara titik dalam kelompok, dan itu boleh dilakukan dengan cara 'rata' atau 'tidak rata', bergantung pada sifat data. [Jarak Euclidean](https://wikipedia.org/wiki/Euclidean_distance) diukur sebagai panjang segmen garis antara dua titik. [Jarak bukan Euclidean](https://wikipedia.org/wiki/Non-Euclidean_geometry) diukur sepanjang lengkung. Jika data anda, yang divisualisasikan, nampaknya tidak wujud pada satah, anda mungkin perlu menggunakan algoritma khusus untuk menanganinya.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Jarak'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Kelompok ditentukan oleh matriks jaraknya, contohnya jarak antara titik. Jarak ini boleh diukur dengan beberapa cara. Kelompok Euclidean ditentukan oleh purata nilai titik, dan mengandungi 'centroid' atau titik tengah. Jarak diukur berdasarkan jarak ke centroid tersebut. Jarak bukan Euclidean merujuk kepada 'clustroid', titik yang paling dekat dengan titik lain. Clustroid pula boleh ditentukan dengan pelbagai cara.\n",
">\n",
"> 🎓 ['Terkekang'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Pengelompokan Terkekang](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) memperkenalkan pembelajaran 'semi-terawasi' ke dalam kaedah tanpa pengawasan ini. Hubungan antara titik ditandai sebagai 'tidak boleh dihubungkan' atau 'mesti dihubungkan' supaya beberapa peraturan dipaksa pada dataset.\n",
">\n",
"> Contoh: Jika algoritma dibiarkan bebas pada kumpulan data yang tidak berlabel atau separa berlabel, kelompok yang dihasilkannya mungkin berkualiti rendah. Dalam contoh di atas, kelompok mungkin mengelompokkan 'benda muzik bulat' dan 'benda muzik segi empat' dan 'benda segi tiga' dan 'kuki'. Jika diberikan beberapa kekangan, atau peraturan untuk diikuti (\"item mesti diperbuat daripada plastik\", \"item perlu dapat menghasilkan muzik\") ini boleh membantu 'mengekang' algoritma untuk membuat pilihan yang lebih baik.\n",
">\n",
"> 🎓 'Ketumpatan'\n",
">\n",
"> Data yang 'berisik' dianggap 'padat'. Jarak antara titik dalam setiap kelompoknya mungkin terbukti, apabila diperiksa, lebih atau kurang padat, atau 'sesak' dan oleh itu data ini perlu dianalisis dengan kaedah pengelompokan yang sesuai. [Artikel ini](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) menunjukkan perbezaan antara menggunakan pengelompokan K-Means vs. algoritma HDBSCAN untuk meneroka dataset yang berisik dengan ketumpatan kelompok yang tidak sekata.\n",
"\n",
"Perdalam pemahaman anda tentang teknik pengelompokan dalam [modul pembelajaran ini](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Algoritma pengelompokan**\n",
"\n",
"Terdapat lebih daripada 100 algoritma pengelompokan, dan penggunaannya bergantung pada sifat data yang ada. Mari kita bincangkan beberapa yang utama:\n",
"\n",
"- **Pengelompokan hierarki**. Jika objek diklasifikasikan berdasarkan jaraknya dengan objek berdekatan, dan bukannya dengan objek yang lebih jauh, kelompok dibentuk berdasarkan jarak anggota mereka ke dan dari objek lain. Pengelompokan hierarki dicirikan oleh penggabungan dua kelompok berulang kali.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Pengelompokan centroid**. Algoritma popular ini memerlukan pilihan 'k', atau bilangan kelompok untuk dibentuk, selepas itu algoritma menentukan titik tengah kelompok dan mengumpulkan data di sekitar titik tersebut. [Pengelompokan K-means](https://wikipedia.org/wiki/K-means_clustering) adalah versi pengelompokan centroid yang popular yang memisahkan dataset kepada kumpulan K yang telah ditentukan. Pusat ditentukan oleh purata terdekat, maka namanya. Jarak kuasa dua dari kelompok diminimumkan.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik oleh Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Pengelompokan berasaskan pengedaran**. Berdasarkan pemodelan statistik, pengelompokan berasaskan pengedaran berpusat pada menentukan kebarangkalian bahawa titik data tergolong dalam kelompok, dan menetapkannya dengan sewajarnya. Kaedah campuran Gaussian tergolong dalam jenis ini.\n",
"\n",
"- **Pengelompokan berasaskan ketumpatan**. Titik data diberikan kepada kelompok berdasarkan ketumpatannya, atau pengelompokannya di sekitar satu sama lain. Titik data yang jauh dari kumpulan dianggap sebagai pencilan atau bunyi. DBSCAN, Mean-shift dan OPTICS tergolong dalam jenis pengelompokan ini.\n",
"\n",
"- **Pengelompokan berasaskan grid**. Untuk dataset pelbagai dimensi, grid dibuat dan data dibahagikan di antara sel grid, dengan itu mencipta kelompok.\n",
"\n",
"Cara terbaik untuk belajar tentang pengelompokan adalah mencubanya sendiri, jadi itulah yang akan anda lakukan dalam latihan ini.\n",
"\n",
"Kami memerlukan beberapa pakej untuk melengkapkan modul ini. Anda boleh memasangnya seperti berikut: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk melengkapkan modul ini dan memasangnya untuk anda jika ada yang hilang.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## Latihan - kelompokkan data anda\n",
"\n",
"Pengelompokan sebagai teknik sangat dibantu oleh visualisasi yang tepat, jadi mari kita mulakan dengan memvisualisasikan data muzik kita. Latihan ini akan membantu kita menentukan kaedah pengelompokan mana yang paling berkesan digunakan berdasarkan sifat data ini.\n",
"\n",
"Mari kita teruskan dengan mengimport data.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core tidyverse and make it available in your current R session\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# Import the data into a tibble\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
"\r\n",
"# View the first 5 rows of the data set\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Kadang-kadang, kita mungkin ingin mendapatkan sedikit lebih banyak maklumat tentang data kita. Kita boleh melihat `data` dan `strukturnya` dengan menggunakan fungsi [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html):\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Glimpse into the data set\r\n",
"df %>% \r\n",
" glimpse()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Kerja yang bagus!💪\n",
"\n",
"Kita dapat lihat bahawa `glimpse()` akan memberikan jumlah baris (pemerhatian) dan lajur (pemboleh ubah), kemudian, beberapa entri pertama bagi setiap pemboleh ubah dalam satu baris selepas nama pemboleh ubah. Selain itu, *jenis data* bagi pemboleh ubah diberikan serta-merta selepas nama pemboleh ubah di dalam `< >`.\n",
"\n",
"`DataExplorer::introduce()` boleh meringkaskan maklumat ini dengan kemas:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe basic information for our data\r\n",
"df %>% \r\n",
" introduce()\r\n",
"\r\n",
"# A visual display of the same\r\n",
"df %>% \r\n",
" plot_intro()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Hebat! Kita baru sahaja mengetahui bahawa data kita tidak mempunyai nilai yang hilang.\n",
"\n",
"Sambil kita berada di sini, kita boleh meneroka statistik kecenderungan pusat yang biasa (contohnya [min](https://en.wikipedia.org/wiki/Arithmetic_mean) dan [median](https://en.wikipedia.org/wiki/Median)) serta ukuran penyebaran (contohnya [sisihan piawai](https://en.wikipedia.org/wiki/Standard_deviation)) menggunakan `summarytools::descr()`\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe common statistics\r\n",
"df %>% \r\n",
" descr(stats = \"common\")\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Mari kita lihat nilai umum data. Perlu diingat bahawa populariti boleh menjadi `0`, yang menunjukkan lagu-lagu yang tidak mempunyai kedudukan. Kita akan menghapuskan data tersebut sebentar lagi.\n",
"\n",
"> 🤔 Jika kita bekerja dengan pengelompokan, kaedah tanpa pengawasan yang tidak memerlukan data berlabel, mengapa kita menunjukkan data ini dengan label? Dalam fasa penerokaan data, label ini berguna, tetapi ia tidak diperlukan untuk algoritma pengelompokan berfungsi.\n",
"\n",
"### 1. Terokai genre popular\n",
"\n",
"Mari kita teruskan dan cari genre paling popular 🎶 dengan membuat kiraan berapa kali ia muncul.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Popular genres\r\n",
"top_genres <- df %>% \r\n",
" count(artist_top_genre, sort = TRUE) %>% \r\n",
"# Encode to categorical and reorder the according to count\r\n",
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
"\r\n",
"# Print the top genres\r\n",
"top_genres\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Itu berjalan dengan baik! Mereka kata gambar bernilai seribu baris data bingkai (sebenarnya tiada siapa yang pernah kata begitu 😅). Tetapi anda faham maksudnya, kan?\n",
"\n",
"Salah satu cara untuk menggambarkan data kategori (pemboleh ubah jenis karakter atau faktor) adalah dengan menggunakan barplot. Mari kita buat barplot untuk 10 genre teratas:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Change the default gray theme\r\n",
"theme_set(theme_light())\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Sekarang lebih mudah untuk mengenal pasti bahawa kita mempunyai genre `missing` 🧐!\n",
"\n",
"> Visualisasi yang baik akan menunjukkan perkara yang tidak dijangka, atau menimbulkan soalan baru tentang data - Hadley Wickham dan Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Perhatikan, apabila genre teratas digambarkan sebagai `Missing`, itu bermaksud Spotify tidak mengklasifikasikannya, jadi mari kita hapuskannya.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" filter(artist_top_genre != \"Missing\") %>% \r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Daripada sedikit penerokaan data, kita mendapati bahawa tiga genre teratas mendominasi dataset ini. Mari kita fokus pada `afro dancehall`, `afropop`, dan `nigerian pop`, serta tapis dataset untuk membuang apa sahaja dengan nilai populariti 0 (bermaksud ia tidak diklasifikasikan dengan populariti dalam dataset dan boleh dianggap sebagai gangguan untuk tujuan kita):\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"nigerian_songs <- df %>% \r\n",
" # Concentrate on top 3 genres\r\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
" # Remove unclassified observations\r\n",
" filter(popularity != 0)\r\n",
"\r\n",
"\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"nigerian_songs %>%\r\n",
" count(artist_top_genre) %>%\r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Mari kita lihat sama ada terdapat hubungan linear yang jelas antara pemboleh ubah berangka dalam set data kita. Hubungan ini dihitung secara matematik melalui [statistik korelasi](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Statistik korelasi adalah nilai antara -1 dan 1 yang menunjukkan kekuatan hubungan. Nilai di atas 0 menunjukkan korelasi *positif* (nilai tinggi bagi satu pemboleh ubah cenderung bertepatan dengan nilai tinggi bagi pemboleh ubah yang lain), manakala nilai di bawah 0 menunjukkan korelasi *negatif* (nilai tinggi bagi satu pemboleh ubah cenderung bertepatan dengan nilai rendah bagi pemboleh ubah yang lain).\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Narrow down to numeric variables and fid correlation\r\n",
"corr_mat <- nigerian_songs %>% \r\n",
" select(where(is.numeric)) %>% \r\n",
" cor()\r\n",
"\r\n",
"# Visualize correlation matrix\r\n",
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Data tidak mempunyai korelasi yang kuat kecuali antara `energy` dan `loudness`, yang masuk akal memandangkan muzik yang kuat biasanya lebih bertenaga. `Popularity` mempunyai hubungan dengan `release date`, yang juga masuk akal kerana lagu yang lebih baru mungkin lebih popular. Panjang dan tenaga juga kelihatan mempunyai korelasi.\n",
"\n",
"Ia akan menarik untuk melihat apa yang algoritma pengelompokan boleh lakukan dengan data ini!\n",
"\n",
"> 🎓 Perhatikan bahawa korelasi tidak bermaksud sebab-akibat! Kita mempunyai bukti korelasi tetapi tiada bukti sebab-akibat. Sebuah [laman web yang menghiburkan](https://tylervigen.com/spurious-correlations) mempunyai beberapa visual yang menekankan perkara ini.\n",
"\n",
"### 2. Terokai pengagihan data\n",
"\n",
"Mari kita ajukan beberapa soalan yang lebih halus. Adakah genre berbeza secara signifikan dalam persepsi kebolehmenarian mereka, berdasarkan populariti? Mari kita periksa pengagihan data tiga genre teratas kita untuk populariti dan kebolehmenarian sepanjang paksi x dan y yang diberikan menggunakan [graf ketumpatan](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves).\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Perform 2D kernel density estimation\r\n",
"density_estimate_2d <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
" geom_density_2d(bins = 5, size = 1) +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" xlim(-20, 80) +\r\n",
" ylim(0, 1.2)\r\n",
"\r\n",
"# Density plot based on the popularity\r\n",
"density_estimate_pop <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" theme(legend.position = \"none\")\r\n",
"\r\n",
"# Density plot based on the danceability\r\n",
"density_estimate_dance <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
"\r\n",
"\r\n",
"# Patch everything together\r\n",
"library(patchwork)\r\n",
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Kami melihat terdapat bulatan sepusat yang sejajar, tanpa mengira genre. Adakah mungkin citarasa rakyat Nigeria bertemu pada tahap tertentu dalam kebolehmenarian untuk genre ini?\n",
"\n",
"Secara umum, ketiga-tiga genre ini sejajar dari segi populariti dan kebolehmenarian. Menentukan kelompok dalam data yang kurang sejajar ini akan menjadi cabaran. Mari kita lihat sama ada plot taburan boleh menyokong perkara ini.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# A scatter plot of popularity and danceability\r\n",
"scatter_plot <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
" geom_point(size = 2, alpha = 0.8) +\r\n",
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
"\r\n",
"# Add a touch of interactivity\r\n",
"ggplotly(scatter_plot)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Plot penyebaran bagi paksi yang sama menunjukkan corak penumpuan yang serupa.\n",
"\n",
"Secara umum, untuk pengelompokan, anda boleh menggunakan plot penyebaran untuk menunjukkan kelompok data, jadi menguasai jenis visualisasi ini sangat berguna. Dalam pelajaran seterusnya, kita akan mengambil data yang telah ditapis ini dan menggunakan pengelompokan k-means untuk mengenal pasti kumpulan dalam data ini yang kelihatan bertindih dengan cara yang menarik.\n",
"\n",
"## **🚀 Cabaran**\n",
"\n",
"Sebagai persediaan untuk pelajaran seterusnya, buat carta tentang pelbagai algoritma pengelompokan yang mungkin anda temui dan gunakan dalam persekitaran pengeluaran. Apakah jenis masalah yang cuba diselesaikan oleh pengelompokan?\n",
"\n",
"## [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Ulasan & Kajian Kendiri**\n",
"\n",
"Sebelum anda menggunakan algoritma pengelompokan, seperti yang telah kita pelajari, adalah idea yang baik untuk memahami sifat dataset anda. Baca lebih lanjut mengenai topik ini [di sini](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Mendalami pemahaman anda tentang teknik pengelompokan:\n",
"\n",
"- [Latih dan Nilai Model Pengelompokan menggunakan Tidymodels dan rakan-rakan](https://rpubs.com/eR_ic/clustering)\n",
"\n",
"- Bradley Boehmke & Brandon Greenwell, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
"\n",
"## **Tugasan**\n",
"\n",
"[Selidik visualisasi lain untuk pengelompokan](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## TERIMA KASIH KEPADA:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) kerana mencipta versi Python asal modul ini ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) kerana mencipta ilustrasi yang hebat yang menjadikan konsep pembelajaran mesin lebih mudah difahami dan lebih senang untuk difahami.\n",
"\n",
"Selamat Belajar,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"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 perhatian 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"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "99c36449cad3708a435f6798cfa39972",
"translation_date": "2025-09-06T12:09:00+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,642 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"colab": {
"name": "lesson_14.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"coopTranslator": {
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
"translation_date": "2025-09-06T12:16:51+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "ms"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Terokai pengelompokan K-Means menggunakan R dan prinsip data Tidy.\n",
"\n",
"### [**Kuiz sebelum kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"Dalam pelajaran ini, anda akan belajar cara mencipta kelompok menggunakan pakej Tidymodels dan pakej lain dalam ekosistem R (kita akan panggil mereka kawan 🧑‍🤝‍🧑), serta set data muzik Nigeria yang anda import sebelum ini. Kita akan membincangkan asas K-Means untuk pengelompokan. Ingatlah bahawa, seperti yang anda pelajari dalam pelajaran sebelumnya, terdapat banyak cara untuk bekerja dengan kelompok dan kaedah yang anda gunakan bergantung pada data anda. Kita akan mencuba K-Means kerana ia adalah teknik pengelompokan yang paling biasa. Mari kita mulakan!\n",
"\n",
"Istilah yang akan anda pelajari:\n",
"\n",
"- Skor Silhouette\n",
"\n",
"- Kaedah Elbow\n",
"\n",
"- Inertia\n",
"\n",
"- Varians\n",
"\n",
"### **Pengenalan**\n",
"\n",
"[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) adalah kaedah yang berasal dari bidang pemprosesan isyarat. Ia digunakan untuk membahagikan dan memisahkan kumpulan data kepada `k kelompok` berdasarkan persamaan dalam ciri-ciri mereka.\n",
"\n",
"Kelompok ini boleh divisualisasikan sebagai [diagram Voronoi](https://wikipedia.org/wiki/Voronoi_diagram), yang merangkumi satu titik (atau 'benih') dan kawasan yang berkaitan dengannya.\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografik oleh Jen Looper</figcaption>\n",
"\n",
"\n",
"Pengelompokan K-Means mempunyai langkah-langkah berikut:\n",
"\n",
"1. Saintis data bermula dengan menentukan bilangan kelompok yang dikehendaki untuk dicipta.\n",
"\n",
"2. Seterusnya, algoritma secara rawak memilih K pemerhatian daripada set data untuk dijadikan pusat awal bagi kelompok (iaitu, centroid).\n",
"\n",
"3. Seterusnya, setiap pemerhatian yang tinggal diberikan kepada centroid yang paling dekat dengannya.\n",
"\n",
"4. Seterusnya, purata baru bagi setiap kelompok dikira dan centroid dipindahkan ke purata tersebut.\n",
"\n",
"5. Setelah pusat-pusat dikira semula, setiap pemerhatian diperiksa semula untuk melihat sama ada ia mungkin lebih dekat dengan kelompok lain. Semua objek diberikan semula menggunakan purata kelompok yang dikemas kini. Langkah pemberian kelompok dan pengemaskinian centroid diulang secara iteratif sehingga pemberian kelompok berhenti berubah (iaitu, apabila penumpuan dicapai). Biasanya, algoritma akan berhenti apabila setiap iterasi baru menghasilkan pergerakan centroid yang tidak ketara dan kelompok menjadi statik.\n",
"\n",
"<div>\n",
"\n",
"> Perlu diingat bahawa disebabkan oleh pengacakan pemerhatian awal k yang digunakan sebagai centroid permulaan, kita boleh mendapatkan hasil yang sedikit berbeza setiap kali kita menggunakan prosedur ini. Atas sebab ini, kebanyakan algoritma menggunakan beberapa *permulaan rawak* dan memilih iterasi dengan WCSS terendah. Oleh itu, sangat disarankan untuk sentiasa menjalankan K-Means dengan beberapa nilai *nstart* untuk mengelakkan *optimum tempatan yang tidak diingini.*\n",
"\n",
"</div>\n",
"\n",
"Animasi pendek ini menggunakan [karya seni](https://github.com/allisonhorst/stats-illustrations) oleh Allison Horst menerangkan proses pengelompokan:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n",
"\n",
"\n",
"\n",
"Satu soalan asas yang timbul dalam pengelompokan ialah: bagaimana anda tahu berapa banyak kelompok untuk memisahkan data anda? Satu kelemahan menggunakan K-Means termasuk fakta bahawa anda perlu menetapkan `k`, iaitu bilangan `centroid`. Nasib baik, `kaedah elbow` membantu untuk menganggarkan nilai permulaan yang baik untuk `k`. Anda akan mencubanya sebentar lagi.\n",
"\n",
"### \n",
"\n",
"**Prasyarat**\n",
"\n",
"Kita akan bermula dari tempat kita berhenti dalam [pelajaran sebelumnya](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), di mana kita menganalisis set data, membuat banyak visualisasi dan menapis set data kepada pemerhatian yang menarik. Pastikan anda menyemaknya!\n",
"\n",
"Kita memerlukan beberapa pakej untuk menyelesaikan modul ini. Anda boleh memasangnya dengan: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk menyelesaikan modul ini dan memasangnya untuk anda sekiranya ada yang hilang.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ah_tBi58LXyi"
},
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7e--UCUTLXym"
},
"source": [
"Mari kita mulakan dengan pantas!\n",
"\n",
"## 1. Tarian dengan data: Tumpukan kepada 3 genre muzik paling popular\n",
"\n",
"Ini adalah ringkasan apa yang telah kita lakukan dalam pelajaran sebelumnya. Jom kita analisis dan pecahkan data!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ycamx7GGLXyn"
},
"source": [
"# Load the core tidyverse and make it available in your current R session\n",
"library(tidyverse)\n",
"\n",
"# Import the data into a tibble\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
"\n",
"# Narrow down to top 3 popular genres\n",
"nigerian_songs <- df %>% \n",
" # Concentrate on top 3 genres\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
" # Remove unclassified observations\n",
" filter(popularity != 0)\n",
"\n",
"\n",
"\n",
"# Visualize popular genres using bar plots\n",
"theme_set(theme_light())\n",
"nigerian_songs %>%\n",
" count(artist_top_genre) %>%\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
" fill = artist_top_genre)) +\n",
" geom_col(alpha = 0.8) +\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
" ggtitle(\"Top genres\") +\n",
" theme(plot.title = element_text(hjust = 0.5))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "b5h5zmkPLXyp"
},
"source": [
"🤩 Itu berjalan dengan baik!\n",
"\n",
"## 2. Lebih banyak penerokaan data.\n",
"\n",
"Seberapa bersih data ini? Mari kita periksa pencilan menggunakan plot kotak. Kita akan memberi tumpuan kepada lajur berangka dengan pencilan yang lebih sedikit (walaupun anda boleh membersihkan pencilan tersebut). Plot kotak boleh menunjukkan julat data dan akan membantu memilih lajur mana yang hendak digunakan. Perlu diingat, plot kotak tidak menunjukkan varians, elemen penting untuk data yang boleh dikelompokkan dengan baik. Sila lihat [perbincangan ini](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) untuk bacaan lanjut.\n",
"\n",
"[Plot kotak](https://en.wikipedia.org/wiki/Box_plot) digunakan untuk menggambarkan secara grafik taburan data `berangka`, jadi mari kita mulakan dengan *memilih* semua lajur berangka bersama-sama dengan genre muzik popular.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HhNreJKLLXyq"
},
"source": [
"# Select top genre column and all other numeric columns\n",
"df_numeric <- nigerian_songs %>% \n",
" select(artist_top_genre, where(is.numeric)) \n",
"\n",
"# Display the data\n",
"df_numeric %>% \n",
" slice_head(n = 5)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "uYXrwJRaLXyq"
},
"source": [
"Lihat bagaimana pembantu pemilihan `where` memudahkan perkara ini 💁? Terokai fungsi-fungsi lain seperti ini [di sini](https://tidyselect.r-lib.org/).\n",
"\n",
"Oleh kerana kita akan membuat kotak plot untuk setiap ciri numerik dan kita ingin mengelakkan penggunaan gelung, mari kita susun semula data kita ke dalam format yang *lebih panjang* yang akan membolehkan kita memanfaatkan `facets` - subplot yang masing-masing memaparkan satu subset data.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gd5bR3f8LXys"
},
"source": [
"# Pivot data from wide to long\n",
"df_numeric_long <- df_numeric %>% \n",
" pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
"\n",
"# Print out data\n",
"df_numeric_long %>% \n",
" slice_head(n = 15)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-7tE1swnLXyv"
},
"source": [
"Lebih panjang lagi! Sekarang masa untuk beberapa `ggplots`! Jadi, `geom` apa yang akan kita gunakan?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "r88bIsyuLXyy"
},
"source": [
"# Make a box plot\n",
"df_numeric_long %>% \n",
" ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
" geom_boxplot() +\n",
" facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
" theme(legend.position = \"none\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYVyKIUELXyz"
},
"source": [
"Mudah-gg!\n",
"\n",
"Sekarang kita dapat lihat data ini agak berisik: dengan memerhatikan setiap lajur sebagai kotak plot, anda boleh nampak nilai luar. Anda boleh melalui set data ini dan membuang nilai luar tersebut, tetapi itu akan menjadikan data agak terhad.\n",
"\n",
"Buat masa ini, mari kita pilih lajur mana yang akan kita gunakan untuk latihan pengelompokan kita. Mari kita pilih lajur berangka dengan julat yang serupa. Kita boleh mengekodkan `artist_top_genre` sebagai nilai berangka tetapi kita akan abaikan buat masa ini.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-wkpINyZLXy0"
},
"source": [
"# Select variables with similar ranges\n",
"df_numeric_select <- df_numeric %>% \n",
" select(popularity, danceability, acousticness, loudness, energy) \n",
"\n",
"# Normalize data\n",
"# df_numeric_select <- scale(df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "D7dLzgpqLXy1"
},
"source": [
"## 3. Mengira pengelompokan k-means dalam R\n",
"\n",
"Kita boleh mengira k-means dalam R menggunakan fungsi terbina dalam `kmeans`, lihat `help(\"kmeans()\")`. Fungsi `kmeans()` menerima bingkai data dengan semua lajur bernombor sebagai argumen utamanya.\n",
"\n",
"Langkah pertama apabila menggunakan pengelompokan k-means adalah untuk menentukan bilangan kelompok (k) yang akan dihasilkan dalam penyelesaian akhir. Kita tahu terdapat 3 genre lagu yang telah kita asingkan daripada set data, jadi mari kita cuba 3:\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "uC4EQ5w7LXy5"
},
"source": [
"set.seed(2056)\n",
"# Kmeans clustering for 3 clusters\n",
"kclust <- kmeans(\n",
" df_numeric_select,\n",
" # Specify the number of clusters\n",
" centers = 3,\n",
" # How many random initial configurations\n",
" nstart = 25\n",
")\n",
"\n",
"# Display clustering object\n",
"kclust\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hzfhscWrLXy-"
},
"source": [
"Objek kmeans mengandungi beberapa maklumat yang dijelaskan dengan baik dalam `help(\"kmeans()\")`. Buat masa ini, mari kita fokus pada beberapa perkara. Kita dapat lihat bahawa data telah dikelompokkan kepada 3 kluster dengan saiz 65, 110, 111. Hasil keluaran juga mengandungi pusat kluster (purata) untuk 3 kumpulan merentasi 5 pemboleh ubah.\n",
"\n",
"Vektor pengelompokan adalah tugasan kluster untuk setiap pemerhatian. Mari kita gunakan fungsi `augment` untuk menambah tugasan kluster ke dalam set data asal.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0XwwpFGQLXy_"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"augment(kclust, df_numeric_select) %>% \n",
" relocate(.cluster) %>% \n",
" slice_head(n = 10)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "NXIVXXACLXzA"
},
"source": [
"Hebat, kita baru sahaja membahagikan set data kita kepada 3 kumpulan. Jadi, sejauh mana baiknya pengelompokan kita 🤷? Mari kita lihat pada `Silhouette score`.\n",
"\n",
"### **Silhouette score**\n",
"\n",
"[Analisis Silhouette](https://en.wikipedia.org/wiki/Silhouette_(clustering)) boleh digunakan untuk mengkaji jarak pemisahan antara kluster yang dihasilkan. Skor ini berbeza dari -1 hingga 1, dan jika skor menghampiri 1, kluster tersebut adalah padat dan terpisah dengan baik daripada kluster lain. Nilai yang hampir dengan 0 menunjukkan kluster yang bertindih dengan sampel yang sangat dekat dengan sempadan keputusan kluster jiran. [sumber](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Kaedah silhouette purata mengira purata silhouette bagi pemerhatian untuk nilai *k* yang berbeza. Skor silhouette purata yang tinggi menunjukkan pengelompokan yang baik.\n",
"\n",
"Fungsi `silhouette` dalam pakej cluster digunakan untuk mengira lebar silhouette purata.\n",
"\n",
"> Silhouette boleh dikira dengan mana-mana [metrik jarak](https://en.wikipedia.org/wiki/Distance \"Distance\"), seperti [jarak Euclidean](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") atau [jarak Manhattan](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") yang telah kita bincangkan dalam [pelajaran sebelumnya](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb).\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Jn0McL28LXzB"
},
"source": [
"# Load cluster package\n",
"library(cluster)\n",
"\n",
"# Compute average silhouette score\n",
"ss <- silhouette(kclust$cluster,\n",
" # Compute euclidean distance\n",
" dist = dist(df_numeric_select))\n",
"mean(ss[, 3])\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QyQRn97nLXzC"
},
"source": [
"Skor kita ialah **.549**, jadi berada di tengah-tengah. Ini menunjukkan bahawa data kita tidak begitu sesuai untuk jenis pengelompokan ini. Mari kita lihat sama ada kita boleh mengesahkan andaian ini secara visual. [Pakej factoextra](https://rpkgs.datanovia.com/factoextra/index.html) menyediakan fungsi (`fviz_cluster()`) untuk memvisualisasikan pengelompokan.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7a6Km1_FLXzD"
},
"source": [
"library(factoextra)\n",
"\n",
"# Visualize clustering results\n",
"fviz_cluster(kclust, df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IBwCWt-0LXzD"
},
"source": [
"Tumpang tindih dalam kelompok menunjukkan bahawa data kita tidak begitu sesuai untuk jenis pengelompokan ini, tetapi mari kita teruskan.\n",
"\n",
"## 4. Menentukan jumlah kelompok yang optimum\n",
"\n",
"Satu persoalan asas yang sering timbul dalam pengelompokan K-Means ialah - tanpa label kelas yang diketahui, bagaimana anda tahu berapa banyak kelompok untuk memisahkan data anda?\n",
"\n",
"Salah satu cara untuk mencuba mengetahuinya adalah dengan menggunakan sampel data untuk `mencipta siri model pengelompokan` dengan bilangan kelompok yang meningkat (contohnya dari 1-10), dan menilai metrik pengelompokan seperti **Silhouette score.**\n",
"\n",
"Mari kita tentukan bilangan kelompok yang optimum dengan mengira algoritma pengelompokan untuk nilai *k* yang berbeza dan menilai **Within Cluster Sum of Squares** (WCSS). Jumlah WCSS mengukur kepadatan pengelompokan dan kita mahu ia sekecil mungkin, dengan nilai yang lebih rendah bermaksud titik data lebih rapat.\n",
"\n",
"Mari kita terokai kesan pilihan `k` yang berbeza, dari 1 hingga 10, terhadap pengelompokan ini.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hSeIiylDLXzE"
},
"source": [
"# Create a series of clustering models\n",
"kclusts <- tibble(k = 1:10) %>% \n",
" # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
" mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
" # Farm out clustering metrics eg WCSS\n",
" glanced = map(model, ~ glance(.x))) %>% \n",
" unnest(cols = glanced)\n",
" \n",
"\n",
"# View clustering rsulsts\n",
"kclusts\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "m7rS2U1eLXzE"
},
"source": [
"Sekarang kita mempunyai jumlah keseluruhan dalam-kluster sum-of-squares (tot.withinss) untuk setiap algoritma pengelompokan dengan pusat *k*, kita menggunakan [kaedah siku](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) untuk mencari bilangan kluster yang optimum. Kaedah ini melibatkan melukis WCSS sebagai fungsi bilangan kluster, dan memilih [siku lengkung](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Siku lengkung\") sebagai bilangan kluster yang akan digunakan.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "o_DjHGItLXzF"
},
"source": [
"set.seed(2056)\n",
"# Use elbow method to determine optimum number of clusters\n",
"kclusts %>% \n",
" ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
" geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
" geom_point(size = 2, color = \"#FF7F0EFF\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "pLYyt5XSLXzG"
},
"source": [
"Plot menunjukkan pengurangan besar dalam WCSS (jadi *ketatannya* lebih tinggi) apabila bilangan kluster meningkat dari satu ke dua, dan pengurangan yang lebih ketara lagi dari dua ke tiga kluster. Selepas itu, pengurangan menjadi kurang jelas, menghasilkan satu `elbow` 💪 pada carta sekitar tiga kluster. Ini adalah petunjuk yang baik bahawa terdapat dua hingga tiga kluster data yang agak terpisah dengan baik.\n",
"\n",
"Kita kini boleh teruskan dan mengekstrak model pengelompokan di mana `k = 3`:\n",
"\n",
"> `pull()`: digunakan untuk mengekstrak satu lajur\n",
">\n",
"> `pluck()`: digunakan untuk mengindeks struktur data seperti senarai\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JP_JPKBILXzG"
},
"source": [
"# Extract k = 3 clustering\n",
"final_kmeans <- kclusts %>% \n",
" filter(k == 3) %>% \n",
" pull(model) %>% \n",
" pluck(1)\n",
"\n",
"\n",
"final_kmeans\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "l_PDTu8tLXzI"
},
"source": [
"Bagus! Mari kita visualisasikan kluster yang diperoleh. Berminat untuk sedikit interaktiviti menggunakan `plotly`?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dNcleFe-LXzJ"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"results <- augment(final_kmeans, df_numeric_select) %>% \n",
" bind_cols(df_numeric %>% select(artist_top_genre)) \n",
"\n",
"# Plot cluster assignments\n",
"clust_plt <- results %>% \n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
" geom_point(size = 2, alpha = 0.8) +\n",
" paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
"\n",
"ggplotly(clust_plt)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "6JUM_51VLXzK"
},
"source": [
"Mungkin kita menjangkakan bahawa setiap kelompok (diwakili oleh warna yang berbeza) akan mempunyai genre yang berbeza (diwakili oleh bentuk yang berbeza).\n",
"\n",
"Mari kita lihat ketepatan model ini.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HdIMUGq7LXzL"
},
"source": [
"# Assign genres to predefined integers\n",
"label_count <- results %>% \n",
" group_by(artist_top_genre) %>% \n",
" mutate(id = cur_group_id()) %>% \n",
" ungroup() %>% \n",
" summarise(correct_labels = sum(.cluster == id))\n",
"\n",
"\n",
"# Print results \n",
"cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
"\n",
"cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "C50wvaAOLXzM"
},
"source": [
"Ketepatan model ini tidaklah buruk, tetapi tidak begitu baik. Mungkin data ini tidak sesuai untuk K-Means Clustering. Data ini terlalu tidak seimbang, kurang berkorelasi, dan terdapat terlalu banyak variasi antara nilai-nilai kolum untuk membentuk kluster dengan baik. Malah, kluster yang terbentuk mungkin sangat dipengaruhi atau berat sebelah oleh tiga kategori genre yang telah kita tentukan sebelum ini.\n",
"\n",
"Walau bagaimanapun, ini adalah proses pembelajaran yang sangat menarik!\n",
"\n",
"Dalam dokumentasi Scikit-learn, anda boleh lihat bahawa model seperti ini, dengan kluster yang tidak begitu jelas, mempunyai masalah 'variasi':\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografik daripada Scikit-learn</figcaption>\n",
"\n",
"\n",
"\n",
"## **Variasi**\n",
"\n",
"Variasi didefinisikan sebagai \"purata perbezaan kuasa dua daripada Min\" [sumber](https://www.mathsisfun.com/data/standard-deviation.html). Dalam konteks masalah pengelompokan ini, ia merujuk kepada data di mana nombor-nombor dalam set data kita cenderung menyimpang terlalu jauh daripada min.\n",
"\n",
"✅ Ini adalah masa yang baik untuk memikirkan semua cara yang boleh anda gunakan untuk membetulkan isu ini. Ubah suai data sedikit lagi? Gunakan kolum yang berbeza? Gunakan algoritma yang berbeza? Petunjuk: Cuba [skala data anda](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) untuk menormalkannya dan uji kolum lain.\n",
"\n",
"> Cuba '[kalkulator variasi](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ini untuk memahami konsep ini dengan lebih mendalam.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Cabaran**\n",
"\n",
"Luangkan masa dengan notebook ini, ubah suai parameter. Bolehkah anda meningkatkan ketepatan model dengan membersihkan data lebih banyak (contohnya, membuang outlier)? Anda boleh menggunakan berat untuk memberikan lebih banyak berat kepada sampel data tertentu. Apa lagi yang boleh anda lakukan untuk mencipta kluster yang lebih baik?\n",
"\n",
"Petunjuk: Cuba skala data anda. Terdapat kod yang dikomen dalam notebook yang menambah skala standard untuk menjadikan kolum data lebih serupa dari segi julat. Anda akan dapati bahawa walaupun skor siluet menurun, 'kink' dalam graf siku menjadi lebih lancar. Ini kerana membiarkan data tidak berskala membolehkan data dengan variasi yang kurang membawa lebih banyak berat. Baca lebih lanjut tentang masalah ini [di sini](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Ulasan & Kajian Kendiri**\n",
"\n",
"- Lihatlah Simulator K-Means [seperti ini](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Anda boleh menggunakan alat ini untuk memvisualisasikan titik data sampel dan menentukan centroidnya. Anda boleh mengedit keacakan data, bilangan kluster dan bilangan centroid. Adakah ini membantu anda mendapatkan idea tentang bagaimana data boleh dikelompokkan?\n",
"\n",
"- Juga, lihat [handout tentang K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) dari Stanford.\n",
"\n",
"Ingin mencuba kemahiran pengelompokan yang baru anda pelajari pada set data yang sesuai untuk K-Means clustering? Sila lihat:\n",
"\n",
"- [Latih dan Nilai Model Pengelompokan](https://rpubs.com/eR_ic/clustering) menggunakan Tidymodels dan rakan-rakan\n",
"\n",
"- [Analisis Kluster K-Means](https://uc-r.github.io/kmeans_clustering), Panduan Pemrograman Analitik Perniagaan UC R\n",
"\n",
"- [Pengelompokan K-Means dengan prinsip data yang teratur](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Tugasan**\n",
"\n",
"[Cuba kaedah pengelompokan yang berbeza](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## TERIMA KASIH KEPADA:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) kerana mencipta versi Python asal modul ini ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) kerana mencipta ilustrasi yang menakjubkan 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",
"\n",
"Selamat Belajar,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Duta Pelajar Microsoft Learn Emas.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"500\"/>\n",
" <figcaption>Karya seni oleh @allison_horst</figcaption>\n"
]
},
{
"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"
]
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,100 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "27de2abc0235ebd22080fc8f1107454d",
"translation_date": "2025-09-06T12:53:53+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from textblob import TextBlob\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# You should download the book text, clean it, and import it here\n",
"with open(\"pride.txt\", encoding=\"utf8\") as f:\n",
" file_contents = f.read()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"book_pride = TextBlob(file_contents)\n",
"positive_sentiment_sentences = []\n",
"negative_sentiment_sentences = []"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for sentence in book_pride.sentences:\n",
" if sentence.sentiment.polarity == 1:\n",
" positive_sentiment_sentences.append(sentence)\n",
" if sentence.sentiment.polarity == -1:\n",
" negative_sentiment_sentences.append(sentence)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"The \" + str(len(positive_sentiment_sentences)) + \" most positive sentences:\")\n",
"for sentence in positive_sentiment_sentences:\n",
" print(\"+ \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"The \" + str(len(negative_sentiment_sentences)) + \" most negative sentences:\")\n",
"for sentence in negative_sentiment_sentences:\n",
" print(\"- \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))"
]
},
{
"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"
]
}
]
}

@ -0,0 +1,174 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "2d05e7db439376aa824f4b387f8324ca",
"translation_date": "2025-09-06T12:53:38+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# EDA\n",
"import pandas as pd\n",
"import time"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_difference_review_avg(row):\n",
" return row[\"Average_Score\"] - row[\"Calc_Average_Score\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"print(\"Loading data file now, this could take a while depending on file size\")\n",
"start = time.time()\n",
"df = pd.read_csv('../../data/Hotel_Reviews.csv')\n",
"end = time.time()\n",
"print(\"Loading took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What shape is the data (rows, columns)?\n",
"print(\"The shape of the data (rows, cols) is \" + str(df.shape))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# value_counts() creates a Series object that has index and values\n",
"# in this case, the country and the frequency they occur in reviewer nationality\n",
"nationality_freq = df[\"Reviewer_Nationality\"].value_counts()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What reviewer nationality is the most common in the dataset?\n",
"print(\"The highest frequency reviewer nationality is \" + str(nationality_freq.index[0]).strip() + \" with \" + str(nationality_freq[0]) + \" reviews.\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What is the top 10 most common nationalities and their frequencies?\n",
"print(\"The top 10 highest frequency reviewer nationalities are:\")\n",
"print(nationality_freq[0:10].to_string())\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# How many unique nationalities are there?\n",
"print(\"There are \" + str(nationality_freq.index.size) + \" unique nationalities in the dataset\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What was the most frequently reviewed hotel for the top 10 nationalities - print the hotel and number of reviews\n",
"for nat in nationality_freq[:10].index:\n",
" # First, extract all the rows that match the criteria into a new dataframe\n",
" nat_df = df[df[\"Reviewer_Nationality\"] == nat] \n",
" # Now get the hotel freq\n",
" freq = nat_df[\"Hotel_Name\"].value_counts()\n",
" print(\"The most reviewed hotel for \" + str(nat).strip() + \" was \" + str(freq.index[0]) + \" with \" + str(freq[0]) + \" reviews.\") \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# How many reviews are there per hotel (frequency count of hotel) and do the results match the value in `Total_Number_of_Reviews`?\n",
"# First create a new dataframe based on the old one, removing the uneeded columns\n",
"hotel_freq_df = df.drop([\"Hotel_Address\", \"Additional_Number_of_Scoring\", \"Review_Date\", \"Average_Score\", \"Reviewer_Nationality\", \"Negative_Review\", \"Review_Total_Negative_Word_Counts\", \"Positive_Review\", \"Review_Total_Positive_Word_Counts\", \"Total_Number_of_Reviews_Reviewer_Has_Given\", \"Reviewer_Score\", \"Tags\", \"days_since_review\", \"lat\", \"lng\"], axis = 1)\n",
"# Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found\n",
"hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')\n",
"# Get rid of all the duplicated rows\n",
"hotel_freq_df = hotel_freq_df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
"print()\n",
"print(hotel_freq_df.to_string())\n",
"print(str(hotel_freq_df.shape))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# While there is an `Average_Score` for each hotel according to the dataset, \n",
"# you can also calculate an average score (getting the average of all reviewer scores in the dataset for each hotel)\n",
"# Add a new column to your dataframe with the column header `Calc_Average_Score` that contains that calculated average. \n",
"df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n",
"# Add a new column with the difference between the two average scores\n",
"df[\"Average_Score_Difference\"] = df.apply(get_difference_review_avg, axis = 1)\n",
"# Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)\n",
"review_scores_df = df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
"# Sort the dataframe to find the lowest and highest average score difference\n",
"review_scores_df = review_scores_df.sort_values(by=[\"Average_Score_Difference\"])\n",
"print(review_scores_df[[\"Average_Score_Difference\", \"Average_Score\", \"Calc_Average_Score\", \"Hotel_Name\"]])\n",
"# Do any hotels have the same (rounded to 1 decimal place) `Average_Score` and `Calc_Average_Score`?\n"
]
},
{
"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"
]
}
]
}

@ -0,0 +1,172 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "033cb89c85500224b3c63fd04f49b4aa",
"translation_date": "2025-09-06T12:54:09+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import time\n",
"import ast"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def replace_address(row):\n",
" if \"Netherlands\" in row[\"Hotel_Address\"]:\n",
" return \"Amsterdam, Netherlands\"\n",
" elif \"Barcelona\" in row[\"Hotel_Address\"]:\n",
" return \"Barcelona, Spain\"\n",
" elif \"United Kingdom\" in row[\"Hotel_Address\"]:\n",
" return \"London, United Kingdom\"\n",
" elif \"Milan\" in row[\"Hotel_Address\"]: \n",
" return \"Milan, Italy\"\n",
" elif \"France\" in row[\"Hotel_Address\"]:\n",
" return \"Paris, France\"\n",
" elif \"Vienna\" in row[\"Hotel_Address\"]:\n",
" return \"Vienna, Austria\" \n",
" else:\n",
" return row.Hotel_Address\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"start = time.time()\n",
"df = pd.read_csv('../../data/Hotel_Reviews.csv')\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# dropping columns we will not use:\n",
"df.drop([\"lat\", \"lng\"], axis = 1, inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Replace all the addresses with a shortened, more useful form\n",
"df[\"Hotel_Address\"] = df.apply(replace_address, axis = 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Drop `Additional_Number_of_Scoring`\n",
"df.drop([\"Additional_Number_of_Scoring\"], axis = 1, inplace=True)\n",
"# Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values\n",
"df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')\n",
"df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Process the Tags into new columns\n",
"# The file Hotel_Reviews_Tags.py, identifies the most important tags\n",
"# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, \n",
"# Family with young children, Family with older children, With a pet\n",
"df[\"Leisure_trip\"] = df.Tags.apply(lambda tag: 1 if \"Leisure trip\" in tag else 0)\n",
"df[\"Couple\"] = df.Tags.apply(lambda tag: 1 if \"Couple\" in tag else 0)\n",
"df[\"Solo_traveler\"] = df.Tags.apply(lambda tag: 1 if \"Solo traveler\" in tag else 0)\n",
"df[\"Business_trip\"] = df.Tags.apply(lambda tag: 1 if \"Business trip\" in tag else 0)\n",
"df[\"Group\"] = df.Tags.apply(lambda tag: 1 if \"Group\" in tag or \"Travelers with friends\" in tag else 0)\n",
"df[\"Family_with_young_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with young children\" in tag else 0)\n",
"df[\"Family_with_older_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with older children\" in tag else 0)\n",
"df[\"With_a_pet\"] = df.Tags.apply(lambda tag: 1 if \"With a pet\" in tag else 0)\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# No longer need any of these columns\n",
"df.drop([\"Review_Date\", \"Review_Total_Negative_Word_Counts\", \"Review_Total_Positive_Word_Counts\", \"days_since_review\", \"Total_Number_of_Reviews_Reviewer_Has_Given\"], axis = 1, inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saving results to Hotel_Reviews_Filtered.csv\n",
"Filtering took 23.74 seconds\n"
]
}
],
"source": [
"# Saving new data file with calculated columns\n",
"print(\"Saving results to Hotel_Reviews_Filtered.csv\")\n",
"df.to_csv(r'../../data/Hotel_Reviews_Filtered.csv', index = False)\n",
"end = time.time()\n",
"print(\"Filtering took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"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"
]
}
]
}

@ -0,0 +1,137 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "341efc86325ec2a214f682f57a189dfd",
"translation_date": "2025-09-06T12:54:23+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV (you can )\n",
"import pandas as pd \n",
"\n",
"df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# We want to find the most useful tags to keep\n",
"# Remove opening and closing brackets\n",
"df.Tags = df.Tags.str.strip(\"[']\")\n",
"# remove all quotes too\n",
"df.Tags = df.Tags.str.replace(\" ', '\", \",\", regex = False)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# removing this to take advantage of the 'already a phrase' fact of the dataset \n",
"# Now split the strings into a list\n",
"tag_list_df = df.Tags.str.split(',', expand = True)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Remove leading and trailing spaces\n",
"df[\"Tag_1\"] = tag_list_df[0].str.strip()\n",
"df[\"Tag_2\"] = tag_list_df[1].str.strip()\n",
"df[\"Tag_3\"] = tag_list_df[2].str.strip()\n",
"df[\"Tag_4\"] = tag_list_df[3].str.strip()\n",
"df[\"Tag_5\"] = tag_list_df[4].str.strip()\n",
"df[\"Tag_6\"] = tag_list_df[5].str.strip()\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Merge the 6 columns into one with melt\n",
"df_tags = df.melt(value_vars=[\"Tag_1\", \"Tag_2\", \"Tag_3\", \"Tag_4\", \"Tag_5\", \"Tag_6\"])\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"The shape of the tags with no filtering: (2514684, 2)\n",
" index count\n",
"0 Leisure trip 338423\n",
"1 Couple 205305\n",
"2 Solo traveler 89779\n",
"3 Business trip 68176\n",
"4 Group 51593\n",
"5 Family with young children 49318\n",
"6 Family with older children 21509\n",
"7 Travelers with friends 1610\n",
"8 With a pet 1078\n"
]
}
],
"source": [
"# Get the value counts\n",
"tag_vc = df_tags.value.value_counts()\n",
"# print(tag_vc)\n",
"print(\"The shape of the tags with no filtering:\", str(df_tags.shape))\n",
"# Drop rooms, suites, and length of stay, mobile device and anything with less count than a 1000\n",
"df_tags = df_tags[~df_tags.value.str.contains(\"Standard|room|Stayed|device|Beds|Suite|Studio|King|Superior|Double\", na=False, case=False)]\n",
"tag_vc = df_tags.value.value_counts().reset_index(name=\"count\").query(\"count > 1000\")\n",
"# Print the top 10 (there should only be 9 and we'll use these in the filtering section)\n",
"print(tag_vc[:10])"
]
},
{
"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"
]
}
]
}

@ -0,0 +1,260 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "705bf02633759f689abc37b19749a16d",
"translation_date": "2025-09-06T12:54:38+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"[nltk_data] Downloading package vader_lexicon to\n[nltk_data] /Users/jenlooper/nltk_data...\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"True"
]
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import time\n",
"import pandas as pd\n",
"import nltk as nltk\n",
"from nltk.corpus import stopwords\n",
"from nltk.sentiment.vader import SentimentIntensityAnalyzer\n",
"nltk.download('vader_lexicon')\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"vader_sentiment = SentimentIntensityAnalyzer()\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# There are 3 possibilities of input for a review:\n",
"# It could be \"No Negative\", in which case, return 0\n",
"# It could be \"No Positive\", in which case, return 0\n",
"# It could be a review, in which case calculate the sentiment\n",
"def calc_sentiment(review): \n",
" if review == \"No Negative\" or review == \"No Positive\":\n",
" return 0\n",
" return vader_sentiment.polarity_scores(review)[\"compound\"] \n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"df = pd.read_csv(\"../../data/Hotel_Reviews_Filtered.csv\")\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Remove stop words - can be slow for a lot of text!\n",
"# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches\n",
"# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends\n",
"start = time.time()\n",
"cache = set(stopwords.words(\"english\"))\n",
"def remove_stopwords(review):\n",
" text = \" \".join([word for word in review.split() if word not in cache])\n",
" return text\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Remove the stop words from both columns\n",
"df.Negative_Review = df.Negative_Review.apply(remove_stopwords) \n",
"df.Positive_Review = df.Positive_Review.apply(remove_stopwords)\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Removing stop words took 5.77 seconds\n"
]
}
],
"source": [
"end = time.time()\n",
"print(\"Removing stop words took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Calculating sentiment columns for both positive and negative reviews\n",
"Calculating sentiment took 201.07 seconds\n"
]
}
],
"source": [
"# Add a negative sentiment and positive sentiment column\n",
"print(\"Calculating sentiment columns for both positive and negative reviews\")\n",
"start = time.time()\n",
"df[\"Negative_Sentiment\"] = df.Negative_Review.apply(calc_sentiment)\n",
"df[\"Positive_Sentiment\"] = df.Positive_Review.apply(calc_sentiment)\n",
"end = time.time()\n",
"print(\"Calculating sentiment took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" Negative_Review Negative_Sentiment\n",
"186584 So bad experience memories I hotel The first n... -0.9920\n",
"129503 First charged twice room booked booking second... -0.9896\n",
"307286 The staff Had bad experience even booking Janu... -0.9889\n",
"452092 No WLAN room Incredibly rude restaurant staff ... -0.9884\n",
"201293 We usually traveling Paris 2 3 times year busi... -0.9873\n",
"... ... ...\n",
"26899 I would say however one night expensive even d... 0.9933\n",
"138365 Wifi terribly slow I speed test network upload... 0.9938\n",
"79215 I find anything hotel first I walked past hote... 0.9938\n",
"278506 The property great location There bakery next ... 0.9945\n",
"339189 Guys I like hotel I wish return next year Howe... 0.9948\n",
"\n",
"[515738 rows x 2 columns]\n",
" Positive_Review Positive_Sentiment\n",
"137893 Bathroom Shower We going stay twice hotel 2 ni... -0.9820\n",
"5839 I completely disappointed mad since reception ... -0.9780\n",
"64158 get everything extra internet parking breakfas... -0.9751\n",
"124178 I didnt like anythig Room small Asked upgrade ... -0.9721\n",
"489137 Very rude manager abusive staff reception Dirt... -0.9703\n",
"... ... ...\n",
"331570 Everything This recently renovated hotel class... 0.9984\n",
"322920 From moment stepped doors Guesthouse Hotel sta... 0.9985\n",
"293710 This place surprise expected good actually gre... 0.9985\n",
"417442 We celebrated wedding night Langham I commend ... 0.9985\n",
"132492 We arrived super cute boutique hotel area expl... 0.9987\n",
"\n",
"[515738 rows x 2 columns]\n"
]
}
],
"source": [
"df = df.sort_values(by=[\"Negative_Sentiment\"], ascending=True)\n",
"print(df[[\"Negative_Review\", \"Negative_Sentiment\"]])\n",
"df = df.sort_values(by=[\"Positive_Sentiment\"], ascending=True)\n",
"print(df[[\"Positive_Review\", \"Positive_Sentiment\"]])\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)\n",
"df = df.reindex([\"Hotel_Name\", \"Hotel_Address\", \"Total_Number_of_Reviews\", \"Average_Score\", \"Reviewer_Score\", \"Negative_Sentiment\", \"Positive_Sentiment\", \"Reviewer_Nationality\", \"Leisure_trip\", \"Couple\", \"Solo_traveler\", \"Business_trip\", \"Group\", \"Family_with_young_children\", \"Family_with_older_children\", \"With_a_pet\", \"Negative_Review\", \"Positive_Review\"], axis=1)\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saving results to Hotel_Reviews_NLP.csv\n"
]
}
],
"source": [
"print(\"Saving results to Hotel_Reviews_NLP.csv\")\n",
"df.to_csv(r\"../../data/Hotel_Reviews_NLP.csv\", index = False)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,63 @@
{
"cells": [
{
"source": [
"# Persediaan Data\n",
"\n",
"Dalam notebook ini, kami menunjukkan cara untuk:\n",
"\n",
"menyediakan data siri masa untuk modul ini\n",
"memvisualisasikan data\n",
"Data dalam contoh ini diambil daripada pertandingan ramalan GEFCom2014. Ia terdiri daripada 3 tahun nilai beban elektrik dan suhu setiap jam antara tahun 2012 hingga 2014.\n",
"\n",
"1Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli dan Rob J. Hyndman, \"Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond\", International Journal of Forecasting, vol.32, no.3, pp 896-913, Julai-September, 2016.\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"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 perhatian 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"
]
}
],
"metadata": {
"kernel_info": {
"name": "python3"
},
"kernelspec": {
"name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"nteract": {
"version": "nteract-front-end@1.0.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "5e2bbe594906dce3aaaa736d6dac6683",
"translation_date": "2025-09-06T12:03:12+00:00",
"source_file": "7-TimeSeries/1-Introduction/working/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,57 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "523ec472196307b3c4235337353c9ceb",
"translation_date": "2025-09-06T12:01:59+00:00",
"source_file": "7-TimeSeries/2-ARIMA/working/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"Dalam buku nota ini, kami menunjukkan cara untuk:\n",
"- menyediakan data siri masa untuk melatih model ramalan siri masa ARIMA\n",
"- melaksanakan model ARIMA ringkas untuk meramalkan langkah-langkah HORIZON seterusnya (masa *t+1* hingga *t+HORIZON*) dalam siri masa\n",
"- menilai model\n",
"\n",
"Data dalam contoh ini diambil daripada pertandingan ramalan GEFCom2014. Ia terdiri daripada 3 tahun data beban elektrik dan suhu setiap jam antara tahun 2012 dan 2014. Tugasnya adalah untuk meramalkan nilai masa depan beban elektrik. Dalam contoh ini, kami menunjukkan cara untuk meramalkan satu langkah masa ke hadapan, menggunakan data beban sejarah sahaja.\n",
"\n",
"Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli dan Rob J. Hyndman, \"Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond\", International Journal of Forecasting, vol.32, no.3, pp 896-913, Julai-September, 2016.\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pip install statsmodels"
]
},
{
"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 perhatian 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"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,699 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "fv9OoQsMFk5A"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dalam buku nota ini, kami menunjukkan cara untuk:\n",
"\n",
"- menyediakan data siri masa 2D untuk melatih model regresi SVM\n",
"- melaksanakan SVR menggunakan kernel RBF\n",
"- menilai model menggunakan plot dan MAPE\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Mengimport modul\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append('../../')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "M687KNlQFp0-"
},
"outputs": [],
"source": [
"import os\n",
"import warnings\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import datetime as dt\n",
"import math\n",
"\n",
"from sklearn.svm import SVR\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from common.utils import load_data, mape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Cj-kfVdMGjWP"
},
"source": [
"## Menyediakan data\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8fywSjC6GsRz"
},
"source": [
"### Muatkan data\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"id": "aBDkEB11Fumg",
"outputId": "99cf7987-0509-4b73-8cc2-75d7da0d2740"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>load</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-01-01 00:00:00</th>\n",
" <td>2698.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 01:00:00</th>\n",
" <td>2558.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 02:00:00</th>\n",
" <td>2444.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 03:00:00</th>\n",
" <td>2402.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 04:00:00</th>\n",
" <td>2403.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" load\n",
"2012-01-01 00:00:00 2698.0\n",
"2012-01-01 01:00:00 2558.0\n",
"2012-01-01 02:00:00 2444.0\n",
"2012-01-01 03:00:00 2402.0\n",
"2012-01-01 04:00:00 2403.0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"energy = load_data('../../data')[['load']]\n",
"energy.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O0BWP13rGnh4"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 486
},
"id": "hGaNPKu_Gidk",
"outputId": "7f89b326-9057-4f49-efbe-cb100ebdf76d"
},
"outputs": [],
"source": [
"energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)\n",
"plt.xlabel('timestamp', fontsize=12)\n",
"plt.ylabel('load', fontsize=12)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IPuNor4eGwYY"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ysvsNyONGt0Q"
},
"outputs": [],
"source": [
"train_start_dt = '2014-11-01 00:00:00'\n",
"test_start_dt = '2014-12-30 00:00:00'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 548
},
"id": "SsfdLoPyGy9w",
"outputId": "d6d6c25b-b1f4-47e5-91d1-707e043237d7"
},
"outputs": [],
"source": [
"energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \\\n",
" .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \\\n",
" .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)\n",
"plt.xlabel('timestamp', fontsize=12)\n",
"plt.ylabel('load', fontsize=12)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XbFTqBw6G1Ch"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sekarang, anda perlu menyediakan data untuk latihan dengan melakukan penapisan dan penskalaan data anda.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cYivRdQpHDj3",
"outputId": "a138f746-461c-4fd6-bfa6-0cee094c4aa1"
},
"outputs": [],
"source": [
"train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]\n",
"test = energy.copy()[energy.index >= test_start_dt][['load']]\n",
"\n",
"print('Training data shape: ', train.shape)\n",
"print('Test data shape: ', test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Skalakan data supaya berada dalam julat (0, 1).\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"id": "3DNntGQnZX8G",
"outputId": "210046bc-7a66-4ccd-d70d-aa4a7309949c"
},
"outputs": [],
"source": [
"scaler = MinMaxScaler()\n",
"train['load'] = scaler.fit_transform(train)\n",
"train.head(5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "26Yht-rzZexe",
"outputId": "20326077-a38a-4e78-cc5b-6fd7af95d301"
},
"outputs": [],
"source": [
"test['load'] = scaler.transform(test)\n",
"test.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "x0n6jqxOQ41Z"
},
"source": [
"### Mencipta data dengan langkah masa\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fdmxTZtOQ8xs"
},
"source": [
"Untuk SVR kami, kami mengubah data input kepada bentuk `[batch, timesteps]`. Jadi, kami mengubah bentuk `train_data` dan `test_data` sedia ada supaya terdapat dimensi baharu yang merujuk kepada timesteps. Untuk contoh kami, kami mengambil `timesteps = 5`. Jadi, input kepada model adalah data untuk 4 timestep pertama, dan outputnya adalah data untuk timestep ke-5.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Rpju-Sc2HFm0"
},
"outputs": [],
"source": [
"# Converting to numpy arrays\n",
"\n",
"train_data = train.values\n",
"test_data = test.values"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Selecting the timesteps\n",
"\n",
"timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "O-JrsrsVJhUQ",
"outputId": "c90dbe71-bacc-4ec4-b452-f82fe5aefaef"
},
"outputs": [],
"source": [
"# Converting data to 2D tensor\n",
"\n",
"train_data_timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "exJD8AI7KE4g",
"outputId": "ce90260c-f327-427d-80f2-77307b5a6318"
},
"outputs": [],
"source": [
"# Converting test data to 2D tensor\n",
"\n",
"test_data_timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "2u0R2sIsLuq5"
},
"outputs": [],
"source": [
"x_train, y_train = None\n",
"x_test, y_test = None\n",
"\n",
"print(x_train.shape, y_train.shape)\n",
"print(x_test.shape, y_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8wIPOtAGLZlh"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "EhA403BEPEiD"
},
"outputs": [],
"source": [
"# Create model using RBF kernel\n",
"\n",
"model = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GS0UA3csMbqp",
"outputId": "d86b6f05-5742-4c1d-c2db-c40510bd4f0d"
},
"outputs": [],
"source": [
"# Fit model on training data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Rz_x8S3UrlcF"
},
"source": [
"### Buat ramalan model\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XR0gnt3MnuYS",
"outputId": "157e40ab-9a23-4b66-a885-0d52a24b2364"
},
"outputs": [],
"source": [
"# Making predictions\n",
"\n",
"y_train_pred = None\n",
"y_test_pred = None"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_2epncg-SGzr"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Scaling the predictions\n",
"\n",
"y_train_pred = scaler.inverse_transform(y_train_pred)\n",
"y_test_pred = scaler.inverse_transform(y_test_pred)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xmm_YLXhq7gV",
"outputId": "18392f64-4029-49ac-c71a-a4e2411152a1"
},
"outputs": [],
"source": [
"# Scaling the original values\n",
"\n",
"y_train = scaler.inverse_transform(y_train)\n",
"y_test = scaler.inverse_transform(y_test)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "u3LBj93coHEi",
"outputId": "d4fd49e8-8c6e-4bb0-8ef9-ca0b26d725b4"
},
"outputs": [],
"source": [
"# Extract the timesteps for x-axis\n",
"\n",
"train_timestamps = None\n",
"test_timestamps = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(25,6))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.title(\"Training data prediction\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LnhzcnYtXHCm",
"outputId": "f5f0d711-f18b-4788-ad21-d4470ea2c02b"
},
"outputs": [],
"source": [
"print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 225
},
"id": "53Q02FoqQH4V",
"outputId": "53e2d59b-5075-4765-ad9e-aed56c966583"
},
"outputs": [],
"source": [
"plt.figure(figsize=(10,3))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "clOAUH-SXCJG",
"outputId": "a3aa85ff-126a-4a4a-cd9e-90b9cc465ef5"
},
"outputs": [],
"source": [
"print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DHlKvVCId5ue"
},
"source": [
"## Ramalan set data penuh\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cOFJ45vreO0N",
"outputId": "35628e33-ecf9-4966-8036-f7ea86db6f16"
},
"outputs": [],
"source": [
"# Extracting load values as numpy array\n",
"data = None\n",
"\n",
"# Scaling\n",
"data = None\n",
"\n",
"# Transforming to 2D tensor as per model input requirement\n",
"data_timesteps=None\n",
"\n",
"# Selecting inputs and outputs from data\n",
"X, Y = None, None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ESSAdQgwexIi"
},
"outputs": [],
"source": [
"# Make model predictions\n",
"\n",
"# Inverse scale and reshape\n",
"Y_pred = None\n",
"Y = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 328
},
"id": "M_qhihN0RVVX",
"outputId": "a89cb23e-1d35-437f-9d63-8b8907e12f80"
},
"outputs": [],
"source": [
"plt.figure(figsize=(30,8))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "AcN7pMYXVGTK",
"outputId": "7e1c2161-47ce-496c-9d86-7ad9ae0df770"
},
"outputs": [],
"source": [
"print('MAPE: ', mape(Y_pred, Y)*100, '%')"
]
},
{
"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"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"collapsed_sections": [],
"name": "Recurrent_Neural_Networks.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
},
"coopTranslator": {
"original_hash": "e86ce102239a14c44585623b9b924a74",
"translation_date": "2025-09-06T12:05:23+00:00",
"source_file": "7-TimeSeries/3-SVR/working/notebook.ipynb",
"language_code": "ms"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -0,0 +1,447 @@
{
"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:50:45+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "my"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## ရေဂရက်ရှင်းကို နားလည်ခြင်း - ပထမပိုင်း သင်ခန်းစာ\n",
"\n",
"#### အခြေအနေကို နားလည်ခြင်း\n",
"\n",
"✅ ရေဂရက်ရှင်းနည်းလမ်းအမျိုးမျိုး ရှိပြီး သင်ရွေးချယ်မည့်နည်းလမ်းသည် သင်လိုချင်သော အဖြေကို မူတည်ပါသည်။ ဥပမာအားဖြင့် သတ်မှတ်အသက်ရှိသူတစ်ဦး၏ အမြင့်ကို ခန့်မှန်းလိုပါက သင်သည် **ဂဏန်းတန်ဖိုး** ရှာဖွေလိုသောကြောင့် `linear regression` ကို အသုံးပြုမည်ဖြစ်သည်။ သို့သော် အစားအစာအမျိုးအစားတစ်ခုကို သက်သေရှင်းလင်းစွာ သက်သေပြ၍ vegan ဟုတ်မဟုတ်ကို သတ်မှတ်လိုပါက သင်သည် **အမျိုးအစားခွဲခြားမှု** ရှာဖွေလိုသောကြောင့် `logistic regression` ကို အသုံးပြုမည်ဖြစ်သည်။ Logistic regression အကြောင်းကို နောက်ပိုင်းတွင် ပိုမိုလေ့လာနိုင်ပါမည်။ ဒေတာမှ မေးခွန်းတစ်ချို့ကို မေးနိုင်မည့်အကြောင်းနှင့် အထိုက်အလျောက် နည်းလမ်းများကို သုံးသင့်မည်ကို စဉ်းစားကြည့်ပါ။\n",
"\n",
"ဤအပိုင်းတွင် သင်သည် [ဆေးချိုရောဂါဆိုင်ရာ ဒေတာအနည်းငယ်](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) နှင့် အလုပ်လုပ်မည်ဖြစ်သည်။ ဆေးချိုရောဂါရှိသူများအတွက် ကုသမှုတစ်ခုကို စမ်းသပ်လိုကြောင်း စဉ်းစားကြည့်ပါ။ Machine Learning မော်ဒယ်များက မျိုးစုံသော အချက်အလက်ပေါင်းစပ်မှုများအပေါ် မူတည်၍ ဘယ်သူတွေက ကုသမှုကို ပိုမိုတုံ့ပြန်နိုင်မည်ကို သတ်မှတ်ရန် ကူညီနိုင်ပါသည်။ ရိုးရှင်းသော ရေဂရက်ရှင်းမော်ဒယ်တစ်ခုတောင် visualization ပြုလုပ်ပါက သင်၏ သီအိုရီဆိုင်ရာ ဆေးဘက်ဆိုင်ရာ စမ်းသပ်မှုများကို စီမံခန့်ခွဲရန် အထောက်အကူဖြစ်စေမည့် အချက်အလက်များကို ပြသနိုင်ပါသည်။\n",
"\n",
"ဒါဆိုရင် ဒီအလုပ်ကို စတင်လိုက်ကြစို့!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>ပန်းချီရေးဆွဲသူ - @allison_horst</figcaption>\n",
"\n",
"<!--![ပန်းချီရေးဆွဲသူ - \\@allison_horst](../../../../../../2-Regression/1-Tools/images/encouRage.jpg)<br>ပန်းချီရေးဆွဲသူ - @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. ကျွန်ုပ်တို့၏ tool set ကို load လုပ်ခြင်း\n",
"\n",
"ဤအလုပ်ကိုလုပ်ဆောင်ရန်အတွက် ကျွန်ုပ်တို့အောက်ပါ packages များလိုအပ်ပါမည်-\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) သည် [R packages များစုစည်းမှု](https://www.tidyverse.org/packages) ဖြစ်ပြီး ဒေတာသိပ္ပံကို ပိုမိုလျင်မြန်စေပြီး လွယ်ကူစေကာ ပျော်ရွှင်စေပါသည်။\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) framework သည် [packages များစုစည်းမှု](https://www.tidymodels.org/packages/) ဖြစ်ပြီး မော်ဒယ်တည်ဆောက်ခြင်းနှင့် machine learning အတွက်အသုံးပြုသည်။\n",
"\n",
"ဤ packages များကို အောက်ပါအတိုင်း install လုပ်နိုင်ပါသည်-\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"အောက်ပါ script သည် သင်ဤ module ကိုပြီးစီးရန်လိုအပ်သော packages များရှိမရှိကိုစစ်ဆေးပြီး မရှိသေးသော packages များကို install လုပ်ပေးပါမည်။\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": [
"အခုတော့ ဒီအံ့ဩဖွယ်ကောင်းတဲ့ package တွေကို load လုပ်ပြီး အခု R session မှာ အသုံးပြုနိုင်အောင် လုပ်ကြမယ်။ (ဒီဟာက ဥပမာပြရန်အတွက်သာဖြစ်ပြီး `pacman::p_load()` က အဲ့ဒီအလုပ်ကို ရှင်းပြီးသားဖြစ်ပါတယ်)\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. ဆီးချိုရောဂါဆိုင်ရာ ဒေတာစု\n",
"\n",
"ဒီလေ့ကျင့်ခန်းမှာ ကျွန်တော်တို့ရဲ့ ရေဂရက်ရှင်း (regression) ကျွမ်းကျင်မှုကို အသုံးပြုပြီး ဆီးချိုရောဂါဆိုင်ရာ ဒေတာစုပေါ်မှာ ခန့်မှန်းချက်တွေ ပြုလုပ်ပါမယ်။ [diabetes dataset](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) ဟာ `442 samples` ရှိပြီး ဆီးချိုရောဂါနဲ့ပတ်သက်တဲ့ ဒေတာတွေကို ထည့်သွင်းထားပါတယ်။ ဒီမှာ `age`, `sex`, `body mass index`, `average blood pressure`, နဲ့ `six blood serum measurements` စတဲ့ 10 ခုသော ခန့်မှန်းမှု feature variable တွေ၊ နောက်ပြီး `y` ဆိုတဲ့ outcome variable တစ်ခုလည်း ပါဝင်ပါတယ်။ `y` ဟာ baseline အပြီး တစ်နှစ်အကြာမှာ ရောဂါတိုးတက်မှုကို အရေအတွက်အလိုက် တိုင်းတာထားတဲ့ variable ဖြစ်ပါတယ်။\n",
"\n",
"|အချက်အလက်အရေအတွက်|442|\n",
"|----------------------|:---|\n",
"|ခန့်မှန်းမှု variable အရေအတွက်|ပထမ 10 ကော်လံတွေဟာ အရေအတွက်အလိုက် ခန့်မှန်းမှု variable တွေ|\n",
"|ရလဒ်/ပစ်မှတ်|11 ကော်လံဟာ baseline အပြီး တစ်နှစ်အကြာမှာ ရောဂါတိုးတက်မှုကို အရေအတွက်အလိုက် တိုင်းတာထားတဲ့ variable|\n",
"|ခန့်မှန်းမှု variable အချက်အလက်|- အသက် (age) နှစ်အလိုက်\n",
"||- ကျား/မ (sex)\n",
"||- bmi ကိုယ်အလေးချိန်နှင့်အရွယ်အစားညှိနှိုင်းမှု\n",
"||- bp သွေးပေါင်ချိန်ပျမ်းမျှ\n",
"||- s1 tc, သွေးတွင်း cholesterol စုစုပေါင်း\n",
"||- s2 ldl, အနိမ့်သိပ်သည်းမှု lipoproteins\n",
"||- s3 hdl, အမြင့်သိပ်သည်းမှု lipoproteins\n",
"||- s4 tch, cholesterol စုစုပေါင်း / HDL\n",
"||- s5 ltg, serum triglycerides အဆင့် log ဖြစ်နိုင်ခြေ\n",
"||- s6 glu, သွေးတွင်း sugar အဆင့်|\n",
"\n",
"> 🎓 သတိပြုပါ၊ ဒီဟာ supervised learning ဖြစ်ပြီး 'y' ဆိုတဲ့ target variable တစ်ခုလိုအပ်ပါတယ်။\n",
"\n",
"R language ကို အသုံးပြုပြီး ဒေတာကို ပြုပြင်နိုင်ဖို့အတွက် ဒေတာကို R ရဲ့ memory ထဲသို့ တင်ရပါမယ်၊ ဒါမှမဟုတ် R ကို ဒေတာကို remote မှတဆင့် access လုပ်နိုင်အောင် ချိတ်ဆက်မှုတစ်ခု တည်ဆောက်ရပါမယ်။\n",
"\n",
"> [readr](https://readr.tidyverse.org/) package ဟာ Tidyverse ရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပြီး R မှာ rectangular data ကို အလွယ်တကူ၊ မြန်မြန်ဆန်ဆန် ဖတ်ရှုနိုင်စေတဲ့ နည်းလမ်းတစ်ခု ပေးပါတယ်။\n",
"\n",
"အခုတော့ ဒီ source URL မှာပေးထားတဲ့ ဆီးချိုရောဂါဆိုင်ရာ ဒေတာစုကို load လုပ်ကြမယ်: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"ဒါ့အပြင် `glimpse()` ကို အသုံးပြုပြီး ဒေတာကို စစ်ဆေးပြီး၊ `slice()` ကို အသုံးပြုကာ ပထမ 5 rows ကို ပြသပါမယ်။\n",
"\n",
"နောက်ထပ်ဆက်လုပ်မယ့်အခါမှာ R code မှာ မကြာခဏ တွေ့ရမယ့် အရာတစ်ခုကို မိတ်ဆက်ပေးပါမယ် 🥁🥁: pipe operator `%>%`\n",
"\n",
"pipe operator (`%>%`) ဟာ လုပ်ဆောင်မှုတွေကို အဆင့်ဆင့် အလွယ်တကူ ဆက်သွယ်ပေးပြီး object တစ်ခုကို function သို့မဟုတ် call expression ထဲကို ရှေ့ဆက်ပေးပါတယ်။ pipe operator ကို သင့် code မှာ \"ပြီးတော့\" လို့ ပြောနည်းတစ်ခုလို ထင်ရနိုင်ပါတယ်။\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()` က ဒီဒေတာမှာ အတန်း 442 ခုနဲ့ ကော်လံ 11 ခုရှိပြီး ကော်လံအားလုံးဟာ `double` ဒေတာအမျိုးအစားဖြစ်တယ်ဆိုတာကို ပြသပေးပါတယ်။\n",
"\n",
"<br>\n",
"\n",
"> glimpse() နဲ့ slice() ဟာ [`dplyr`](https://dplyr.tidyverse.org/) မှာပါတဲ့ function တွေဖြစ်ပါတယ်။ Dplyr ဟာ Tidyverse ရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပြီး ဒေတာကို စနစ်တကျ ပြုပြင်နိုင်ဖို့ အထောက်အကူပြုတဲ့ verbs တွေကို ပေးစွမ်းတဲ့ grammar တစ်ခုဖြစ်ပါတယ်။\n",
"\n",
"<br>\n",
"\n",
"အခု ဒေတာရရှိပြီးတဲ့အခါမှာ ဒီအတန်းအတွက် `bmi` feature တစ်ခုကို ရွေးချယ်ပြီး အာရုံစိုက်ဖို့ narrow down လုပ်မယ်။ ဒါကို လုပ်ဖို့အတွက် လိုအပ်တဲ့ ကော်လံတွေကို ရွေးချယ်ရမယ်။ ဒါကို ဘယ်လိုလုပ်မလဲ?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) ဟာ data frame ထဲက ကော်လံတွေကို *ရွေးချယ်* (လိုအပ်လျှင် အမည်ပြောင်း) လုပ်နိုင်စေတဲ့ function တစ်ခုဖြစ်ပါတယ်။\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": [
"## ၃။ သင်ကြားမှုနှင့် စမ်းသပ်မှု ဒေတာ\n",
"\n",
"အထောက်အထားအပေါ်မူတည်သော သင်ကြားမှု (supervised learning) တွင် ဒေတာကို *ခွဲခြား*၍ အသုံးပြုခြင်းသည် ရိုးရာအလေ့အထဖြစ်သည်။ ဒေတာကို (အများအားဖြင့် ပိုကြီးမားသော) သင်ကြားမှုအတွက် အသုံးပြုမည့်အစုနှင့်၊ မော်ဒယ်၏ စွမ်းဆောင်ရည်ကို စမ်းသပ်ရန် အသုံးပြုမည့် ပိုသေးငယ်သော \"အနားထား\" အစုအဖြစ် ခွဲခြားသည်။\n",
"\n",
"ယခုအခါ ဒေတာများကို ပြင်ဆင်ပြီးဖြစ်သောကြောင့်၊ ဒီဒေတာအစုအတွင်းရှိ နံပါတ်များကို သဘာဝကျကျ ခွဲခြားနိုင်ရန် စက်တစ်လုံးက ကူညီပေးနိုင်မလားဆိုတာ ကြည့်နိုင်ပါပြီ။ [rsample](https://tidymodels.github.io/rsample/) package ကို အသုံးပြုနိုင်ပြီး၊ ၎င်းသည် Tidymodels framework ၏ အစိတ်အပိုင်းတစ်ခုဖြစ်သည်။ ဒီ package ကို အသုံးပြု၍ ဒေတာကို *ဘယ်လို* ခွဲမည်ဆိုသည်ကို သိရှိထားသော object တစ်ခုကို ဖန်တီးနိုင်ပြီး၊ ထို့နောက် ဖန်တီးထားသော သင်ကြားမှုနှင့် စမ်းသပ်မှုအစုများကို ထုတ်ယူရန် rsample function နှစ်ခုကို အသုံးပြုနိုင်ပါသည်။\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. Tidymodels ကို အသုံးပြု၍ Linear Regression မော်ဒယ် တည်ဆောက်ခြင်း\n",
"\n",
"အခုတော့ မော်ဒယ်ကို တည်ဆောက်ဖို့ အဆင်သင့် ဖြစ်ပါပြီ!\n",
"\n",
"Tidymodels မှာ မော်ဒယ်တွေကို `parsnip()` ကို အသုံးပြုပြီး အောက်ပါ သုံးခုကို သတ်မှတ်ရပါတယ်-\n",
"\n",
"- မော်ဒယ် **အမျိုးအစား** က Linear Regression, Logistic Regression, Decision Tree မော်ဒယ်တွေလို မော်ဒယ်အမျိုးအစားကို ခွဲခြားပေးပါတယ်။\n",
"\n",
"- မော်ဒယ် **mode** က Regression နဲ့ Classification လို ရိုးရိုးနည်းလမ်းတွေ ပါဝင်ပြီး၊ မော်ဒယ်အမျိုးအစားတချို့က နှစ်ခုလုံးကို ပံ့ပိုးပေးနိုင်သလို တချို့က mode တစ်ခုတည်းသာ ပါဝင်ပါတယ်။\n",
"\n",
"- မော်ဒယ် **engine** က မော်ဒယ်ကို တည်ဆောက်ဖို့ အသုံးပြုမယ့် ကွန်ပျူတာဆိုင်ရာ tool ဖြစ်ပါတယ်။ အများအားဖြင့် R packages တွေဖြစ်ပြီး၊ **`\"lm\"`** သို့မဟုတ် **`\"ranger\"`** လိုမျိုးတွေ ပါဝင်ပါတယ်။\n",
"\n",
"ဒီ မော်ဒယ်ဆိုင်ရာ အချက်အလက်တွေကို model specification အနေနဲ့ သိမ်းဆည်းထားပြီး၊ အခုတော့ တစ်ခု တည်ဆောက်လိုက်ရအောင်!\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": [
"မော်ဒယ်တစ်ခုကို *သတ်မှတ်ပြီး* ဖြစ်သောအခါ၊ မော်ဒယ်ကို [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) လုပ်ဆောင်မှုကို အသုံးပြု၍ `ခန့်မှန်း` သို့မဟုတ် `လေ့ကျင့်` နိုင်ပါသည်၊ ယေဘူယျအားဖြင့် ဖော်မြူလာနှင့် ဒေတာအချို့ကို အသုံးပြုပါသည်။\n",
"\n",
"`y ~ .` ဆိုသည်မှာ `y` ကို ခန့်မှန်းထားသောအရေအတွက်/ပစ်မှတ်အဖြစ် တိုက်ရိုက်ချိတ်ဆက်ပြီး၊ အားလုံးသော ခန့်မှန်းစရာများ/အင်္ဂါရပ်များဖြင့် (ဥပမာ- `.`) ရှင်းပြမည်ဟု ဆိုလိုသည် (ဤအခါတွင်၊ ကျွန်ုပ်တို့တွင် ခန့်မှန်းစရာတစ်ခုသာရှိသည်- `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": [
"မော်ဒယ်ကိုလေ့ကျင့်စဉ်တွင် သင်ယူထားသော coefficient များကို output မှာတွေ့နိုင်ပါတယ်။ အဲဒီ coefficient များက အမှန်တကယ် variable နဲ့ ခန့်မှန်းထားတဲ့ variable အကြား error အနည်းဆုံးဖြစ်စေတဲ့ အကောင်းဆုံးလိုင်းရဲ့ coefficient များကို ကိုယ်စားပြုပါတယ်။\n",
"<br>\n",
"\n",
"## 5. စမ်းသပ်မှုအစုအပေါ် ခန့်မှန်းချက်များပြုလုပ်ပါ\n",
"\n",
"အခုတော့ မော်ဒယ်ကိုလေ့ကျင့်ပြီးပြီဖြစ်တဲ့အတွက် [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) ကို အသုံးပြုပြီး စမ်းသပ်မှု dataset အတွက် ရောဂါတိုးတက်မှု y ကို ခန့်မှန်းနိုင်ပါပြီ။ ဒါကို data group များအကြားလိုင်းဆွဲဖို့ အသုံးပြုမယ်။\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": [
"ဝိုဟူး! 💃🕺 ကျွန်တော်တို့ မော်ဒယ်တစ်ခုကို လေ့ကျင့်ပြီး အနာဂတ်ခန့်မှန်းချက်များကို ပြုလုပ်လိုက်ပါပြီ!\n",
"\n",
"အနာဂတ်ခန့်မှန်းချက်များကို ပြုလုပ်တဲ့အခါ tidymodels ရဲ့ သဘောတရားက standardized column names တွေပါဝင်တဲ့ tibble/data frame အဖြစ် အမြဲထုတ်လုပ်ဖို့ ရည်ရွယ်ထားပါတယ်။ ဒါက အစပိုင်းဒေတာနဲ့ ခန့်မှန်းချက်တွေကို နောက်ထပ်လုပ်ဆောင်မှုတွေ (ဥပမာ- ပုံဆွဲခြင်း) အတွက် အသုံးဝင်တဲ့ format အဖြစ် ပေါင်းစည်းဖို့ လွယ်ကူစေပါတယ်။\n",
"\n",
"`dplyr::bind_cols()` က data frame အများအပြားကို column အဖြစ် ထိရောက်စွာ ပေါင်းစည်းပေးပါတယ်။\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": [
"## ၆။ မော်ဒယ်ရလဒ်များကို ရှုမြင်ခြင်း\n",
"\n",
"အခုတော့ ဤအရာကို အမြင်အာရုံဖြင့် ကြည့်ရှုလိုက်ရအောင် 📈။ `y` နှင့် `bmi` တန်ဖိုးများကို စမ်းသပ်မှုအစုအဖွဲ့မှ scatter plot တစ်ခုဖန်တီးပြီး၊ မော်ဒယ်၏ အချက်အလက်အစုအဖွဲ့များအကြား အကောင်းဆုံးနေရာတွင် မျဉ်းတန်းတစ်ခုကို ခန့်မှန်းချက်များကို အသုံးပြု၍ ရေးဆွဲပါမည်။\n",
"\n",
"R တွင် ဂရပ်ဖန်တီးရန် စနစ်အမျိုးမျိုးရှိပြီး `ggplot2` သည် အလှပဆုံးနှင့် အကွဲအပြားများစွာ အသုံးပြုနိုင်သော စနစ်တစ်ခုဖြစ်သည်။ ၎င်းသည် **လွတ်လပ်သောအစိတ်အပိုင်းများကို ပေါင်းစပ်ခြင်း** ဖြင့် ဂရပ်များဖန်တီးရန် ခွင့်ပြုသည်။\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": [
"✅ ဒီမှာ ဘာတွေဖြစ်နေတယ်ဆိုတာကို နည်းနည်းတွေးကြည့်ပါ။ တစ်ခုတည်းသော တိုက်ရိုက်လိုင်းတစ်ခုဟာ အချက်အလက်အနည်းငယ်များကို ဖြတ်သန်းနေပါတယ်၊ ဒါပေမယ့် အဲ့လိုင်းက တကယ်ဘာလုပ်နေပါသလဲ။ မသိတဲ့ အချက်အလက်တစ်ခုကို y axis ရဲ့ ဆက်နွယ်မှုအပေါ်မှာ ဘယ်လိုနေရာချထားရမလဲဆိုတာကို အဲ့လိုင်းကို အသုံးပြုနိုင်ပုံကို မြင်နိုင်ပါသလား။ ဒီမော်ဒယ်ရဲ့ အကျိုးကျေးဇူးကို လက်တွေ့အသုံးချပုံအနေနဲ့ စကားလုံးတွေနဲ့ ဖော်ပြကြည့်ပါ။\n",
"\n",
"အောင်မြင်ပါတယ်၊ သင့်ရဲ့ ပထမဆုံး linear regression မော်ဒယ်ကို တည်ဆောက်ပြီး၊ အဲ့ဒီနဲ့ အတူ အနာဂတ်ခန့်မှန်းချက်တစ်ခုကို ဖန်တီးပြီး၊ အဲ့ဒီကို plot ထဲမှာ ပြသနိုင်ခဲ့ပါပြီ!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,46 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3-final"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"coopTranslator": {
"original_hash": "1b2ab303ac6c604a34c6ca7a49077fc7",
"translation_date": "2025-09-06T11:52:59+00:00",
"source_file": "2-Regression/2-Data/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,669 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_2-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
"translation_date": "2025-09-06T11:56:07+00:00",
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
"language_code": "my"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# ရှုထောင့်မော်ဒယ်တည်ဆောက်ခြင်း - ဒေတာကို ပြင်ဆင်ပြီး ရှုထောင့်ဖော်ပြခြင်း\n",
"\n",
"## **Linear Regression for Pumpkins - အတန်း ၂**\n",
"#### မိတ်ဆက်\n",
"\n",
"Tidymodels နဲ့ Tidyverse ကို သုံးပြီး machine learning မော်ဒယ်တည်ဆောက်ခြင်းကို စတင်လုပ်ဆောင်ဖို့ လိုအပ်တဲ့ tools တွေကို သင်ပြင်ဆင်ပြီးသားဖြစ်တဲ့အခါ၊ သင့်ဒေတာကို အကောင်းဆုံးအသုံးချနိုင်ဖို့ အရေးကြီးတဲ့မေးခွန်းတွေကို မေးဖို့ အဆင်သင့်ဖြစ်နေပါပြီ။ ဒေတာနဲ့အလုပ်လုပ်ပြီး ML ဖြေရှင်းနည်းတွေကို အသုံးချတဲ့အခါ၊ သင့်ဒေတာရဲ့ potentials ကို အကောင်းဆုံးဖွင့်လှစ်နိုင်ဖို့ မေးခွန်းကို မှန်မှန်မေးနိုင်ဖို့ အရေးကြီးပါတယ်။\n",
"\n",
"ဒီအတန်းမှာ သင်လေ့လာရမယ့်အရာတွေကတော့ -\n",
"\n",
"- မော်ဒယ်တည်ဆောက်ဖို့ ဒေတာကို ပြင်ဆင်နည်း။\n",
"\n",
"- `ggplot2` ကို သုံးပြီး ဒေတာကို ရှုထောင့်ဖော်ပြနည်း။\n",
"\n",
"သင်လိုချင်တဲ့အဖြေကို ရရှိဖို့ မေးခွန်းက အရေးကြီးပါတယ်။ ML algorithm အမျိုးအစားကို သင်ရွေးချယ်ရမယ့်အခါ၊ အဖြေရဲ့အရည်အသွေးက သင့်ဒေတာရဲ့ သဘာဝပေါ်မူတည်ပါတယ်။\n",
"\n",
"ဒီအရာတွေကို လက်တွေ့လေ့ကျင့်မှုနဲ့အတူ လေ့လာကြည့်ရအောင်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/unruly_data.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>ပန်းချီရေးဆွဲသူ @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![ပန်းချီရေးဆွဲသူ \\@allison_horst](../../../../../../2-Regression/2-Data/images/unruly_data.jpg)<br>ပန်းချီရေးဆွဲသူ \\@allison_horst-->\n"
],
"metadata": {
"id": "Pg5aexcOPqAZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. ဖရုံသီးဒေတာကို တင်သွင်းခြင်းနှင့် Tidyverse ကို အသုံးပြုခြင်း\n",
"\n",
"ဒီသင်ခန်းစာကို အပိုင်းပိုင်းခွဲပြီး လေ့လာရန် အောက်ပါ packages များလိုအပ်ပါမည်-\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) သည် [R packages များစုစည်းမှု](https://www.tidyverse.org/packages) ဖြစ်ပြီး ဒေတာသိပ္ပံကို ပိုမိုမြန်ဆန်စေပြီး လွယ်ကူစေသည့်အပြင် ပျော်ရွှင်စေပါသည်။\n",
"\n",
"သင်သည် အောက်ပါအတိုင်း ထည့်သွင်းနိုင်ပါသည်-\n",
"\n",
"`install.packages(c(\"tidyverse\"))`\n",
"\n",
"အောက်ပါ script သည် သင်ဤ module ကို ပြီးမြောက်စွာ လုပ်ဆောင်ရန် လိုအပ်သော packages များရှိမရှိ စစ်ဆေးပြီး မရှိသေးပါက ထည့်သွင်းပေးပါမည်-\n"
],
"metadata": {
"id": "dc5WhyVdXAjR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse)"
],
"outputs": [],
"metadata": {
"id": "GqPYUZgfXOBt"
}
},
{
"cell_type": "markdown",
"source": [
"အခုတော့ ဒီသင်ခန်းစာအတွက် ပံ့ပိုးထားတဲ့ [data](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ကို ဖိုင်တွေကို ဖွင့်ပြီး data တွေကို load လုပ်ကြရအောင်!\n"
],
"metadata": {
"id": "kvjDTPDSXRr2"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core Tidyverse packages\n",
"library(tidyverse)\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 =50)"
],
"outputs": [],
"metadata": {
"id": "VMri-t2zXqgD"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` ကို အမြန်ကြည့်လိုက်တာနဲ့ အချို့နေရာမှာ အလွတ်တွေရှိပြီး စာသား (`chr`) နဲ့ ကိန်းဂဏန်း (`dbl`) တွေ ရောနှောနေတယ်ဆိုတာ မြင်ရတယ်။ `Date` က character အမျိုးအစားဖြစ်ပြီး `Package` ဆိုတဲ့ ထူးဆန်းတဲ့ ကော်လံတစ်ခုလည်းရှိတယ်။ အဲဒီမှာတော့ `sacks`, `bins` နဲ့ အခြားတန်ဖိုးတွေ ရောနှောနေတယ်။ အချက်အလက်တွေက တကယ်ပဲ ရှုပ်ထွေးနေတယ် 😤။\n",
"\n",
"တကယ်တော့ ML မော်ဒယ်တစ်ခုကို တိုက်ရိုက်ဖန်တီးဖို့ အဆင်သင့်ဖြစ်နေတဲ့ dataset ကို ရရှိတာဟာ မကြာခဏဖြစ်တာမဟုတ်ပါဘူး။ ဒါပေမယ့် စိတ်မပူပါနဲ့၊ ဒီသင်ခန်းစာမှာ R libraries ပုံမှန်တွေကို အသုံးပြုပြီး raw dataset ကို ပြင်ဆင်ပုံကို သင်ယူရမှာဖြစ်ပါတယ် 🧑‍🔧။ အချက်အလက်တွေကို visualization လုပ်ပုံနည်းလမ်းမျိုးစုံကိုလည်း သင်ယူရမှာဖြစ်ပါတယ် 📈📊။\n",
"<br>\n",
"\n",
"> အမှတ်ရစေချင်တာ: pipe operator (`%>%`) က object ကို function သို့မဟုတ် call expression ထဲကို ရှေ့ဆက်ပေးပြီး logical sequence အတိုင်း လုပ်ဆောင်ပေးပါတယ်။ pipe operator ကို သင့် code မှာ \"ပြီးတော့\" လို့ ပြောနည်းနဲ့ တူတယ်လို့ စဉ်းစားနိုင်ပါတယ်။\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. မရှိသည့် ဒေတာများကို စစ်ဆေးပါ\n",
"\n",
"ဒေတာသိပ္ပံပညာရှင်များအနေဖြင့် အများဆုံး ကြုံရသော ပြဿနာတစ်ခုမှာ မပြီးစီးသည့် ဒေတာများ သို့မဟုတ် မရှိသည့် ဒေတာများကို ကိုင်တွယ်ရခြင်းဖြစ်သည်။ R မှာ မရှိသည့် ဒေတာများ သို့မဟုတ် မသိသေးသော အချက်အလက်များကို `NA` (Not Available) ဆိုသော အထူးတန်ဖိုးဖြင့် ကိုယ်စားပြုထားသည်။\n",
"\n",
"ဒါဆိုရင် ဒေတာဖရိမ်မှာ မရှိသည့် ဒေတာများ ပါဝင်နေသည်ကို ဘယ်လို သိနိုင်မလဲ?\n",
"<br>\n",
"- တိုက်ရိုက်နည်းလမ်းတစ်ခုကတော့ `anyNA` ဆိုသော base R function ကို အသုံးပြုခြင်းဖြစ်ပြီး၊ ဒါဟာ `TRUE` သို့မဟုတ် `FALSE` ဆိုသော logical objects ကို ပြန်ပေးသည်။\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"အိုကေ၊ ဒေတာတစ်ချို့ပျောက်နေသလိုပဲ! ဒါကစတင်ဖို့ကောင်းတဲ့နေရာတစ်ခုပါပဲ။\n",
"\n",
"- နောက်ထပ်နည်းလမ်းတစ်ခုကတော့ `is.na()` function ကိုသုံးတာဖြစ်ပြီး၊ ဒါကတစ်ခုချင်းစီသော column element တွေထဲမှာ ဘယ်ဟာတွေမရှိဘူးဆိုတာကို logical `TRUE` နဲ့ပြသပေးနိုင်ပါတယ်။\n"
],
"metadata": {
"id": "mU-7-SB6YokF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "W-DxDOR4YxSW"
}
},
{
"cell_type": "markdown",
"source": [
"အကြီးမားတဲ့ data frame တစ်ခုကို handle လုပ်ရတဲ့အခါမှာ၊ အတန်းတွေ၊ ကော်လံတွေကို တစ်ခုချင်းစီ individually ပြန်လည်သုံးသပ်ဖို့က အချိန်ကုန်ပြီး အလွန်မထိရောက်နိုင်ပါဘူး😴။\n",
"\n",
"- ပိုမိုလွယ်ကူပြီး အဓိကကျတဲ့နည်းလမ်းတစ်ခုကတော့ ကော်လံတစ်ခုချင်းစီအတွက် မရှိသေးတဲ့တန်ဖိုးတွေ (missing values) ရဲ့ စုစုပေါင်းကိုတွက်ချက်ဖို့ဖြစ်ပါတယ်:\n"
],
"metadata": {
"id": "xUWxipKYY0o7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" colSums()"
],
"outputs": [],
"metadata": {
"id": "ZRBWV6P9ZArL"
}
},
{
"cell_type": "markdown",
"source": [
"အရမ်းကောင်းတဲ့ package တွေ၊ function တွေကိုပေါင်းစပ်ထားတဲ့အပြင် R မှာ documentation ကလည်းအရမ်းကောင်းပါတယ်။ ဥပမာအားဖြင့် `help(colSums)` သို့မဟုတ် `?colSums` ကိုသုံးပြီး function အကြောင်းပိုမိုသိရှိနိုင်ပါတယ်။\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: ဒေတာကို စီမံခန့်ခွဲရန် အဘိဓာန်\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_wrangling.png\"\n",
" width=\"569\"/>\n",
" <figcaption>ပန်းချီကား - @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![ပန်းချီကား - \\@allison_horst](../../../../../../2-Regression/2-Data/images/dplyr_wrangling.png)<br/>ပန်းချီကား - \\@allison_horst-->\n"
],
"metadata": {
"id": "o4jLY5-VZO2C"
}
},
{
"cell_type": "markdown",
"source": [
"[`dplyr`](https://dplyr.tidyverse.org/) သည် Tidyverse အတွင်းရှိ package တစ်ခုဖြစ်ပြီး ဒေတာကို စီမံခန့်ခွဲရန်အတွက် သတ်မှတ်ထားသော လုပ်ဆောင်ချက်များကို ပေးစွမ်းသော grammar တစ်ခုဖြစ်သည်။ ၎င်းသည် ဒေတာစီမံခန့်ခွဲမှုဆိုင်ရာ အခက်အခဲများကို ဖြေရှင်းရန် အထောက်အကူပြုသော လုပ်ဆောင်ချက်များကို တစ်စည်းတစ်လုံးအဖြစ် ပေးစွမ်းသည်။ ဒီအပိုင်းမှာ dplyr ရဲ့ လုပ်ဆောင်ချက်များကို လေ့လာကြမယ်! \n",
"<br>\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` ဟာ `dplyr` package ထဲမှာရှိတဲ့ function တစ်ခုဖြစ်ပြီး သင့်အတွက်လိုအပ်တဲ့ column တွေကို ရွေးချယ်ထားရန် (သို့မဟုတ်) ဖယ်ရှားရန် ကူညီပေးပါတယ်။\n",
"\n",
"သင့် data frame ကို ပိုမိုလွယ်ကူစွာ အသုံးပြုနိုင်အောင် လိုအပ်တဲ့ column တွေကိုသာ ထားရှိပြီး မလိုအပ်တဲ့ column တွေကို ဖယ်ရှားရန် `select()` ကို အသုံးပြုနိုင်ပါတယ်။\n",
"\n",
"ဥပမာအားဖြင့် ဒီလေ့ကျင့်မှုမှာ ကျွန်တော်တို့ရဲ့ analysis အတွက် `Package`, `Low Price`, `High Price` နဲ့ `Date` column တွေကိုသာ အသုံးပြုမယ်။ အဲ့ဒီ column တွေကို ရွေးချယ်ကြည့်ရအောင်။\n"
],
"metadata": {
"id": "x3VGMAGBZiUr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(Package, `Low Price`, `High Price`, Date)\n",
"\n",
"\n",
"# Print data set\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "F_FgxQnVZnM0"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::mutate()\n",
"\n",
"`mutate()` ဟာ `dplyr` package ထဲမှာရှိတဲ့ function တစ်ခုဖြစ်ပြီး၊ အသစ်သော column များကို ဖန်တီးရန် သို့မဟုတ် ရှိပြီးသား column များကို ပြင်ဆင်ရန် အသုံးပြုနိုင်ပါတယ်၊ အဲဒီအချိန်မှာ ရှိပြီးသား column များကိုလည်း ထိန်းသိမ်းထားနိုင်ပါတယ်။\n",
"\n",
"`mutate` ရဲ့ အခြေခံဖွဲ့စည်းပုံကတော့ -\n",
"\n",
"`data %>% mutate(new_column_name = what_it_contains)`\n",
"\n",
"အခု `mutate` ကို `Date` column ကို အသုံးပြုပြီး လေ့ကျင့်ကြည့်ရအောင်။ အောက်ပါအဆင့်များကို လုပ်ဆောင်ပါမယ် -\n",
"\n",
"1. ရက်စွဲများ (လက်ရှိမှာ character အမျိုးအစားဖြစ်နေတဲ့) ကို လ (month) ပုံစံအဖြစ် ပြောင်းလဲပါ (ဒါတွေက အမေရိကန်ရက်စွဲပုံစံဖြစ်ပြီး၊ ပုံစံက `MM/DD/YYYY` ဖြစ်ပါတယ်)။\n",
"\n",
"2. ရက်စွဲများထဲက လ (month) ကို အသစ်သော column တစ်ခုထဲမှာ ထုတ်ယူထည့်သွင်းပါ။\n",
"\n",
"R မှာ [lubridate](https://lubridate.tidyverse.org/) package က Date-time data တွေနဲ့ အလုပ်လုပ်ဖို့ ပိုမိုလွယ်ကူစေပါတယ်။ ဒါကြောင့် `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` တို့ကို အသုံးပြုပြီး အထက်ပါ ရည်မှန်းချက်များကို ပြည့်မှီအောင် လုပ်ဆောင်ကြည့်ရအောင်။ Date column ကို နောက်ထပ်လုပ်ဆောင်မှုများမှာ မလိုအပ်တော့တဲ့အတွက် ဖယ်ရှားပစ်နိုင်ပါတယ်။\n"
],
"metadata": {
"id": "2KKo0Ed9Z1VB"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load lubridate\n",
"library(lubridate)\n",
"\n",
"pumpkins <- pumpkins %>% \n",
" # Convert the Date column to a date object\n",
" mutate(Date = mdy(Date)) %>% \n",
" # Extract month from Date\n",
" mutate(Month = month(Date)) %>% \n",
" # Drop Date column\n",
" select(-Date)\n",
"\n",
"# View the first few rows\n",
"pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "5joszIVSZ6xe"
}
},
{
"cell_type": "markdown",
"source": [
"ဝူးဟူး! 🤩\n",
"\n",
"အခုတော့ `Price` ဆိုတဲ့ column အသစ်တစ်ခုဖန်တီးကြမယ်၊ ဒါဟာဖရုံသီးရဲ့ပျမ်းမျှဈေးနှုန်းကိုဖော်ပြပေးမှာဖြစ်ပါတယ်။ အခုတော့ `Low Price` နဲ့ `High Price` column တွေရဲ့ပျမ်းမျှကိုယူပြီး Price column အသစ်ကိုဖြည့်စွက်လိုက်ပါ။ \n"
],
"metadata": {
"id": "nIgLjNMCZ-6Y"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new column Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
"\n",
"# View the first few rows of the data\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "Zo0BsqqtaJw2"
}
},
{
"cell_type": "markdown",
"source": [
"ဟုတ်ကဲ့!💪\n",
"\n",
"\"ဒါပေမယ့် ခဏစောင့်ပါ!\" `View(pumpkins)` နဲ့ အချက်အလက်အစုံကို လျှောက်ကြည့်ပြီးရင် သင်ပြောမယ်၊ \"ဒီမှာ တစ်ခုခု ထူးထူးဆန်းဆန်းရှိတယ်နော်!\"🤔\n",
"\n",
"`Package` ကော်လံကို ကြည့်မယ်ဆိုရင်၊ ဖရုံသီးတွေကို အမျိုးမျိုးသော ပုံစံတွေနဲ့ ရောင်းချထားတာကို တွေ့ရမယ်။ တချို့ကို `1 1/9 bushel` အတိုင်းအတာနဲ့ ရောင်းထားပြီး၊ တချို့ကို `1/2 bushel` အတိုင်းအတာနဲ့ ရောင်းထားတယ်၊ တချို့ကို ဖရုံသီးတစ်လုံးစီအလိုက်၊ တချို့ကို ပေါင်အလိုက်၊ တချို့ကိုတော့ အကျယ်အဝန်း မတူညီတဲ့ သေတ္တာကြီးတွေထဲမှာ ရောင်းထားတယ်။\n",
"\n",
"ဒါကို အတည်ပြုကြည့်ရအောင်:\n"
],
"metadata": {
"id": "p77WZr-9aQAR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Verify the distinct observations in Package column\n",
"pumpkins %>% \n",
" distinct(Package)"
],
"outputs": [],
"metadata": {
"id": "XISGfh0IaUy6"
}
},
{
"cell_type": "markdown",
"source": [
"အံ့သြဖွယ်!👏\n",
"\n",
"ဖရုံသီးတွေကို အမြဲတမ်းတိကျစွာ အလေးချိန်တိုင်းတာဖို့ ခက်ခဲနေသလိုပဲ၊ အဲဒါကြောင့် `Package` ကော်လံထဲမှာ *bushel* စာကြောင်းပါဝင်တဲ့ ဖရုံသီးတွေကိုသာ ရွေးချယ်ပြီး၊ ဒါကို `new_pumpkins` လို့ခေါ်တဲ့ data frame အသစ်တစ်ခုထဲမှာ ထည့်ကြည့်ရအောင်။ \n",
"<br>\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() နှင့် stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): သင့်ရဲ့အခြေအနေများကိုဖြည့်ဆည်းတဲ့ **အတန်းများ** ကိုသာပါဝင်တဲ့ ဒေတာအစုကို ဖန်တီးပေးသည်။ ဤကိစ္စတွင် `Package` ကော်လံထဲမှာ *bushel* စာသားပါဝင်တဲ့ pumpkins များကို ရွေးချယ်ပေးသည်။\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): စာသားတစ်ခုထဲမှာ ပုံစံတစ်ခုရှိမရှိကို ရှာဖွေသည်။\n",
"\n",
"[`stringr`](https://github.com/tidyverse/stringr) ပက်ကေ့ချ်သည် စာသားနှင့်ဆိုင်သော လုပ်ဆောင်မှုများအတွက် ရိုးရှင်းသော function များကို ပေးသည်။\n"
],
"metadata": {
"id": "L8Qfcs92ageF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Retain only pumpkins with \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(Package, \"bushel\"))\n",
"\n",
"# Get the dimensions of the new data\n",
"dim(new_pumpkins)\n",
"\n",
"# View a few rows of the new data\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "hy_SGYREampd"
}
},
{
"cell_type": "markdown",
"source": [
"သင်မြင်နိုင်သည့်အတိုင်း၊ ကျွန်ုပ်တို့သည် သစ်ဖရုံသီးများကို တစ်လှည်းချင်းစီအလိုက် ၄၁၅ စာရင်းခန့်အထိ ကျဉ်းမြောင်းစွာ ရှာဖွေပြီးဖြစ်ပါသည်။🤩 \n",
"<br>\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**ဒါပေမယ့်! တစ်ခုထပ်လုပ်ရမယ့်အရာရှိနေသေးတယ်**\n",
"\n",
"သင်သတိထားမိပါသလား၊ တစ်တန်းစီမှာ bushel အရေအတွက်က မတူညီတာကို။ သင် bushel တစ်ခုအလိုက် စျေးနှုန်းကို ပြသနိုင်ဖို့၊ 1 1/9 သို့မဟုတ် 1/2 bushel အလိုက်မဟုတ်ဘဲ စျေးနှုန်းကို သင့်တင်ဖို့လိုပါတယ်။ စံပြုဖို့ သင့်တင်တွက်ချက်မှုအချို့လုပ်ရမယ်။\n",
"\n",
"[`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) function ကို သုံးပြီး Price column ကို အခြေအနေတစ်ချို့အပေါ် မူတည်ပြီး *ပြောင်းလဲ* သွားမယ်။ `case_when` က `if_else()` statement အများအပြားကို vectorise လုပ်နိုင်စေပါတယ်။\n"
],
"metadata": {
"id": "mLpw2jH4a0tx"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Convert the price if the Package contains fractional bushel values\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(Price = case_when(\n",
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
" TRUE ~ Price))\n",
"\n",
"# View the first few rows of the data\n",
"new_pumpkins %>% \n",
" slice_head(n = 30)"
],
"outputs": [],
"metadata": {
"id": "P68kLVQmbM6I"
}
},
{
"cell_type": "markdown",
"source": [
"ယခုတွင် ကျွန်ုပ်တို့သည် တစ်ယူနစ်စီ၏ စျေးနှုန်းကို ၎င်းတို့၏ bushel အတိုင်းအတာအပေါ် အခြေခံ၍ ခွဲခြမ်းစိတ်ဖြာနိုင်ပါသည်။ သို့သော်လည်း သံပုရာ bushel များကို လေ့လာခြင်းသည် `သင့်ဒေတာ၏ သဘာဝကို နားလည်ရန်` အလွန် `အရေးကြီး` သည်ကို ပြသပေးပါသည်။\n",
"\n",
"> ✅ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) အဆိုအရ bushel ၏ အလေးချိန်သည် ထုတ်ကုန်အမျိုးအစားပေါ် မူတည်သည်၊ အကြောင်းမူမိ volume အတိုင်းအတာဖြစ်သည်။ \"ဥပမာအားဖြင့် ခရမ်းချဉ်သီး bushel တစ်ခုသည် ၅၆ ပေါင်အလေးချိန်ရှိရမည်... အရွက်များနှင့် အပင်များသည် နေရာများယူပြီး အလေးချိန်နည်းပါသည်၊ ထို့ကြောင့် spinach bushel တစ်ခုသည် ၂၀ ပေါင်သာရှိသည်။\" ၎င်းသည် အတော်လေး ရှုပ်ထွေးသည်! Bushel-to-pound ပြောင်းလဲမှုကို မလုပ်တော့ဘဲ bushel အတိုင်း စျေးနှုန်းထားကြစို့။ သို့သော်လည်း သံပုရာ bushel များကို လေ့လာခြင်းသည် သင့်ဒေတာ၏ သဘာဝကို နားလည်ရန် အလွန်အရေးကြီးသည်ကို ပြသပေးပါသည်။\n",
">\n",
"> ✅ သင်သတိထားမိပါသလား၊ တစ်ဝက် bushel ဖြင့် ရောင်းချသော သံပုရာများသည် အလွန်စျေးကြီးသည်။ အဘယ်ကြောင့်ဆိုသည်ကို သင်ရှာဖွေနိုင်ပါသလား။ အကြံပြုချက် - သေးငယ်သော သံပုရာများသည် ကြီးမားသော သံပုရာများထက် စျေးကြီးသည်၊ အဓိကအားဖြင့် bushel တစ်ခုတွင် သံပုရာသေးများ အများကြီးပါဝင်နိုင်သည့်အတွက်၊ ကြီးမားသော hollow pie သံပုရာတစ်ခုကြောင့် အသုံးမကျသော နေရာများယူထားသည်။\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"ယခုနောက်ဆုံးအနေနဲ့၊ စိတ်လှုပ်ရှားစရာအတွက် 💁‍♀️၊ Month ကော်လံကို Package ကော်လံမတိုင်မီ `ပထမ` အနေအထားသို့ ရွှေ့လိုက်ကြစို့။\n",
"\n",
"ကော်လံအနေအထားများကို ပြောင်းလဲရန် `dplyr::relocate()` ကို အသုံးပြုနိုင်ပါတယ်။\n"
],
"metadata": {
"id": "qql1SowfbdnP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new data frame new_pumpkins\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(Month, .before = Package)\n",
"\n",
"new_pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "JJ1x6kw8bixF"
}
},
{
"cell_type": "markdown",
"source": [
"အလုပ်ကောင်းပါတယ်!👌 အခုတော့ သင့်မှာ သန့်ရှင်းပြီး တစ်ပြင်လုံးကျေတဲ့ ဒေတာစနစ်ရှိပြီး၊ သင့်ရဲ့ အသစ်သော regression မော်ဒယ်ကို တည်ဆောက်နိုင်ပါပြီ!\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. ggplot2 ဖြင့် ဒေတာကို ရှင်းလင်းဖော်ပြခြင်း\n",
"\n",
"<p >\n",
" <img src=\"../../images/data-visualization.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Dasani Madipalli ၏ အင်ဖိုဂရပ်</figcaption>\n",
"\n",
"\n",
"<!--![Infographic by Dasani Madipalli](../../../../../../2-Regression/2-Data/images/data-visualization.png){width=\"600\"}-->\n",
"\n",
"ဒီလိုဆိုရိုးစကားတစ်ခုရှိပါတယ် -\n",
"\n",
"> \"ရိုးရှင်းတဲ့ဂရပ်တစ်ခုက ဒေတာအနုညာတစ်ဦးရဲ့ စိတ်ကို အခြားကိရိယာတစ်ခုထက် ပိုမိုသိမြင်စေတတ်တယ်။\" --- John Tukey\n",
"\n",
"ဒေတာသိပ္ပံပညာရှင်တစ်ဦးရဲ့ အလုပ်တစ်ခုက သူတို့လုပ်ကိုင်နေတဲ့ ဒေတာရဲ့ အရည်အသွေးနဲ့ သဘာဝကို ဖော်ပြပေးရတာဖြစ်ပါတယ်။ ဒါကိုလုပ်ဖို့အတွက် သူတို့က စိတ်ဝင်စားဖွယ် ဂရပ်များ၊ ပုံများ၊ နဲ့ ဇယားများကို ဖန်တီးတတ်ကြပါတယ်။ ဒါတွေက ဒေတာရဲ့ အခြားမမြင်နိုင်တဲ့ ဆက်စပ်မှုများနဲ့ ချို့တဲ့ချက်များကို မြင်သာစေတတ်ပါတယ်။\n",
"\n",
"အထူးသဖြင့် ဂရပ်ဖော်ပြမှုတွေက ဒေတာအတွက် သင့်တော်တဲ့ စက်လေ့လာနည်းလမ်းကို ရွေးချယ်ရာမှာလည်း အထောက်အကူဖြစ်တတ်ပါတယ်။ ဥပမာ - စက်ကွင်းပုံစံလိုက်နေတဲ့ scatterplot တစ်ခုက ဒေတာဟာ linear regression အတွက် သင့်တော်တယ်ဆိုတာ ပြသနိုင်ပါတယ်။\n",
"\n",
"R မှာ ဂရပ်ဖန်တီးဖို့ စနစ်အမျိုးမျိုးရှိပေမယ့် [`ggplot2`](https://ggplot2.tidyverse.org/index.html) က အလှပဆုံးနဲ့ အကောင်းဆုံး အသုံးချနိုင်တဲ့ စနစ်တစ်ခုဖြစ်ပါတယ်။ `ggplot2` က သီးခြားအစိတ်အပိုင်းတွေကို **ပေါင်းစပ်ဖန်တီးခြင်း** ဖြင့် ဂရပ်ဖန်တီးခွင့်ပြုပါတယ်။\n",
"\n",
"အခုတော့ Price နဲ့ Month ကော်လံတွေကို အသုံးပြုပြီး ရိုးရှင်းတဲ့ scatter plot တစ်ခုကို စတင်ဖန်တီးကြမယ်။\n",
"\n",
"ဒီအခါမှာတော့ [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html) ကို အသုံးပြုပြီး ဒေတာစနစ်နဲ့ အလှဆင်ပုံ (aesthetic mapping) ကို [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html) နဲ့ ပေးပြီးနောက်မှာ scatter plot အတွက် [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html) လိုတဲ့ layer တွေကို ထည့်ပေးရမှာ ဖြစ်ပါတယ်။\n"
],
"metadata": {
"id": "mYSH6-EtbvNa"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plots\n",
"theme_set(theme_light())\n",
"\n",
"# Create a scatter plot\n",
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
"p + geom_point()"
],
"outputs": [],
"metadata": {
"id": "g2YjnGeOcLo4"
}
},
{
"cell_type": "markdown",
"source": [
"ဒီဟာ အသုံးဝင်တဲ့ ပုံကြမ်းလား 🤷? ဘာတွေက အံ့ဩစရာလို့ ထင်ရလဲ?\n",
"\n",
"ဒါဟာ အထူးသဖြင့် အသုံးဝင်တာမဟုတ်ပါဘူး၊ အကြောင်းကတော့ သတ်မှတ်ထားတဲ့ လတစ်လအတွင်းမှာ သင့်ဒေတာကို အချက်အလက်အနေနဲ့ ဖြန့်ကျက်ပြသပေးရုံသာ ဖြစ်ပါတယ်။\n",
"<br>\n"
],
"metadata": {
"id": "Ml7SDCLQcPvE"
}
},
{
"cell_type": "markdown",
"source": [
"### **ဘယ်လိုအသုံးဝင်အောင်လုပ်မလဲ?**\n",
"\n",
"အချက်အလက်တွေကို အသုံးဝင်တဲ့အချက်အလက်အဖြစ် ပြသနိုင်ဖို့အတွက် အချက်အလက်တွေကို တစ်နည်းနည်းနဲ့ အုပ်စုဖွဲ့ဖို့လိုပါတယ်။ ဥပမာအားဖြင့် ကျွန်တော်တို့ရဲ့ အချက်အလက်မှာ တစ်လစီအတွက် ဖရုံသီးရဲ့ ပျမ်းမျှဈေးနှုန်းကို ရှာဖွေမယ်ဆိုရင် အချက်အလက်ရဲ့ အခြေခံပုံစံတွေကို ပိုမိုနားလည်နိုင်စေမှာဖြစ်ပါတယ်။ ဒီအရာက **dplyr** ရဲ့ အခြေခံအချက်တစ်ခုဆီကို ဦးတည်စေပါတယ်။\n",
"\n",
"#### `dplyr::group_by() %>% summarize()`\n",
"\n",
"R မှာ အုပ်စုဖွဲ့ပြီး စုစုပေါင်းတွက်ချက်မှုတွေကို လွယ်ကူစွာတွက်ချက်နိုင်ပါတယ်။\n",
"\n",
"`dplyr::group_by() %>% summarize()`\n",
"\n",
"- `dplyr::group_by()` က အချက်အလက်ရဲ့ အနုပညာအထောက်အထားကို အပြည့်အစုံ dataset ကနေ တစ်ခုချင်းစီအုပ်စု (ဥပမာ - တစ်လစီ) အဖြစ် ပြောင်းလဲပေးပါတယ်။\n",
"\n",
"- `dplyr::summarize()` က သင့်ရဲ့ အုပ်စုဖွဲ့မူအပြောင်းအလဲအတွက် တစ်ခုချင်းစီအတွက် အချက်အလက်တစ်ခုနှင့် သင်ဖော်ပြလိုတဲ့ စုစုပေါင်းတွက်ချက်မှုအချက်အလက်တစ်ခုကို အသစ်တစ်ခု data frame အဖြစ် ဖန်တီးပေးပါတယ်။\n",
"\n",
"ဥပမာအားဖြင့် `dplyr::group_by() %>% summarize()` ကို အသုံးပြုပြီး **Month** ကော်လံအပေါ် အခြေခံပြီး ဖရုံသီးတွေကို အုပ်စုဖွဲ့ပြီး **mean price** ကို တစ်လစီအတွက် ရှာဖွေနိုင်ပါတယ်။\n"
],
"metadata": {
"id": "jMakvJZIcVkh"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price))"
],
"outputs": [],
"metadata": {
"id": "6kVSUa2Bcilf"
}
},
{
"cell_type": "markdown",
"source": [
"တိုတောင်းပြီး ရှင်းလင်းပါ!✨\n",
"\n",
"လများလိုမျိုး အမျိုးအစားအလိုက် အချက်အလက်များကို ဘားပုံစံဖြင့် ဖော်ပြခြင်းက ပိုမိုသင့်တော်ပါသည် 📊။ ဘားချတ်များဖော်ဆောင်ရန် `geom_bar()` နှင့် `geom_col()` ဟာ အရေးပါသော အလွှာများဖြစ်ပါတယ်။ `?geom_bar` ကို ကြည့်ပြီး အသေးစိတ်ကို သိရှိနိုင်ပါတယ်။\n",
"\n",
"အခုတစ်ခါ လုပ်ကြည့်ရအောင်!\n"
],
"metadata": {
"id": "Kds48GUBcj3W"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the average price of pumpkins per month then plot a bar chart\r\n",
"new_pumpkins %>%\r\n",
" group_by(Month) %>% \r\n",
" summarise(mean_price = mean(Price)) %>% \r\n",
" ggplot(aes(x = Month, y = mean_price)) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"Pumpkin Price\")"
],
"outputs": [],
"metadata": {
"id": "VNbU1S3BcrxO"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩 ဒါက ပိုပြီး အသုံးဝင်တဲ့ ဒေတာမြင်ကွင်းဖော်ပြမှုပါ! ဒီအချက်အလက်က ဖော်ပြနေသလို သကြားဖရုံရဲ့ အမြင့်ဆုံးစျေးနှုန်းက စက်တင်ဘာနဲ့ အောက်တိုဘာလတွေမှာ ဖြစ်တတ်ပါတယ်။ ဒါဟာ သင့်မျှော်မှန်းချက်နဲ့ ကိုက်ညီပါသလား? ဘာကြောင့် ကိုက်ညီသလဲ၊ ဘာကြောင့် မကိုက်ညီသလဲ?\n",
"\n",
"ဒုတိယသင်ခန်းစာကို ပြီးမြောက်အောင် လုပ်ဆောင်နိုင်ခဲ့တဲ့အတွက် ဂုဏ်ယူပါတယ် 👏! သင့်ဒေတာကို မော်ဒယ်တည်ဆောက်ဖို့ ပြင်ဆင်ပြီး၊ မြင်ကွင်းဖော်ပြမှုတွေကို အသုံးပြုပြီး ထပ်မံသော အချက်အလက်တွေကို ရှာဖွေတွေ့ရှိနိုင်ခဲ့ပါတယ်!\n"
],
"metadata": {
"id": "zDm0VOzzcuzR"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,128 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ဖရုံသီးဈေးနှုန်း\n",
"\n",
"လိုအပ်သော library နှင့် dataset ကို load လုပ်ပါ။ ဒေတာကို dataframe အဖြစ်ပြောင်းပြီး အောက်ပါအချက်အလက်များသာပါဝင်အောင် subset ပြုလုပ်ပါ။\n",
"\n",
"- Bushel အလိုက်ဈေးနှုန်းထားသော ဖရုံသီးများကိုသာ ရယူပါ။\n",
"- ရက်စွဲကို လအဖြစ်ပြောင်းပါ။\n",
"- အမြင့်ဆုံးနှင့် အနိမ့်ဆုံးဈေးနှုန်းများ၏ ပျမ်းမျှဈေးနှုန်းကိုတွက်ချက်ပါ။\n",
"- Bushel အရေအတွက်အလိုက်ဈေးနှုန်းကို ပြောင်းလဲပါ။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from datetime import datetime\n",
"\n",
"pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
"\n",
"pumpkins.head()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
"\n",
"columns_to_select = ['Package', 'Variety', 'City Name', 'Low Price', 'High Price', 'Date']\n",
"pumpkins = pumpkins.loc[:, columns_to_select]\n",
"\n",
"price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
"\n",
"month = pd.DatetimeIndex(pumpkins['Date']).month\n",
"day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)\n",
"\n",
"new_pumpkins = pd.DataFrame(\n",
" {'Month': month, \n",
" 'DayOfYear' : day_of_year, \n",
" 'Variety': pumpkins['Variety'], \n",
" 'City': pumpkins['City Name'], \n",
" 'Package': pumpkins['Package'], \n",
" 'Low Price': pumpkins['Low Price'],\n",
" 'High Price': pumpkins['High Price'], \n",
" 'Price': price})\n",
"\n",
"new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/1.1\n",
"new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price*2\n",
"\n",
"new_pumpkins.head()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"အခြေခံ စက်တာပလော့တစ်ခုက ကျွန်ုပ်တို့တွင် သြဂုတ်လမှ ဒီဇင်ဘာလအထိ လအလိုက် ဒေတာသာ ရှိကြောင်း သတိပေးပါသည်။ လိုင်းနားပုံစံဖြင့် သုံးသပ်ချက်များဆွဲရန် အချက်အလက်များ ပိုမိုလိုအပ်နိုင်ပါသည်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.scatter('Month','Price',data=new_pumpkins)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"plt.scatter('DayOfYear','Price',data=new_pumpkins)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3-final"
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "b032d371c75279373507f003439a577e",
"translation_date": "2025-09-06T11:29:29+00:00",
"source_file": "2-Regression/3-Linear/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,269 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ဖရုံသီးအမျိုးအစားများနှင့် အရောင်\n",
"\n",
"လိုအပ်သော library များနှင့် dataset ကို load လုပ်ပါ။ ဒေတာကို subset အဖြစ်ထားရှိထားသော dataframe အဖြစ်ပြောင်းပါ။\n",
"\n",
"အရောင်နှင့် အမျိုးအစားအကြား ဆက်နွယ်မှုကို ကြည့်ကြမယ်\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>City Name</th>\n",
" <th>Type</th>\n",
" <th>Package</th>\n",
" <th>Variety</th>\n",
" <th>Sub Variety</th>\n",
" <th>Grade</th>\n",
" <th>Date</th>\n",
" <th>Low Price</th>\n",
" <th>High Price</th>\n",
" <th>Mostly Low</th>\n",
" <th>...</th>\n",
" <th>Unit of Sale</th>\n",
" <th>Quality</th>\n",
" <th>Condition</th>\n",
" <th>Appearance</th>\n",
" <th>Storage</th>\n",
" <th>Crop</th>\n",
" <th>Repack</th>\n",
" <th>Trans Mode</th>\n",
" <th>Unnamed: 24</th>\n",
" <th>Unnamed: 25</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4/29/17</td>\n",
" <td>270.0</td>\n",
" <td>280.0</td>\n",
" <td>270.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>E</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>5/6/17</td>\n",
" <td>270.0</td>\n",
" <td>280.0</td>\n",
" <td>270.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>E</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>9/24/16</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>9/24/16</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>11/5/16</td>\n",
" <td>90.0</td>\n",
" <td>100.0</td>\n",
" <td>90.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 26 columns</p>\n",
"</div>"
],
"text/plain": [
" City Name Type Package Variety Sub Variety Grade Date \\\n",
"0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n",
"1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
"2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
"3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
"4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
"\n",
" Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n",
"0 270.0 280.0 270.0 ... NaN NaN NaN \n",
"1 270.0 280.0 270.0 ... NaN NaN NaN \n",
"2 160.0 160.0 160.0 ... NaN NaN NaN \n",
"3 160.0 160.0 160.0 ... NaN NaN NaN \n",
"4 90.0 100.0 90.0 ... NaN NaN NaN \n",
"\n",
" Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
"0 NaN NaN NaN E NaN NaN NaN \n",
"1 NaN NaN NaN E NaN NaN NaN \n",
"2 NaN NaN NaN N NaN NaN NaN \n",
"3 NaN NaN NaN N NaN NaN NaN \n",
"4 NaN NaN NaN N NaN NaN NaN \n",
"\n",
"[5 rows x 26 columns]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"full_pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
"\n",
"full_pumpkins.head()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.1"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "dee08c2b49057b0de8b6752c4dbca368",
"translation_date": "2025-09-06T11:40:34+00:00",
"source_file": "2-Regression/4-Logistic/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,690 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## လော့ဂစ်စတစ် ရီဂရက်ရှင်း မော်ဒယ် တည်ဆောက်ခြင်း - သင်ခန်းစာ ၄\n",
"\n",
"![လင်းနီးယားနှင့် လော့ဂစ်စတစ် ရီဂရက်ရှင်း အင်ဖိုဂရပ်](../../../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png)\n",
"\n",
"#### **[သင်ခန်းစာမတိုင်မီ စမ်းမေးခွန်း](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n",
"\n",
"#### အကျဉ်းချုပ်\n",
"\n",
"ဒီသင်ခန်းစာမှာ ရီဂရက်ရှင်းနဲ့ပတ်သက်တဲ့ *ရိုးရာ* ML နည်းလမ်းတစ်ခုဖြစ်တဲ့ လော့ဂစ်စတစ် ရီဂရက်ရှင်းကို လေ့လာသွားမှာဖြစ်ပါတယ်။ ဒီနည်းလမ်းကို သုံးပြီး binary categories (နှစ်မျိုးသာရှိတဲ့ အုပ်စုများ) ကိုခန့်မှန်းနိုင်ဖို့ ပုံစံတွေ ရှာဖွေမှာဖြစ်ပါတယ်။ ဥပမာ - ဒီချောကလက်က chocolate ဖြစ်မလား? ဒီရောဂါက ကူးစက်နိုင်မလား? ဒီဖောက်သည်က ဒီထုတ်ကုန်ကို ရွေးချယ်မလား?\n",
"\n",
"ဒီသင်ခန်းစာမှာ သင်လေ့လာနိုင်မယ့်အရာတွေက:\n",
"\n",
"- လော့ဂစ်စတစ် ရီဂရက်ရှင်းနည်းလမ်းများ\n",
"\n",
"✅ ဒီလိုရီဂရက်ရှင်းနဲ့ ပိုမိုနက်နက်ရှိုင်းရှိုင်း လေ့လာချင်ရင် ဒီ [Learn module](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott) ကိုကြည့်ပါ။\n",
"\n",
"## ကြိုတင်လိုအပ်ချက်\n",
"\n",
"Pumpkin data နဲ့အလုပ်လုပ်ပြီးသားဖြစ်တဲ့အတွက်၊ အခုတော့ binary category တစ်ခုကို အလုပ်လုပ်ဖို့ ရင်းနှီးလာပြီးဖြစ်ပါတယ်။ အဲဒါကတော့ `Color` ပါ။\n",
"\n",
"အခုတော့ လော့ဂစ်စတစ် ရီဂရက်ရှင်း မော်ဒယ်တစ်ခု တည်ဆောက်ပြီး၊ အချို့သော variable တွေကို အခြေခံပြီး *ပျဉ်ပြားတစ်ခုရဲ့ အရောင်က ဘယ်လိုဖြစ်နိုင်မလဲ* (လိမ္မော်ရောင် 🎃 ဒါမှမဟုတ် အဖြူရောင် 👻) ဆိုတာ ခန့်မှန်းကြည့်ရအောင်။\n",
"\n",
"> ဘာကြောင့် ရီဂရက်ရှင်းနဲ့ပတ်သက်တဲ့ သင်ခန်းစာအုပ်စုတစ်ခုမှာ binary classification ကို ပြောနေတာလဲ? ဒီဟာက စကားလုံးအသုံးအနှုန်းအဆင်ပြေမှုအတွက်သာဖြစ်ပါတယ်၊ လော့ဂစ်စတစ် ရီဂရက်ရှင်းက [တကယ်တော့ classification နည်းလမ်းတစ်ခု](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) ဖြစ်ပါတယ်၊ သို့သော် linear-based ဖြစ်ပါတယ်။ အခြား classification နည်းလမ်းတွေကို နောက်သင်ခန်းစာအုပ်စုမှာ လေ့လာနိုင်ပါတယ်။\n",
"\n",
"ဒီသင်ခန်းစာအတွက် လိုအပ်မယ့် package တွေက:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) က [R packages အစုတစ်စု](https://www.tidyverse.org/packages) ဖြစ်ပြီး၊ ဒေတာသိပ္ပံကို ပိုမိုလျင်မြန်စေပြီး လွယ်ကူစေကာ ပျော်ရွှင်စေပါတယ်။\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) framework က [packages အစုတစ်စု](https://www.tidymodels.org/packages/) ဖြစ်ပြီး၊ မော်ဒယ်တည်ဆောက်ခြင်းနှင့် machine learning အတွက် အသုံးပြုနိုင်ပါတယ်။\n",
"\n",
"- `janitor`: [janitor package](https://github.com/sfirke/janitor) က အညစ်အကြေးဒေတာတွေကို စစ်ဆေးပြီး သန့်ရှင်းစေဖို့ လွယ်ကူတဲ့ tools တွေ ပေးပါတယ်။\n",
"\n",
"- `ggbeeswarm`: [ggbeeswarm package](https://github.com/eclarke/ggbeeswarm) က ggplot2 ကို အသုံးပြုပြီး beeswarm ပုံစံ plot တွေ ဖန်တီးနိုင်စေတဲ့ နည်းလမ်းတွေ ပေးပါတယ်။\n",
"\n",
"ဒီ package တွေကို အောက်ပါအတိုင်း install လုပ်နိုင်ပါတယ်:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n",
"\n",
"အခြားနည်းလမ်းအနေနဲ့၊ အောက်ပါ script က သင့်မှာ ဒီ module ကို ပြီးမြောက်ဖို့ လိုအပ်တဲ့ package တွေ ရှိမရှိ စစ်ဆေးပြီး မရှိသေးရင် install လုပ်ပေးပါမယ်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## **မေးခွန်းကိုသတ်မှတ်ပါ**\n",
"\n",
"ကျွန်တော်တို့ရဲ့ရည်ရွယ်ချက်အရ၊ 'အဖြူ' သို့မဟုတ် 'အဖြူမဟုတ်' ဆိုတဲ့ binary အနေနဲ့ဖော်ပြပါမယ်။ ကျွန်တော်တို့ရဲ့ dataset မှာ 'striped' ဆိုတဲ့အမျိုးအစားလည်းရှိပေမယ့် အရေအတွက်နည်းနည်းသာရှိလို့ မသုံးတော့ပါဘူး။ Null values တွေကို dataset မှာဖယ်ရှားလိုက်တဲ့အခါမှာလည်း အဲဒီအမျိုးအစားကပျောက်သွားပါတယ်။\n",
"\n",
"> 🎃 အလွဲလွဲအချို့က အဖြူရောင်ဖရုံသီးတွေကို 'တစ်ဆိတ်' ဖရုံသီးလို့ခေါ်တယ်။ carving လုပ်ဖို့လွယ်ကူတဲ့အရာမဟုတ်လို့ လူကြိုက်များတဲ့လိမ္မော်ရောင်ဖရုံသီးတွေလိုမဟုတ်ပေမယ့် အရမ်းမိုက်တယ်။ ဒါကြောင့် ကျွန်တော်တို့ရဲ့မေးခွန်းကို 'တစ်ဆိတ်' သို့မဟုတ် 'တစ်ဆိတ်မဟုတ်' လို့ပြန်လည်ဖော်ပြနိုင်ပါတယ်။ 👻\n",
"\n",
"## **Logistic regression အကြောင်း**\n",
"\n",
"Logistic regression ဟာ linear regression နဲ့အရေးပါတဲ့အချက်အချို့မှာကွဲပြားပါတယ်။ Linear regression ကိုမကြာသေးခင်ကလေ့လာခဲ့ပြီးသားဖြစ်ပါတယ်။\n",
"\n",
"#### **Binary classification**\n",
"\n",
"Logistic regression ဟာ linear regression ရဲ့ features တွေကိုမပေးပါဘူး။ Logistic regression က `binary category` (\"လိမ္မော်ရောင် သို့မဟုတ် လိမ္မော်ရောင်မဟုတ်\") ကိုခန့်မှန်းပေးနိုင်ပြီး linear regression ကတော့ `continual values` တွေကိုခန့်မှန်းနိုင်ပါတယ်။ ဥပမာအားဖြင့် ဖရုံသီးရဲ့မူလနေရာနဲ့ရိတ်သိမ်းချိန်အပေါ်မူတည်ပြီး *ဈေးနှုန်းဘယ်လောက်တက်မလဲ* ဆိုတာကိုခန့်မှန်းနိုင်ပါတယ်။\n",
"\n",
"![Dasani Madipalli ရဲ့ Infographic](../../../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png)\n",
"\n",
"### အခြား classification မျိုးစုံ\n",
"\n",
"Logistic regression ရဲ့အခြားမျိုးစုံတွေမှာ multinomial နဲ့ ordinal ပါဝင်ပါတယ်:\n",
"\n",
"- **Multinomial** - အမျိုးအစားတစ်ခုထက်ပိုရှိတဲ့အခါမှာသုံးတယ်။ \"လိမ္မော်ရောင်၊ အဖြူရောင်၊ နောက်ပြီး Striped\"။\n",
"\n",
"- **Ordinal** - အစီအစဉ်ရှိတဲ့အမျိုးအစားတွေကိုသုံးတယ်။ ဥပမာအားဖြင့် ဖရုံသီးတွေကို mini, sm, med, lg, xl, xxl ဆိုတဲ့အရွယ်အစားအတိုင်းအစီအစဉ်ထားချင်တဲ့အခါမှာအသုံးဝင်တယ်။\n",
"\n",
"![Multinomial vs ordinal regression](../../../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png)\n",
"\n",
"#### **Variables တွေကို correlation မလိုအပ်ပါ**\n",
"\n",
"Linear regression ဟာ variables တွေကပို correlation ရှိရင်ပိုကောင်းတယ်ဆိုတာကိုသတိရပါ။ Logistic regression ကတော့အတိအကျဆန့်ကျင်ဘက်ဖြစ်ပြီး variables တွေ alignment မလိုအပ်ပါဘူး။ ဒါဟာ correlation အနည်းငယ်ရှိတဲ့ဒီ data အတွက်အဆင်ပြေပါတယ်။\n",
"\n",
"#### **သန့်ရှင်းတဲ့ data အများကြီးလိုအပ်ပါတယ်**\n",
"\n",
"Logistic regression ဟာ data ပိုများရင်ပိုတိကျတဲ့ရလဒ်တွေကိုပေးနိုင်ပါတယ်။ ကျွန်တော်တို့ dataset ကအရမ်းသေးလို့ ဒီ task အတွက်မအကောင်းဆုံးဖြစ်တာကိုသတိထားပါ။\n",
"\n",
"✅ Logistic regression အတွက်သင့်တော်တဲ့ data အမျိုးအစားတွေကိုစဉ်းစားပါ\n",
"\n",
"## လေ့ကျင့်ခန်း - data ကို tidy လုပ်ပါ\n",
"\n",
"အရင်ဆုံး data ကိုအနည်းငယ်သန့်စင်ပြီး null values တွေကိုဖယ်ရှားပြီး column အချို့ကိုသာရွေးပါ:\n",
"\n",
"1. အောက်ပါ code ကိုထည့်ပါ:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Load the core tidyverse packages\n",
"library(tidyverse)\n",
"\n",
"# Import the data and clean column names\n",
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n",
" clean_names()\n",
"\n",
"# Select desired columns\n",
"pumpkins_select <- pumpkins %>% \n",
" select(c(city_name, package, variety, origin, item_size, color)) \n",
"\n",
"# Drop rows containing missing values and encode color as factor (category)\n",
"pumpkins_select <- pumpkins_select %>% \n",
" drop_na() %>% \n",
" mutate(color = factor(color))\n",
"\n",
"# View the first few rows\n",
"pumpkins_select %>% \n",
" slice_head(n = 5)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"သင့်ရဲ့ dataframe အသစ်ကို ကြည့်ရှုလိုပါက [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) function ကို အောက်ပါအတိုင်း အသုံးပြုနိုင်ပါတယ်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"pumpkins_select %>% \n",
" glimpse()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"အခုကျွန်တော်တို့ လုပ်မယ့်အလုပ်က binary classification problem တစ်ခုဖြစ်မယ်ဆိုတာ အတည်ပြုကြရအောင်:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Subset distinct observations in outcome column\n",
"pumpkins_select %>% \n",
" distinct(color)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### အမျိုးအစားအလိုက် ပုံဖော်မှု - ကဏ္ဍပုံကြမ်း\n",
"အခုအချိန်မှာ သင်သည် ဖရုံသီးဒေတာကို ထပ်မံတင်ပြီး၊ အချို့သော အပြောင်းအလဲများ (Color အပါအဝင်) ပါဝင်သော ဒေတာစနစ်တစ်ခုကို ထိန်းသိမ်းထားနိုင်ရန် သန့်ရှင်းစင်ကြယ်အောင် ပြင်ဆင်ပြီးဖြစ်ပါသည်။ ယခု ggplot စာကြည့်တိုက်ကို အသုံးပြု၍ notebook အတွင်းရှိ dataframe ကို ပုံဖော်ကြည့်ပါမည်။\n",
"\n",
"ggplot စာကြည့်တိုက်သည် သင့်ဒေတာကို ပုံဖော်ရန် အလွန်ကောင်းမွန်သော နည်းလမ်းများကို ပေးစွမ်းနိုင်ပါသည်။ ဥပမာအားဖြင့်၊ သင်သည် Variety နှင့် Color အလိုက် ဒေတာဖြန့်ဖြူးမှုများကို ကဏ္ဍပုံကြမ်းတစ်ခုဖြင့် နှိုင်းယှဉ်ကြည့်နိုင်ပါသည်။\n",
"\n",
"1. geombar function ကို အသုံးပြု၍ ဖရုံသီးဒေတာနှင့်အတူ ပုံကြမ်းတစ်ခုကို ဖန်တီးပါ၊ ဖရုံသီးအမျိုးအစား (လိမ္မော်ရောင် သို့မဟုတ် အဖြူရောင်) တစ်ခုစီအတွက် အရောင် mapping ကို သတ်မှတ်ပါ:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "python"
}
},
"outputs": [],
"source": [
"# Specify colors for each value of the hue variable\n",
"palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
"\n",
"# Create the bar plot\n",
"ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n",
" geom_bar(position = \"dodge\") +\n",
" scale_fill_manual(values = palette) +\n",
" labs(y = \"Variety\", fill = \"Color\") +\n",
" theme_minimal()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ဒေတာကိုကြည့်ရှုခြင်းအားဖြင့် Color ဒေတာသည် Variety နှင့် ဘယ်လိုဆက်စပ်နေသည်ကို တွေ့နိုင်ပါသည်။\n",
"\n",
"✅ ဒီအမျိုးအစားအလိုက် ပုံစံကိုကြည့်ပြီး၊ သင်စိတ်ဝင်စားဖွယ် ရှာဖွေမှုများ ဘယ်လိုလုပ်နိုင်မလဲဆိုတာ စဉ်းစားကြည့်ပါ။\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ဒေတာကြိုတင်အလုပ်လုပ်ခြင်း: လက္ခဏာအင်ကိုဒင်း\n",
"\n",
"ကျွန်တော်တို့ရဲ့ ဖရုံသီးဒေတာစုပေါင်းမှုမှာ ကော်လံအားလုံးအတွက် စာသားတန်ဖိုးတွေပါဝင်ပါတယ်။ လူတွေအတွက် အမျိုးအစားဒေတာနဲ့ အလုပ်လုပ်တာက အလွယ်တကူနားလည်နိုင်ပေမယ့်၊ စက်တွေအတွက်တော့ မဟုတ်ပါဘူး။ စက်သင်ယူအယ်လဂိုရီသမ်တွေက နံပါတ်တွေနဲ့ အလုပ်လုပ်ရင် ပိုကောင်းပါတယ်။ ဒါကြောင့် အမျိုးအစားဒေတာတွေကို နံပါတ်ဒေတာတွေဖြစ်အောင် ပြောင်းလဲပေးတဲ့ လက္ခဏာအင်ကိုဒင်းအဆင့်ဟာ ဒေတာကြိုတင်အလုပ်လုပ်ခြင်းအဆင့်မှာ အရေးကြီးပါတယ်။ ကောင်းမွန်တဲ့အင်ကိုဒင်းက ကောင်းမွန်တဲ့မော်ဒယ်တည်ဆောက်နိုင်စေပါတယ်။\n",
"\n",
"လက္ခဏာအင်ကိုဒင်းအတွက် အဓိကအင်ကိုဒါအမျိုးအစားနှစ်မျိုးရှိပါတယ်-\n",
"\n",
"1. **Ordinal encoder**: ဒါဟာ အဆင့်လိုက်အမျိုးအစားအတွက် သင့်တော်ပါတယ်။ အဆင့်လိုက်အမျိုးအစားဆိုတာက အမျိုးအစားဒေတာတွေဖြစ်ပြီး၊ ဒေတာတွေမှာ အဆင့်လိုက်အလျောက်စဉ်လိုက်နေတဲ့အခါပါ။ ဥပမာ- ကျွန်တော်တို့ရဲ့ ဒေတာစုပေါင်းမှုမှာ `item_size` ကော်လံလိုမျိုးပါ။ Ordinal encoder က အမျိုးအစားတစ်ခုစီကို နံပါတ်တစ်ခုနဲ့ ဖန်တီးပေးပြီး၊ အဲ့ဒီနံပါတ်ဟာ ကော်လံထဲမှာ အမျိုးအစားရဲ့ အဆင့်စဉ်လိုက်ဖြစ်ပါတယ်။\n",
"\n",
"2. **Categorical encoder**: ဒါဟာ အမည်လိုက်အမျိုးအစားအတွက် သင့်တော်ပါတယ်။ အမည်လိုက်အမျိုးအစားဆိုတာက အမျိုးအစားဒေတာတွေဖြစ်ပြီး၊ ဒေတာတွေမှာ အဆင့်လိုက်စဉ်မရှိတဲ့အခါပါ။ ဥပမာ- ကျွန်တော်တို့ရဲ့ ဒေတာစုပေါင်းမှုမှာ `item_size` ကွဲပြားမှုအပြင် အခြားသောလက္ခဏာအားလုံးလိုမျိုးပါ။ Categorical encoder က တစ်ခုချင်းစီအမျိုးအစားကို binary ကော်လံတစ်ခုနဲ့ ဖန်တီးပေးပါတယ်။ အဲ့ဒီ encoded variable ဟာ ဖရုံသီးက အဲ့ဒီ Variety ကိုယ်စားပြုရင် 1 ဖြစ်ပြီး၊ မဟုတ်ရင် 0 ဖြစ်ပါတယ်။\n",
"\n",
"Tidymodels က နောက်ထပ် အဆင်ပြေတဲ့ package တစ်ခုကို ပေးထားပါတယ်- [recipes](https://recipes.tidymodels.org/) ဆိုတဲ့ ဒေတာကြိုတင်အလုပ်လုပ်ဖို့အတွက် package တစ်ခုပါ။ ကျွန်တော်တို့ `recipe` တစ်ခုကို သတ်မှတ်ပြီး၊ အဲ့ဒီမှာ အားလုံးသော predictor ကော်လံတွေကို နံပါတ်အစုအဖြစ် encode လုပ်ဖို့ သတ်မှတ်ပါမယ်။ ပြီးတော့ `prep` ကို သုံးပြီး လိုအပ်တဲ့ အရေအတွက်တွေနဲ့ စာရင်းဇယားတွေကို ခန့်မှန်းပြီး၊ နောက်ဆုံးမှာ `bake` ကို သုံးပြီး အသစ်သော ဒေတာတွေအပေါ်မှာ အဲ့ဒီတွက်ချက်မှုတွေကို အကောင်အထည်ဖော်ပါမယ်။\n",
"\n",
"> ပုံမှန်အားဖြင့်၊ recipes ကို မော်ဒယ်တည်ဆောက်ဖို့ ကြိုတင်အလုပ်လုပ်တဲ့အခါမှာ အသုံးပြုကြပါတယ်။ ဒါဟာ ဒေတာစုပေါင်းမှုကို မော်ဒယ်တည်ဆောက်ဖို့ အဆင့်ဆင့်လုပ်ဆောင်ပေးဖို့ သတ်မှတ်ပေးပါတယ်။ အဲ့ဒီအခါမှာ `workflow()` ကို အသုံးပြုဖို့ အလွန်အရေးကြီးအကြံပြုပါတယ်၊ prep နဲ့ bake ကို ကိုယ်တိုင်သုံးမယ့်အစားပါ။ ကျွန်တော်တို့ ဒီအကြောင်းကို ခဏနောက်မှ ပြန်လည်ဆွေးနွေးပါမယ်။\n",
">\n",
"> ဒါပေမယ့် အခုအချိန်မှာတော့၊ recipes + prep + bake ကို အသုံးပြုပြီး ဒေတာစုပေါင်းမှုကို ဒေတာခွဲခြမ်းစိတ်ဖြာမှုအတွက် ပြင်ဆင်ဖို့ လုပ်ဆောင်ရမယ့် အဆင့်တွေကို သတ်မှတ်ပြီး၊ အဲ့ဒီအဆင့်တွေကို အကောင်အထည်ဖော်ထားတဲ့ ဒေတာကို ထုတ်ယူဖို့ သုံးနေပါတယ်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Preprocess and extract data to allow some data analysis\n",
"baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n",
" # Define ordering for item_size column\n",
" step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
" # Convert factors to numbers using the order defined above (Ordinal encoding)\n",
" step_integer(item_size, zero_based = F) %>%\n",
" # Encode all other predictors using one hot encoding\n",
" step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n",
" prep(data = pumpkin_select) %>%\n",
" bake(new_data = NULL)\n",
"\n",
"# Display the first few rows of preprocessed data\n",
"baked_pumpkins %>% \n",
" slice_head(n = 5)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"✅ Item Size ကော်လံအတွက် ordinal encoder ကိုသုံးခြင်း၏ အကျိုးကျေးဇူးများကဘာလဲ?\n",
"\n",
"### အပြောင်းအလဲများအကြား ဆက်စပ်မှုများကို ခွဲခြမ်းစိတ်ဖြာပါ\n",
"\n",
"အခုတော့ ကျွန်တော်တို့ရဲ့ ဒေတာကို ကြိုတင်လုပ်ဆောင်ပြီးဖြစ်တဲ့အတွက်၊ feature တွေနဲ့ label အကြား ဆက်စပ်မှုတွေကို ခွဲခြမ်းစိတ်ဖြာနိုင်ပါပြီ။ ဒါကတော့ feature တွေကို အသုံးပြုပြီး label ကို မော်ဒယ်က ဘယ်လောက်တိကျစွာ ခန့်မှန်းနိုင်မလဲဆိုတာကို နားလည်ဖို့ အထောက်အကူဖြစ်စေမှာပါ။ ဒီလို ခွဲခြမ်းစိတ်ဖြာမှုကို လုပ်ဆောင်ဖို့ အကောင်းဆုံးနည်းလမ်းကတော့ ဒေတာကို ပုံဖော်ဖို့ ဖြစ်ပါတယ်။\n",
"\n",
"ဒီအတွက် ကျွန်တော်တို့ ggplot geom_boxplot_ function ကို ထပ်မံအသုံးပြုမှာဖြစ်ပြီး၊ Item Size, Variety နဲ့ Color တို့အကြား ဆက်စပ်မှုတွေကို categorical plot အနေနဲ့ မြင်နိုင်အောင် ပြသမှာဖြစ်ပါတယ်။ ဒေတာကို ပိုမိုကောင်းမွန်စွာ ပုံဖော်နိုင်ဖို့အတွက် encoded Item Size ကော်လံနဲ့ unencoded Variety ကော်လံကို အသုံးပြုသွားမှာ ဖြစ်ပါတယ်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Define the color palette\n",
"palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
"\n",
"# We need the encoded Item Size column to use it as the x-axis values in the plot\n",
"pumpkins_select_plot<-pumpkins_select\n",
"pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n",
"\n",
"# Create the grouped box plot\n",
"ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n",
" geom_boxplot() +\n",
" facet_grid(variety ~ ., scales = \"free_x\") +\n",
" scale_fill_manual(values = palette) +\n",
" labs(x = \"Item Size\", y = \"\") +\n",
" theme_minimal() +\n",
" theme(strip.text = element_text(size = 12)) +\n",
" theme(axis.text.x = element_text(size = 10)) +\n",
" theme(axis.title.x = element_text(size = 12)) +\n",
" theme(axis.title.y = element_blank()) +\n",
" theme(legend.position = \"bottom\") +\n",
" guides(fill = guide_legend(title = \"Color\")) +\n",
" theme(panel.spacing = unit(0.5, \"lines\"))+\n",
" theme(strip.text.y = element_text(size = 4, hjust = 0)) \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### အုပ်စုပျံ့ပုံ (Swarm Plot) ကို အသုံးပြုပါ\n",
"\n",
"Color သည် binary အမျိုးအစား (အဖြူရောင် သို့မဟုတ် အဖြူမဟုတ်) ဖြစ်သောကြောင့်၊ ၎င်းကို 'မြင်ကွင်းဖော်ပြရန် [အထူးနည်းလမ်း](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf) တစ်ခု' လိုအပ်ပါသည်။\n",
"\n",
"အုပ်စုပျံ့ပုံ (swarm plot) ကို အသုံးပြု၍ item_size နှင့်ဆိုင်သော color ၏ ဖြန့်ဖြူးမှုကို ဖော်ပြကြည့်ပါ။\n",
"\n",
"ဤအတွက် [ggbeeswarm package](https://github.com/eclarke/ggbeeswarm) ကို အသုံးပြုမည်ဖြစ်ပြီး၊ ၎င်းသည် ggplot2 ကို အသုံးပြု၍ beeswarm ပုံစံရှိသော ပုံများ ဖန်တီးရန် နည်းလမ်းများပေးသည်။ Beeswarm ပုံစံသည် သာမန်အားဖြင့် တစ်နေရာတည်းတွင် တိုးတက်မှုရှိမည့် အချက်များကို အနီးအနားတွင် ပြသနိုင်ရန် ဖော်ပြသည့် နည်းလမ်းတစ်ခုဖြစ်သည်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Create beeswarm plots of color and item_size\n",
"baked_pumpkins %>% \n",
" mutate(color = factor(color)) %>% \n",
" ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n",
" geom_quasirandom() +\n",
" scale_color_brewer(palette = \"Dark2\", direction = -1) +\n",
" theme(legend.position = \"none\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"အရောင်နှင့်အရွယ်အစားအုပ်စုကြီးတို့၏ binary အမျိုးအစားများအကြားဆက်နွယ်မှုကိုနားလည်ပြီးနောက်၊ သင့်ဖရုံသီးရဲ့အရောင်ဖြစ်နိုင်မှုကိုသတ်မှတ်ဖို့ logistic regression ကိုလေ့လာကြမယ်။\n",
"\n",
"## မော်ဒယ်ကိုတည်ဆောက်ပါ\n",
"\n",
"သင့် classification မော်ဒယ်မှာအသုံးပြုချင်တဲ့ variable တွေကိုရွေးချယ်ပြီး data ကို training set နဲ့ test set အဖြစ်ခွဲပါ။ [rsample](https://rsample.tidymodels.org/) ဟာ Tidymodels မှာပါဝင်တဲ့ package တစ်ခုဖြစ်ပြီး data ကိုထိရောက်စွာခွဲခြားခြင်းနဲ့ resampling အတွက်အခြေခံအဆောက်အအုံပေးပါတယ်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Split data into 80% for training and 20% for testing\n",
"set.seed(2056)\n",
"pumpkins_split <- pumpkins_select %>% \n",
" initial_split(prop = 0.8)\n",
"\n",
"# Extract the data in each split\n",
"pumpkins_train <- training(pumpkins_split)\n",
"pumpkins_test <- testing(pumpkins_split)\n",
"\n",
"# Print out the first 5 rows of the training set\n",
"pumpkins_train %>% \n",
" slice_head(n = 5)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"🙌 ယခုအခါ ကျွန်ုပ်တို့သည် သင်ကြားမှုအချက်အလက်များကို သင်ကြားမှုတံဆိပ် (အရောင်) နှင့် ကိုက်ညီစေရန် မော်ဒယ်ကို လေ့ကျင့်ရန် အသင့်ဖြစ်နေပါပြီ။\n",
"\n",
"မော်ဒယ်ဖန်တီးရန် အချက်အလက်များကို ပြင်ဆင်စေရန် လိုအပ်သော ကြိုတင်အဆင့်များကို ဖော်ပြသည့် recipe တစ်ခုကို စတင်ဖန်တီးပါမည်။ ဥပမာအားဖြင့် - အမျိုးအစားအချက်အလက်များကို ကိန်းဂဏန်းများအဖြစ် encode ပြုလုပ်ခြင်း။ `baked_pumpkins` နမူနာလိုပင်၊ `pumpkins_recipe` ကို ဖန်တီးပါမည်။ သို့သော် ယခုအချိန်တွင် `prep` နှင့် `bake` မပြုလုပ်သေးပါ၊ အကြောင်းမှာ ၎င်းကို workflow အတွင်းတွင် ထည့်သွင်းသွားမည်ဖြစ်ပြီး၊ အနည်းငယ်အဆင့်အနည်းငယ်အတွင်း တွေ့မြင်ရမည်ဖြစ်သည်။\n",
"\n",
"Tidymodels တွင် logistic regression မော်ဒယ်ကို ဖော်ပြနိုင်သော နည်းလမ်းများစွာ ရှိပါသည်။ `?logistic_reg()` ကို ကြည့်ပါ။ ယခုအချိန်တွင် `stats::glm()` engine ကို အသုံးပြု၍ logistic regression မော်ဒယ်ကို ပုံမှန်နည်းဖြင့် ဖော်ပြသွားပါမည်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Create a recipe that specifies preprocessing steps for modelling\n",
"pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n",
" step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
" step_integer(item_size, zero_based = F) %>% \n",
" step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n",
"\n",
"# Create a logistic model specification\n",
"log_reg <- logistic_reg() %>% \n",
" set_engine(\"glm\") %>% \n",
" set_mode(\"classification\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"အခုတော့ ကျွန်တော်တို့မှာ အစားအစာချက်ပြုတ်နည်းနဲ့ မော်ဒယ်သတ်မှတ်ချက်ရှိပြီးသားဖြစ်တဲ့အတွက်၊ အဲဒီနှစ်ခုကို ပေါင်းစပ်ပြီး အရာဝတ္ထုတစ်ခုအဖြစ် ဖန်တီးဖို့ လိုအပ်ပါတယ်။ အဲဒီအရာဝတ္ထုက ဒေတာကို ပထမဦးဆုံး ကြိုတင်လုပ်ဆောင်ပေးမယ် (prep+bake ကို နောက်ကွယ်မှာလုပ်ဆောင်ပေးမယ်)၊ ပြီးတော့ ကြိုတင်လုပ်ဆောင်ပြီးသား ဒေတာပေါ်မှာ မော်ဒယ်ကို အဆင်ပြေစွာ တပ်ဆင်ပေးမယ်။ ထို့အပြင် နောက်ဆက်တွဲလုပ်ဆောင်မှုများကိုလည်း လုပ်ဆောင်နိုင်စေမှာ ဖြစ်ပါတယ်။\n",
"\n",
"Tidymodels မှာတော့ ဒီအဆင်ပြေတဲ့ အရာဝတ္ထုကို [`workflow`](https://workflows.tidymodels.org/) လို့ခေါ်ပြီး မော်ဒယ်ဖွဲ့စည်းမှု အစိတ်အပိုင်းတွေကို အဆင်ပြေစွာ ထိန်းသိမ်းပေးပါတယ်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Bundle modelling components in a workflow\n",
"log_reg_wf <- workflow() %>% \n",
" add_recipe(pumpkins_recipe) %>% \n",
" add_model(log_reg)\n",
"\n",
"# Print out the workflow\n",
"log_reg_wf\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"workflow ကို *သတ်မှတ်ပြီး* ဖြစ်တဲ့အခါ၊ [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html) function ကို အသုံးပြုပြီး model ကို `လေ့ကျင့်`နိုင်ပါတယ်။ workflow က recipe ကို ခန့်မှန်းပြီး training မလုပ်မီ data ကို preprocess လုပ်ပေးမှာဖြစ်တဲ့အတွက် prep နဲ့ bake ကို ကိုယ်တိုင် လုပ်စရာမလိုတော့ပါ။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Train the model\n",
"wf_fit <- log_reg_wf %>% \n",
" fit(data = pumpkins_train)\n",
"\n",
"# Print the trained workflow\n",
"wf_fit\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"မော်ဒယ်ကိုလေ့ကျင့်စဉ်အတွင်း သင်ယူထားသော coefficients များကို print ထုတ်ပြသသည်။\n",
"\n",
"အခုတော့ လေ့ကျင့်မှုဒေတာကို အသုံးပြု၍ မော်ဒယ်ကိုလေ့ကျင့်ပြီးပြီဖြစ်သောကြောင့် [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) ကို အသုံးပြု၍ စမ်းသပ်မှုဒေတာပေါ်တွင် ခန့်မှန်းချက်များပြုလုပ်နိုင်ပါပြီ။ အရင်ဆုံး မော်ဒယ်ကို အသုံးပြု၍ စမ်းသပ်မှု data set အတွက် label များနှင့် label တစ်ခုချင်းစီအတွက် probability များကို ခန့်မှန်းကြည့်ပါမည်။ Probability သည် 0.5 ထက်ပိုရှိပါက ခန့်မှန်းထားသော class သည် `WHITE` ဖြစ်ပြီး 0.5 ထက်နည်းပါက `ORANGE` ဖြစ်သည်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Make predictions for color and corresponding probabilities\n",
"results <- pumpkins_test %>% select(color) %>% \n",
" bind_cols(wf_fit %>% \n",
" predict(new_data = pumpkins_test)) %>%\n",
" bind_cols(wf_fit %>%\n",
" predict(new_data = pumpkins_test, type = \"prob\"))\n",
"\n",
"# Compare predictions\n",
"results %>% \n",
" slice_head(n = 10)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ဒီဟာက logistic regression အလုပ်လုပ်ပုံကို ပိုမိုနားလည်စေဖို့ အချက်အလက်တွေ ပေးထားပါတယ်။\n",
"\n",
"### အလွယ်တကူ နားလည်နိုင်ဖို့ confusion matrix\n",
"\n",
"အကြိုတင်ခန့်မှန်းချက်တစ်ခုစီကို \"ground truth\" အဖြစ်မှန်တန်ဖိုးနဲ့ နှိုင်းယှဉ်တာက မော်ဒယ်က ခန့်မှန်းမှုအောင်မြင်မှုကို သတ်မှတ်ဖို့ အလွန်အကျွံ ထိရောက်တဲ့နည်းလမ်းမဟုတ်ပါဘူး။ ကံကောင်းစွာ Tidymodels မှာ အခြားနည်းလမ်းတွေ ရှိပါတယ်။ [`yardstick`](https://yardstick.tidymodels.org/) - performance metrics တွေကို အသုံးပြုပြီး မော်ဒယ်တွေ၏ ထိရောက်မှုကို တိုင်းတာဖို့ အသုံးပြုတဲ့ package တစ်ခုပါ။\n",
"\n",
"Classification ပြဿနာတွေနဲ့ ဆက်စပ်တဲ့ performance metric တစ်ခုက [`confusion matrix`](https://wikipedia.org/wiki/Confusion_matrix) ဖြစ်ပါတယ်။ Confusion matrix က classification မော်ဒယ်တစ်ခုရဲ့ အလုပ်လုပ်ပုံကို ဖော်ပြပေးပါတယ်။ Confusion matrix က မော်ဒယ်က class တစ်ခုစီမှာ အမှန်တကယ် ခွဲခြားနိုင်ခဲ့တဲ့ နမူနာအရေအတွက်ကို စာရင်းပြုစုပေးပါတယ်။ ကျွန်တော်တို့ရဲ့ အခြေအနေမှာတော့ orange pumpkins ကို orange အဖြစ် ခွဲခြားနိုင်ခဲ့တာ၊ white pumpkins ကို white အဖြစ် ခွဲခြားနိုင်ခဲ့တာ၊ နောက်ပြီး **မှားယွင်းတဲ့** အမျိုးအစားတွေထဲကို ခွဲခြားထားတာတွေကို ပြသပေးမှာ ဖြစ်ပါတယ်။\n",
"\n",
"[**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) function က yardstick မှာ observed classes နဲ့ predicted classes တွေကို cross-tabulation အဖြစ်တွက်ချက်ပေးပါတယ်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Confusion matrix for prediction results\n",
"conf_mat(data = results, truth = color, estimate = .pred_class)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"အခု ကျွန်တော်တို့ Confusion Matrix ကို နားလည်ကြည့်ကြမယ်။ ကျွန်တော်တို့ရဲ့ မော်ဒယ်ကို ဖရုံတွေကို `white` နဲ့ `not-white` ဆိုတဲ့ binary အမျိုးအစားနှစ်မျိုးအကြား ခွဲခြားဖို့ တောင်းဆိုထားပါတယ်။\n",
"\n",
"- မော်ဒယ်က ဖရုံတစ်လုံးကို `white` လို့ ခန့်မှန်းပြီး၊ အမှန်တကယ်မှာလည်း အဲဒီဖရုံက `white` အမျိုးအစားထဲမှာ ပါဝင်တယ်ဆိုရင်၊ ဒီလိုအခြေအနေကို `true positive` လို့ ခေါ်ပါတယ်။ ဒါကို အပေါ်ဘက် ဘယ်ဖက်နံပါတ်နဲ့ ပြထားပါတယ်။\n",
"\n",
"- မော်ဒယ်က ဖရုံတစ်လုံးကို `not white` လို့ ခန့်မှန်းပြီး၊ အမှန်တကယ်မှာတော့ အဲဒီဖရုံက `white` အမျိုးအစားထဲမှာ ပါဝင်တယ်ဆိုရင်၊ ဒီလိုအခြေအနေကို `false negative` လို့ ခေါ်ပါတယ်။ ဒါကို အောက်ဘက် ဘယ်ဖက်နံပါတ်နဲ့ ပြထားပါတယ်။\n",
"\n",
"- မော်ဒယ်က ဖရုံတစ်လုံးကို `white` လို့ ခန့်မှန်းပြီး၊ အမှန်တကယ်မှာတော့ အဲဒီဖရုံက `not-white` အမျိုးအစားထဲမှာ ပါဝင်တယ်ဆိုရင်၊ ဒီလိုအခြေအနေကို `false positive` လို့ ခေါ်ပါတယ်။ ဒါကို အပေါ်ဘက် ညာဖက်နံပါတ်နဲ့ ပြထားပါတယ်။\n",
"\n",
"- မော်ဒယ်က ဖရုံတစ်လုံးကို `not white` လို့ ခန့်မှန်းပြီး၊ အမှန်တကယ်မှာလည်း အဲဒီဖရုံက `not-white` အမျိုးအစားထဲမှာ ပါဝင်တယ်ဆိုရင်၊ ဒီလိုအခြေအနေကို `true negative` လို့ ခေါ်ပါတယ်။ ဒါကို အောက်ဘက် ညာဖက်နံပါတ်နဲ့ ပြထားပါတယ်။\n",
"\n",
"| Truth |\n",
"|:-----:|\n",
"\n",
"| | | |\n",
"|---------------|--------|-------|\n",
"| **Predicted** | WHITE | ORANGE |\n",
"| WHITE | TP | FP |\n",
"| ORANGE | FN | TN |\n",
"\n",
"သင်ခန့်မှန်းထားတဲ့အတိုင်း၊ `true positives` နဲ့ `true negatives` အရေအတွက်များပြီး၊ `false positives` နဲ့ `false negatives` အရေအတွက်နည်းရင် ပိုကောင်းပါတယ်။ ဒါက မော်ဒယ်က ပိုမိုကောင်းမွန်စွာ လုပ်ဆောင်နိုင်တယ်ဆိုတာကို ဖော်ပြပါတယ်။\n",
"\n",
"Confusion Matrix က အခြားသော metrics တွေကို ဖော်ထုတ်နိုင်စေပြီး၊ Classification Model ရဲ့ စွမ်းဆောင်ရည်ကို ပိုမိုကောင်းမွန်စွာ အကဲဖြတ်နိုင်စေပါတယ်။ အခု အဲဒီ metrics တွေကို ကြည့်ကြရအောင်။\n",
"\n",
"🎓 Precision: `TP/(TP + FP)` \n",
"အဓိပ္ပါယ်ကတော့ ခန့်မှန်းထားတဲ့ positive တွေထဲမှာ အမှန်တကယ် positive ဖြစ်တဲ့ အချိုးပါ။ [positive predictive value](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\") လို့လည်း ခေါ်တယ်။\n",
"\n",
"🎓 Recall: `TP/(TP + FN)` \n",
"အဓိပ္ပါယ်ကတော့ အမှန်တကယ် positive ဖြစ်တဲ့ sample တွေထဲမှာ positive အဖြေကို ခန့်မှန်းနိုင်တဲ့ အချိုးပါ။ `sensitivity` လို့လည်း သိတယ်။\n",
"\n",
"🎓 Specificity: `TN/(TN + FP)` \n",
"အဓိပ္ပါယ်ကတော့ အမှန်တကယ် negative ဖြစ်တဲ့ sample တွေထဲမှာ negative အဖြေကို ခန့်မှန်းနိုင်တဲ့ အချိုးပါ။\n",
"\n",
"🎓 Accuracy: `TP + TN/(TP + TN + FP + FN)` \n",
"အဓိပ္ပါယ်ကတော့ sample တစ်ခုရဲ့ label ကို မှန်ကန်စွာ ခန့်မှန်းနိုင်တဲ့ ရာခိုင်နှုန်းပါ။\n",
"\n",
"🎓 F Measure: Precision နဲ့ Recall တို့ရဲ့ weighted average ဖြစ်ပြီး၊ အကောင်းဆုံးက 1 ဖြစ်ပြီး အဆိုးဆုံးက 0 ဖြစ်ပါတယ်။\n",
"\n",
"အခုတော့ ဒီ metrics တွေကို တွက်ကြည့်ကြရအောင်!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Combine metric functions and calculate them all at once\n",
"eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n",
"eval_metrics(data = results, truth = color, estimate = .pred_class)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ဒီမော်ဒယ်ရဲ့ ROC curve ကိုမြင်နိုင်အောင် Visualization လုပ်ပါ\n",
"\n",
"အခုတော့ [`ROC curve`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) လို့ခေါ်တဲ့အရာကို မြင်နိုင်အောင် Visualization တစ်ခုထပ်လုပ်ကြည့်ရအောင်:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Make a roc_curve\n",
"results %>% \n",
" roc_curve(color, .pred_ORANGE) %>% \n",
" autoplot()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ROC curves များကို အများအားဖြင့် classifier ၏ true positives နှင့် false positives အချိုးအစားကို ကြည့်ရှုရန် အသုံးပြုကြသည်။ ROC curves တွင် `True Positive Rate`/Sensitivity ကို Y axis တွင် ပြသပြီး၊ `False Positive Rate`/1-Specificity ကို X axis တွင် ပြသလေ့ရှိသည်။ ထို့ကြောင့် curve ၏ တောင်တက်မှုနှင့် အလယ်လိုင်းနှင့် curve အကြားရှိ အကွာအဝေးသည် အရေးကြီးသည်။ သင်လိုချင်တာကတော့ လိုင်းသည် အမြန်တက်ပြီး အလယ်လိုင်းကို ကျော်သွားသော curve တစ်ခုဖြစ်သည်။ ကျွန်ုပ်တို့၏ အခွင့်အရေးတွင် false positives များစတင်ရှိပြီးနောက် လိုင်းသည် တက်ပြီး အကောင်းအတိုင်း ကျော်သွားသည်။\n",
"\n",
"နောက်ဆုံးတွင် `yardstick::roc_auc()` ကို အသုံးပြု၍ Area Under the Curve (AUC) ကို တွက်ချက်ကြမည်။ AUC ကို အဓိပ္ပာယ်ဖွင့်ဆိုသော နည်းလမ်းတစ်ခုမှာ မော်ဒယ်သည် အလွတ်ရွေးချယ်ထားသော positive ตัวอย่างတစ်ခုကို negative ตัวอย่างတစ်ခုထက် မြင့်မားစွာ အဆင့်သတ်မှတ်နိုင်မည့် အလားအလာအဖြစ် သတ်မှတ်နိုင်ခြင်းဖြစ်သည်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "r"
}
},
"outputs": [],
"source": [
"# Calculate area under curve\n",
"results %>% \n",
" roc_auc(color, .pred_ORANGE)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"AUC ရလဒ်မှာ `0.975` လောက်ရှိပါတယ်။ AUC ဟာ 0 ကနေ 1 အထိရှိပြီး၊ အမှန်တကယ်ခန့်မှန်းမှု 100% မှန်ကန်တဲ့မော်ဒယ်ဟာ AUC 1 ရှိမယ်။ ဒီအခြေအနေမှာတော့ မော်ဒယ်ဟာ *တော်တော်ကောင်း*ပါတယ်။\n",
"\n",
"အနာဂတ်မှာ Classification ပညာရပ်တွေအကြောင်းသင်ယူတဲ့အခါမှာ မော်ဒယ်ရဲ့အမှန်တကယ်မှန်ကန်မှုကိုတိုးတက်အောင်လုပ်နည်းတွေ (ဥပမာ ဒီအခါမှာလိုမျိုး data imbalance ကိုဖြေရှင်းနည်း) သင်ယူရပါမယ်။\n",
"\n",
"## 🚀စိန်ခေါ်မှု\n",
"\n",
"Logistic regression အကြောင်းမှာသိရှိစရာတွေတော်တော်များပါတယ်! ဒါပေမယ့် အကောင်းဆုံးသင်ယူနည်းကတော့ စမ်းသပ်လုပ်ဆောင်တာပါပဲ။ ဒီအမျိုးအစားအတွက်သင့်တော်တဲ့ dataset တစ်ခုရှာပြီး မော်ဒယ်တစ်ခုတည်ဆောက်ပါ။ သင်ဘာတွေသင်ယူရမလဲ? အကြံပြုချက်: [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) မှာစိတ်ဝင်စားဖွယ် dataset တွေရှာကြည့်ပါ။\n",
"\n",
"## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း\n",
"\n",
"Stanford မှ [ဒီစာတမ်း](https://web.stanford.edu/~jurafsky/slp3/5.pdf) ရဲ့ ပထမပိုင်းစာမျက်နှာတွေကိုဖတ်ပါ။ Logistic regression ရဲ့ လက်တွေ့အသုံးချနည်းများအကြောင်းကိုလေ့လာပါ။ ယခုအချိန်အထိသင်ယူခဲ့တဲ့ regression tasks တွေထဲမှာ ဘယ်အမျိုးအစားကပိုသင့်တော်မလဲဆိုတာကိုစဉ်းစားပါ။ ဘယ်ဟာကပိုအဆင်ပြေမလဲ?\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"langauge": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "feaf125f481a89c468fa115bf2aed580",
"translation_date": "2025-09-06T11:44:28+00:00",
"source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,267 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "5fa2e8f4584c78250ca9729b46562ceb",
"translation_date": "2025-09-06T12:21:31+00:00",
"source_file": "3-Web-App/1-Web-App/solution/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" datetime city state country shape \\\n",
"0 10/10/1949 20:30 san marcos tx us cylinder \n",
"1 10/10/1949 21:00 lackland afb tx NaN light \n",
"2 10/10/1955 17:00 chester (uk/england) NaN gb circle \n",
"3 10/10/1956 21:00 edna tx us circle \n",
"4 10/10/1960 20:00 kaneohe hi us light \n",
"\n",
" duration (seconds) duration (hours/min) \\\n",
"0 2700.0 45 minutes \n",
"1 7200.0 1-2 hrs \n",
"2 20.0 20 seconds \n",
"3 20.0 1/2 hour \n",
"4 900.0 15 minutes \n",
"\n",
" comments date posted latitude \\\n",
"0 This event took place in early fall around 194... 4/27/2004 29.883056 \n",
"1 1949 Lackland AFB&#44 TX. Lights racing acros... 12/16/2005 29.384210 \n",
"2 Green/Orange circular disc over Chester&#44 En... 1/21/2008 53.200000 \n",
"3 My older brother and twin sister were leaving ... 1/17/2004 28.978333 \n",
"4 AS a Marine 1st Lt. flying an FJ4B fighter/att... 1/22/2004 21.418056 \n",
"\n",
" longitude \n",
"0 -97.941111 \n",
"1 -98.581082 \n",
"2 -2.916667 \n",
"3 -96.645833 \n",
"4 -157.803611 "
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>datetime</th>\n <th>city</th>\n <th>state</th>\n <th>country</th>\n <th>shape</th>\n <th>duration (seconds)</th>\n <th>duration (hours/min)</th>\n <th>comments</th>\n <th>date posted</th>\n <th>latitude</th>\n <th>longitude</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>10/10/1949 20:30</td>\n <td>san marcos</td>\n <td>tx</td>\n <td>us</td>\n <td>cylinder</td>\n <td>2700.0</td>\n <td>45 minutes</td>\n <td>This event took place in early fall around 194...</td>\n <td>4/27/2004</td>\n <td>29.883056</td>\n <td>-97.941111</td>\n </tr>\n <tr>\n <th>1</th>\n <td>10/10/1949 21:00</td>\n <td>lackland afb</td>\n <td>tx</td>\n <td>NaN</td>\n <td>light</td>\n <td>7200.0</td>\n <td>1-2 hrs</td>\n <td>1949 Lackland AFB&amp;#44 TX. Lights racing acros...</td>\n <td>12/16/2005</td>\n <td>29.384210</td>\n <td>-98.581082</td>\n </tr>\n <tr>\n <th>2</th>\n <td>10/10/1955 17:00</td>\n <td>chester (uk/england)</td>\n <td>NaN</td>\n <td>gb</td>\n <td>circle</td>\n <td>20.0</td>\n <td>20 seconds</td>\n <td>Green/Orange circular disc over Chester&amp;#44 En...</td>\n <td>1/21/2008</td>\n <td>53.200000</td>\n <td>-2.916667</td>\n </tr>\n <tr>\n <th>3</th>\n <td>10/10/1956 21:00</td>\n <td>edna</td>\n <td>tx</td>\n <td>us</td>\n <td>circle</td>\n <td>20.0</td>\n <td>1/2 hour</td>\n <td>My older brother and twin sister were leaving ...</td>\n <td>1/17/2004</td>\n <td>28.978333</td>\n <td>-96.645833</td>\n </tr>\n <tr>\n <th>4</th>\n <td>10/10/1960 20:00</td>\n <td>kaneohe</td>\n <td>hi</td>\n <td>us</td>\n <td>light</td>\n <td>900.0</td>\n <td>15 minutes</td>\n <td>AS a Marine 1st Lt. flying an FJ4B fighter/att...</td>\n <td>1/22/2004</td>\n <td>21.418056</td>\n <td>-157.803611</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 23
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"ufos = pd.read_csv('../data/ufos.csv')\n",
"ufos.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['us', nan, 'gb', 'ca', 'au', 'de'], dtype=object)"
]
},
"metadata": {},
"execution_count": 24
}
],
"source": [
"\n",
"ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})\n",
"\n",
"ufos.Country.unique()\n",
"\n",
"# 0 au, 1 ca, 2 de, 3 gb, 4 us"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"<class 'pandas.core.frame.DataFrame'>\nInt64Index: 25863 entries, 2 to 80330\nData columns (total 4 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 Seconds 25863 non-null float64\n 1 Country 25863 non-null object \n 2 Latitude 25863 non-null float64\n 3 Longitude 25863 non-null float64\ndtypes: float64(3), object(1)\nmemory usage: 1010.3+ KB\n"
]
}
],
"source": [
"ufos.dropna(inplace=True)\n",
"\n",
"ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]\n",
"\n",
"ufos.info()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Seconds Country Latitude Longitude\n",
"2 20.0 3 53.200000 -2.916667\n",
"3 20.0 4 28.978333 -96.645833\n",
"14 30.0 4 35.823889 -80.253611\n",
"23 60.0 4 45.582778 -122.352222\n",
"24 3.0 3 51.783333 -0.783333"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Seconds</th>\n <th>Country</th>\n <th>Latitude</th>\n <th>Longitude</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2</th>\n <td>20.0</td>\n <td>3</td>\n <td>53.200000</td>\n <td>-2.916667</td>\n </tr>\n <tr>\n <th>3</th>\n <td>20.0</td>\n <td>4</td>\n <td>28.978333</td>\n <td>-96.645833</td>\n </tr>\n <tr>\n <th>14</th>\n <td>30.0</td>\n <td>4</td>\n <td>35.823889</td>\n <td>-80.253611</td>\n </tr>\n <tr>\n <th>23</th>\n <td>60.0</td>\n <td>4</td>\n <td>45.582778</td>\n <td>-122.352222</td>\n </tr>\n <tr>\n <th>24</th>\n <td>3.0</td>\n <td>3</td>\n <td>51.783333</td>\n <td>-0.783333</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 26
}
],
"source": [
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])\n",
"\n",
"ufos.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"Selected_features = ['Seconds','Latitude','Longitude']\n",
"\n",
"X = ufos[Selected_features]\n",
"y = ufos['Country']\n",
"\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
" FutureWarning)\n",
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
" \"this warning.\", FutureWarning)\n",
" precision recall f1-score support\n",
"\n",
" 0 1.00 1.00 1.00 41\n",
" 1 1.00 0.02 0.05 250\n",
" 2 0.00 0.00 0.00 8\n",
" 3 0.94 1.00 0.97 131\n",
" 4 0.95 1.00 0.97 4743\n",
"\n",
" accuracy 0.95 5173\n",
" macro avg 0.78 0.60 0.60 5173\n",
"weighted avg 0.95 0.95 0.93 5173\n",
"\n",
"Predicted labels: [4 4 4 ... 3 4 4]\n",
"Accuracy: 0.9512855209742895\n",
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/metrics/classification.py:1437: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.\n",
" 'precision', 'predicted', average, warn_for)\n"
]
}
],
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score, classification_report \n",
"from sklearn.linear_model import LogisticRegression\n",
"model = LogisticRegression()\n",
"model.fit(X_train, y_train)\n",
"predictions = model.predict(X_test)\n",
"\n",
"print(classification_report(y_test, predictions))\n",
"print('Predicted labels: ', predictions)\n",
"print('Accuracy: ', accuracy_score(y_test, predictions))\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[3]\n"
]
}
],
"source": [
"import pickle\n",
"model_filename = 'ufo-model.pkl'\n",
"pickle.dump(model, open(model_filename,'wb'))\n",
"\n",
"model = pickle.load(open('ufo-model.pkl','rb'))\n",
"print(model.predict([[50,44,-12]]))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,39 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "d544ef384b7ba73757d830a72372a7f2",
"translation_date": "2025-09-06T12:33:38+00:00",
"source_file": "4-Classification/1-Introduction/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,714 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
"translation_date": "2025-09-06T12:37:36+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "my"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## အမျိုးအစားသတ်မှတ်ခြင်းကိုနားလည်ခြင်း - ဒေတာကိုသန့်စင်၊ ပြင်ဆင်၊ ရှုထောင့်မှကြည့်ရှုခြင်း\n",
"\n",
"ဒီသင်ခန်းစာလေး ၄ ခုမှာ သင်သည် ရိုးရာစက်မှုသင်ယူမှု၏ အခြေခံအချက်တစ်ခုဖြစ်သော *အမျိုးအစားသတ်မှတ်ခြင်း* ကိုလေ့လာပါမည်။ အာရှနှင့်အိန္ဒိယ၏ အံ့ဩဖွယ်အစားအစာများနှင့်ပတ်သက်သော ဒေတာစဉ်ကို အသုံးပြု၍ အမျိုးအစားသတ်မှတ်ခြင်းအယ်လဂိုရီသမ်များကို သင်ကြားပေးပါမည်။ အစားအသောက်အတွက် အဆာပြေဖို့ ပြင်ဆင်ထားပါ!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>ဒီသင်ခန်းစာများတွင် အာရှအစားအစာများကို ကျေးဇူးတင်ပါ။ ဓာတ်ပုံ - Jen Looper</figcaption>\n",
"\n",
"<!--![Celebrate pan-Asian cuisines in these lessons! Image by Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"အမျိုးအစားသတ်မှတ်ခြင်းသည် [supervised learning](https://wikipedia.org/wiki/Supervised_learning) ၏ အမျိုးအစားတစ်ခုဖြစ်ပြီး regression နည်းလမ်းများနှင့် ဆင်တူသော အချက်များစွာပါရှိသည်။ အမျိုးအစားသတ်မှတ်ခြင်းတွင် သင်သည် `category` တစ်ခုကို အရာဝတ္ထုတစ်ခုက ဘယ်အမျိုးအစားတွင် ပါဝင်မည်ကို ခန့်မှန်းရန် မော်ဒယ်ကို လေ့ကျင့်သည်။ စက်မှုသင်ယူမှုသည် ဒေတာစဉ်များကို အသုံးပြု၍ တန်ဖိုးများ သို့မဟုတ် အမည်များကို ခန့်မှန်းခြင်းနှင့် ပတ်သက်သည်ဆိုပါက အမျိုးအစားသတ်မှတ်ခြင်းသည် *binary classification* နှင့် *multiclass classification* ဆိုသော အုပ်စု ၂ ခုအတွင်းတွင် ကျရောက်သည်။\n",
"\n",
"သတိပြုပါ-\n",
"\n",
"- **Linear regression** သည် variable များအကြား ဆက်နွယ်မှုများကို ခန့်မှန်းရန်နှင့် ဒေတာအချက်အလက်အသစ်တစ်ခုသည် အဆိုပါလိုင်းနှင့် ဆက်နွယ်မှုအတွင်း ဘယ်နေရာတွင် ကျရောက်မည်ကို မှန်ကန်စွာခန့်မှန်းရန် ကူညီပေးသည်။ ဥပမာအားဖြင့် *သွားရည်တစ်ခု၏ စျေးနှုန်းသည် စက်တင်ဘာနှင့် ဒီဇင်ဘာတွင် ဘယ်လိုဖြစ်မည်* ဆိုသည်ကို ခန့်မှန်းနိုင်သည်။\n",
"\n",
"- **Logistic regression** သည် \"binary categories\" ကို ရှာဖွေရာတွင် ကူညီပေးသည်။ ဥပမာအားဖြင့် *ဤစျေးနှုန်းတွင် သွားရည်သည် လိမ္မော်ရောင်ဖြစ်မည် သို့မဟုတ် မဖြစ်မည်*?\n",
"\n",
"အမျိုးအစားသတ်မှတ်ခြင်းသည် ဒေတာအချက်အလက်၏ label သို့မဟုတ် class ကို သတ်မှတ်ရန် အခြားနည်းလမ်းများကို သတ်မှတ်ရန် အယ်လဂိုရီသမ်များကို အသုံးပြုသည်။ ဒီအစားအစာဒေတာကို အသုံးပြု၍ အဖွဲ့တစ်ခု၏ အစိတ်အပိုင်းများကို ကြည့်ရှုခြင်းဖြင့် အစားအစာ၏ မူရင်းကို သတ်မှတ်နိုင်မည်ဖြစ်သည်။\n",
"\n",
"### [**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **နိဒါန်း**\n",
"\n",
"အမျိုးအစားသတ်မှတ်ခြင်းသည် စက်မှုသင်ယူမှုသုတေသနရှင်နှင့် ဒေတာသိပ္ပံပညာရှင်၏ အခြေခံလုပ်ငန်းစဉ်များထဲမှ တစ်ခုဖြစ်သည်။ binary value (\"ဤအီးမေးလ်သည် spam ဖြစ်ပါသလား မဖြစ်ပါသလား\") ကို ရိုးရှင်းစွာ သတ်မှတ်ခြင်းမှစ၍ computer vision ကို အသုံးပြု၍ ရုပ်ပုံအမျိုးအစားသတ်မှတ်ခြင်းနှင့် segmentation အထိ၊ ဒေတာကို အမျိုးအစားများအလိုက် သတ်မှတ်ရန်နှင့် မေးခွန်းများမေးရန် အမြဲအသုံးဝင်သည်။\n",
"\n",
"သိပ္ပံပညာရပ်ဆန်သော နည်းလမ်းဖြင့် ပြောရမည်ဆိုပါက သင်၏ အမျိုးအစားသတ်မှတ်ခြင်းနည်းလမ်းသည် input variable များနှင့် output variable များအကြား ဆက်နွယ်မှုကို map လုပ်ရန် ခန့်မှန်းမော်ဒယ်တစ်ခုကို ဖန်တီးပေးသည်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>အမျိုးအစားသတ်မှတ်ခြင်းအယ်လဂိုရီသမ်များကို ကိုင်တွယ်ရန် binary နှင့် multiclass ပြဿနာများ။ Infographic - Jen Looper</figcaption>\n",
"\n",
"ဒေတာကို သန့်စင်ခြင်း၊ ရှုထောင့်မှကြည့်ရှုခြင်းနှင့် ML လုပ်ငန်းစဉ်များအတွက် ပြင်ဆင်ခြင်းလုပ်ငန်းစဉ်ကို စတင်မလုပ်မီ၊ ဒေတာကို အမျိုးအစားသတ်မှတ်ရန် စက်မှုသင်ယူမှုကို အသုံးပြုနိုင်သော နည်းလမ်းများအကြောင်းကို နည်းနည်းလေ့လာကြည့်ပါ။\n",
"\n",
"[statistics](https://wikipedia.org/wiki/Statistical_classification) မှ ဆင်းသက်လာသော classic machine learning ကို အသုံးပြု၍ classification သည် `smoker`, `weight`, `age` ကဲ့သို့သော features များကို အသုံးပြု၍ *X ရောဂါဖြစ်ပွားနိုင်မှု* ကို သတ်မှတ်သည်။ သင်၏ဒေတာသည် label လုပ်ထားပြီး ML အယ်လဂိုရီသမ်များသည် အဆိုပါ label များကို အသုံးပြု၍ ဒေတာစဉ်၏ အမျိုးအစားများ (သို့မဟုတ် 'features') ကို ခန့်မှန်းခြင်းနှင့် အုပ်စု သို့မဟုတ် ရလဒ်တစ်ခုသို့ assign လုပ်ပေးသည်။\n",
"\n",
"✅ အစားအစာများနှင့်ပတ်သက်သော ဒေတာစဉ်ကို စဉ်းစားရန် အချိန်ယူပါ။ multiclass မော်ဒယ်တစ်ခုက ဘာကို ဖြေရှင်းနိုင်မလဲ? binary မော်ဒယ်တစ်ခုက ဘာကို ဖြေရှင်းနိုင်မလဲ? fenugreek ကို အသုံးပြုမည်ဖြစ်သော အစားအစာကို သတ်မှတ်လိုပါက ဘာဖြစ်မည်? star anise, artichokes, cauliflower, horseradish တို့ပါဝင်သော အစားအစာအိတ်တစ်ခုကို သင်ရရှိပါက အိန္ဒိယအစားအစာတစ်ခုကို ဖန်တီးနိုင်မည်ဖြစ်ပါသလား?\n",
"\n",
"### **Hello 'classifier'**\n",
"\n",
"ဤအစားအစာဒေတာစဉ်အပေါ် မေးလိုသောမေးခွန်းသည် **multiclass question** တစ်ခုဖြစ်သည်၊ အမျိုးအစားများစွာနှင့်အလုပ်လုပ်ရန် အမျိုးအစားများစွာရှိသည်။ အစိတ်အပိုင်းများအစုတစ်ခုကို ကြည့်ရှု၍ အဆိုပါဒေတာသည် အမျိုးအစားများထဲမှ ဘယ်အမျိုးအစားတွင် ပါဝင်မည်ကို သတ်မှတ်နိုင်မည်။\n",
"\n",
"Tidymodels သည် အမျိုးအစားသတ်မှတ်ရန် သင်လိုချင်သော ပြဿနာအမျိုးအစားပေါ်မူတည်၍ အယ်လဂိုရီသမ်များစွာကို ပေးသည်။ နောက်ထပ်သင်ခန်းစာ ၂ ခုတွင် သင်သည် အယ်လဂိုရီသမ်များအကြောင်းကို လေ့လာပါမည်။\n",
"\n",
"#### **လိုအပ်ချက်**\n",
"\n",
"ဒီသင်ခန်းစာအတွက် ဒေတာကို သန့်စင်ခြင်း၊ ပြင်ဆင်ခြင်းနှင့် ရှုထောင့်မှကြည့်ရှုရန် အောက်ပါ packages များလိုအပ်ပါမည်-\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) သည် [R packages](https://www.tidyverse.org/packages) များစုစည်းမှုဖြစ်ပြီး ဒေတာသိပ္ပံကို ပိုမိုလျင်မြန်စေပြီး ပိုမိုလွယ်ကူစေသည်။\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) framework သည် [packages](https://www.tidymodels.org/packages/) များစုစည်းမှုဖြစ်ပြီး မော်ဒယ်ဖန်တီးခြင်းနှင့် စက်မှုသင်ယူမှုအတွက် အသုံးပြုသည်။\n",
"\n",
"- `DataExplorer`: [DataExplorer package](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) သည် EDA လုပ်ငန်းစဉ်နှင့် အစီရင်ခံစာဖန်တီးမှုကို လွယ်ကူစေပြီး အလိုအလျောက်လုပ်ဆောင်သည်။\n",
"\n",
"- `themis`: [themis package](https://themis.tidymodels.org/) သည် Unbalanced Data ကို ကိုင်တွယ်ရန် Extra Recipes Steps များပေးသည်။\n",
"\n",
"သင်သည် အောက်ပါအတိုင်း install လုပ်နိုင်သည်-\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"အခြားနည်းလမ်းအနေနှင့် အောက်ပါ script သည် module ကို ပြီးစီးရန်လိုအပ်သော packages များရှိမရှိ စစ်ဆေးပြီး မရှိပါက install လုပ်ပေးပါမည်။\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"ကျွန်တော်တို့ ဒီအံ့သြဖွယ်ပက်ကေ့ဂျ်တွေကို နောက်ပိုင်းမှာ load လုပ်ပြီး လက်ရှိ R session မှာ အသုံးပြုနိုင်အောင် ပြင်ဆင်ပေးပါမယ်။ (ဒါက ဥပမာပြရန်သာဖြစ်ပြီး၊ `pacman::p_load()` က အဲဒီအလုပ်ကို ရှင်းပြီးသားဖြစ်ပါတယ်)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## လေ့ကျင့်မှု - သင့်ဒေတာကို သန့်ရှင်းပြီး ညီမျှအောင် ပြုလုပ်ပါ\n",
"\n",
"ဒီပရောဂျက်ကို စတင်မတိုင်မီ ပထမဆုံးလုပ်ဆောင်ရမည့်အလုပ်က သင့်ဒေတာကို **သန့်ရှင်း**ပြီး **ညီမျှ**အောင် ပြုလုပ်ခြင်းဖြစ်ပါတယ်။ ဒါက ပိုမိုကောင်းမွန်တဲ့ရလဒ်တွေ ရရှိစေမှာပါ။\n",
"\n",
"အရင်ဆုံး ဒေတာနဲ့ မိတ်ဆက်ကြစို့! 🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"အထွေထွေ အချက်အလက်များအရ၊ ကျွန်ုပ်တို့တွင် `2448` အတန်းနှင့် `385` ကော်လံများရှိပြီး၊ `0` မရှိသောတန်ဖိုးများဖြစ်ကြောင်း မြင်နိုင်ပါသည်။ ထို့အပြင်၊ *cuisine* ဟုခေါ်သော ၁ ခုသော discrete ကော်လံလည်း ပါဝင်ပါသည်။\n",
"\n",
"## လေ့ကျင့်မှု - အစားအစာအမျိုးအစားများကို လေ့လာခြင်း\n",
"\n",
"ယခုအချိန်တွင် အလုပ်များ ပိုမိုစိတ်ဝင်စားဖွယ် ဖြစ်လာပါသည်။ အစားအစာအမျိုးအစားအလိုက် ဒေတာဖြန့်ဖြူးမှုကို ရှာဖွေကြည့်ရအောင်။\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"အစားအစာအမျိုးအစားများသည် အရေအတွက်ကန့်သတ်ထားပြီး၊ ဒေတာဖြန့်ဝေမှုမှာ မညီမျှပါ။ ဒါကို သင်ပြင်ဆင်နိုင်ပါတယ်! ပြင်ဆင်မလုပ်ခင်မှာ အရင်ဆုံး နည်းနည်းလေ့လာကြည့်ပါ။\n",
"\n",
"အခုတော့ အစားအစာအမျိုးအစားတစ်ခုချင်းစီကို သူ့ရဲ့ tibble ထဲမှာ သတ်မှတ်ပြီး၊ အစားအစာအမျိုးအစားတစ်ခုချင်းစီအတွက် ရရှိနိုင်တဲ့ ဒေတာအရေအတွက် (အတန်း၊ ကော်လံ) ကို ရှာဖွေကြည့်ပါ။\n",
"\n",
"> [tibble](https://tibble.tidyverse.org/) ဆိုတာ ခေတ်မီသော data frame တစ်ခုဖြစ်ပါတယ်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>ပန်းချီရေးဆွဲသူ @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"## **လေ့ကျင့်ခန်း - dplyr ကို အသုံးပြု၍ အစားအစာအမျိုးအစားအလိုက် ထိပ်တန်းပါဝင်ပစ္စည်းများ ရှာဖွေခြင်း**\n",
"\n",
"အခုတော့ ဒေတာကို ပိုမိုနက်နက်ရှိုင်းရှိုင်း လေ့လာပြီး အစားအစာအမျိုးအစားတစ်ခုစီအတွက် သာမန်ပါဝင်ပစ္စည်းများကို သိနိုင်ပါပြီ။ အစားအစာအမျိုးအစားများအကြား ရှုပ်ထွေးမှုကို ဖြစ်စေသော ထပ်တလဲလဲ ဒေတာများကို ဖယ်ရှားသင့်ပါသည်။ ဒါကြောင့် ဒီပြဿနာအကြောင်းကို လေ့လာကြမယ်။\n",
"\n",
"R မှာ `create_ingredient()` ဆိုတဲ့ function တစ်ခုကို ဖန်တီးပြီး ပါဝင်ပစ္စည်းများအတွက် dataframe တစ်ခုကို ပြန်ပေးနိုင်ပါမယ်။ ဒီ function က အသုံးမဝင်တဲ့ column တစ်ခုကို drop လုပ်ပြီး ပါဝင်ပစ္စည်းများကို count အလိုက် စီမည်ဖြစ်သည်။\n",
"\n",
"R function တစ်ခုရဲ့ အခြေခံဖွဲ့စည်းပုံကတော့:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"R functions အကြောင်းကို tidy အနေနဲ့ မိတ်ဆက်ထားတဲ့ [ဒီနေရာ](https://skirmer.github.io/presentations/functions_with_r.html#1) မှာ ရှာဖွေကြည့်နိုင်ပါတယ်။\n",
"\n",
"အခုတော့ စတင်လိုက်ရအောင်! [dplyr verbs](https://dplyr.tidyverse.org/) ကို အသုံးပြုမယ်။ အရင်စာရင်းတွေမှာ သင်ယူခဲ့တဲ့အတိုင်း:\n",
"\n",
"- `dplyr::select()`: **columns** များကို ထည့်သွင်းရန် သို့မဟုတ် ဖယ်ရှားရန် ကူညီပေးသည်။\n",
"\n",
"- `dplyr::pivot_longer()`: ဒေတာကို \"အရှည်ပိုင်း\" ပြောင်းလဲရန် ကူညီပေးပြီး rows အရေအတွက်ကို တိုးစေပြီး columns အရေအတွက်ကို လျှော့စေသည်။\n",
"\n",
"- `dplyr::group_by()` နှင့် `dplyr::summarise()`: အုပ်စုများအလိုက် အကျဉ်းချုပ် စာရင်းအင်းများကို ရှာဖွေပြီး အဆင်ပြေတဲ့ table တစ်ခုအဖြစ် ထည့်သွင်းပေးသည်။\n",
"\n",
"- `dplyr::filter()`: သင့်ရဲ့ အခြေအနေများကို ဖြည့်ဆည်းသော rows များသာ ပါဝင်သော ဒေတာ subset တစ်ခုကို ဖန်တီးသည်။\n",
"\n",
"- `dplyr::mutate()`: columns များကို ဖန်တီးရန် သို့မဟုတ် ပြင်ဆင်ရန် ကူညီပေးသည်။\n",
"\n",
"Allison Horst ရဲ့ [*အနုပညာ*-ပြည့် learnr tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) ကို ကြည့်ပါ။ dplyr *(Tidyverse ရဲ့ အစိတ်အပိုင်း)* မှာ အသုံးဝင်တဲ့ ဒေတာကို စီမံခန့်ခွဲနိုင်စေတဲ့ function များကို မိတ်ဆက်ပေးထားပါတယ်။\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"အခုတော့ ဒီ function ကို အသုံးပြုပြီး အစားအစာအမျိုးအစားအလိုက် အများဆုံးလူကြိုက်များတဲ့ ပစ္စည်းအစိတ်အပိုင်း ၁၀ ခုကို သိနိုင်ပါပြီ။ `thai_df` နဲ့ စမ်းကြည့်ရအောင်!\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"ယခင်အပိုင်းတွင် `geom_col()` ကိုအသုံးပြုခဲ့ပြီးဖြစ်သည်၊ `geom_bar` ကိုလည်း ဘားဇယားများဖန်တီးရန် မည်သို့အသုံးပြုနိုင်သည်ကို ကြည့်ရှုကြမည်။ နောက်ထပ်ဖတ်ရှုရန် `?geom_bar` ကိုအသုံးပြုပါ။\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"တရုတ်အစားအစာတွေကော?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"ဒေတာဗျူအာလိုင်းဇေးရှင်းများမှ, အခုတော့ `dplyr::select()` ကို အသုံးပြုပြီး ချက်ပြုတ်မှုအမျိုးအစားများအကြား ရှုပ်ထွေးမှု ဖြစ်စေသော အများဆုံးတွေ့ရသော ပစ္စည်းများကို ဖယ်ရှားနိုင်ပါပြီ။\n",
"\n",
"ဆန်၊ ကြက်သီးနဲ့ ဂျင်းကို လူတိုင်းချစ်ကြပါတယ်!\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## အချက်အလက်များကို ကြိုတင်အဆင်သင့်ပြုလုပ်ခြင်း 👩‍🍳👨‍🍳 - အချက်အလက်မညီမျှမှုကို ကိုင်တွယ်ခြင်း ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>ပုံပန်းချီရေးဆွဲသူ @allison_horst</figcaption>\n",
"\n",
"ဒီသင်ခန်းစာက အစားအစာအမျိုးမျိုးနဲ့ ပတ်သက်တာဖြစ်တဲ့အတွက် `recipes` ကို အခြေခံပြီး ဆွေးနွေးရပါမယ်။\n",
"\n",
"Tidymodels က အချက်အလက်များကို ကြိုတင်အဆင်သင့်ပြုလုပ်ဖို့အတွက် `recipes` ဆိုတဲ့ အဆင်ပြေတဲ့ package တစ်ခုကို ထပ်မံပေးထားပါတယ်။\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"ကျွန်တော်တို့ရဲ့ အစားအစာအမျိုးအစားများရဲ့ ဖြန့်ဝေမှုကို နောက်တစ်ကြိမ် ပြန်လည်ကြည့်ရှုကြပါစို့။\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"အစားအစာအမျိုးအစားအရေအတွက်တွင် မညီမျှမှုများရှိနေသည်ကို သတိပြုမိပါသည်။ ကိုရီးယားအစားအစာများသည် ထိုင်းအစားအစာများထက် ၃ ဆနီးပါး ပိုများနေသည်။ မညီမျှသောဒေတာများသည် မော်ဒယ်၏စွမ်းဆောင်ရည်အပေါ် အနုတ်လက္ခဏာများပေးနိုင်သည်။ ဥပမာအားဖြင့် binary classification ကိုစဉ်းစားကြည့်ပါ။ ဒေတာအများစုသည် တစ်မျိုးတည်းသောအတန်းဖြစ်နေပါက ML မော်ဒယ်သည် အတန်းအမျိုးအစားကို ပိုမိုခန့်မှန်းမည်ဖြစ်ပြီး၊ ဒေတာများပိုမိုရှိနေသောကြောင့်ဖြစ်သည်။ ဒေတာကိုညီမျှအောင်လုပ်ခြင်းသည် skewed data များကိုဖယ်ရှားပြီး မညီမျှမှုကိုဖယ်ရှားပေးသည်။ မော်ဒယ်များအများစုသည် အချက်အလက်အရေအတွက်များညီမျှသောအခါ အကောင်းဆုံးစွမ်းဆောင်ရည်ပြသနိုင်ပြီး၊ မညီမျှသောဒေတာများနှင့်ရင်ဆိုင်ရသည့်အခါ အခက်အခဲများရှိတတ်သည်။\n",
"\n",
"မညီမျှသောဒေတာအစုများကို ကိုင်တွယ်ရန် နည်းလမ်းနှစ်မျိုးအဓိကရှိသည်-\n",
"\n",
"- အနည်းဆုံးအတန်းအမျိုးအစားတွင် observation များထည့်ခြင်း: `Over-sampling` ဥပမာ SMOTE algorithm ကိုအသုံးပြုခြင်း\n",
"\n",
"- အများဆုံးအတန်းအမျိုးအစားမှ observation များဖယ်ရှားခြင်း: `Under-sampling`\n",
"\n",
"အခုတော့ `recipe` ကိုအသုံးပြုပြီး မညီမျှသောဒေတာအစုများကို ကိုင်တွယ်ပုံကို ပြသပါမည်။ recipe ဆိုသည်မှာ ဒေတာအစုကို ဒေတာခွဲခြမ်းစိတ်ဖြာလုပ်ရန်အဆင့်များကို ဖော်ပြထားသော အခြေခံအစီအစဉ်တစ်ခုအဖြစ် စဉ်းစားနိုင်သည်။\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"အကြိုတင်လုပ်ဆောင်မှုအဆင့်များကို ခွဲခြားကြည့်ပါစို့။\n",
"\n",
"- `recipe()` ကို formula နဲ့ခေါ်သုံးတဲ့အခါ `df_select` ဒေတာကို အခြေခံပြီး variable တွေရဲ့ *roles* ကို recipe ကိုပြောပြပေးပါတယ်။ ဥပမာ `cuisine` column ကို `outcome` role အဖြစ် သတ်မှတ်ထားပြီး အခြား column တွေကို `predictor` role အဖြစ် သတ်မှတ်ထားပါတယ်။\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) က minority class ရဲ့ အသစ်ထပ်ထွက်လာတဲ့ ဥပမာတွေကို nearest neighbors ကို အသုံးပြုပြီး စက်မှုတုနည်းဖြင့် ဖန်တီးပေးတဲ့ recipe step ရဲ့ *specification* ကို ဖန်တီးပေးပါတယ်။\n",
"\n",
"အခုတော့ preprocessed data ကို ကြည့်ချင်ရင် [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) နဲ့ [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) ကို အသုံးပြုရပါမယ်။\n",
"\n",
"`prep()`: training set ကနေ လိုအပ်တဲ့ parameters တွေကို ခန့်မှန်းပြီး နောက်ထပ် data set တွေမှာ အသုံးပြုနိုင်အောင် ပြင်ဆင်ပေးပါတယ်။\n",
"\n",
"`bake()`: prepped recipe ကို ယူပြီး operation တွေကို data set တစ်ခုခုမှာ အကောင်အထည်ဖော်ပေးပါတယ်။\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"အရသာရှိတယ်! ဒေတာက သန့်ရှင်းပြီး၊ ထိန်းညှိထားပြီး၊ အရသာလည်း အရမ်းကောင်းပါတယ် 😋!\n",
"\n",
"> အများအားဖြင့်၊ recipe ဆိုတာက မော်ဒယ်တစ်ခုကို ပြင်ဆင်ဖို့အတွက် အဆင့်တွေကို သတ်မှတ်ပေးတဲ့ preprocessor အနေနဲ့ အသုံးပြုလေ့ရှိပါတယ်။ ဒီအခါမှာတော့ `workflow()` ကို အသုံးပြုလေ့ရှိပါတယ် (ကျွန်တော်တို့ရဲ့ အတန်းတွေမှာ ရှေ့မှာ ကြည့်ဖူးပြီးသား)၊ recipe ကို ကိုယ်တိုင် ခန့်မှန်းစရာမလိုဘဲ။\n",
">\n",
"> ထို့ကြောင့် tidymodels ကို အသုံးပြုတဲ့အခါမှာ **`prep()`** နဲ့ **`bake()`** ကို မဖြစ်မနေ အသုံးပြုစရာမလိုပေမယ့်၊ recipe တွေက မျှော်လင့်ထားတဲ့အတိုင်း အလုပ်လုပ်နေလားဆိုတာ အတည်ပြုဖို့အတွက် အသုံးဝင်တဲ့ function တွေဖြစ်ပါတယ်၊ ကျွန်တော်တို့ရဲ့ အခန်းကဏ္ဍမှာလိုပဲ။\n",
">\n",
"> **`new_data = NULL`** နဲ့ prepped recipe ကို **`bake()`** လုပ်တဲ့အခါမှာ၊ recipe ကို သတ်မှတ်တဲ့အချိန်မှာ ပေးထားတဲ့ ဒေတာကို ပြန်ရမှာဖြစ်ပေမယ့်၊ preprocessing အဆင့်တွေကို ဖြတ်သွားပြီးသား ဖြစ်ပါတယ်။\n",
"\n",
"အခုတော့ ဒီဒေတာကို နောက်အတန်းတွေမှာ အသုံးပြုဖို့အတွက် ကူးထားလိုက်ရအောင်:\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"ဤအသစ်ထွက် CSV ကို အခု root data folder မှာ ရှာတွေ့နိုင်ပါပြီ။\n",
"\n",
"**🚀စိန်ခေါ်မှု**\n",
"\n",
"ဒီသင်ခန်းစာမှာ စိတ်ဝင်စားဖွယ် dataset အများအပြား ပါဝင်ပါတယ်။ `data` folder တွေကို စူးစမ်းကြည့်ပြီး binary classification ဒါမှမဟုတ် multi-class classification အတွက် သင့်လျော်တဲ့ dataset တွေ ရှိမရှိ စစ်ဆေးပါ။ ဒီ dataset ကို အသုံးပြုပြီး ဘယ်လိုမေးခွန်းတွေ မေးနိုင်မလဲ?\n",
"\n",
"## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း**\n",
"\n",
"- [package themis](https://github.com/tidymodels/themis) ကို ကြည့်ပါ။ Imbalanced data ကို ကိုင်တွယ်ဖို့ ဘယ်လိုနည်းလမ်းတွေ အသုံးပြုနိုင်မလဲ?\n",
"\n",
"- Tidy models [reference website](https://www.tidymodels.org/start/) ကို လေ့လာပါ။\n",
"\n",
"- H. Wickham နှင့် G. Grolemund ရေးသားထားသော [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/) ကို ဖတ်ရှုပါ။\n",
"\n",
"#### ကျေးဇူးတင်စကား:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) ကို R ကို ပိုမိုကြိုဆိုဖွယ်ကောင်းပြီး စိတ်ဝင်စားဖွယ်ကောင်းအောင် ဖန်တီးထားတဲ့ အံ့ဩဖွယ်ပုံရိပ်တွေကို ဖန်တီးပေးထားတဲ့အတွက် ကျေးဇူးတင်ပါတယ်။ သူမရဲ့ [gallery](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) မှာ ပိုမိုများစွာသော ပုံရိပ်တွေကို ရှာဖွေကြည့်နိုင်ပါတယ်။\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) နှင့် [Jen Looper](https://www.twitter.com/jenlooper) ကို ဒီ module ရဲ့ Python version ကို ဖန်တီးပေးထားတဲ့အတွက် ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Artwork by @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူပညာရှင်များမှ လက်တွေ့ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,39 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "68829b06b4dcd512d3327849191f4d7f",
"translation_date": "2025-09-06T12:21:48+00:00",
"source_file": "4-Classification/2-Classifiers-1/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူသားဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,279 @@
{
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"from sklearn.svm import SVC\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 4
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy is 0.8181818181818182\n"
]
}
],
"source": [
"lr = LogisticRegression(multi_class='ovr',solver='liblinear')\n",
"model = lr.fit(X_train, np.ravel(y_train))\n",
"\n",
"accuracy = model.score(X_test, y_test)\n",
"print (\"Accuracy is {}\".format(accuracy))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"ingredients: Index(['artemisia', 'black_pepper', 'mushroom', 'shiitake', 'soy_sauce',\n 'vegetable_oil'],\n dtype='object')\ncuisine: korean\n"
]
}
],
"source": [
"# test an item\n",
"print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')\n",
"print(f'cuisine: {y_test.iloc[50]}')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" 0\n",
"korean 0.392231\n",
"chinese 0.372872\n",
"japanese 0.218825\n",
"thai 0.013427\n",
"indian 0.002645"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>0</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>korean</th>\n <td>0.392231</td>\n </tr>\n <tr>\n <th>chinese</th>\n <td>0.372872</td>\n </tr>\n <tr>\n <th>japanese</th>\n <td>0.218825</td>\n </tr>\n <tr>\n <th>thai</th>\n <td>0.013427</td>\n </tr>\n <tr>\n <th>indian</th>\n <td>0.002645</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"#rehsape to 2d array and transpose\n",
"test= X_test.iloc[50].values.reshape(-1, 1).T\n",
"# predict with score\n",
"proba = model.predict_proba(test)\n",
"classes = model.classes_\n",
"# create df with classes and scores\n",
"resultdf = pd.DataFrame(data=proba, columns=classes)\n",
"\n",
"# create df to show results\n",
"topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\n",
"topPrediction.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.75 0.73 0.74 223\n indian 0.93 0.88 0.90 255\n japanese 0.78 0.78 0.78 253\n korean 0.87 0.86 0.86 236\n thai 0.76 0.84 0.80 232\n\n accuracy 0.82 1199\n macro avg 0.82 0.82 0.82 1199\nweighted avg 0.82 0.82 0.82 1199\n\n"
]
}
],
"source": [
"y_pred = model.predict(X_test)\r\n",
"print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သိရှိထားပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "9408506dd864f2b6e334c62f80c0cfcc",
"translation_date": "2025-09-06T12:22:08+00:00",
"source_file": "4-Classification/2-Classifiers-1/solution/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,163 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "15a83277036572e0773229b5f21c1e12",
"translation_date": "2025-09-06T12:28:08+00:00",
"source_file": "4-Classification/3-Classifiers-2/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,648 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "lesson_12-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "fab50046ca413a38939d579f8432274f",
"translation_date": "2025-09-06T12:30:50+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "my"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## အစားအစာအမျိုးအစား ခွဲခြားခြင်း ၂\n",
"\n",
"ဒီ classification သင်ခန်းစာအပိုင်း (ဒုတိယပိုင်း) မှာ categorical data ကို ခွဲခြားဖို့ `ပိုမိုကောင်းမွန်တဲ့နည်းလမ်းများ` ကို လေ့လာသင်ယူမှာဖြစ်ပါတယ်။ ထို့အပြင် classifier တစ်ခုကို ရွေးချယ်ခြင်းက အခြားတစ်ခုနဲ့ ဘယ်လိုကွာခြားမှုတွေရှိမလဲဆိုတာကိုလည်း သင်ယူပါမယ်။\n",
"\n",
"### [**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **လိုအပ်ချက်များ**\n",
"\n",
"ယခင်သင်ခန်းစာများကိုပြီးစီးထားသည်ဟုယူဆပါသည်၊ အကြောင်းမူမကျော်လွှားဘဲ ယခင်သင်ခန်းစာများမှ သင်ယူခဲ့သော အကြောင်းအရာများကို ဆက်လက်အသုံးပြုသွားမည်ဖြစ်သည်။\n",
"\n",
"ဒီသင်ခန်းစာအတွက် အောက်ပါ packages များလိုအပ်ပါမယ်-\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) သည် [R packages များ](https://www.tidyverse.org/packages) ရဲ့စုစည်းမှုဖြစ်ပြီး data science ကို ပိုမိုလွယ်ကူစေပြီး ပိုမိုပျော်ရွှင်စေဖို့ ရည်ရွယ်ထားပါတယ်။\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) framework သည် modeling နဲ့ machine learning အတွက် [packages များ](https://www.tidymodels.org/packages/) ရဲ့စုစည်းမှုဖြစ်ပါတယ်။\n",
"\n",
"- `themis`: [themis package](https://themis.tidymodels.org/) သည် Unbalanced Data ကို ကိုင်တွယ်ဖို့ Extra Recipes Steps များပေးစွမ်းပါတယ်။\n",
"\n",
"ဒီ packages များကို အောက်ပါအတိုင်း install လုပ်နိုင်ပါတယ်-\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"အခြားနည်းလမ်းအနေနဲ့ အောက်ပါ script သည် module ကိုပြီးစီးဖို့လိုအပ်သော packages များရှိမရှိ စစ်ဆေးပြီး မရှိပါက install လုပ်ပေးပါမယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vZ57IuUxgyQt"
},
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "z22M-pj4g07x"
},
"source": [
"## **1. အမျိုးအစားခွဲမြေပုံ**\n",
"\n",
"ကျွန်တော်တို့ [အတန်းမတိုင်မီ](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) မှာ မေးခွန်းတစ်ခုကို ဖြေရှင်းဖို့ ကြိုးစားခဲ့ပါတယ်။ အဲဒါကတော့ - မော်ဒယ်များစွာအနက် ဘယ်ဟာကို ရွေးချယ်ရမလဲ? အဓိကအားဖြင့် ဒါဟာ ဒေတာရဲ့ လက္ခဏာများနဲ့ ကျွန်တော်တို့ ဖြေရှင်းချင်တဲ့ ပြဿနာအမျိုးအစား (ဥပမာ အမျိုးအစားခွဲခြားခြင်း၊ regression) ပေါ်မူတည်ပါတယ်။\n",
"\n",
"ယခင်က Microsoft ရဲ့ cheat sheet ကို အသုံးပြုပြီး ဒေတာကို အမျိုးအစားခွဲခြားတဲ့အခါ ရွေးချယ်နိုင်တဲ့ အခြားရွေးချယ်မှုများကို လေ့လာခဲ့ပါတယ်။ Python ရဲ့ Machine Learning framework ဖြစ်တဲ့ Scikit-learn ကလည်း အလားတူ cheat sheet တစ်ခုကို ပေးထားပြီး၊ ဒါဟာ သင့်ရဲ့ estimators (အမျိုးအစားခွဲခြင်းလုပ်ဆောင်သူများ) ကို ပိုမိုသေချာစွာ ရှုမြင်နိုင်အောင် ကူညီပေးနိုင်ပါတယ်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> အကြံပြုချက်: [ဒီမြေပုံကို အွန်လိုင်းမှာကြည့်ရှုပါ](https://scikit-learn.org/stable/tutorial/machine_learning_map/)၊ လမ်းကြောင်းတစ်လျှောက်တွင် နှိပ်ပြီး documentation ကိုဖတ်ရှုနိုင်ပါတယ်။\n",
">\n",
"> [Tidymodels reference site](https://www.tidymodels.org/find/parsnip/#models) သည် မော်ဒယ်အမျိုးအစားများအကြောင်း အလွန်ကောင်းမွန်သော documentation ကိုလည်း ပေးဆောင်ထားပါတယ်။\n",
"\n",
"### **အစီအစဉ်** 🗺️\n",
"\n",
"ဒီမြေပုံက သင့်ဒေတာကို ရှင်းလင်းစွာ နားလည်ပြီးပြီဆိုရင်၊ လမ်းကြောင်းတစ်လျှောက် 'လမ်းလျှောက်' သလို ဆုံးဖြတ်ချက်တစ်ခုရဖို့ အလွန်အသုံးဝင်ပါတယ်။\n",
"\n",
"- ကျွန်တော်တို့မှာ \\>50 နမူနာရှိတယ်\n",
"\n",
"- ကဏ္ဍတစ်ခုကို ခန့်မှန်းချင်တယ်\n",
"\n",
"- Label ထည့်ထားတဲ့ ဒေတာရှိတယ်\n",
"\n",
"- 100,000 နမူနာထက် နည်းတယ်\n",
"\n",
"- ✨ Linear SVC ကို ရွေးချယ်နိုင်တယ်\n",
"\n",
"- အဲဒါမအောင်မြင်ရင်၊ ကျွန်တော်တို့မှာ နံပါတ်ဆိုင်ရာ ဒေတာရှိတဲ့အတွက်\n",
"\n",
" - ✨ KNeighbors Classifier ကို စမ်းကြည့်နိုင်တယ်\n",
"\n",
" - အဲဒါလည်း မအောင်မြင်ရင် ✨ SVC နဲ့ ✨ Ensemble Classifiers ကို စမ်းကြည့်ပါ\n",
"\n",
"ဒီလမ်းကြောင်းက အလွန်အသုံးဝင်တဲ့ လမ်းညွှန်တစ်ခုပါ။ အခုတော့ [tidymodels](https://www.tidymodels.org/) မော်ဒယ်ဖွဲ့စည်းမှုကို အသုံးပြုပြီး အလုပ်စတင်ကြရအောင်။ ဒီ framework က R packages တွေကို တစ်ရပ်တည်းအောင် စနစ်တကျ ဖွဲ့စည်းထားပြီး၊ ကောင်းမွန်တဲ့ စာရင်းအင်းဆိုင်ရာ လေ့ကျင့်မှုတွေကို အားပေးဖို့ ဖန်တီးထားတာပါ 😊။\n",
"\n",
"## 2. ဒေတာကို ခွဲခြားပြီး မညီမျှတဲ့ ဒေတာအစုကို ကိုင်တွယ်ပါ။\n",
"\n",
"ယခင်သင်ခန်းစာတွေမှာ ကျွန်တော်တို့က အစားအစာအမျိုးအစားတွေမှာ ရှိနေတဲ့ ပုံမှန်ပါဝင်ပစ္စည်းတွေကို တွေ့ရှိခဲ့ပါတယ်။ ထို့အပြင် အစားအစာအမျိုးအစားအရ အရေအတွက်မှာလည်း မညီမျှမှုတွေ ရှိနေပါတယ်။\n",
"\n",
"ဒီအရာတွေကို ကျွန်တော်တို့\n",
"\n",
"- `dplyr::select()` ကို အသုံးပြုပြီး၊ မတူညီတဲ့ အစားအစာအမျိုးအစားတွေကြားမှာ ရှုပ်ထွေးမှု ဖြစ်စေတဲ့ အများဆုံးပါဝင်ပစ္စည်းတွေကို ဖယ်ရှားပါမယ်။\n",
"\n",
"- ဒေတာကို မော်ဒယ်ဖွဲ့စည်းဖို့ အသင့်ဖြစ်အောင် ပြင်ဆင်ပေးတဲ့ `recipe` ကို အသုံးပြုပြီး၊ `over-sampling` algorithm ကို လျှောက်ထားပါမယ်။\n",
"\n",
"အထက်ပါအချက်တွေကို ယခင်သင်ခန်းစာမှာ ကြည့်ပြီးသားဖြစ်တဲ့အတွက် ဒီအပိုင်းက အလွယ်တစ်ကူဖြစ်မှာပါ 🥳!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6tj_rN00hClA"
},
"source": [
"# Load the core Tidyverse and Tidymodels packages\n",
"library(tidyverse)\n",
"library(tidymodels)\n",
"\n",
"# Load the original cuisines data\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
"\n",
"# Drop id column, rice, garlic and ginger from our original data set\n",
"df_select <- df %>% \n",
" select(-c(1, rice, garlic, ginger)) %>%\n",
" # Encode cuisine column as categorical\n",
" mutate(cuisine = factor(cuisine))\n",
"\n",
"\n",
"# Create data split specification\n",
"set.seed(2056)\n",
"cuisines_split <- initial_split(data = df_select,\n",
" strata = cuisine,\n",
" prop = 0.7)\n",
"\n",
"# Extract the data in each split\n",
"cuisines_train <- training(cuisines_split)\n",
"cuisines_test <- testing(cuisines_split)\n",
"\n",
"# Display distribution of cuisines in the training set\n",
"cuisines_train %>% \n",
" count(cuisine) %>% \n",
" arrange(desc(n))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zFin5yw3hHb1"
},
"source": [
"### မတူညီသော ဒေတာများကို ကိုင်တွယ်ခြင်း\n",
"\n",
"မတူညီသော ဒေတာများသည် မော်ဒယ်၏ စွမ်းဆောင်ရည်အပေါ် အနုတ်လက္ခဏာများကို ဖြစ်ပေါ်စေတတ်သည်။ မော်ဒယ်အများစုသည် ကြည့်ရှုမှုအရေအတွက်များ တန်းတူရှိသောအခါ အကောင်းဆုံးလုပ်ဆောင်နိုင်ပြီး၊ ထို့ကြောင့် မတူညီသော ဒေတာများနှင့် ရင်ဆိုင်ရာတွင် အခက်အခဲများရှိတတ်သည်။\n",
"\n",
"မတူညီသော ဒေတာအစုများကို ကိုင်တွယ်ရန် နည်းလမ်းအဓိကနှစ်မျိုးရှိသည် -\n",
"\n",
"- အနည်းဆုံးအုပ်စုတွင် ကြည့်ရှုမှုများ ထည့်သွင်းခြင်း: `Over-sampling` ဥပမာအားဖြင့် SMOTE အယ်လဂိုရီသမ်ကို အသုံးပြုခြင်းဖြင့် အနည်းဆုံးအုပ်စု၏ နီးစပ်သော အချက်အလက်များကို အသုံးပြုကာ သဘာဝမဟုတ်သော နမူနာအသစ်များကို ဖန်တီးခြင်း။\n",
"\n",
"- အများဆုံးအုပ်စုမှ ကြည့်ရှုမှုများ ဖယ်ရှားခြင်း: `Under-sampling`\n",
"\n",
"ယခင်သင်ခန်းစာတွင်၊ `recipe` ကို အသုံးပြု၍ မတူညီသော ဒေတာအစုများကို ကိုင်တွယ်နည်းကို ပြသခဲ့ပါသည်။ `recipe` ဆိုသည်မှာ ဒေတာအစုတစ်ခုကို ဒေတာခွဲခြမ်းစိတ်ဖြာမှုအတွက် ပြင်ဆင်ရန် လိုအပ်သော အဆင့်များကို ဖော်ပြထားသည့် အခြေခံပုံစံတစ်ခုအဖြစ် သတ်မှတ်နိုင်သည်။ ကျွန်ုပ်တို့၏အမှုတွင်၊ `training set` အတွက် ကျွန်ုပ်တို့၏ အစားအစာအမျိုးအစားများ၏ အရေအတွက်ကို တန်းတူဖြန့်ဝေထားရန် လိုအပ်ပါသည်။ အခုလိုက်ကြရအောင်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cRzTnHolhLWd"
},
"source": [
"# Load themis package for dealing with imbalanced data\n",
"library(themis)\n",
"\n",
"# Create a recipe for preprocessing training data\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
" step_smote(cuisine) \n",
"\n",
"# Print recipe\n",
"cuisines_recipe"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KxOQ2ORhhO81"
},
"source": [
"အခုတော့ ကျွန်တော်တို့ မော်ဒယ်တွေကို လေ့ကျင့်ဖို့ အဆင်သင့်ဖြစ်ပါပြီ 👩‍💻👨‍💻!\n",
"\n",
"## 3. Multinomial Regression မော်ဒယ်များကို ကျော်လွန်ခြင်း\n",
"\n",
"ယခင် သင်ခန်းစာမှာ ကျွန်တော်တို့ Multinomial Regression မော်ဒယ်များကို လေ့လာခဲ့ပါတယ်။ အခုတော့ Classification အတွက် ပိုမိုတိကျပြီး လွယ်ကူတဲ့ မော်ဒယ်များကို ရှာဖွေကြည့်ရအောင်။\n",
"\n",
"### Support Vector Machines\n",
"\n",
"Classification အနေနဲ့ `Support Vector Machines` ဆိုတာ *hyperplane* တစ်ခုကို ရှာဖွေပြီး အတန်းတွေကို \"အကောင်းဆုံး\" ခွဲခြားဖို့ ကြိုးစားတဲ့ Machine Learning နည်းလမ်းတစ်ခုဖြစ်ပါတယ်။ အောက်မှာ ရိုးရှင်းတဲ့ ဥပမာတစ်ခုကို ကြည့်ရအောင်:\n",
"\n",
"<p >\n",
" <img src=\"../../images/svm.png\"\n",
" width=\"300\"/>\n",
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C4Wsd0vZhXYu"
},
"source": [
"H1~ သည် classes များကို ခွဲခြားပေးမည်မဟုတ်ပါ။ H2~ သည် ခွဲခြားပေးနိုင်သော်လည်း အနည်းငယ်သော margin ဖြင့်သာ ဖြစ်သည်။ H3~ သည် အများဆုံး margin ဖြင့် classes များကို ခွဲခြားပေးသည်။\n",
"\n",
"#### Linear Support Vector Classifier\n",
"\n",
"Support-Vector Clustering (SVC) သည် Support-Vector Machines များ၏ ML နည်းလမ်းများအုပ်စုမှ ဆင်းသက်လာသော နည်းလမ်းတစ်ခုဖြစ်သည်။ SVC တွင် hyperplane ကို training observations များ၏ `အများစု` ကို မှန်ကန်စွာ ခွဲခြားပေးနိုင်ရန် ရွေးချယ်ပေးသော်လည်း၊ `အချို့သော` observations များကို မှားယွင်းစွာ ခွဲခြားပေးနိုင်သည်။ အချို့သော point များကို မှားနေစေခြင်းအား ခွင့်ပြုခြင်းဖြင့် SVM သည် outliers များအပေါ်တွင် ပိုမိုတည်ငြိမ်လာပြီး၊ ဒါကြောင့် data အသစ်များအပေါ်တွင် ပိုမိုကောင်းမွန်စွာ အထွေထွေပြုနိုင်သည်။ ဤအခြေအနေကို ထိန်းညှိပေးသည့် parameter ကို `cost` ဟု ခေါ်ပြီး၊ ၎င်း၏ ပုံမှန်တန်ဖိုးမှာ 1 ဖြစ်သည် (e.g., `help(\"svm_poly\")` ကို ကြည့်ပါ)။\n",
"\n",
"ယခု `degree = 1` ကို polynomial SVM မော်ဒယ်တွင် သတ်မှတ်ခြင်းဖြင့် linear SVC တစ်ခုကို ဖန်တီးကြည့်ရအောင်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vJpp6nuChlBz"
},
"source": [
"# Make a linear SVC specification\n",
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svc_linear_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svc_linear_spec)\n",
"\n",
"# Print out workflow\n",
"svc_linear_wf"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDs8cWNkhoqu"
},
"source": [
"ယခုအခါမှာတော့ *workflow* ထဲမှာ preprocessing အဆင့်များနှင့် model specification ကိုဖမ်းဆီးထားပြီးဖြစ်သောကြောင့် linear SVC ကို training လုပ်ပြီး ရလဒ်များကိုအတူတူအကဲဖြတ်နိုင်ပါပြီ။ Performance metrics အတွက် `accuracy`, `sensitivity`, `Positive Predicted Value` နှင့် `F Measure` ကိုအကဲဖြတ်ပေးမယ့် metric set တစ်ခုကိုဖန်တီးကြစို့။\n",
"\n",
"> `augment()` က prediction တွေကိုထည့်ပေးမယ့် column(s) ကိုပေးထားတဲ့ data ထဲမှာထည့်ပေးပါမယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "81wiqcwuhrnq"
},
"source": [
"# Train a linear SVC model\n",
"svc_linear_fit <- svc_linear_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svc_linear_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0UFQvHf-huo3"
},
"source": [
"#### အထောက်အပံ့ဗက်တာစက်\n",
"\n",
"အထောက်အပံ့ဗက်တာစက် (SVM) သည် အတန်းများအကြား မလိုင်းတန်းဖြစ်သော နယ်နိမိတ်ကို လိုက်လျောညီထွေဖြစ်စေရန်အတွက် အထောက်အပံ့ဗက်တာအမျိုးအစားခွဲခြားမှု၏ တိုးချဲ့မှုတစ်ခုဖြစ်သည်။ အဓိကအားဖြင့် SVM များသည် *kernel trick* ကို အသုံးပြု၍ အတန်းများအကြား မလိုင်းတန်းဆက်နွှယ်မှုများကို လိုက်လျောညီထွေဖြစ်စေရန် feature space ကို ချဲ့ထွင်ပေးသည်။ SVM များတွင် အသုံးပြုသော လူကြိုက်များပြီး အလွန်လွယ်ကူသော kernel function တစ်ခုမှာ *Radial basis function* ဖြစ်သည်။ ဒါကြောင့် ဒါကို ကျွန်တော်တို့ရဲ့ ဒေတာပေါ်မှာ ဘယ်လိုအလုပ်လုပ်မလဲဆိုတာ ကြည့်ကြမယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-KX4S8mzhzmp"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Make an RBF SVM specification\n",
"svm_rbf_spec <- svm_rbf() %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svm_rbf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svm_rbf_spec)\n",
"\n",
"\n",
"# Train an RBF model\n",
"svm_rbf_fit <- svm_rbf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svm_rbf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QBFSa7WSh4HQ"
},
"source": [
"ပိုမိုကောင်းမွန်ပါတယ် 🤩!\n",
"\n",
"> ✅ ကျေးဇူးပြု၍ ကြည့်ပါ:\n",
">\n",
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), Hands-on Machine Learning with R\n",
">\n",
"> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning with Applications in R\n",
">\n",
"> ပိုမိုသိရှိရန်။\n",
"\n",
"### အနီးဆုံးအိမ်နီးချင်း ခွဲခြားမှု\n",
"\n",
"*K*-nearest neighbor (KNN) သည် observation တစ်ခုစီကို အခြား observation များနှင့် *တူညီမှု* အပေါ်အခြေခံ၍ ခန့်မှန်းပေးသော algorithm တစ်ခုဖြစ်သည်။\n",
"\n",
"အခုတစ်ခါ ကျွန်ုပ်တို့ရဲ့ data ကို အသုံးပြု၍ တစ်ခုကို fit လုပ်ကြည့်ရအောင်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "k4BxxBcdh9Ka"
},
"source": [
"# Make a KNN specification\n",
"knn_spec <- nearest_neighbor() %>% \n",
" set_engine(\"kknn\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"knn_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(knn_spec)\n",
"\n",
"# Train a boosted tree model\n",
"knn_wf_fit <- knn_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"knn_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HaegQseriAcj"
},
"source": [
"မော်ဒယ်သည် လိုအပ်သလို အလုပ်မလုပ်နေသလိုပဲ။ `help(\"nearest_neighbor\")` ကိုကြည့်ပြီး မော်ဒယ်၏ arguments များကို ပြောင်းလဲခြင်းဖြင့် မော်ဒယ်၏ စွမ်းဆောင်ရည်ကို တိုးတက်စေမည်ဖြစ်သည်။ စမ်းသပ်ကြည့်ရန် သေချာပါစေ။\n",
"\n",
"> ✅ ကျေးဇူးပြု၍ ကြည့်ပါ:\n",
">\n",
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
">\n",
"> အကြောင်းကို ပိုမိုလေ့လာရန် *K*-Nearest Neighbors classifiers။\n",
"\n",
"### Ensemble classifiers\n",
"\n",
"Ensemble algorithm များသည် အခြေခံမော်ဒယ်များစွာကို ပေါင်းစည်းခြင်းဖြင့် အကောင်းဆုံးမော်ဒယ်တစ်ခုကို ဖန်တီးရန် အလုပ်လုပ်သည်။ ၎င်းသည် အောက်ပါနည်းလမ်းများဖြင့် ဖြစ်နိုင်သည်-\n",
"\n",
"`bagging`: အခြေခံမော်ဒယ်များစုစည်းမှုကို *အလယ်ပျမ်းမျှ function* ဖြင့် လုပ်ဆောင်ခြင်း\n",
"\n",
"`boosting`: မော်ဒယ်များ၏ အစဉ်အလာကို တိုးတက်စေရန် တစ်ခုနှင့်တစ်ခု ဆက်လက်တည်ဆောက်ခြင်း။\n",
"\n",
"အရင်ဆုံး Random Forest မော်ဒယ်ကို စမ်းကြည့်ရအောင်။ ၎င်းသည် ဆုံးဖြတ်မှုအပင်များစွာကို တည်ဆောက်ပြီး အလယ်ပျမ်းမျှ function ကို အသုံးပြုကာ ပိုမိုကောင်းမွန်သော မော်ဒယ်တစ်ခုကို ဖန်တီးသည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "49DPoVs6iK1M"
},
"source": [
"# Make a random forest specification\n",
"rf_spec <- rand_forest() %>% \n",
" set_engine(\"ranger\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"rf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(rf_spec)\n",
"\n",
"# Train a random forest model\n",
"rf_wf_fit <- rf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"rf_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "RGVYwC_aiUWc"
},
"source": [
"အလုပ်ကောင်းပါတယ် 👏!\n",
"\n",
"Boosted Tree မော်ဒယ်ကိုလည်း စမ်းသပ်ကြည့်ရအောင်။\n",
"\n",
"Boosted Tree သည် အဆက်မပြတ် ဆုံးဖြတ်မှုအပင်များကို တစ်စဉ်တစ်စဉ် ဖန်တီးသော ensemble နည်းလမ်းတစ်ခုဖြစ်ပြီး၊ အပင်တစ်ခုစီသည် ယခင်အပင်များ၏ရလဒ်များအပေါ် မူတည်ကာ အမှားကို တဖြည်းဖြည်း လျှော့ချရန် ကြိုးစားသည်။ ၎င်းသည် မှားယွင်းစွာ ခွဲခြားထားသော အရာများ၏ အလေးချိန်များကို အာရုံစိုက်ပြီး၊ နောက်ထပ် classifier အတွက် fit ကို ပြင်ဆင်ကာ မှန်ကန်စေရန် ကြိုးစားသည်။\n",
"\n",
"ဤမော်ဒယ်ကို fit လုပ်ရန် နည်းလမ်းအမျိုးမျိုးရှိသည် ( `help(\"boost_tree\")` ကို ကြည့်ပါ )။ ဤဥပမာတွင် Boosted trees ကို `xgboost` engine ဖြင့် fit လုပ်ပါမည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Py1YWo-micWs"
},
"source": [
"# Make a boosted tree specification\n",
"boost_spec <- boost_tree(trees = 200) %>% \n",
" set_engine(\"xgboost\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"boost_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(boost_spec)\n",
"\n",
"# Train a boosted tree model\n",
"boost_wf_fit <- boost_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"boost_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zNQnbuejigZM"
},
"source": [
"> ✅ ကျေးဇူးပြု၍ ကြည့်ပါ:\n",
">\n",
"> - [Machine Learning for Social Scientists](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
">\n",
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
">\n",
"> - <https://algotech.netlify.app/blog/xgboost/> - AdaBoost မော်ဒယ်ကို လေ့လာနိုင်ပြီး၊ xgboost အစားထိုးအဖြစ် အသုံးချနိုင်သော မော်ဒယ်တစ်ခုဖြစ်သည်။\n",
">\n",
"> Ensemble classifiers အကြောင်း ပိုမိုလေ့လာရန်။\n",
"\n",
"## 4. အပို - မော်ဒယ်များစွာကို နှိုင်းယှဉ်ခြင်း\n",
"\n",
"ဒီ lab မှာ မော်ဒယ်အမျိုးမျိုးစွာကို အဆင့်ဆင့် လေ့လာပြီးဖြစ်ပါတယ် 🙌။ မတူညီတဲ့ preprocessor set တွေနဲ့/သို့မဟုတ် မော်ဒယ်အထူးပြုချက်များကို အသုံးပြုပြီး workflows များစွာကို တစ်ခုချင်းစီ ဖန်တီးရတာ အချိန်စားတတ်သလို၊ တစ်ခုချင်း performance metrics တွေကို တွက်ချက်ရတာလည်း မလွယ်ကူနိုင်ပါဘူး။\n",
"\n",
"ဒါကို ဖြေရှင်းနိုင်မလားဆိုတာ ကြည့်ကြရအောင်။ Training set ပေါ်မှာ workflows များစွာကို fit လုပ်ပြီး၊ Test set အပေါ်မှာ အခြေခံပြီး performance metrics တွေကို ပြန်ပေးနိုင်မယ့် function တစ်ခု ဖန်တီးကြည့်မယ်။ ဒီအတွက် [purrr](https://purrr.tidyverse.org/) package ထဲက `map()` နဲ့ `map_dfr()` ကို အသုံးပြုမယ်။ ဒီ function တွေက list ထဲမှာရှိတဲ့ element တစ်ခုချင်းစီကို လိုအပ်တဲ့ function တွေ သက်ဆိုင်ရာအတိုင်း လျှောက်သုံးနိုင်စေတယ်။\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html) function တွေက for loops များစွာကို အစားထိုးပြီး၊ ပိုမိုရိုးရှင်းပြီး ဖတ်ရလွယ်ကူတဲ့ code တွေ ရေးနိုင်စေတယ်။ [`map()`](https://purrr.tidyverse.org/reference/map.html) function တွေကို ပိုမိုနားလည်ဖို့အတွက် အကောင်းဆုံးနေရာကတော့ R for data science ထဲက [iteration chapter](http://r4ds.had.co.nz/iteration.html) ဖြစ်ပါတယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Qzb7LyZnimd2"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"# Define a function that returns performance metrics\n",
"compare_models <- function(workflow_list, train_set, test_set){\n",
" \n",
" suppressWarnings(\n",
" # Fit each model to the train_set\n",
" map(workflow_list, fit, data = train_set) %>% \n",
" # Make predictions on the test set\n",
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
" # Select desired columns\n",
" select(model, cuisine, .pred_class) %>% \n",
" # Evaluate model performance\n",
" group_by(model) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
" ungroup()\n",
" )\n",
" \n",
"} # End of function"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Fwa712sNisDA"
},
"source": []
},
{
"cell_type": "code",
"metadata": {
"id": "3i4VJOi2iu-a"
},
"source": [
"# Make a list of workflows\n",
"workflow_list <- list(\n",
" \"svc\" = svc_linear_wf,\n",
" \"svm\" = svm_rbf_wf,\n",
" \"knn\" = knn_wf,\n",
" \"random_forest\" = rf_wf,\n",
" \"xgboost\" = boost_wf)\n",
"\n",
"# Call the function\n",
"set.seed(2056)\n",
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
"\n",
"# Print out performance metrics\n",
"perf_metrics %>% \n",
" group_by(.metric) %>% \n",
" arrange(desc(.estimate)) %>% \n",
" slice_head(n=7)\n",
"\n",
"# Compare accuracy\n",
"perf_metrics %>% \n",
" filter(.metric == \"accuracy\") %>% \n",
" arrange(desc(.estimate))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KuWK_lEli4nW"
},
"source": [
"[**workflowset**](https://workflowsets.tidymodels.org/) package သည် အသုံးပြုသူများကို မော်ဒယ်အရေအတွက်များစွာကို ဖန်တီးပြီး လွယ်ကူစွာ အသုံးချနိုင်စေသော်လည်း၊ ၎င်းသည် `cross-validation` ကဲ့သို့သော ပြန်လည်နမူနာယူမှုနည်းလမ်းများနှင့် အဓိကအားဖြင့် အလုပ်လုပ်ရန် ဒီဇိုင်းထုတ်ထားသည်။ ဤနည်းလမ်းကို ကျွန်ုပ်တို့ မဖော်ပြရသေးပါ။\n",
"\n",
"## **🚀စိန်ခေါ်မှု**\n",
"\n",
"ဤနည်းလမ်းတစ်ခုစီတွင် သင်ပြင်ဆင်နိုင်သည့် parameter များစွာရှိပြီး၊ ဥပမာအားဖြင့် SVMs တွင် `cost`၊ KNN တွင် `neighbors`၊ Random Forest တွင် `mtry` (Randomly Selected Predictors) စသည်ဖြင့်ပါဝင်သည်။\n",
"\n",
"မော်ဒယ်တစ်ခုစီ၏ ပုံမှန် parameter များကို သုတေသနပြုပြီး၊ parameter များကို ပြင်ဆင်ခြင်းက မော်ဒယ်၏ အရည်အသွေးအပေါ် အဘယ်အရာကို ဆိုလိုသည်ကို စဉ်းစားပါ။\n",
"\n",
"မော်ဒယ်တစ်ခုနှင့် ၎င်း၏ parameter များအကြောင်း ပိုမိုသိရှိလိုပါက `help(\"model\")` ကို အသုံးပြုပါ၊ ဥပမာအားဖြင့် `help(\"rand_forest\")`။\n",
"\n",
"> လက်တွေ့အနေဖြင့်၊ ဤ parameter များအတွက် *အကောင်းဆုံးတန်ဖိုးများ* ကို *ခန့်မှန်း* ရန်၊ `simulated data set` ပေါ်တွင် မော်ဒယ်များစွာကို လေ့ကျင့်ပြီး၊ မော်ဒယ်များ၏ စွမ်းဆောင်ရည်ကို တိုင်းတာခြင်းဖြင့် ပြုလုပ်သည်။ ဤလုပ်ငန်းစဉ်ကို **tuning** ဟု ခေါ်သည်။\n",
"\n",
"### [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **ပြန်လည်ဆန်းစစ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာမှု**\n",
"\n",
"ဤသင်ခန်းစာများတွင် အသုံးအနှုန်းများစွာပါဝင်သောကြောင့်၊ [ဤစာရင်း](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) တွင် အသုံးဝင်သော အဘိဓာန်များကို ပြန်လည်ဆန်းစစ်ရန် အချိန်ယူပါ။\n",
"\n",
"#### ကျေးဇူးတင်စကား:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) သည် R ကို ပိုမိုကြိုဆိုဖွယ်ကောင်းစေပြီး စိတ်ဝင်စားဖွယ်ကောင်းစေသော ပုံဆွဲများကို ဖန်တီးပေးသည့်အတွက် ကျေးဇူးတင်ပါသည်။ ၎င်း၏ [gallery](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) တွင် ပိုမိုသော ပုံဆွဲများကို ရှာဖွေကြည့်ရှုနိုင်ပါသည်။\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) နှင့် [Jen Looper](https://www.twitter.com/jenlooper) တို့သည် ဤ module ၏ မူရင်း Python ဗားရှင်းကို ဖန်တီးပေးသည့်အတွက် ♥️\n",
"\n",
"ပျော်ရွှင်စွာ လေ့လာကြပါစေ၊\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"569\"/>\n",
" <figcaption>Artwork by @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,300 @@
{
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 2
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.svm import SVC\n",
"from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"\n",
"C = 10\n",
"# Create different classifiers.\n",
"classifiers = {\n",
" 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),\n",
" 'KNN classifier': KNeighborsClassifier(C),\n",
" 'SVC': SVC(),\n",
" 'RFST': RandomForestClassifier(n_estimators=100),\n",
" 'ADA': AdaBoostClassifier(n_estimators=100)\n",
" \n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy (train) for Linear SVC: 76.4% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.64 0.66 0.65 242\n",
" indian 0.91 0.86 0.89 236\n",
" japanese 0.72 0.73 0.73 245\n",
" korean 0.83 0.75 0.79 234\n",
" thai 0.75 0.82 0.78 242\n",
"\n",
" accuracy 0.76 1199\n",
" macro avg 0.77 0.76 0.77 1199\n",
"weighted avg 0.77 0.76 0.77 1199\n",
"\n",
"Accuracy (train) for KNN classifier: 70.7% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.65 0.63 0.64 242\n",
" indian 0.84 0.81 0.82 236\n",
" japanese 0.60 0.81 0.69 245\n",
" korean 0.89 0.53 0.67 234\n",
" thai 0.69 0.75 0.72 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.73 0.71 0.71 1199\n",
"weighted avg 0.73 0.71 0.71 1199\n",
"\n",
"Accuracy (train) for SVC: 80.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.71 0.69 0.70 242\n",
" indian 0.92 0.92 0.92 236\n",
" japanese 0.77 0.78 0.77 245\n",
" korean 0.87 0.77 0.82 234\n",
" thai 0.75 0.86 0.80 242\n",
"\n",
" accuracy 0.80 1199\n",
" macro avg 0.80 0.80 0.80 1199\n",
"weighted avg 0.80 0.80 0.80 1199\n",
"\n",
"Accuracy (train) for RFST: 82.8% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.80 0.75 0.77 242\n",
" indian 0.90 0.91 0.90 236\n",
" japanese 0.82 0.78 0.80 245\n",
" korean 0.85 0.82 0.83 234\n",
" thai 0.78 0.89 0.83 242\n",
"\n",
" accuracy 0.83 1199\n",
" macro avg 0.83 0.83 0.83 1199\n",
"weighted avg 0.83 0.83 0.83 1199\n",
"\n",
"Accuracy (train) for ADA: 71.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.60 0.57 0.58 242\n",
" indian 0.87 0.84 0.86 236\n",
" japanese 0.71 0.60 0.65 245\n",
" korean 0.68 0.78 0.72 234\n",
" thai 0.70 0.78 0.74 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.71 0.71 0.71 1199\n",
"weighted avg 0.71 0.71 0.71 1199\n",
"\n"
]
}
],
"source": [
"n_classifiers = len(classifiers)\n",
"\n",
"for index, (name, classifier) in enumerate(classifiers.items()):\n",
" classifier.fit(X_train, np.ravel(y_train))\n",
"\n",
" y_pred = classifier.predict(X_test)\n",
" accuracy = accuracy_score(y_test, y_pred)\n",
" print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\n",
" print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "7ea2b714669c823a596d986ba2d5739f",
"translation_date": "2025-09-06T12:28:27+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,39 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "2f3e0d9e9ac5c301558fb8bf733ac0cb",
"translation_date": "2025-09-06T12:27:34+00:00",
"source_file": "4-Classification/4-Applied/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**အကြောင်းကြားချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာရှိသော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,290 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "49325d6dd12a3628fc64fa7ccb1a80ff",
"translation_date": "2025-09-06T12:27:51+00:00",
"source_file": "4-Classification/4-Applied/solution/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: skl2onnx in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n",
"Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (3.8.0)\n",
"Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.19.2)\n",
"Requirement already satisfied: onnx>=1.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.9.0)\n",
"Requirement already satisfied: six in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from skl2onnx) (1.12.0)\n",
"Requirement already satisfied: onnxconverter-common<1.9,>=1.6.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.8.1)\n",
"Requirement already satisfied: scikit-learn>=0.19 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (0.24.2)\n",
"Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.4.1)\n",
"Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->skl2onnx) (45.1.0)\n",
"Requirement already satisfied: typing-extensions>=3.6.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnx>=1.2.1->skl2onnx) (3.10.0.0)\n",
"Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (2.1.0)\n",
"Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (0.16.0)\n",
"\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
"You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"!pip install skl2onnx"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd \n"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 60
}
],
"source": [
"data = pd.read_csv('../../data/cleaned_cuisines.csv')\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 61
}
],
"source": [
"X = data.iloc[:,2:]\n",
"X.head()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" cuisine\n",
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>cuisine</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>1</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>2</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>3</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>4</th>\n <td>indian</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 62
}
],
"source": [
"y = data[['cuisine']]\n",
"y.head()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.svm import SVC\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"SVC(C=10, kernel='linear', probability=True, random_state=0)"
]
},
"metadata": {},
"execution_count": 65
}
],
"source": [
"model = SVC(kernel='linear', C=10, probability=True,random_state=0)\n",
"model.fit(X_train,y_train.values.ravel())\n"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
"y_pred = model.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.72 0.70 0.71 236\n indian 0.91 0.88 0.89 243\n japanese 0.80 0.75 0.77 240\n korean 0.80 0.81 0.81 230\n thai 0.76 0.85 0.80 250\n\n accuracy 0.80 1199\n macro avg 0.80 0.80 0.80 1199\nweighted avg 0.80 0.80 0.80 1199\n\n"
]
}
],
"source": [
"print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [],
"source": [
"from skl2onnx import convert_sklearn\n",
"from skl2onnx.common.data_types import FloatTensorType\n",
"\n",
"initial_type = [('float_input', FloatTensorType([None, 380]))]\n",
"options = {id(model): {'nocl': True, 'zipmap': False}}\n",
"onx = convert_sklearn(model, initial_types=initial_type, options=options)\n",
"with open(\"./model.onnx\", \"wb\") as f:\n",
" f.write(onx.SerializeToString())\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,50 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python383jvsc74a57bd0e134e05457d34029b6460cd73bbf1ed73f339b5b6d98c95be70b69eba114fe95",
"display_name": "Python 3.8.3 64-bit (conda)"
},
"coopTranslator": {
"original_hash": "40e0707e96b3e1899a912776006264f9",
"translation_date": "2025-09-06T12:06:38+00:00",
"source_file": "5-Clustering/1-Visualize/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**အကြောင်းကြားချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် ရှုယူသင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,472 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Spotify မှ စုဆောင်းထားသော နိုင်ဂျီးရီးယားဂီတ - ခွဲခြမ်းစိတ်ဖြာမှု**\n",
"\n",
"Clustering ဆိုသည်မှာ [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning) အမျိုးအစားတစ်ခုဖြစ်ပြီး၊ ဒေတာစနစ်သည် အမှတ်အသားမပါရှိခြင်း သို့မဟုတ် ၎င်း၏ input များသည် ကြိုတင်သတ်မှတ်ထားသော output များနှင့် မကိုက်ညီခြင်းကို သဘောထားသည်။ ၎င်းသည် အမျိုးမျိုးသော algorithm များကို အသုံးပြု၍ အမှတ်အသားမပါရှိသော ဒေတာများကို စီစစ်ပြီး၊ ဒေတာအတွင်းရှိ ပုံစံများအရ အုပ်စုများကို ဖော်ထုတ်ပေးသည်။\n",
"\n",
"[**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **နိဒါန်း**\n",
"\n",
"[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) သည် ဒေတာစူးစမ်းမှုအတွက် အလွန်အသုံးဝင်သည်။ နိုင်ဂျီးရီးယားပရိသတ်များ၏ ဂီတသုံးစွဲမှုပုံစံများနှင့် လမ်းကြောင်းများကို ရှာဖွေဖော်ထုတ်နိုင်မလားဆိုတာ ကြည့်ကြရအောင်။\n",
"\n",
"> ✅ Clustering ၏ အသုံးဝင်မှုများအကြောင်း စဉ်းစားရန် တစ်မိနစ်ယူပါ။ နေ့စဉ်ဘဝတွင် Clustering ဖြစ်ပေါ်နေသော အချိန်များကို သတိထားမိပါသလား။ ဥပမာ - အဝတ်လျှော်ပြီးနောက် မိသားစုဝတ်စုံများကို စီစစ်ထားရသောအခါ 🧦👕👖🩲။ ဒေတာသိပ္ပံတွင်တော့ Clustering သည် အသုံးပြုသူ၏ စိတ်ကြိုက်များကို ခွဲခြားစစ်ဆေးရန် သို့မဟုတ် အမှတ်အသားမပါသော ဒေတာ၏ လက္ခဏာများကို သတ်မှတ်ရန် အသုံးပြုသည်။ Clustering သည် တစ်နည်းအားဖြင့် ရှုပ်ထွေးမှုများကို အစီအစဉ်ဖြစ်အောင် ပြုလုပ်ပေးသည်။\n",
"\n",
"ပရော်ဖက်ရှင်နယ်အဆင့်တွင်တော့ Clustering ကို စျေးကွက်ခွဲခြားမှု (market segmentation) အတွက် အသုံးပြုနိုင်သည်။ ဥပမာအားဖြင့် ဘယ်အသက်အရွယ်အုပ်စုက ဘယ်ပစ္စည်းတွေကို ဝယ်ယူတယ်ဆိုတာ သတ်မှတ်နိုင်သည်။ ထို့အပြင် Clustering ကို အထူးသဖြင့် လိမ်လည်မှုများ (fraud detection) သို့မဟုတ် ဆေးဘက်ဆိုင်ရာ စစ်ဆေးမှုများတွင် ကင်ဆာကဲ့သို့သော ရောဂါများကို ရှာဖွေဖော်ထုတ်ရန် အသုံးပြုနိုင်သည်။\n",
"\n",
"✅ ဘဏ်လုပ်ငန်း၊ e-commerce သို့မဟုတ် စီးပွားရေးလုပ်ငန်းများတွင် Clustering ကို သင်ဘယ်လိုတွေ့ဖူးတယ်ဆိုတာ တစ်မိနစ်စဉ်းစားကြည့်ပါ။\n",
"\n",
"> 🎓 စိတ်ဝင်စားစရာကောင်းတာကတော့ Clustering ခွဲခြားစစ်ဆေးမှုသည် 1930 ခုနှစ်များတွင် လူမှုဗေဒ (Anthropology) နှင့် စိတ်ပညာ (Psychology) လောကများတွင် စတင်ပေါ်ပေါက်ခဲ့ခြင်းဖြစ်သည်။ အဲဒီအချိန်မှာ ဘယ်လိုအသုံးပြုခဲ့မလဲဆိုတာ စဉ်းစားကြည့်ပါ။\n",
"\n",
"ဒါ့အပြင် Clustering ကို ရှာဖွေမှုရလဒ်များကို အုပ်စုဖွဲ့ရန် အသုံးပြုနိုင်သည်။ ဥပမာအားဖြင့် စျေးဝယ်ဆိုင်လင့်များ၊ ပုံများ သို့မဟုတ် သုံးသပ်ချက်များကို အုပ်စုဖွဲ့ခြင်း။ Clustering သည် အကြီးမားသော ဒေတာစနစ်ကို လျှော့ချပြီး၊ နောက်ထပ် စစ်ဆေးမှုများအတွက် အသေးစိတ်ခွဲခြားရန် အသုံးဝင်သည်။\n",
"\n",
"✅ ဒေတာကို Clusters အဖြစ် စီစဉ်ပြီးနောက်၊ Cluster Id တစ်ခုကို သတ်မှတ်ပေးနိုင်သည်။ ဒေတာ၏ privacy ကို ထိန်းသိမ်းရန် Cluster Id ကို အသုံးပြုနိုင်သည်။ Cluster Id ကို အသုံးပြုခြင်း၏ အခြားသော အကျိုးကျေးဇူးများကို စဉ်းစားကြည့်ပါ။\n",
"\n",
"### Clustering စတင်ခြင်း\n",
"\n",
"> 🎓 Clusters များကို ဖန်တီးပုံသည် ဒေတာအချက်အလက်များကို အုပ်စုဖွဲ့ပုံနှင့် ဆက်စပ်နေသည်။ အချို့သော အသုံးအနှုန်းများကို ရှင်းလင်းကြည့်ရအောင်:\n",
">\n",
"> 🎓 ['Transductive' နှင့် 'Inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transductive inference သည် သတ်မှတ်ထားသော training cases များမှ စတင်ပြီး၊ အထူးသတ်မှတ်ထားသော test cases များကို ချိတ်ဆက်သည်။ Inductive inference သည် training cases များမှ စတင်ပြီး၊ ယင်းမှ ရရှိသော အထွေထွေစည်းမျဉ်းများကို test cases များတွင်သာ အသုံးပြုသည်။\n",
">\n",
"> ဥပမာ - သင်တွင် အချို့သော အမှတ်အသားပါရှိပြီး အချို့မှာ မပါသော ဒေတာစနစ်ရှိသည်။ Inductive approach ကို အသုံးပြုပါက 'records' နှင့် 'cds' ကို သင်ကြားပြီး၊ မသတ်မှတ်ထားသော ဒေတာများကို အဲဒီအတိုင်း သတ်မှတ်ပေးမည်။ Transductive approach သည် မသတ်မှတ်ထားသော ဒေတာများကို ပိုမိုထိရောက်စွာ စီစစ်ပေးနိုင်သည်။\n",
">\n",
"> 🎓 ['Non-flat' နှင့် 'Flat' Geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Flat geometry သည် [Euclidean](https://wikipedia.org/wiki/Euclidean_geometry) အပေါ် အခြေခံပြီး၊ Non-flat geometry သည် Non-Euclidean အပေါ် အခြေခံသည်။\n",
">\n",
"> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Clusters များကို Distance Matrix ဖြင့် သတ်မှတ်သည်။ Euclidean clusters သည် center point (centroid) အပေါ် အခြေခံပြီး၊ Non-Euclidean clusters သည် clustroid အပေါ် အခြေခံသည်။\n",
">\n",
"> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> Constrained Clustering သည် semi-supervised learning ကို ထည့်သွင်းထားသည်။ ဒေတာအချက်အလက်များအကြား 'cannot link' သို့မဟုတ် 'must-link' စည်းမျဉ်းများကို သတ်မှတ်ပေးသည်။\n",
">\n",
"> 🎓 'Density'\n",
">\n",
"> 'Noisy' ဒေတာသည် 'dense' ဟု သတ်မှတ်သည်။ [ဒီဆောင်းပါး](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) သည် K-Means နှင့် HDBSCAN အကြား ကွာခြားချက်ကို ရှင်းပြထားသည်။\n",
"\n",
"Clustering နည်းလမ်းများကို နက်နက်ရှိုင်းရှိုင်း လေ့လာရန် [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) ကို ကြည့်ပါ။\n",
"\n",
"### **Clustering Algorithms**\n",
"\n",
"Clustering Algorithm များ ၁၀၀ ကျော်ရှိပြီး၊ ၎င်းတို့၏ အသုံးပြုမှုသည် ဒေတာ၏ လက္ခဏာအပေါ် မူတည်သည်။ အဓိက Algorithm များကို ဆွေးနွေးကြည့်ရအောင်:\n",
"\n",
"- **Hierarchical Clustering**: အနီးအနားရှိ အရာဝတ္ထုများအပေါ် အခြေခံ၍ အုပ်စုဖွဲ့သည်။\n",
" \n",
"- **Centroid Clustering**: 'k' သတ်မှတ်ပြီး၊ Cluster center ကို သတ်မှတ်ကာ ဒေတာများကို စုစည်းသည်။ [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) သည် အလွန်လူကြိုက်များသည်။\n",
"\n",
"- **Distribution-based Clustering**: ဒေတာအချက်အလက်တစ်ခုသည် Cluster တစ်ခုနှင့် ဆက်စပ်မှုကို သတ်မှတ်သည်။\n",
"\n",
"- **Density-based Clustering**: ဒေတာများ၏ အစုအဝေးပေါ် မူတည်သည်။\n",
"\n",
"- **Grid-based Clustering**: မျိုးစုံအတိုင်းအတာရှိသော ဒေတာများကို Grid ဖြင့် ခွဲခြားသည်။\n",
"\n",
"Clustering ကို လက်တွေ့ လေ့လာရန် အကောင်းဆုံးနည်းလမ်းမှာ ကိုယ်တိုင် လက်တွေ့လုပ်ဆောင်ခြင်းဖြစ်သည်။ \n",
"\n",
"ဤ module ကို ပြီးမြောက်ရန် လိုအပ်သော packages များကို `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))` ဖြင့် ထည့်သွင်းနိုင်သည်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## လေ့ကျင့်မှု - သင့်ဒေတာကို အစုအဖွဲ့ခွဲပါ\n",
"\n",
"အစုအဖွဲ့ခွဲခြင်းဆိုတာ အကောင်းဆုံးမြင်နိုင်အောင် ပြသပေးတဲ့နည်းလမ်းတစ်ခုဖြစ်ပြီး၊ သင့်ရဲ့ဂီတဒေတာကို မြင်နိုင်အောင် ပြသခြင်းဖြင့် စတင်ကြမယ်။ ဒီလေ့ကျင့်မှုက ဒီဒေတာရဲ့သဘာဝအရ အစုအဖွဲ့ခွဲခြင်းနည်းလမ်းတွေထဲက ဘယ်နည်းလမ်းကို အကျိုးရှိစွာ အသုံးပြုနိုင်မလဲဆိုတာ ဆုံးဖြတ်ဖို့ ကူညီပေးပါလိမ့်မယ်။\n",
"\n",
"ဒေတာကို တင်သွင်းပြီး စတင်ကြပါစို့!\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core tidyverse and make it available in your current R session\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# Import the data into a tibble\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
"\r\n",
"# View the first 5 rows of the data set\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"တစ်ခါတစ်ရံမှာ၊ ကျွန်တော်တို့ရဲ့ဒေတာအကြောင်းနည်းနည်းပိုပြီးသိချင်တတ်ပါတယ်။ ဒေတာနဲ့ `၎င်းရဲ့ဖွဲ့စည်းမှု` ကို [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) function ကိုသုံးပြီးကြည့်ရှုနိုင်ပါတယ်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Glimpse into the data set\r\n",
"df %>% \r\n",
" glimpse()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"အလုပ်ကောင်းပါတယ်!💪\n",
"\n",
"`glimpse()` သည် အတန်း (အချက်အလက်များ) အရေအတွက်နှင့် ကော်လံ (အပြောင်းအလဲများ) အရေအတွက်ကို ပြသပေးပြီး၊ ထို့နောက် အပြောင်းအလဲတစ်ခုစီ၏ အမည်အောက်တွင် အတန်းတစ်ခုစီ၏ အစပိုင်းအချက်အလက်များကို ပြသပေးပါသည်။ ထို့အပြင်၊ အပြောင်းအလဲ၏ *ဒေတာအမျိုးအစား* ကို `< >` အတွင်းတွင် အပြောင်းအလဲအမည်၏ ချက်ချင်းအောက်တွင် ဖော်ပြထားပါသည်။\n",
"\n",
"`DataExplorer::introduce()` သည် ဤအချက်အလက်များကို သေချာစွာ အကျဉ်းချုပ်ပေးနိုင်ပါသည်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe basic information for our data\r\n",
"df %>% \r\n",
" introduce()\r\n",
"\r\n",
"# A visual display of the same\r\n",
"df %>% \r\n",
" plot_intro()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"အံ့သြဖွယ်ပါပဲ! ကျွန်တော်တို့ရဲ့ဒေတာမှာ မရှိတဲ့တန်ဖိုးတွေမရှိဘူးဆိုတာကို အခုမှသိလိုက်ရပါတယ်။\n",
"\n",
"ဒီအချိန်မှာပဲ၊ အလယ်အလတ်အခြေအနေဆိုင်ရာ စာရင်းအင်းများ (ဥပမာ [ပျမ်းမျှတန်ဖိုး](https://en.wikipedia.org/wiki/Arithmetic_mean) နဲ့ [အလယ်တန်းတန်ဖိုး](https://en.wikipedia.org/wiki/Median)) နဲ့ ပြန့်နှံ့မှုကိုတိုင်းတာတဲ့ အချက်အလက်များ (ဥပမာ [စံချိန်လွှာ](https://en.wikipedia.org/wiki/Standard_deviation)) ကို `summarytools::descr()` ကိုသုံးပြီး စမ်းသပ်ကြည့်နိုင်ပါတယ်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe common statistics\r\n",
"df %>% \r\n",
" descr(stats = \"common\")\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ဒေတာရဲ့အထွေထွေတန်ဖိုးတွေကိုကြည့်လိုက်ရအောင်။ `0` ဖြစ်နိုင်တဲ့ပေါ်ပြူလာတန်ဖိုးကို သတိပြုပါ၊ ဒါဟာအဆင့်သတ်မှတ်မရှိတဲ့သီချင်းတွေကိုပြသပါတယ်။ အဲ့ဒီအချက်တွေကိုမကြာမီဖယ်ရှားပစ်မှာဖြစ်ပါတယ်။\n",
"\n",
"> 🤔 ကျွန်တော်တို့က အမှတ်အသားမလိုအပ်တဲ့ unsupervised နည်းလမ်းဖြစ်တဲ့ clustering နဲ့အလုပ်လုပ်နေတယ်ဆိုရင်၊ ဒီဒေတာကို အမှတ်အသားနဲ့ပြသတာဘာလို့လဲ? ဒေတာကိုလေ့လာတဲ့အဆင့်မှာ အဲ့ဒီအချက်တွေက အသုံးဝင်ပေမယ့် clustering algorithm တွေကိုအလုပ်လုပ်ဖို့အတွက်တော့ မလိုအပ်ပါဘူး။\n",
"\n",
"### 1. ပေါ်ပြူလာဂျန်းရတွေကိုလေ့လာပါ\n",
"\n",
"အဲ့ဒီဂျန်းရတွေ 🎶 ဘယ်လောက်များပေါ်ပြူလာလဲဆိုတာကို သိရအောင်၊ အကြိမ်ရေကိုရေတွက်ပြီးရှာဖွေလိုက်ရအောင်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Popular genres\r\n",
"top_genres <- df %>% \r\n",
" count(artist_top_genre, sort = TRUE) %>% \r\n",
"# Encode to categorical and reorder the according to count\r\n",
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
"\r\n",
"# Print the top genres\r\n",
"top_genres\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ဒါက အဆင်ပြေပါတယ်! သူတို့ပြောကြတာက ပုံတစ်ပုံဟာ ဒေတာဖရိမ်တစ်ခုရဲ့ အတန်းထောင်ချီတဲ့တန်ဖိုးနဲ့ တန်းတူတယ်ဆိုပေမယ့် (အမှန်တကယ်တော့ ဘယ်သူမှ ဒီလိုမပြောကြပါဘူး 😅)၊ သင်နားလည်မယ်လို့ မျှော်လင့်ပါတယ်။\n",
"\n",
"Categorical ဒေတာ (character သို့မဟုတ် factor variable) ကို ရှင်းလင်းဖော်ပြဖို့ နည်းလမ်းတစ်ခုက barplot တွေကို အသုံးပြုတာဖြစ်ပါတယ်။ အခုတော့ ထိပ်တန်း 10 ခုရှိတဲ့ genres တွေကို barplot နဲ့ ဖော်ပြကြည့်ရအောင်:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Change the default gray theme\r\n",
"theme_set(theme_light())\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ယခုအခါမှာ `missing` အမျိုးအစားတွေကို အလွယ်တကူ သိရှိနိုင်ပါပြီ 🧐!\n",
"\n",
"> အကောင်းဆုံး ရုပ်ပုံဖော်ပြမှုတစ်ခုက သင်မမျှော်လင့်ထားတဲ့အရာတွေကို ပြသပေးနိုင်ရမယ်၊ ဒါမှမဟုတ် ဒေတာအပေါ်မှာ မေးခွန်းအသစ်တွေကို ထွက်ပေါ်လာစေဖို့ လိုအပ်ပါတယ် - Hadley Wickham နဲ့ Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"သတိပြုပါ၊ အထက်ဆုံး အမျိုးအစားကို `Missing` လို့ ဖော်ပြထားတဲ့အခါမှာ၊ အဲဒါက Spotify က အမျိုးအစားသတ်မှတ်မထားတာဖြစ်ပါတယ်၊ ဒါကြောင့် အဲဒါကို ဖယ်ရှားလိုက်ရအောင်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" filter(artist_top_genre != \"Missing\") %>% \r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ဒေတာကိုအနည်းငယ်လေ့လာကြည့်ပြီးနောက်၊ ထိပ်ဆုံးအမျိုးအစားသုံးမျိုးသည် ဒီဒေတာစုစည်းမှုကို အဓိကကျစေသည်ကို သိရှိရပါသည်။ `afro dancehall`, `afropop`, နှင့် `nigerian pop` ကိုအဓိကထားပြီး၊ popularity အတန်းမှာ 0 ဖြစ်သောအရာများကို ဖယ်ရှားရန်အတွက် ဒေတာကို စစ်ထုတ်ပါ (ဒါဟာ ဒီဒေတာတွင် popularity အတန်းဖြင့် သတ်မှတ်မထားသောအရာများဖြစ်ပြီး ကျွန်ုပ်တို့ရည်ရွယ်ချက်အတွက် ဆူညံမှုအဖြစ် သတ်မှတ်နိုင်ပါသည်)။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"nigerian_songs <- df %>% \r\n",
" # Concentrate on top 3 genres\r\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
" # Remove unclassified observations\r\n",
" filter(popularity != 0)\r\n",
"\r\n",
"\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"nigerian_songs %>%\r\n",
" count(artist_top_genre) %>%\r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"အချက်အလက်များအတွဲအတွင်းရှိ ကိန်းဂဏန်းအမျိုးအစားများအကြား ရှိနိုင်သော တိုင်းတာနိုင်သော ရှုထောင့်တစ်ခုကို ကြည့်ရှုကြမည်။ ဒီဆက်နွယ်မှုကို သင်္ချာအရ [correlation statistic](https://en.wikipedia.org/wiki/Correlation) ဖြင့် တိုင်းတာနိုင်သည်။\n",
"\n",
"Correlation statistic သည် -1 မှ 1 အတွင်းရှိ တန်ဖိုးတစ်ခုဖြစ်ပြီး ဆက်နွယ်မှု၏ အားအင်ကို ဖော်ပြသည်။ 0 အထက်ရှိ တန်ဖိုးများသည် *အပေါင်းသက်သက်ဆက်နွယ်မှု* (variable တစ်ခု၏ တန်ဖိုးများ မြင့်တက်လာသည်နှင့်အမျှ အခြား variable ၏ တန်ဖိုးများလည်း မြင့်တက်လာသည်) ကို ဖော်ပြပြီး၊ 0 အောက်ရှိ တန်ဖိုးများသည် *အနုတ်သက်သက်ဆက်နွယ်မှု* (variable တစ်ခု၏ တန်ဖိုးများ မြင့်တက်လာသည်နှင့်အမျှ အခြား variable ၏ တန်ဖိုးများ ကျဆင်းလာသည်) ကို ဖော်ပြသည်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Narrow down to numeric variables and fid correlation\r\n",
"corr_mat <- nigerian_songs %>% \r\n",
" select(where(is.numeric)) %>% \r\n",
" cor()\r\n",
"\r\n",
"# Visualize correlation matrix\r\n",
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"အချက်အလက်များသည် `energy` နှင့် `loudness` အကြားတွင်သာ အားလုံးထဲမှာ အနည်းငယ်ဆက်စပ်မှုရှိသည်။ ဒါဟာ သက်ဆိုင်ပါတယ်၊ အကြမ်းအကျဉ်းပြောရရင် အသံကြီးတဲ့ဂီတတွေဟာ အင်အားကြီးတတ်ပါတယ်။ `Popularity` ဟာ `release date` နဲ့ ဆက်စပ်မှုရှိတယ်လို့ တွေ့ရပါတယ်၊ ဒါဟာလည်း သက်ဆိုင်ပါတယ်၊ အခုတလောထွက်တဲ့သီချင်းတွေဟာ ပိုမိုလူကြိုက်များတတ်ပါတယ်။ သီချင်းအရှည်နှင့် အင်အားကြီးမှုတို့လည်း ဆက်စပ်မှုရှိတယ်လို့ တွေ့ရပါတယ်။\n",
"\n",
"ဒီအချက်အလက်တွေကို clustering algorithm တစ်ခုက ဘယ်လိုအဓိပ္ပာယ်ပေးမလဲဆိုတာ စိတ်ဝင်စားဖို့ကောင်းပါတယ်!\n",
"\n",
"> 🎓 Correlation ဟာ causation ကို မဆိုလိုပါဘူးဆိုတာ သတိပြုပါ! ကျွန်တော်တို့မှာ correlation ရှိတယ်ဆိုတဲ့ သက်သေရှိပေမယ့် causation ရှိတယ်ဆိုတဲ့ သက်သေမရှိပါဘူး။ [အလွဲလွဲအချို့ correlation တွေ](https://tylervigen.com/spurious-correlations) ကို ပြသထားတဲ့ ဝက်ဘ်ဆိုဒ်တစ်ခုက ဒီအချက်ကို အလေးပေးပြထားပါတယ်။\n",
"\n",
"### 2. အချက်အလက်ဖြန့်ဝေမှုကို စူးစမ်းကြည့်ရန်\n",
"\n",
"အနည်းငယ်ပိုမိုနက်ရှိုင်းတဲ့မေးခွန်းတွေကို မေးကြည့်ရအောင်။ အမျိုးအစားတွေဟာ သူတို့ရဲ့ danceability perception တွေမှာ လူကြိုက်များမှုအပေါ် အရေးပါလား? ကျွန်တော်တို့ရဲ့ ထိပ်ဆုံးအမျိုးအစားသုံးမျိုးရဲ့ လူကြိုက်များမှုနှင့် danceability အချက်အလက်ဖြန့်ဝေမှုကို x axis နဲ့ y axis တစ်ခုတည်းအပေါ်မှာ [density plots](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) အသုံးပြုပြီး စူးစမ်းကြည့်ရအောင်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Perform 2D kernel density estimation\r\n",
"density_estimate_2d <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
" geom_density_2d(bins = 5, size = 1) +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" xlim(-20, 80) +\r\n",
" ylim(0, 1.2)\r\n",
"\r\n",
"# Density plot based on the popularity\r\n",
"density_estimate_pop <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" theme(legend.position = \"none\")\r\n",
"\r\n",
"# Density plot based on the danceability\r\n",
"density_estimate_dance <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
"\r\n",
"\r\n",
"# Patch everything together\r\n",
"library(patchwork)\r\n",
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ကျွန်တော်တို့မြင်ရတာက အမျိုးအစားမရွေးဘဲ အလယ်ဗဟိုရိပ်ခွဲများတန်းစီနေတယ်ဆိုတာပါ။ ဒီအမျိုးအစားအတွက် နိုင်ဂျီးရီးယားလူကြိုက်များမှုဟာ တစ်ခုတည်းသော အကအလှပြနိုင်မှုအဆင့်မှာ တွေ့ဆုံနိုင်မလား?\n",
"\n",
"အထွေထွေအားဖြင့် အမျိုးအစားသုံးမျိုးဟာ လူကြိုက်များမှုနဲ့ အကအလှပြနိုင်မှုအရ တန်းစီနေပါတယ်။ ဒီအနည်းငယ်တန်းစီထားတဲ့ ဒေတာထဲမှာ အစုအဖွဲ့တွေကို သတ်မှတ်ဖို့ အခက်အခဲဖြစ်နိုင်ပါတယ်။ Scatter plot တစ်ခုက ဒီအချက်ကို ထောက်ခံနိုင်မလားဆိုတာ ကြည့်ကြမယ်။\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# A scatter plot of popularity and danceability\r\n",
"scatter_plot <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
" geom_point(size = 2, alpha = 0.8) +\r\n",
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
"\r\n",
"# Add a touch of interactivity\r\n",
"ggplotly(scatter_plot)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"အတူတူသော အာရုံစူးစိုက်မှုများကို scatterplot တွင် ပြသထားသော အချို့သော အချက်အလက်များသည် တူညီသော ပုံစံကို ပြသသည်။\n",
"\n",
"ယေဘူယျအားဖြင့်၊ clustering အတွက် scatterplot များကို အသုံးပြု၍ အချက်အလက်များ၏ အစုအဖွဲ့များကို ပြသနိုင်သည်။ ထို့ကြောင့် visualization အမျိုးအစားကို ကျွမ်းကျင်စွာ အသုံးပြုနိုင်ခြင်းသည် အလွန်အသုံးဝင်သည်။ နောက်တန်းခန်းတွင်၊ ကျွန်ုပ်တို့သည် ဒီအချက်အလက်များကို စစ်ထုတ်ပြီး k-means clustering ကို အသုံးပြုကာ အချက်အလက်များတွင် စိတ်ဝင်စားဖွယ် overlap ဖြစ်နေသော အစုအဖွဲ့များကို ရှာဖွေမည်ဖြစ်သည်။\n",
"\n",
"## **🚀 စိန်ခေါ်မှု**\n",
"\n",
"နောက်တန်းခန်းအတွက် ပြင်ဆင်ရန်၊ သင့်အား production environment တွင် ရှာဖွေပြီး အသုံးပြုနိုင်မည့် clustering algorithm များအကြောင်းကို ရှင်းလင်းပြထားသော chart တစ်ခု ပြုလုပ်ပါ။ Clustering သည် ဘယ်လိုပြဿနာများကို ဖြေရှင်းရန် ကြိုးစားနေသလဲ?\n",
"\n",
"## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း**\n",
"\n",
"Clustering algorithm များကို အသုံးပြုမည်မတိုင်မီ၊ သင့် dataset ၏ သဘာဝကို နားလည်ထားခြင်းသည် အကောင်းဆုံးဖြစ်သည်ဟု ကျွန်ုပ်တို့ သင်ယူခဲ့သည်။ ဒီအကြောင်းအရာကို [ဒီမှာ](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) ပိုမိုဖတ်ရှုပါ။\n",
"\n",
"Clustering နည်းလမ်းများကို ပိုမိုနက်နက်ရှိုင်းရှိုင်း နားလည်ပါ:\n",
"\n",
"- [Tidymodels နှင့် သူငယ်ချင်းများကို အသုံးပြု၍ Clustering Models များကို လေ့ကျင့်ပြီး အကဲဖြတ်ခြင်း](https://rpubs.com/eR_ic/clustering)\n",
"\n",
"- Bradley Boehmke & Brandon Greenwell, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
"\n",
"## **အလုပ်ပေးစာ**\n",
"\n",
"[Clustering အတွက် အခြားသော visualization များကို ရှာဖွေပါ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## ကျေးဇူးတင်စကား:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) သည် ဒီ module ၏ Python version ကို စတင်ဖန်တီးပေးခဲ့သည် ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) သည် machine learning concept များကို ပိုမိုနားလည်ရလွယ်ကူစေရန် အံ့ဩဖွယ် illustration များ ဖန်တီးပေးခဲ့သည်။\n",
"\n",
"ပညာရပ်များကို ပျော်ရွှင်စွာ လေ့လာပါ,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "99c36449cad3708a435f6798cfa39972",
"translation_date": "2025-09-06T12:10:28+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,639 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"colab": {
"name": "lesson_14.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"coopTranslator": {
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
"translation_date": "2025-09-06T12:18:11+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "my"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## R နှင့် Tidy data အခြေခံများကို အသုံးပြု၍ K-Means clustering ကို လေ့လာပါ။\n",
"\n",
"### [**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"ဒီသင်ခန်းစာမှာ Tidymodels package နဲ့ R ecosystem (သူငယ်ချင်းတွေ 🧑‍🤝‍🧑) ထဲက အခြား package တွေကို အသုံးပြုပြီး cluster တွေကို ဖန်တီးနည်းကို သင်ယူပါမယ်။ သင်ရင်းနှီးပြီးသား Nigerian music dataset ကို အသုံးပြုပါမယ်။ K-Means Clustering အခြေခံကို လေ့လာပါမယ်။ အရင်သင်ခန်းစာမှာ သင်ယူခဲ့သလို၊ cluster တွေကို အလုပ်လုပ်စေဖို့ နည်းလမ်းများစွာရှိပြီး သင့် data ပေါ်မူတည်ပြီး သင့်လျော်တဲ့နည်းလမ်းကို ရွေးချယ်ရပါမယ်။ K-Means က အများဆုံး အသုံးပြုတဲ့ clustering နည်းလမ်းဖြစ်လို့ အဲဒီနည်းလမ်းကို စမ်းကြည့်ပါမယ်။ စလိုက်ကြစို့!\n",
"\n",
"သင်လေ့လာရမယ့် အကြောင်းအရာများ:\n",
"\n",
"- Silhouette scoring\n",
"\n",
"- Elbow method\n",
"\n",
"- Inertia\n",
"\n",
"- Variance\n",
"\n",
"### **Introduction**\n",
"\n",
"[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) က signal processing နယ်ပယ်က ဆင်းသက်လာတဲ့ နည်းလမ်းတစ်ခုဖြစ်ပြီး data တွေကို `k clusters` အဖြစ် feature တွေတူညီမှုအပေါ် မူတည်ပြီး ခွဲခြားပေးပါတယ်။\n",
"\n",
"ဒီ cluster တွေကို [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) အနေနဲ့ မြင်နိုင်ပြီး၊ diagram တွေမှာ point (သို့မဟုတ် 'seed') နဲ့ အဲဒီ point ရဲ့ region ပါဝင်ပါတယ်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Jen Looper ရဲ့ Infographic</figcaption>\n",
"\n",
"K-Means clustering ရဲ့ အဆင့်တွေက:\n",
"\n",
"1. Data scientist က ဖန်တီးလိုတဲ့ cluster အရေအတွက်ကို သတ်မှတ်ပါမယ်။\n",
"\n",
"2. Algorithm က data set ထဲက K observations ကို random ရွေးပြီး cluster တွေရဲ့ center (centroids) အဖြစ် သတ်မှတ်ပါမယ်။\n",
"\n",
"3. ကျန် observations တွေကို အနီးဆုံး centroid ကို assign လုပ်ပါမယ်။\n",
"\n",
"4. Cluster တစ်ခုစီရဲ့ mean ကို ပြန်တွက်ပြီး centroid ကို mean ရဲ့နေရာကို ရွှေ့ပါမယ်။\n",
"\n",
"5. Center တွေ ပြန်တွက်ပြီးတဲ့အခါ၊ observation တစ်ခုစီကို ပြန်စစ်ပြီး အခြား cluster နဲ့ ပိုနီးနိုင်မလား စစ်ပါမယ်။ Object တွေကို ပြန် assign လုပ်ပြီး cluster mean အသစ်နဲ့ update လုပ်ပါမယ်။ Cluster assignment နဲ့ centroid update အဆင့်တွေကို iteration ပြုလုပ်ပြီး cluster assignment မပြောင်းလဲတော့တဲ့အချိန် (convergence ရောက်တဲ့အချိန်) မှာ algorithm ရပ်တန့်ပါမယ်။ Typically, centroid တွေ အနည်းငယ်ရွှေ့သွားတဲ့ iteration တွေမှာ algorithm ရပ်တန့်ပြီး cluster တွေ static ဖြစ်သွားပါမယ်။\n",
"\n",
"<div>\n",
"\n",
"> အစပိုင်းမှာ randomization လုပ်ထားတဲ့ k observations တွေကြောင့် procedure ကို အသုံးပြုတဲ့အခါ အနည်းငယ်ကွာခြားတဲ့ရလဒ်တွေ ရနိုင်ပါတယ်။ ဒီအကြောင်းကြောင့် algorithm အများစုက *random starts* အများကြီး အသုံးပြုပြီး WCSS အနည်းဆုံးရတဲ့ iteration ကို ရွေးချယ်ပါတယ်။ အဲဒီအကြောင်းကြောင့် K-Means ကို *nstart* အတော်များများနဲ့ always run လုပ်ဖို့ strongly recommend လုပ်ပါတယ်။ ဒါက *undesirable local optimum* ရှောင်ရှားနိုင်စေပါတယ်။\n",
"\n",
"</div>\n",
"\n",
"Allison Horst ရဲ့ [artwork](https://github.com/allisonhorst/stats-illustrations) ကို အသုံးပြုထားတဲ့ animation လေးက clustering process ကို ရှင်းပြထားပါတယ်:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>@allison_horst ရဲ့ Artwork</figcaption>\n",
"\n",
"Clustering နဲ့ပတ်သက်ပြီး အခြေခံမေးခွန်းတစ်ခုက: သင့် data ကို ဘယ်နှစ်ခု cluster အဖြစ် ခွဲခြားရမလဲဆိုတာကို ဘယ်လိုသိနိုင်မလဲ? K-Means ရဲ့ drawback တစ်ခုက `k` ကို သတ်မှတ်ရမယ်ဆိုတာပါ။ ဒါက `centroids` အရေအတွက်ကို ဆိုလိုပါတယ်။ ကံကောင်းစွာ `elbow method` က `k` ရဲ့ အကောင်းဆုံး value ကို ခန့်မှန်းဖို့ ကူညီပေးပါတယ်။ မကြာခင်မှာ စမ်းကြည့်ပါမယ်။\n",
"\n",
"### \n",
"\n",
"**Prerequisite**\n",
"\n",
"အရင်သင်ခန်းစာ [previous lesson](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) မှာ ရပ်ထားတဲ့နေရာကနေ ဆက်လုပ်ပါမယ်။ အဲဒီမှာ data set ကို ခွဲခြမ်းစိတ်ဖြာပြီး visualization အများကြီးလုပ်ခဲ့ပြီး observation တွေကို filter လုပ်ထားပါတယ်။ သေချာစွာ ပြန်ကြည့်ပါ။\n",
"\n",
"ဒီ module ကို ပြီးမြောက်စေဖို့ package အချို့လိုအပ်ပါမယ်။ အဲဒီ package တွေကို `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))` လို့ install လုပ်နိုင်ပါတယ်။\n",
"\n",
"အခြားနည်းလမ်းအနေနဲ့ အောက်ပါ script က module ကို ပြီးမြောက်စေဖို့လိုအပ်တဲ့ package တွေရှိမရှိ စစ်ဆေးပြီး မရှိတဲ့ package တွေကို install လုပ်ပေးပါမယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ah_tBi58LXyi"
},
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7e--UCUTLXym"
},
"source": [
"အရင်ဆုံး စတင်လိုက်ကြစို့!\n",
"\n",
"## 1. ဒေတာနှင့်အတူ အကအဖြစ်: အများဆုံးလူကြိုက်များသော ဂီတအမျိုးအစား ၃ မျိုးကို ရှာဖွေပါ\n",
"\n",
"ဒီဟာက အရင်စာသင်ခန်းမှာ ကျွန်တော်တို့ လုပ်ခဲ့တာတွေကို ပြန်လည်သုံးသပ်ခြင်းဖြစ်ပါတယ်။ ဒေတာကို ခွဲခြမ်းစိတ်ဖြာပြီး စမ်းကြည့်ရအောင်!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ycamx7GGLXyn"
},
"source": [
"# Load the core tidyverse and make it available in your current R session\n",
"library(tidyverse)\n",
"\n",
"# Import the data into a tibble\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
"\n",
"# Narrow down to top 3 popular genres\n",
"nigerian_songs <- df %>% \n",
" # Concentrate on top 3 genres\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
" # Remove unclassified observations\n",
" filter(popularity != 0)\n",
"\n",
"\n",
"\n",
"# Visualize popular genres using bar plots\n",
"theme_set(theme_light())\n",
"nigerian_songs %>%\n",
" count(artist_top_genre) %>%\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
" fill = artist_top_genre)) +\n",
" geom_col(alpha = 0.8) +\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
" ggtitle(\"Top genres\") +\n",
" theme(plot.title = element_text(hjust = 0.5))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "b5h5zmkPLXyp"
},
"source": [
"🤩 ဒါကောင်းတယ်!\n",
"\n",
"## 2. ဒေတာကို ပိုမိုလေ့လာခြင်း။\n",
"\n",
"ဒီဒေတာက ဘယ်လောက်သန့်ရှင်းလဲ? Boxplot တွေကို သုံးပြီး အထူးထင်ရှားနေတဲ့အချက်တွေကို စစ်ဆေးကြည့်ရအောင်။ အထူးထင်ရှားနေတဲ့အချက်တွေ နည်းတဲ့ နံပါတ်ဆိုင်ရာကော်လံတွေကို အဓိကထားပြီး စစ်ဆေးပါမယ် (သို့ပင်မဟုတ် အထူးထင်ရှားနေတဲ့အချက်တွေကို ဖယ်ရှားနိုင်ပါတယ်။) Boxplot တွေက ဒေတာရဲ့ အကွာအဝေးကို ပြသနိုင်ပြီး ဘယ်ကော်လံတွေကို အသုံးပြုရမလဲဆိုတာ ရွေးချယ်ဖို့ အထောက်အကူဖြစ်စေပါတယ်။ သို့သော် Boxplot တွေက ကွဲပြားမှု (variance) ကို မပြသနိုင်ပါဘူး၊ ကောင်းမွန်တဲ့ clusterable ဒေတာအတွက် အရေးကြီးတဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပါတယ်။ ပိုမိုသိရှိရန် [ဒီဆွေးနွေးချက်](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) ကို ကြည့်ပါ။\n",
"\n",
"[Boxplot](https://en.wikipedia.org/wiki/Box_plot) တွေကို `numeric` ဒေတာရဲ့ ဖြန့်ဝေမှုကို ဂရပ်ဖစ်ပုံစံနဲ့ ဖော်ပြဖို့ အသုံးပြုပါတယ်၊ ဒါကြောင့် နံပါတ်ဆိုင်ရာကော်လံအားလုံးကို လူကြိုက်များတဲ့ ဂီတအမျိုးအစားတွေနဲ့အတူ *ရွေးချယ်* လုပ်ပြီး စတင်ကြည့်ရအောင်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HhNreJKLLXyq"
},
"source": [
"# Select top genre column and all other numeric columns\n",
"df_numeric <- nigerian_songs %>% \n",
" select(artist_top_genre, where(is.numeric)) \n",
"\n",
"# Display the data\n",
"df_numeric %>% \n",
" slice_head(n = 5)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "uYXrwJRaLXyq"
},
"source": [
"`where` အကူအညီကို သုံးပြီး ရွေးချယ်မှုကို လွယ်ကူစေတဲ့ နည်းလမ်းကို ကြည့်ပါ 💁။ ဒီလို အခြားသော function များကို [ဒီမှာ](https://tidyselect.r-lib.org/) ရှာဖွေပါ။\n",
"\n",
"အရေအတွက်ဆိုင်ရာ feature တစ်ခုစီအတွက် boxplot တစ်ခုစီ ပြုလုပ်မည်ဖြစ်ပြီး loop မသုံးရန် ရှောင်ရှားလိုသောကြောင့်၊ `facets` ကို အသုံးပြုနိုင်ရန်အတွက် *longer* format သို့ data ကို ပြောင်းလဲဖွဲ့စည်းပါမည်။ `facets` သည် data ၏ subset တစ်ခုစီကို ပြသသော subplot များဖြစ်သည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gd5bR3f8LXys"
},
"source": [
"# Pivot data from wide to long\n",
"df_numeric_long <- df_numeric %>% \n",
" pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
"\n",
"# Print out data\n",
"df_numeric_long %>% \n",
" slice_head(n = 15)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-7tE1swnLXyv"
},
"source": [
"အရမ်းရှည်လို့ပါ! အခုတော့ `ggplots` တချို့လုပ်ကြည့်မယ်! ဒါဆိုရင် ဘယ် `geom` ကိုသုံးမလဲ?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "r88bIsyuLXyy"
},
"source": [
"# Make a box plot\n",
"df_numeric_long %>% \n",
" ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
" geom_boxplot() +\n",
" facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
" theme(legend.position = \"none\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYVyKIUELXyz"
},
"source": [
"အရမ်းလွယ်တယ်-ဂျီဂျီ!\n",
"\n",
"အခုတော့ ဒီဒေတာက အနည်းငယ် ရွှံ့ရွှံ့လေးဖြစ်နေတယ်ဆိုတာ မြင်နိုင်ပါပြီ။ ကော်လံတစ်ခုချင်းစီကို boxplot အနေနဲ့ ကြည့်ရှုရင်း၊ outliers တွေကို တွေ့နိုင်ပါတယ်။ ဒီ outliers တွေကို dataset ထဲကနေ ဖယ်ရှားနိုင်ပေမယ့် ဒါက ဒေတာကို အရမ်းနည်းသွားစေမှာပါ။\n",
"\n",
"အခုအချိန်မှာတော့ clustering exercise အတွက် အသုံးပြုမယ့် ကော်လံတွေကို ရွေးချယ်ကြမယ်။ range တူတဲ့ numeric ကော်လံတွေကို ရွေးချယ်ကြမယ်။ `artist_top_genre` ကို numeric အနေနဲ့ encode လုပ်နိုင်ပေမယ့် အခုအချိန်မှာတော့ ဒါကို drop လုပ်လိုက်မယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-wkpINyZLXy0"
},
"source": [
"# Select variables with similar ranges\n",
"df_numeric_select <- df_numeric %>% \n",
" select(popularity, danceability, acousticness, loudness, energy) \n",
"\n",
"# Normalize data\n",
"# df_numeric_select <- scale(df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "D7dLzgpqLXy1"
},
"source": [
"## 3. R မှာ k-means clustering ကိုတွက်ချက်ခြင်း\n",
"\n",
"R မှာ `kmeans` ဆိုတဲ့ built-in function ကိုသုံးပြီး k-means ကိုတွက်ချက်နိုင်ပါတယ်၊ `help(\"kmeans()\")` ကိုကြည့်ပါ။ `kmeans()` function က အဓိက argument အနေနဲ့ အားလုံးနံပါတ်ဖြစ်တဲ့ column တွေပါဝင်တဲ့ data frame ကို လက်ခံပါတယ်။\n",
"\n",
"k-means clustering ကိုသုံးတဲ့အခါ ပထမဆုံးအဆင့်ကတော့ နောက်ဆုံးရလဒ်မှာ ဖွဲ့စည်းမယ့် cluster (k) အရေအတွက်ကို သတ်မှတ်ရမှာဖြစ်ပါတယ်။ Dataset ထဲကနေ သီချင်းအမျိုးအစား ၃ မျိုးကို ခွဲထုတ်ထားတာကို သိပြီးသားဖြစ်တဲ့အတွက် ၃ ကိုစမ်းကြည့်ရအောင်:\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "uC4EQ5w7LXy5"
},
"source": [
"set.seed(2056)\n",
"# Kmeans clustering for 3 clusters\n",
"kclust <- kmeans(\n",
" df_numeric_select,\n",
" # Specify the number of clusters\n",
" centers = 3,\n",
" # How many random initial configurations\n",
" nstart = 25\n",
")\n",
"\n",
"# Display clustering object\n",
"kclust\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hzfhscWrLXy-"
},
"source": [
"kmeans အရာဝတ္ထုတွင် `help(\"kmeans()\")` တွင်ကောင်းစွာရှင်းပြထားသော အချက်အလက်များစွာပါရှိသည်။ အခုအချိန်မှာတော့ အချို့အချက်အလက်များကိုသာ အာရုံစိုက်ကြမယ်။ အချက်အလက်များကို 65, 110, 111 အရွယ်အစားရှိသော 3 ခုအုပ်စုအလိုက် ခွဲထားသည်ကို တွေ့ရသည်။ ထို့အပြင် အထွက်မှာ 5 ခုသော အပြောင်းအလဲများအတွက် အုပ်စု 3 ခု၏ အုပ်စုအလယ်ဗဟို (mean) များကိုလည်း ပါရှိသည်။\n",
"\n",
"Clustering vector သည် တစ်ခုချင်းစီသော observation အတွက် အုပ်စုခွဲခြင်းအမည်ဖြစ်သည်။ `augment` function ကို အသုံးပြု၍ အုပ်စုခွဲခြင်းအမည်ကို မူရင်းဒေတာအစုအဝေးထဲသို့ ထည့်သွင်းကြရအောင်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0XwwpFGQLXy_"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"augment(kclust, df_numeric_select) %>% \n",
" relocate(.cluster) %>% \n",
" slice_head(n = 10)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "NXIVXXACLXzA"
},
"source": [
"ကျွန်တော်တို့ dataset ကို ၃ အုပ်အုပ်စုအဖြစ် ခွဲခြားပြီးပြီ။ ဒါဆိုရင် ကျွန်တော်တို့ clustering က ဘယ်လောက်ကောင်းလဲ 🤷? `Silhouette score` ကိုကြည့်လိုက်ရအောင်။\n",
"\n",
"### **Silhouette score**\n",
"\n",
"[Silhouette analysis](https://en.wikipedia.org/wiki/Silhouette_(clustering)) ကို အသုံးပြုပြီး အုပ်စုတွေကြားက ခွဲခြားမှုအကွာအဝေးကို လေ့လာနိုင်ပါတယ်။ ဒီ score ဟာ -1 ကနေ 1 အထိ ပြောင်းလဲနိုင်ပြီး၊ score က 1 နီးစပ်ရင် အုပ်စုဟာ တင်းကျပ်ပြီး အခြားအုပ်စုတွေနဲ့ ကောင်းစွာ ခွဲခြားထားတယ်လို့ ဆိုနိုင်ပါတယ်။ 0 နီးစပ်တဲ့ value ကတော့ အနီးအနားမှာရှိတဲ့ အုပ်စုတွေရဲ့ decision boundary နဲ့ sample တွေ overlap ဖြစ်နေတယ်လို့ ပြသပါတယ်။ [source](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)\n",
"\n",
"Average silhouette method က observations တွေရဲ့ average silhouette ကို *k* ရဲ့ အမျိုးမျိုးသော value တွေအတွက် တွက်ချက်ပေးပါတယ်။ Average silhouette score မြင့်မားရင် clustering ကောင်းတယ်လို့ ဆိုနိုင်ပါတယ်။\n",
"\n",
"`silhouette` function ကို cluster package ထဲမှာ အသုံးပြုပြီး average silhouette width ကို တွက်ချက်နိုင်ပါတယ်။\n",
"\n",
"> Silhouette ကို [distance](https://en.wikipedia.org/wiki/Distance \"Distance\") metric မျိုးစုံနဲ့ တွက်ချက်နိုင်ပါတယ်၊ ဥပမာ [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") နဲ့ [Manhattan distance](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") တို့ဖြစ်ပြီး၊ အဲဒီ distance တွေကို [ယခင်သင်ခန်းစာ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) မှာ ဆွေးနွေးခဲ့ပါတယ်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Jn0McL28LXzB"
},
"source": [
"# Load cluster package\n",
"library(cluster)\n",
"\n",
"# Compute average silhouette score\n",
"ss <- silhouette(kclust$cluster,\n",
" # Compute euclidean distance\n",
" dist = dist(df_numeric_select))\n",
"mean(ss[, 3])\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QyQRn97nLXzC"
},
"source": [
"ကျွန်ုပ်တို့၏ အမှတ်သည် **.549** ဖြစ်ပြီး အလယ်အလတ်တွင် ရှိနေသည်။ ဤသည်မှာ ကျွန်ုပ်တို့၏ ဒေတာသည် ဤအမျိုးအစား၏ clustering အတွက် အထူးသင့်လျော်မှုမရှိကြောင်း ပြသသည်။ ဤအယူအဆကို မြင်သာစွာ အတည်ပြုနိုင်မလားဆိုတာ ကြည့်ကြရအောင်။ [factoextra package](https://rpkgs.datanovia.com/factoextra/index.html) သည် clustering ကို မြင်သာစေသော (`fviz_cluster()`) function များကို ပံ့ပိုးပေးသည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7a6Km1_FLXzD"
},
"source": [
"library(factoextra)\n",
"\n",
"# Visualize clustering results\n",
"fviz_cluster(kclust, df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IBwCWt-0LXzD"
},
"source": [
"အုပ်စုများအကြားအပြန်အလှန်ကျယ်ကျယ်ပြန့်ပြန့်ဖြစ်နေသည်မှာ ကျွန်ုပ်တို့၏ဒေတာသည် ဤအမျိုးအစားအုပ်စုဖွဲ့ခြင်းအတွက် အထူးသင့်လျော်မှုမရှိကြောင်းကို ဖော်ပြနေသော်လည်း ဆက်လက်လုပ်ဆောင်ကြပါစို့။\n",
"\n",
"## 4. အကောင်းဆုံးအုပ်စုများကိုသတ်မှတ်ခြင်း\n",
"\n",
"K-Means အုပ်စုဖွဲ့ခြင်းတွင် မကြာခဏပေါ်လာသော အခြေခံမေးခွန်းတစ်ခုမှာ - အတန်းအမှတ်အသားများမသိဘဲ ဒေတာကို အုပ်စုများအဖြစ် ဘယ်နှစ်ခုခွဲရမလဲဆိုတာကို ဘယ်လိုသိနိုင်မလဲဆိုတာဖြစ်သည်။\n",
"\n",
"သိနိုင်ရန်နည်းလမ်းတစ်ခုမှာ `အုပ်စုဖွဲ့မော်ဒယ်များစီးရီး` ကို အုပ်စုအရေအတွက်တိုးတက်လာစေပြီး (ဥပမာ 1-10) ဒေတာနမူနာကို အသုံးပြုကာ **Silhouette score** ကဲ့သို့သော အုပ်စုဖွဲ့မီထရစ်များကို အကဲဖြတ်ခြင်းဖြစ်သည်။\n",
"\n",
"အကောင်းဆုံးအုပ်စုအရေအတွက်ကို *k* ရဲ့ တန်ဖိုးအမျိုးမျိုးအတွက် အုပ်စုဖွဲ့အယ်လဂိုရီသုံးပြီး **Within Cluster Sum of Squares** (WCSS) ကိုတွက်ချက်ခြင်းဖြင့် သတ်မှတ်ကြမည်။ အစုအတွင်း စုစုပေါင်း စတုရန်းပမာဏ (WCSS) သည် အုပ်စုဖွဲ့ခြင်း၏ တိကျမှုကိုတိုင်းတာပြီး ဒေတာအချက်အလက်များနီးစပ်မှုကို ဖော်ပြသည့်အတွက် တန်ဖိုးနည်းသင့်သည်။ တန်ဖိုးနည်းသည့်အခါ ဒေတာအချက်အလက်များ ပိုနီးစပ်သည်ကိုဆိုလိုသည်။\n",
"\n",
"အုပ်စုအရေအတွက် `k` ကို 1 မှ 10 အထိ ရွေးချယ်မှုများ၏ သက်ရောက်မှုကို လေ့လာကြစို့။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hSeIiylDLXzE"
},
"source": [
"# Create a series of clustering models\n",
"kclusts <- tibble(k = 1:10) %>% \n",
" # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
" mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
" # Farm out clustering metrics eg WCSS\n",
" glanced = map(model, ~ glance(.x))) %>% \n",
" unnest(cols = glanced)\n",
" \n",
"\n",
"# View clustering rsulsts\n",
"kclusts\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "m7rS2U1eLXzE"
},
"source": [
"ယခုအခါတွင် center *k* ဖြင့် clustering algorithm တစ်ခုစီအတွက် total within-cluster sum-of-squares (tot.withinss) ရရှိပြီးနောက်၊ [elbow method](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) ကိုအသုံးပြု၍ cluster အရေအတွက်အကောင်းဆုံးကိုရှာဖွေပါသည်။ ဤနည်းလမ်းသည် cluster အရေအတွက်၏ function အနေဖြင့် WCSS ကိုပုံဖော်ခြင်းနှင့် [curve ၏ elbow](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") ကို cluster အရေအတွက်အဖြစ်ရွေးချယ်ခြင်းဖြင့် ဖွဲ့စည်းထားသည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "o_DjHGItLXzF"
},
"source": [
"set.seed(2056)\n",
"# Use elbow method to determine optimum number of clusters\n",
"kclusts %>% \n",
" ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
" geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
" geom_point(size = 2, color = \"#FF7F0EFF\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "pLYyt5XSLXzG"
},
"source": [
"ဒီဇာတ်ကြောင်းမှာ WCSS အတွက် အလွန်လျော့ကျမှု (ထို့ကြောင့် *တင်းကျပ်မှု* ပိုများလာခြင်း) ကို ကလပ်စတာအရေအတွက် တစ်ခုမှ နှစ်ခုသို့ တိုးလာသည့်အခါ တွေ့ရပြီး၊ နှစ်ခုမှ သုံးခုသို့ တိုးလာသည့်အခါတွင်လည်း ထင်ရှားသော လျော့ကျမှုကို တွေ့ရသည်။ ထို့နောက်တွင်တော့ လျော့ကျမှုသည် သိသာစွာ မရှိတော့ဘဲ၊ ချတ်တွင် သုံးခုခန့်ရှိသော ကလပ်စတာများတွင် `elbow` 💪 တစ်ခု ဖြစ်ပေါ်လာသည်ကို တွေ့ရသည်။ ဒါကတော့ ဒေတာအချက်အလက်များကို သီးခြားကွဲထွက်စွာ သုံးခုခန့်ရှိကြောင်းကို ကောင်းမွန်စွာ ပြသနေသည်။\n",
"\n",
"အခုတော့ `k = 3` ဖြစ်သော clustering မော်ဒယ်ကို ထုတ်ယူနိုင်ပြီဖြစ်သည်။\n",
"\n",
"> `pull()`: တစ်ခုတည်းသော ကော်လံကို ထုတ်ယူရန် အသုံးပြုသည် \n",
">\n",
"> `pluck()`: စာရင်းများကဲ့သို့သော ဒေတာဖွဲ့စည်းမှုများကို အညွှန်းပြရန် အသုံးပြုသည် \n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JP_JPKBILXzG"
},
"source": [
"# Extract k = 3 clustering\n",
"final_kmeans <- kclusts %>% \n",
" filter(k == 3) %>% \n",
" pull(model) %>% \n",
" pluck(1)\n",
"\n",
"\n",
"final_kmeans\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "l_PDTu8tLXzI"
},
"source": [
"အိုကေ! အခုရထားတဲ့ cluster တွေကို မြင်တွေ့ကြည့်ရှုကြမယ်။ `plotly` ကိုသုံးပြီး အပြန်အလှန်ဆက်သွယ်နိုင်တဲ့ visualization လုပ်ချင်ပါသလား?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dNcleFe-LXzJ"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"results <- augment(final_kmeans, df_numeric_select) %>% \n",
" bind_cols(df_numeric %>% select(artist_top_genre)) \n",
"\n",
"# Plot cluster assignments\n",
"clust_plt <- results %>% \n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
" geom_point(size = 2, alpha = 0.8) +\n",
" paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
"\n",
"ggplotly(clust_plt)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "6JUM_51VLXzK"
},
"source": [
"သင့်အားဖြင့် အရောင်အမျိုးမျိုးဖြင့် ဖော်ပြထားသော အစုအဖွဲ့တစ်ခုစီသည် အမျိုးအစားအမျိုးမျိုး (ပုံသဏ္ဍာန်အမျိုးမျိုးဖြင့် ဖော်ပြထားသော) ကို သီးခြားထားမည်ဟု မျှော်လင့်နိုင်ပါသည်။\n",
"\n",
"အခုတော့ မော်ဒယ်၏ တိကျမှုကို ကြည့်ရှုကြမည်။\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HdIMUGq7LXzL"
},
"source": [
"# Assign genres to predefined integers\n",
"label_count <- results %>% \n",
" group_by(artist_top_genre) %>% \n",
" mutate(id = cur_group_id()) %>% \n",
" ungroup() %>% \n",
" summarise(correct_labels = sum(.cluster == id))\n",
"\n",
"\n",
"# Print results \n",
"cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
"\n",
"cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "C50wvaAOLXzM"
},
"source": [
"ဒီမော်ဒယ်ရဲ့တိကျမှုက မဆိုးဘူး၊ ဒါပေမယ့် အလွန်ကောင်းလို့မရောက်သေးဘူး။ ဒေတာဟာ K-Means Clustering နဲ့အတူ အလုပ်လုပ်ဖို့မသင့်တော်နိုင်ဘူးလို့ဖြစ်နိုင်ပါတယ်။ ဒီဒေတာဟာ မျှတမှုမရှိလွန်းတာ၊ ဆက်စပ်မှုနည်းလွန်းတာ၊ နဲ့ ကော်လံတန်ဖိုးတွေကြားမှာ အပြောင်းအလဲများလွန်းတာကြောင့် အုပ်စုဖွဲ့ဖို့မလွယ်ကူပါဘူး။ အမှန်တကယ်တော့ ဖွဲ့စည်းထားတဲ့အုပ်စုတွေဟာ အထက်မှာသတ်မှတ်ထားတဲ့ ဇာနီးသုံးမျိုးကဏ္ဍတွေက အလွန်အကျွံသက်ရောက်မှုရှိတာဖြစ်နိုင်ပါတယ်။\n",
"\n",
"ဒါပေမယ့်လည်း၊ ဒီလေ့လာမှုက အတော်လေးအကျိုးရှိတဲ့လုပ်ငန်းစဉ်တစ်ခုပါပဲ!\n",
"\n",
"Scikit-learn ရဲ့စာရွက်စာတမ်းတွေမှာ၊ ဒီလိုမော်ဒယ်တစ်ခု၊ အုပ်စုတွေက အလွန်ရှင်းလင်းစွာမသတ်မှတ်ထားတဲ့အခါမှာ 'variance' ပြဿနာရှိတယ်လို့တွေ့နိုင်ပါတယ်။\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Scikit-learn မှ Infographic</figcaption>\n",
"\n",
"\n",
"\n",
"## **Variance**\n",
"\n",
"Variance ကို \"Mean မှအကွာအဝေးရဲ့စတုရန်းတန်ဖိုးတွေရဲ့ပျမ်းမျှ\" ဟုသတ်မှတ်ထားသည် [အရင်းအမြစ်](https://www.mathsisfun.com/data/standard-deviation.html)။ ဒီ clustering ပြဿနာရဲ့အခြေအနေမှာတော့၊ ဒေတာတွေဟာ Mean မှအလွန်အကျွံကွာဟမှုရှိတယ်ဆိုတာကိုရည်ညွှန်းပါတယ်။\n",
"\n",
"✅ ဒီပြဿနာကိုပြင်ဆင်နိုင်တဲ့နည်းလမ်းတွေကိုစဉ်းစားဖို့အချိန်ကောင်းတစ်ခုပါပဲ။ ဒေတာကိုနည်းနည်းပိုပြီးပြင်ဆင်မလား? ကော်လံအခြားတွေကိုသုံးမလား? အခြား algorithm ကိုသုံးမလား? အကြံပြုချက်: [ဒေတာကို scale လုပ်ပါ](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/)၊ ဒေတာကို normalize လုပ်ပြီး အခြားကော်လံတွေကိုစမ်းသပ်ပါ။\n",
"\n",
"> ဒီ '[variance calculator](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ကိုသုံးပြီး concept ကိုနည်းနည်းပိုနားလည်နိုင်ပါတယ်။\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Challenge**\n",
"\n",
"ဒီ notebook ကိုနည်းနည်းအချိန်ယူပြီး parameter တွေကိုပြင်ဆင်ပါ။ ဒေတာကိုပိုပြီးသန့်စင်ခြင်း (ဥပမာ - outliers ဖယ်ရှားခြင်း) ကတဆင့် မော်ဒယ်ရဲ့တိကျမှုကိုတိုးတက်စေနိုင်မလား? သတ်မှတ်ထားတဲ့ဒေတာ sample တွေကိုပိုပြီးအလေးပေးဖို့ weight တွေကိုအသုံးပြုနိုင်ပါတယ်။ အုပ်စုတွေကိုပိုကောင်းစွာဖွဲ့စည်းဖို့အခြားဘာတွေလုပ်နိုင်မလဲ?\n",
"\n",
"အကြံပြုချက်: ဒေတာကို scale လုပ်ကြည့်ပါ။ notebook မှာ commented code ရှိပါတယ်၊ ဒါဟာ standard scaling ကိုထည့်သွင်းပြီး ဒေတာကော်လံတွေကို range ရဲ့အနီးအနားမှာတူညီစေဖို့အတွက်ပါ။ Silhouette score ကကျသွားပေမယ့် elbow graph ရဲ့ 'kink' က smooth ဖြစ်သွားတာကိုတွေ့ရပါမယ်။ ဒါဟာ ဒေတာကို unscaled ထားလိုက်ရင် variance နည်းတဲ့ဒေတာတွေကပိုအလေးပေးခံရတာကြောင့်ဖြစ်ပါတယ်။ ဒီပြဿနာအကြောင်းနည်းနည်းပိုဖတ်ရှုပါ [ဒီမှာ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)။\n",
"\n",
"## [**Post-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Review & Self Study**\n",
"\n",
"- K-Means Simulator [ဒီလိုတစ်ခု](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) ကိုကြည့်ရှုပါ။ ဒီ tool ကို sample data point တွေကို visualization လုပ်ပြီး centroid တွေကိုသတ်မှတ်ဖို့အသုံးပြုနိုင်ပါတယ်။ ဒေတာရဲ့ randomness, အုပ်စုအရေအတွက်နဲ့ centroid အရေအတွက်တွေကိုပြင်ဆင်နိုင်ပါတယ်။ ဒေတာကိုအုပ်စုဖွဲ့စည်းနိုင်တဲ့နည်းလမ်းကိုနားလည်စေဖို့ကူညီနိုင်ပါသလား?\n",
"\n",
"- [Stanford မှ K-Means အကြောင်း handout](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) ကိုလည်းကြည့်ရှုပါ။\n",
"\n",
"K-Means clustering နဲ့အလုပ်လုပ်ဖို့သင့်တော်တဲ့ဒေတာ set တွေကိုစမ်းသပ်ချင်ပါသလား? ဒီနေရာတွေကိုကြည့်ရှုပါ-\n",
"\n",
"- [Train and Evaluate Clustering Models](https://rpubs.com/eR_ic/clustering) Tidymodels နဲ့အတူ\n",
"\n",
"- [K-means Cluster Analysis](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-means clustering with tidy data principles](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Assignment**\n",
"\n",
"[Clustering နည်းလမ်းအမျိုးမျိုးကိုစမ်းကြည့်ပါ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## THANK YOU TO:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) က ဒီ module ရဲ့ Python version ကိုဖန်တီးပေးခဲ့တာအတွက် ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) က R ကိုပိုပြီးကြိုဆိုဖို့နဲ့စိတ်ဝင်စားဖို့ကူညီတဲ့အံ့မခန်း illustration တွေကိုဖန်တီးပေးခဲ့ပါတယ်။ သူမရဲ့ [gallery](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) မှာ illustration တွေကိုရှာဖွေကြည့်ရှုနိုင်ပါတယ်။\n",
"\n",
"ပညာရရှိပါစေ၊\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"500\"/>\n",
" <figcaption>@allison_horst ရဲ့အနုပညာ</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,100 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "27de2abc0235ebd22080fc8f1107454d",
"translation_date": "2025-09-06T12:53:58+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from textblob import TextBlob\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# You should download the book text, clean it, and import it here\n",
"with open(\"pride.txt\", encoding=\"utf8\") as f:\n",
" file_contents = f.read()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"book_pride = TextBlob(file_contents)\n",
"positive_sentiment_sentences = []\n",
"negative_sentiment_sentences = []"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for sentence in book_pride.sentences:\n",
" if sentence.sentiment.polarity == 1:\n",
" positive_sentiment_sentences.append(sentence)\n",
" if sentence.sentiment.polarity == -1:\n",
" negative_sentiment_sentences.append(sentence)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"The \" + str(len(positive_sentiment_sentences)) + \" most positive sentences:\")\n",
"for sentence in positive_sentiment_sentences:\n",
" print(\"+ \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"The \" + str(len(negative_sentiment_sentences)) + \" most negative sentences:\")\n",
"for sentence in negative_sentiment_sentences:\n",
" print(\"- \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,174 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "2d05e7db439376aa824f4b387f8324ca",
"translation_date": "2025-09-06T12:53:42+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# EDA\n",
"import pandas as pd\n",
"import time"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_difference_review_avg(row):\n",
" return row[\"Average_Score\"] - row[\"Calc_Average_Score\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"print(\"Loading data file now, this could take a while depending on file size\")\n",
"start = time.time()\n",
"df = pd.read_csv('../../data/Hotel_Reviews.csv')\n",
"end = time.time()\n",
"print(\"Loading took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What shape is the data (rows, columns)?\n",
"print(\"The shape of the data (rows, cols) is \" + str(df.shape))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# value_counts() creates a Series object that has index and values\n",
"# in this case, the country and the frequency they occur in reviewer nationality\n",
"nationality_freq = df[\"Reviewer_Nationality\"].value_counts()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What reviewer nationality is the most common in the dataset?\n",
"print(\"The highest frequency reviewer nationality is \" + str(nationality_freq.index[0]).strip() + \" with \" + str(nationality_freq[0]) + \" reviews.\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What is the top 10 most common nationalities and their frequencies?\n",
"print(\"The top 10 highest frequency reviewer nationalities are:\")\n",
"print(nationality_freq[0:10].to_string())\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# How many unique nationalities are there?\n",
"print(\"There are \" + str(nationality_freq.index.size) + \" unique nationalities in the dataset\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What was the most frequently reviewed hotel for the top 10 nationalities - print the hotel and number of reviews\n",
"for nat in nationality_freq[:10].index:\n",
" # First, extract all the rows that match the criteria into a new dataframe\n",
" nat_df = df[df[\"Reviewer_Nationality\"] == nat] \n",
" # Now get the hotel freq\n",
" freq = nat_df[\"Hotel_Name\"].value_counts()\n",
" print(\"The most reviewed hotel for \" + str(nat).strip() + \" was \" + str(freq.index[0]) + \" with \" + str(freq[0]) + \" reviews.\") \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# How many reviews are there per hotel (frequency count of hotel) and do the results match the value in `Total_Number_of_Reviews`?\n",
"# First create a new dataframe based on the old one, removing the uneeded columns\n",
"hotel_freq_df = df.drop([\"Hotel_Address\", \"Additional_Number_of_Scoring\", \"Review_Date\", \"Average_Score\", \"Reviewer_Nationality\", \"Negative_Review\", \"Review_Total_Negative_Word_Counts\", \"Positive_Review\", \"Review_Total_Positive_Word_Counts\", \"Total_Number_of_Reviews_Reviewer_Has_Given\", \"Reviewer_Score\", \"Tags\", \"days_since_review\", \"lat\", \"lng\"], axis = 1)\n",
"# Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found\n",
"hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')\n",
"# Get rid of all the duplicated rows\n",
"hotel_freq_df = hotel_freq_df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
"print()\n",
"print(hotel_freq_df.to_string())\n",
"print(str(hotel_freq_df.shape))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# While there is an `Average_Score` for each hotel according to the dataset, \n",
"# you can also calculate an average score (getting the average of all reviewer scores in the dataset for each hotel)\n",
"# Add a new column to your dataframe with the column header `Calc_Average_Score` that contains that calculated average. \n",
"df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n",
"# Add a new column with the difference between the two average scores\n",
"df[\"Average_Score_Difference\"] = df.apply(get_difference_review_avg, axis = 1)\n",
"# Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)\n",
"review_scores_df = df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
"# Sort the dataframe to find the lowest and highest average score difference\n",
"review_scores_df = review_scores_df.sort_values(by=[\"Average_Score_Difference\"])\n",
"print(review_scores_df[[\"Average_Score_Difference\", \"Average_Score\", \"Calc_Average_Score\", \"Hotel_Name\"]])\n",
"# Do any hotels have the same (rounded to 1 decimal place) `Average_Score` and `Calc_Average_Score`?\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,172 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "033cb89c85500224b3c63fd04f49b4aa",
"translation_date": "2025-09-06T12:54:13+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import time\n",
"import ast"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def replace_address(row):\n",
" if \"Netherlands\" in row[\"Hotel_Address\"]:\n",
" return \"Amsterdam, Netherlands\"\n",
" elif \"Barcelona\" in row[\"Hotel_Address\"]:\n",
" return \"Barcelona, Spain\"\n",
" elif \"United Kingdom\" in row[\"Hotel_Address\"]:\n",
" return \"London, United Kingdom\"\n",
" elif \"Milan\" in row[\"Hotel_Address\"]: \n",
" return \"Milan, Italy\"\n",
" elif \"France\" in row[\"Hotel_Address\"]:\n",
" return \"Paris, France\"\n",
" elif \"Vienna\" in row[\"Hotel_Address\"]:\n",
" return \"Vienna, Austria\" \n",
" else:\n",
" return row.Hotel_Address\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"start = time.time()\n",
"df = pd.read_csv('../../data/Hotel_Reviews.csv')\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# dropping columns we will not use:\n",
"df.drop([\"lat\", \"lng\"], axis = 1, inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Replace all the addresses with a shortened, more useful form\n",
"df[\"Hotel_Address\"] = df.apply(replace_address, axis = 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Drop `Additional_Number_of_Scoring`\n",
"df.drop([\"Additional_Number_of_Scoring\"], axis = 1, inplace=True)\n",
"# Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values\n",
"df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')\n",
"df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Process the Tags into new columns\n",
"# The file Hotel_Reviews_Tags.py, identifies the most important tags\n",
"# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, \n",
"# Family with young children, Family with older children, With a pet\n",
"df[\"Leisure_trip\"] = df.Tags.apply(lambda tag: 1 if \"Leisure trip\" in tag else 0)\n",
"df[\"Couple\"] = df.Tags.apply(lambda tag: 1 if \"Couple\" in tag else 0)\n",
"df[\"Solo_traveler\"] = df.Tags.apply(lambda tag: 1 if \"Solo traveler\" in tag else 0)\n",
"df[\"Business_trip\"] = df.Tags.apply(lambda tag: 1 if \"Business trip\" in tag else 0)\n",
"df[\"Group\"] = df.Tags.apply(lambda tag: 1 if \"Group\" in tag or \"Travelers with friends\" in tag else 0)\n",
"df[\"Family_with_young_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with young children\" in tag else 0)\n",
"df[\"Family_with_older_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with older children\" in tag else 0)\n",
"df[\"With_a_pet\"] = df.Tags.apply(lambda tag: 1 if \"With a pet\" in tag else 0)\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# No longer need any of these columns\n",
"df.drop([\"Review_Date\", \"Review_Total_Negative_Word_Counts\", \"Review_Total_Positive_Word_Counts\", \"days_since_review\", \"Total_Number_of_Reviews_Reviewer_Has_Given\"], axis = 1, inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saving results to Hotel_Reviews_Filtered.csv\n",
"Filtering took 23.74 seconds\n"
]
}
],
"source": [
"# Saving new data file with calculated columns\n",
"print(\"Saving results to Hotel_Reviews_Filtered.csv\")\n",
"df.to_csv(r'../../data/Hotel_Reviews_Filtered.csv', index = False)\n",
"end = time.time()\n",
"print(\"Filtering took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,137 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "341efc86325ec2a214f682f57a189dfd",
"translation_date": "2025-09-06T12:54:27+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV (you can )\n",
"import pandas as pd \n",
"\n",
"df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# We want to find the most useful tags to keep\n",
"# Remove opening and closing brackets\n",
"df.Tags = df.Tags.str.strip(\"[']\")\n",
"# remove all quotes too\n",
"df.Tags = df.Tags.str.replace(\" ', '\", \",\", regex = False)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# removing this to take advantage of the 'already a phrase' fact of the dataset \n",
"# Now split the strings into a list\n",
"tag_list_df = df.Tags.str.split(',', expand = True)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Remove leading and trailing spaces\n",
"df[\"Tag_1\"] = tag_list_df[0].str.strip()\n",
"df[\"Tag_2\"] = tag_list_df[1].str.strip()\n",
"df[\"Tag_3\"] = tag_list_df[2].str.strip()\n",
"df[\"Tag_4\"] = tag_list_df[3].str.strip()\n",
"df[\"Tag_5\"] = tag_list_df[4].str.strip()\n",
"df[\"Tag_6\"] = tag_list_df[5].str.strip()\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Merge the 6 columns into one with melt\n",
"df_tags = df.melt(value_vars=[\"Tag_1\", \"Tag_2\", \"Tag_3\", \"Tag_4\", \"Tag_5\", \"Tag_6\"])\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"The shape of the tags with no filtering: (2514684, 2)\n",
" index count\n",
"0 Leisure trip 338423\n",
"1 Couple 205305\n",
"2 Solo traveler 89779\n",
"3 Business trip 68176\n",
"4 Group 51593\n",
"5 Family with young children 49318\n",
"6 Family with older children 21509\n",
"7 Travelers with friends 1610\n",
"8 With a pet 1078\n"
]
}
],
"source": [
"# Get the value counts\n",
"tag_vc = df_tags.value.value_counts()\n",
"# print(tag_vc)\n",
"print(\"The shape of the tags with no filtering:\", str(df_tags.shape))\n",
"# Drop rooms, suites, and length of stay, mobile device and anything with less count than a 1000\n",
"df_tags = df_tags[~df_tags.value.str.contains(\"Standard|room|Stayed|device|Beds|Suite|Studio|King|Superior|Double\", na=False, case=False)]\n",
"tag_vc = df_tags.value.value_counts().reset_index(name=\"count\").query(\"count > 1000\")\n",
"# Print the top 10 (there should only be 9 and we'll use these in the filtering section)\n",
"print(tag_vc[:10])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

@ -0,0 +1,260 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "705bf02633759f689abc37b19749a16d",
"translation_date": "2025-09-06T12:54:42+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"[nltk_data] Downloading package vader_lexicon to\n[nltk_data] /Users/jenlooper/nltk_data...\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"True"
]
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import time\n",
"import pandas as pd\n",
"import nltk as nltk\n",
"from nltk.corpus import stopwords\n",
"from nltk.sentiment.vader import SentimentIntensityAnalyzer\n",
"nltk.download('vader_lexicon')\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"vader_sentiment = SentimentIntensityAnalyzer()\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# There are 3 possibilities of input for a review:\n",
"# It could be \"No Negative\", in which case, return 0\n",
"# It could be \"No Positive\", in which case, return 0\n",
"# It could be a review, in which case calculate the sentiment\n",
"def calc_sentiment(review): \n",
" if review == \"No Negative\" or review == \"No Positive\":\n",
" return 0\n",
" return vader_sentiment.polarity_scores(review)[\"compound\"] \n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"df = pd.read_csv(\"../../data/Hotel_Reviews_Filtered.csv\")\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Remove stop words - can be slow for a lot of text!\n",
"# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches\n",
"# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends\n",
"start = time.time()\n",
"cache = set(stopwords.words(\"english\"))\n",
"def remove_stopwords(review):\n",
" text = \" \".join([word for word in review.split() if word not in cache])\n",
" return text\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Remove the stop words from both columns\n",
"df.Negative_Review = df.Negative_Review.apply(remove_stopwords) \n",
"df.Positive_Review = df.Positive_Review.apply(remove_stopwords)\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Removing stop words took 5.77 seconds\n"
]
}
],
"source": [
"end = time.time()\n",
"print(\"Removing stop words took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Calculating sentiment columns for both positive and negative reviews\n",
"Calculating sentiment took 201.07 seconds\n"
]
}
],
"source": [
"# Add a negative sentiment and positive sentiment column\n",
"print(\"Calculating sentiment columns for both positive and negative reviews\")\n",
"start = time.time()\n",
"df[\"Negative_Sentiment\"] = df.Negative_Review.apply(calc_sentiment)\n",
"df[\"Positive_Sentiment\"] = df.Positive_Review.apply(calc_sentiment)\n",
"end = time.time()\n",
"print(\"Calculating sentiment took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" Negative_Review Negative_Sentiment\n",
"186584 So bad experience memories I hotel The first n... -0.9920\n",
"129503 First charged twice room booked booking second... -0.9896\n",
"307286 The staff Had bad experience even booking Janu... -0.9889\n",
"452092 No WLAN room Incredibly rude restaurant staff ... -0.9884\n",
"201293 We usually traveling Paris 2 3 times year busi... -0.9873\n",
"... ... ...\n",
"26899 I would say however one night expensive even d... 0.9933\n",
"138365 Wifi terribly slow I speed test network upload... 0.9938\n",
"79215 I find anything hotel first I walked past hote... 0.9938\n",
"278506 The property great location There bakery next ... 0.9945\n",
"339189 Guys I like hotel I wish return next year Howe... 0.9948\n",
"\n",
"[515738 rows x 2 columns]\n",
" Positive_Review Positive_Sentiment\n",
"137893 Bathroom Shower We going stay twice hotel 2 ni... -0.9820\n",
"5839 I completely disappointed mad since reception ... -0.9780\n",
"64158 get everything extra internet parking breakfas... -0.9751\n",
"124178 I didnt like anythig Room small Asked upgrade ... -0.9721\n",
"489137 Very rude manager abusive staff reception Dirt... -0.9703\n",
"... ... ...\n",
"331570 Everything This recently renovated hotel class... 0.9984\n",
"322920 From moment stepped doors Guesthouse Hotel sta... 0.9985\n",
"293710 This place surprise expected good actually gre... 0.9985\n",
"417442 We celebrated wedding night Langham I commend ... 0.9985\n",
"132492 We arrived super cute boutique hotel area expl... 0.9987\n",
"\n",
"[515738 rows x 2 columns]\n"
]
}
],
"source": [
"df = df.sort_values(by=[\"Negative_Sentiment\"], ascending=True)\n",
"print(df[[\"Negative_Review\", \"Negative_Sentiment\"]])\n",
"df = df.sort_values(by=[\"Positive_Sentiment\"], ascending=True)\n",
"print(df[[\"Positive_Review\", \"Positive_Sentiment\"]])\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)\n",
"df = df.reindex([\"Hotel_Name\", \"Hotel_Address\", \"Total_Number_of_Reviews\", \"Average_Score\", \"Reviewer_Score\", \"Negative_Sentiment\", \"Positive_Sentiment\", \"Reviewer_Nationality\", \"Leisure_trip\", \"Couple\", \"Solo_traveler\", \"Business_trip\", \"Group\", \"Family_with_young_children\", \"Family_with_older_children\", \"With_a_pet\", \"Negative_Review\", \"Positive_Review\"], axis=1)\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saving results to Hotel_Reviews_NLP.csv\n"
]
}
],
"source": [
"print(\"Saving results to Hotel_Reviews_NLP.csv\")\n",
"df.to_csv(r\"../../data/Hotel_Reviews_NLP.csv\", index = False)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သိရှိထားပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူပညာရှင်များမှ လက်တွေ့ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,63 @@
{
"cells": [
{
"source": [
"# ဒေတာတပ်ဆင်ခြင်း\n",
"\n",
"ဒီ notebook မှာ ကျွန်တော်တို့အကြောင်းအရာတွေကို ပြသပေးမှာဖြစ်ပါတယ်-\n",
"\n",
"ဒီ module အတွက် အချိန်လိုက်အချက်အလက်တွေကို တပ်ဆင်ခြင်း\n",
"အချက်အလက်တွေကို ရှင်းလင်းပြသခြင်း\n",
"ဒီဥပမာမှာ အသုံးပြုထားတဲ့ အချက်အလက်တွေက GEFCom2014 ခန့်မှန်းမှုပြိုင်ပွဲ1 မှ ရယူထားတာဖြစ်ပါတယ်။ 2012 မှ 2014 အတွင်း ၃ နှစ်တာ အချိန်လိုက် လျှပ်စစ်သုံးစွဲမှုနဲ့ အပူချိန်တန်ဖိုးတွေကို တစ်နာရီခြင်းဖြင့် စုစည်းထားပါတယ်။\n",
"\n",
"1Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli နဲ့ Rob J. Hyndman, \"Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond\", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016.\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"kernel_info": {
"name": "python3"
},
"kernelspec": {
"name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"nteract": {
"version": "nteract-front-end@1.0.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "5e2bbe594906dce3aaaa736d6dac6683",
"translation_date": "2025-09-06T12:03:20+00:00",
"source_file": "7-TimeSeries/1-Introduction/working/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,50 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "523ec472196307b3c4235337353c9ceb",
"translation_date": "2025-09-06T12:02:06+00:00",
"source_file": "7-TimeSeries/2-ARIMA/working/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"တောင် ဟောင်၊ ပီအဲရ် ပင်ဆွန်၊ ရှူး ဖန်၊ ဟာမစ်ဒ်ရဇာ ဇာရီပေါ်၊ အယ်လ်ဘတ်ထရိုကိုလီနှင့် ရော့ဘ် ဂျေ ဟိုင်န်မန်၊ \"စိတ်ချရသော စွမ်းအင်ခန့်မှန်းခြင်း: Global Energy Forecasting Competition 2014 နှင့် အခြားများ\", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016။\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pip install statsmodels"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,685 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "fv9OoQsMFk5A"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ဒီနိုက်ဘွတ်မှာ ကျွန်တော်တို့ ပြသမှာက -\n",
"\n",
"- SVM ရေဂရက်ရှင်း မော်ဒယ်ကို လေ့ကျင့်ဖို့ 2D အချိန်စီးရီးဒေတာကို ပြင်ဆင်နည်း \n",
"- RBF kernel ကို အသုံးပြုပြီး SVR ကို အကောင်အထည်ဖော်နည်း \n",
"- ပုံများနဲ့ MAPE ကို အသုံးပြုပြီး မော်ဒယ်ကို အကဲဖြတ်နည်း \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append('../../')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "M687KNlQFp0-"
},
"outputs": [],
"source": [
"import os\n",
"import warnings\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import datetime as dt\n",
"import math\n",
"\n",
"from sklearn.svm import SVR\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from common.utils import load_data, mape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Cj-kfVdMGjWP"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "8fywSjC6GsRz"
},
"source": []
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"id": "aBDkEB11Fumg",
"outputId": "99cf7987-0509-4b73-8cc2-75d7da0d2740"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>load</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-01-01 00:00:00</th>\n",
" <td>2698.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 01:00:00</th>\n",
" <td>2558.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 02:00:00</th>\n",
" <td>2444.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 03:00:00</th>\n",
" <td>2402.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 04:00:00</th>\n",
" <td>2403.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" load\n",
"2012-01-01 00:00:00 2698.0\n",
"2012-01-01 01:00:00 2558.0\n",
"2012-01-01 02:00:00 2444.0\n",
"2012-01-01 03:00:00 2402.0\n",
"2012-01-01 04:00:00 2403.0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"energy = load_data('../../data')[['load']]\n",
"energy.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O0BWP13rGnh4"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 486
},
"id": "hGaNPKu_Gidk",
"outputId": "7f89b326-9057-4f49-efbe-cb100ebdf76d"
},
"outputs": [],
"source": [
"energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)\n",
"plt.xlabel('timestamp', fontsize=12)\n",
"plt.ylabel('load', fontsize=12)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IPuNor4eGwYY"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ysvsNyONGt0Q"
},
"outputs": [],
"source": [
"train_start_dt = '2014-11-01 00:00:00'\n",
"test_start_dt = '2014-12-30 00:00:00'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 548
},
"id": "SsfdLoPyGy9w",
"outputId": "d6d6c25b-b1f4-47e5-91d1-707e043237d7"
},
"outputs": [],
"source": [
"energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \\\n",
" .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \\\n",
" .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)\n",
"plt.xlabel('timestamp', fontsize=12)\n",
"plt.ylabel('load', fontsize=12)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XbFTqBw6G1Ch"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ယခု၊ သင်၏ဒေတာကို လေ့ကျင့်မှုအတွက် ပြင်ဆင်ရန်၊ သင်၏ဒေတာကို စစ်ထုတ်ခြင်းနှင့် အတိုင်းအတာချိန်ညှိခြင်းများ ပြုလုပ်ရန် လိုအပ်ပါသည်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cYivRdQpHDj3",
"outputId": "a138f746-461c-4fd6-bfa6-0cee094c4aa1"
},
"outputs": [],
"source": [
"train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]\n",
"test = energy.copy()[energy.index >= test_start_dt][['load']]\n",
"\n",
"print('Training data shape: ', train.shape)\n",
"print('Test data shape: ', test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"id": "3DNntGQnZX8G",
"outputId": "210046bc-7a66-4ccd-d70d-aa4a7309949c"
},
"outputs": [],
"source": [
"scaler = MinMaxScaler()\n",
"train['load'] = scaler.fit_transform(train)\n",
"train.head(5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "26Yht-rzZexe",
"outputId": "20326077-a38a-4e78-cc5b-6fd7af95d301"
},
"outputs": [],
"source": [
"test['load'] = scaler.transform(test)\n",
"test.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "x0n6jqxOQ41Z"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "fdmxTZtOQ8xs"
},
"source": [
"ကျွန်ုပ်တို့၏ SVR အတွက်၊ input data ကို `[batch, timesteps]` အဖြစ် ပြောင်းလဲပါသည်။ ထို့ကြောင့်၊ ရှိပြီးသား `train_data` နှင့် `test_data` ကို `timesteps` ကို ကိုယ်စားပြုသည့် dimension အသစ်တစ်ခုပါရှိအောင် ပြောင်းလဲပုံဖော်ပါသည်။ ဥပမာအတွက်၊ `timesteps = 5` ကို ယူပါသည်။ ထို့ကြောင့်၊ model သို့ရောက်သည့် input များမှာ ပထမ 4 timesteps အတွက် data ဖြစ်ပြီး၊ output သည် timestep 5 အတွက် data ဖြစ်ပါမည်။\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Rpju-Sc2HFm0"
},
"outputs": [],
"source": [
"# Converting to numpy arrays\n",
"\n",
"train_data = train.values\n",
"test_data = test.values"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Selecting the timesteps\n",
"\n",
"timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "O-JrsrsVJhUQ",
"outputId": "c90dbe71-bacc-4ec4-b452-f82fe5aefaef"
},
"outputs": [],
"source": [
"# Converting data to 2D tensor\n",
"\n",
"train_data_timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "exJD8AI7KE4g",
"outputId": "ce90260c-f327-427d-80f2-77307b5a6318"
},
"outputs": [],
"source": [
"# Converting test data to 2D tensor\n",
"\n",
"test_data_timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "2u0R2sIsLuq5"
},
"outputs": [],
"source": [
"x_train, y_train = None\n",
"x_test, y_test = None\n",
"\n",
"print(x_train.shape, y_train.shape)\n",
"print(x_test.shape, y_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8wIPOtAGLZlh"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "EhA403BEPEiD"
},
"outputs": [],
"source": [
"# Create model using RBF kernel\n",
"\n",
"model = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GS0UA3csMbqp",
"outputId": "d86b6f05-5742-4c1d-c2db-c40510bd4f0d"
},
"outputs": [],
"source": [
"# Fit model on training data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Rz_x8S3UrlcF"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XR0gnt3MnuYS",
"outputId": "157e40ab-9a23-4b66-a885-0d52a24b2364"
},
"outputs": [],
"source": [
"# Making predictions\n",
"\n",
"y_train_pred = None\n",
"y_test_pred = None"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_2epncg-SGzr"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Scaling the predictions\n",
"\n",
"y_train_pred = scaler.inverse_transform(y_train_pred)\n",
"y_test_pred = scaler.inverse_transform(y_test_pred)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xmm_YLXhq7gV",
"outputId": "18392f64-4029-49ac-c71a-a4e2411152a1"
},
"outputs": [],
"source": [
"# Scaling the original values\n",
"\n",
"y_train = scaler.inverse_transform(y_train)\n",
"y_test = scaler.inverse_transform(y_test)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "u3LBj93coHEi",
"outputId": "d4fd49e8-8c6e-4bb0-8ef9-ca0b26d725b4"
},
"outputs": [],
"source": [
"# Extract the timesteps for x-axis\n",
"\n",
"train_timestamps = None\n",
"test_timestamps = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(25,6))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.title(\"Training data prediction\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LnhzcnYtXHCm",
"outputId": "f5f0d711-f18b-4788-ad21-d4470ea2c02b"
},
"outputs": [],
"source": [
"print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 225
},
"id": "53Q02FoqQH4V",
"outputId": "53e2d59b-5075-4765-ad9e-aed56c966583"
},
"outputs": [],
"source": [
"plt.figure(figsize=(10,3))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "clOAUH-SXCJG",
"outputId": "a3aa85ff-126a-4a4a-cd9e-90b9cc465ef5"
},
"outputs": [],
"source": [
"print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DHlKvVCId5ue"
},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cOFJ45vreO0N",
"outputId": "35628e33-ecf9-4966-8036-f7ea86db6f16"
},
"outputs": [],
"source": [
"# Extracting load values as numpy array\n",
"data = None\n",
"\n",
"# Scaling\n",
"data = None\n",
"\n",
"# Transforming to 2D tensor as per model input requirement\n",
"data_timesteps=None\n",
"\n",
"# Selecting inputs and outputs from data\n",
"X, Y = None, None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ESSAdQgwexIi"
},
"outputs": [],
"source": [
"# Make model predictions\n",
"\n",
"# Inverse scale and reshape\n",
"Y_pred = None\n",
"Y = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 328
},
"id": "M_qhihN0RVVX",
"outputId": "a89cb23e-1d35-437f-9d63-8b8907e12f80"
},
"outputs": [],
"source": [
"plt.figure(figsize=(30,8))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "AcN7pMYXVGTK",
"outputId": "7e1c2161-47ce-496c-9d86-7ad9ae0df770"
},
"outputs": [],
"source": [
"print('MAPE: ', mape(Y_pred, Y)*100, '%')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"collapsed_sections": [],
"name": "Recurrent_Neural_Networks.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
},
"coopTranslator": {
"original_hash": "e86ce102239a14c44585623b9b924a74",
"translation_date": "2025-09-06T12:05:40+00:00",
"source_file": "7-TimeSeries/3-SVR/working/notebook.ipynb",
"language_code": "my"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save