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/bn/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

729 lines
44 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-08-29T23:55:58+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "bn"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# একটি শ্রেণীবিন্যাস মডেল তৈরি করুন: সুস্বাদু এশিয়ান এবং ভারতীয় খাবার\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## শ্রেণীবিভাগে পরিচিতি: আপনার ডেটা পরিষ্কার করুন, প্রস্তুত করুন এবং ভিজুয়ালাইজ করুন\n",
"\n",
"এই চারটি পাঠে, আপনি ক্লাসিক মেশিন লার্নিং-এর একটি মৌলিক দিক - *শ্রেণীবিভাগ* - অন্বেষণ করবেন। আমরা এশিয়া এবং ভারতের বিভিন্ন অসাধারণ রান্নার ডেটাসেট ব্যবহার করে বিভিন্ন শ্রেণীবিভাগ অ্যালগরিদম নিয়ে কাজ করব। আশা করি আপনি ক্ষুধার্ত!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>এই পাঠগুলোতে প্যান-এশিয়ান রান্নার উদযাপন করুন! ছবি: জেন লুপার</figcaption>\n",
"\n",
"\n",
"<!--![Celebrate pan-Asian cuisines in these lessons! Image by Jen Looper](../../../../../../translated_images/pinch.b33c0ba76f284aad94a3c4e3ed83e13ed1e17fbcf4db8ca8583c3a0c135e2e99.bn.png)-->\n",
"\n",
"শ্রেণীবিভাগ [supervised learning](https://wikipedia.org/wiki/Supervised_learning)-এর একটি রূপ, যা রিগ্রেশন কৌশলের সাথে অনেক মিল রাখে। শ্রেণীবিভাগে, আপনি একটি মডেল প্রশিক্ষণ দেন যাতে এটি পূর্বানুমান করতে পারে যে একটি আইটেম কোন `শ্রেণী`তে অন্তর্ভুক্ত। যদি মেশিন লার্নিং ডেটাসেট ব্যবহার করে মান বা নাম পূর্বানুমান করার উপর ভিত্তি করে হয়, তবে শ্রেণীবিভাগ সাধারণত দুটি গোষ্ঠীতে বিভক্ত হয়: *বাইনারি শ্রেণীবিভাগ* এবং *মাল্টিক্লাস শ্রেণীবিভাগ*।\n",
"\n",
"মনে রাখবেন:\n",
"\n",
"- **লিনিয়ার রিগ্রেশন** আপনাকে ভেরিয়েবলের মধ্যে সম্পর্ক পূর্বানুমান করতে এবং একটি নতুন ডেটাপয়েন্ট সেই লাইনের সাথে সম্পর্কিত কোথায় পড়বে তা সঠিকভাবে পূর্বানুমান করতে সাহায্য করেছিল। উদাহরণস্বরূপ, আপনি পূর্বানুমান করতে পারতেন যে *সেপ্টেম্বর বনাম ডিসেম্বর মাসে একটি কুমড়ার দাম কত হবে*।\n",
"\n",
"- **লজিস্টিক রিগ্রেশন** আপনাকে \"বাইনারি ক্যাটাগরি\" আবিষ্কার করতে সাহায্য করেছিল: এই দামের পয়েন্টে, *এই কুমড়া কমলা রঙের হবে নাকি কমলা রঙের হবে না*?\n",
"\n",
"শ্রেণীবিভাগ বিভিন্ন অ্যালগরিদম ব্যবহার করে একটি ডেটাপয়েন্টের লেবেল বা শ্রেণী নির্ধারণের অন্যান্য উপায় নির্ধারণ করে। আসুন এই রান্নার ডেটা নিয়ে কাজ করি এবং দেখি, উপাদানগুলোর একটি গোষ্ঠী পর্যবেক্ষণ করে, আমরা এর উৎসের রান্না নির্ধারণ করতে পারি কিনা।\n",
"\n",
"### [**পাঠ-পূর্ব কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **পরিচিতি**\n",
"\n",
"শ্রেণীবিভাগ মেশিন লার্নিং গবেষক এবং ডেটা বিজ্ঞানীর একটি মৌলিক কার্যকলাপ। একটি বাইনারি মানের মৌলিক শ্রেণীবিভাগ থেকে (\"এই ইমেইলটি স্প্যাম কিনা?\"), জটিল ইমেজ শ্রেণীবিভাগ এবং কম্পিউটার ভিশন ব্যবহার করে সেগমেন্টেশন পর্যন্ত, ডেটাকে শ্রেণীতে সাজানো এবং এর উপর প্রশ্ন করা সবসময়ই কার্যকর।\n",
"\n",
"বিষয়টিকে আরও বৈজ্ঞানিকভাবে বললে, আপনার শ্রেণীবিভাগ পদ্ধতি একটি পূর্বানুমানমূলক মডেল তৈরি করে যা ইনপুট ভেরিয়েবলের সাথে আউটপুট ভেরিয়েবলের সম্পর্ক ম্যাপ করতে সক্ষম করে।\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>শ্রেণীবিভাগ অ্যালগরিদমের জন্য বাইনারি বনাম মাল্টিক্লাস সমস্যা। ইনফোগ্রাফিক: জেন লুপার</figcaption>\n",
"\n",
"\n",
"\n",
"আমাদের ডেটা পরিষ্কার করা, ভিজুয়ালাইজ করা এবং মেশিন লার্নিং কাজের জন্য প্রস্তুত করার প্রক্রিয়া শুরু করার আগে, আসুন শিখি কীভাবে মেশিন লার্নিং বিভিন্ন উপায়ে ডেটা শ্রেণীবদ্ধ করতে ব্যবহার করা যায়।\n",
"\n",
"[পরিসংখ্যান](https://wikipedia.org/wiki/Statistical_classification) থেকে উদ্ভূত, ক্লাসিক মেশিন লার্নিং ব্যবহার করে শ্রেণীবিভাগ এমন বৈশিষ্ট্য ব্যবহার করে, যেমন `smoker`, `weight`, এবং `age`, *কোনো নির্দিষ্ট রোগের সম্ভাবনা নির্ধারণ করতে*। এটি একটি সুপারভাইজড লার্নিং কৌশল, যা আপনি পূর্বে রিগ্রেশন অনুশীলনে সম্পাদন করেছিলেন। আপনার ডেটা লেবেলযুক্ত এবং মেশিন লার্নিং অ্যালগরিদম সেই লেবেল ব্যবহার করে ডেটাসেটের শ্রেণী (বা 'বৈশিষ্ট্য') পূর্বানুমান করে এবং তাদের একটি গোষ্ঠী বা ফলাফলে বরাদ্দ করে।\n",
"\n",
"✅ একটি মুহূর্ত নিন এবং একটি রান্নার ডেটাসেট কল্পনা করুন। একটি মাল্টিক্লাস মডেল কী উত্তর দিতে পারবে? একটি বাইনারি মডেল কী উত্তর দিতে পারবে? যদি আপনি নির্ধারণ করতে চান যে একটি নির্দিষ্ট রান্নায় মেথি ব্যবহার করার সম্ভাবনা আছে কিনা? যদি আপনি দেখতে চান যে, একটি ব্যাগ ভর্তি তারকা মৌরি, আর্টিচোক, ফুলকপি এবং হর্সর‍্যাডিশ দিয়ে আপনি একটি সাধারণ ভারতীয় খাবার তৈরি করতে পারবেন কিনা?\n",
"\n",
"### **'ক্লাসিফায়ার'কে হ্যালো বলুন**\n",
"\n",
"আমরা এই রান্নার ডেটাসেট থেকে যে প্রশ্নটি করতে চাই তা আসলে একটি **মাল্টিক্লাস প্রশ্ন**, কারণ আমাদের কাছে কাজ করার জন্য একাধিক সম্ভাব্য জাতীয় রান্না রয়েছে। উপাদানগুলোর একটি ব্যাচ দেওয়া হলে, এই অনেক শ্রেণীর মধ্যে কোনটিতে ডেটা ফিট করবে?\n",
"\n",
"Tidymodels বিভিন্ন ধরনের অ্যালগরিদম অফার করে ডেটা শ্রেণীবদ্ধ করার জন্য, আপনি যে ধরনের সমস্যা সমাধান করতে চান তার উপর নির্ভর করে। পরবর্তী দুটি পাঠে, আপনি এই অ্যালগরিদমগুলোর কয়েকটি সম্পর্কে শিখবেন।\n",
"\n",
"#### **প্রয়োজনীয়তা**\n",
"\n",
"এই পাঠের জন্য, আমরা আমাদের ডেটা পরিষ্কার, প্রস্তুত এবং ভিজুয়ালাইজ করার জন্য নিম্নলিখিত প্যাকেজগুলোর প্রয়োজন হবে:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) হলো একটি [R প্যাকেজের সংগ্রহ](https://www.tidyverse.org/packages), যা ডেটা সায়েন্সকে দ্রুত, সহজ এবং আরও মজাদার করে তোলে!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) ফ্রেমওয়ার্ক হলো মডেলিং এবং মেশিন লার্নিংয়ের জন্য একটি [প্যাকেজের সংগ্রহ](https://www.tidymodels.org/packages/)।\n",
"\n",
"- `DataExplorer`: [DataExplorer প্যাকেজ](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) EDA প্রক্রিয়া এবং রিপোর্ট তৈরির কাজকে সহজ এবং স্বয়ংক্রিয় করার জন্য তৈরি।\n",
"\n",
"- `themis`: [themis প্যাকেজ](https://themis.tidymodels.org/) অসমতল ডেটার জন্য অতিরিক্ত রেসিপি ধাপ সরবরাহ করে।\n",
"\n",
"আপনি এগুলো নিম্নলিখিতভাবে ইনস্টল করতে পারেন:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"অথবা, নিচের স্ক্রিপ্টটি চেক করবে যে এই মডিউলটি সম্পূর্ণ করতে আপনার প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি না থাকে তবে সেগুলো ইনস্টল করবে।\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": [
"আমরা পরে এই চমৎকার প্যাকেজগুলি লোড করব এবং সেগুলিকে আমাদের বর্তমান R সেশনে উপলব্ধ করব। (এটি শুধুমাত্র উদাহরণের জন্য, `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": [
"মজার ব্যাপার! দেখেই মনে হচ্ছে প্রথম কলামটি একটি ধরনের `id` কলাম। চলুন ডেটা সম্পর্কে আরও কিছু তথ্য জানি।\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": [
"আউটপুট থেকে আমরা দেখতে পাচ্ছি যে আমাদের কাছে `2448`টি সারি এবং `385`টি কলাম রয়েছে এবং `0`টি অনুপস্থিত মান রয়েছে। এছাড়াও, আমাদের কাছে ১টি বিচ্ছিন্ন কলাম রয়েছে, *cuisine*।\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",
"এরপর, প্রতিটি রান্নার ধরনকে আলাদা টিবলে ভাগ করুন এবং দেখুন প্রতিটি রান্নার ধরনে কতটা ডেটা (সারি, কলাম) রয়েছে।\n",
"\n",
"> একটি [tibble](https://tibble.tidyverse.org/) হলো আধুনিক ডেটা ফ্রেম।\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()` ফাংশন তৈরি করুন যা একটি উপাদান ডেটাফ্রেম ফেরত দেয়। এই ফাংশনটি একটি অপ্রয়োজনীয় কলাম বাদ দিয়ে শুরু করবে এবং উপাদানগুলিকে তাদের গণনার ভিত্তিতে সাজাবে।\n",
"\n",
"R-এ একটি ফাংশনের মৌলিক কাঠামো হলো:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"R ফাংশন সম্পর্কে একটি পরিচ্ছন্ন পরিচিতি [এখানে](https://skirmer.github.io/presentations/functions_with_r.html#1) পাওয়া যাবে।\n",
"\n",
"চলুন সরাসরি শুরু করি! আমরা [dplyr verbs](https://dplyr.tidyverse.org/) ব্যবহার করব যা আমরা আমাদের আগের পাঠে শিখেছি। সংক্ষেপে:\n",
"\n",
"- `dplyr::select()`: আপনাকে কোন **কলাম** রাখতে বা বাদ দিতে হবে তা বেছে নিতে সাহায্য করে।\n",
"\n",
"- `dplyr::pivot_longer()`: আপনাকে ডেটা \"লম্বা\" করতে সাহায্য করে, যা সারির সংখ্যা বাড়ায় এবং কলামের সংখ্যা কমায়।\n",
"\n",
"- `dplyr::group_by()` এবং `dplyr::summarise()`: আপনাকে বিভিন্ন গোষ্ঠীর জন্য সারাংশ পরিসংখ্যান খুঁজে বের করতে এবং সেগুলিকে একটি সুন্দর টেবিলে রাখতে সাহায্য করে।\n",
"\n",
"- `dplyr::filter()`: ডেটার একটি উপসেট তৈরি করে যা শুধুমাত্র আপনার শর্তগুলি পূরণ করে এমন সারি ধারণ করে।\n",
"\n",
"- `dplyr::mutate()`: আপনাকে কলাম তৈরি বা সংশোধন করতে সাহায্য করে।\n",
"\n",
"এই [*শিল্প*-ভরা learnr টিউটোরিয়াল](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) দেখুন, যা Allison Horst দ্বারা তৈরি এবং dplyr *(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": [
"এখন আমরা এই ফাংশনটি ব্যবহার করে বিভিন্ন রান্নার ধরন অনুযায়ী শীর্ষ দশটি জনপ্রিয় উপাদানের ধারণা পেতে পারি। চলুন `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": [
"জাপানি ডেটার জন্য একই কাজ করি\n"
],
"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": [
"চলুন ভারতীয় খাবারের দিকে এক নজর দিই 🌶️।\n"
],
"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": [
"অবশেষে কোরিয়ান উপাদানগুলি চিত্রিত করুন।\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": [
"ডেটা ভিজুয়ালাইজেশন থেকে, আমরা এখন সবচেয়ে সাধারণ উপাদানগুলো বাদ দিতে পারি যা বিভিন্ন রান্নার মধ্যে বিভ্রান্তি সৃষ্টি করে, `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`- ডেটা প্রি-প্রসেসিংয়ের জন্য একটি প্যাকেজ।\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": [
"যেমনটি দেখা যাচ্ছে, রান্নার ধরনগুলোর সংখ্যায় বেশ অসম বণ্টন রয়েছে। কোরিয়ান রান্নার সংখ্যা থাই রান্নার সংখ্যার প্রায় তিনগুণ। অসমতল ডেটা প্রায়ই মডেলের কার্যকারিতার উপর নেতিবাচক প্রভাব ফেলে। একটি বাইনারি শ্রেণীবিভাজনের কথা চিন্তা করুন। যদি আপনার ডেটার বেশিরভাগই একটি শ্রেণীর হয়, তাহলে একটি মেশিন লার্নিং মডেল সেই শ্রেণীটি বেশি বার ভবিষ্যদ্বাণী করবে, শুধুমাত্র কারণ সেই শ্রেণীর জন্য বেশি ডেটা রয়েছে। ডেটা ভারসাম্যপূর্ণ করা যেকোনো অসমতল ডেটাকে ঠিক করে এবং এই অসমতা দূর করতে সাহায্য করে। অনেক মডেল তখনই সেরা পারফর্ম করে যখন পর্যবেক্ষণের সংখ্যা সমান হয় এবং তাই অসমতল ডেটার সাথে কাজ করতে গিয়ে সমস্যায় পড়ে।\n",
"\n",
"অসমতল ডেটা সেটের সাথে কাজ করার দুটি প্রধান পদ্ধতি রয়েছে:\n",
"\n",
"- সংখ্যালঘু শ্রেণীতে পর্যবেক্ষণ যোগ করা: `ওভার-স্যাম্পলিং`, যেমন SMOTE অ্যালগরিদম ব্যবহার করা\n",
"\n",
"- সংখ্যাগুরু শ্রেণী থেকে পর্যবেক্ষণ সরানো: `আন্ডার-স্যাম্পলিং`\n",
"\n",
"এখন আমরা একটি `রেসিপি` ব্যবহার করে অসমতল ডেটা সেটের সাথে কীভাবে কাজ করতে হয় তা প্রদর্শন করব। একটি রেসিপিকে একটি নকশা হিসেবে ভাবা যেতে পারে যা বর্ণনা করে ডেটা সেটের উপর কী ধাপগুলো প্রয়োগ করা উচিত যাতে এটি ডেটা বিশ্লেষণের জন্য প্রস্তুত হয়।\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()`-এ একটি ফর্মুলা কল করার মাধ্যমে রেসিপিকে *ভেরিয়েবলগুলোর ভূমিকা* নির্ধারণ করতে বলা হয়, যেখানে `df_select` ডেটা রেফারেন্স হিসেবে ব্যবহৃত হয়। উদাহরণস্বরূপ, `cuisine` কলামটি `outcome` ভূমিকা পেয়েছে, আর বাকি কলামগুলোকে `predictor` ভূমিকা দেওয়া হয়েছে।\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) একটি রেসিপি ধাপের *স্পেসিফিকেশন* তৈরি করে, যা সংখ্যালঘু শ্রেণির নতুন উদাহরণ কৃত্রিমভাবে তৈরি করে এই কেসগুলোর নিকটতম প্রতিবেশীদের ব্যবহার করে।\n",
"\n",
"এখন, যদি আমরা প্রিপ্রসেসড ডেটা দেখতে চাই, তাহলে আমাদের [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) এবং [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) ব্যবহার করতে হবে।\n",
"\n",
"`prep()`: একটি প্রশিক্ষণ সেট থেকে প্রয়োজনীয় প্যারামিটার অনুমান করে, যা পরে অন্য ডেটা সেটে প্রয়োগ করা যেতে পারে।\n",
"\n",
"`bake()`: একটি প্রিপ করা রেসিপি নিয়ে সেটি যেকোনো ডেটা সেটে প্রয়োগ করে।\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": [
"এবার চলুন আমাদের রান্নার বিতরণ পরীক্ষা করি এবং সেগুলিকে অসমতল ডেটার সাথে তুলনা করি।\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": [
"ইয়াম! ডেটা সুন্দর এবং পরিষ্কার, ভারসাম্যপূর্ণ, এবং খুবই সুস্বাদু 😋!\n",
"\n",
"> সাধারণত, একটি রেসিপি মডেলিংয়ের জন্য প্রিপ্রসেসর হিসেবে ব্যবহৃত হয় যেখানে এটি নির্ধারণ করে ডেটাসেটে কোন ধাপগুলো প্রয়োগ করা উচিত যাতে এটি মডেলিংয়ের জন্য প্রস্তুত হয়। সেই ক্ষেত্রে, একটি `workflow()` সাধারণত ব্যবহৃত হয় (যেমন আমরা আগের পাঠে দেখেছি) রেসিপি ম্যানুয়ালি অনুমান করার পরিবর্তে।\n",
">\n",
"> তাই, আপনি সাধারণত **`prep()`** এবং **`bake()`** রেসিপি ব্যবহার করতে হয় না যখন আপনি tidymodels ব্যবহার করেন, তবে এগুলো আপনার টুলকিটে থাকা দরকার কারণ এগুলো নিশ্চিত করতে সাহায্য করে যে রেসিপিগুলো আপনার প্রত্যাশা অনুযায়ী কাজ করছে, যেমন আমাদের ক্ষেত্রে।\n",
">\n",
"> যখন আপনি **`bake()`** করেন একটি প্রিপ করা রেসিপি দিয়ে **`new_data = NULL`**, তখন আপনি সেই ডেটা ফিরে পান যা আপনি রেসিপি সংজ্ঞায়িত করার সময় দিয়েছিলেন, তবে এটি প্রিপ্রসেসিং ধাপগুলো অতিক্রম করেছে।\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 এখন রুট ডেটা ফোল্ডারে পাওয়া যাবে।\n",
"\n",
"**🚀চ্যালেঞ্জ**\n",
"\n",
"এই পাঠ্যক্রমে বেশ কিছু আকর্ষণীয় ডেটাসেট রয়েছে। `data` ফোল্ডারগুলো ঘেঁটে দেখুন, কোনো ডেটাসেট কি বাইনারি বা মাল্টি-ক্লাস ক্লাসিফিকেশনের জন্য উপযুক্ত হতে পারে? এই ডেটাসেট নিয়ে আপনি কী প্রশ্ন করবেন?\n",
"\n",
"## [**পোস্ট-লেকচার কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **পুনরালোচনা ও স্ব-অধ্যয়ন**\n",
"\n",
"- [প্যাকেজ themis](https://github.com/tidymodels/themis) দেখুন। ভারসাম্যহীন ডেটা মোকাবিলার জন্য আমরা আর কী কী কৌশল ব্যবহার করতে পারি?\n",
"\n",
"- Tidy models-এর [রেফারেন্স ওয়েবসাইট](https://www.tidymodels.org/start/)।\n",
"\n",
"- এইচ. উইকহ্যাম এবং জি. গ্রোলেমুন্ড, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/)।\n",
"\n",
"#### ধন্যবাদ জানাই:\n",
"\n",
"[`অ্যালিসন হর্স্ট`](https://twitter.com/allison_horst/) কে, যিনি অসাধারণ ইলাস্ট্রেশন তৈরি করেছেন যা R-কে আরও আকর্ষণীয় এবং সহজলভ্য করে তুলেছে। তার আরও ইলাস্ট্রেশন খুঁজে পেতে পারেন এই [গ্যালারিতে](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) কে, যারা এই মডিউলের মূল Python সংস্করণ তৈরি করেছেন ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>@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"
]
}
]
}