You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/ms/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

725 lines
28 KiB

{
"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"
]
}
]
}