{ "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-08-29T23:07:26+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "bn" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## রিগ্রেশন পরিচিতি - পাঠ ১\n", "\n", "#### বিষয়টি বুঝে নেওয়া\n", "\n", "✅ রিগ্রেশনের অনেক ধরণ রয়েছে, এবং আপনি কোনটি বেছে নেবেন তা নির্ভর করে আপনার প্রশ্নের উত্তর কী হতে পারে তার উপর। যদি আপনি কোনো নির্দিষ্ট বয়সের ব্যক্তির সম্ভাব্য উচ্চতা পূর্বানুমান করতে চান, তাহলে আপনি `লিনিয়ার রিগ্রেশন` ব্যবহার করবেন, কারণ আপনি একটি **সংখ্যামূলক মান** খুঁজছেন। যদি আপনি জানতে চান কোনো খাবারকে ভেগান হিসেবে বিবেচনা করা উচিত কিনা, তাহলে আপনি একটি **শ্রেণী নির্ধারণ** খুঁজছেন, সেক্ষেত্রে আপনি `লজিস্টিক রিগ্রেশন` ব্যবহার করবেন। আপনি পরে লজিস্টিক রিগ্রেশন সম্পর্কে আরও শিখবেন। ডেটা থেকে কিছু প্রশ্ন করার কথা ভাবুন এবং কোন পদ্ধতিটি বেশি উপযুক্ত হবে তা নির্ধারণ করুন।\n", "\n", "এই অংশে, আপনি [ডায়াবেটিস সম্পর্কিত একটি ছোট ডেটাসেট](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) নিয়ে কাজ করবেন। কল্পনা করুন যে আপনি ডায়াবেটিস রোগীদের জন্য একটি চিকিৎসা পরীক্ষা করতে চান। মেশিন লার্নিং মডেলগুলো আপনাকে সাহায্য করতে পারে কোন রোগী চিকিৎসায় ভালো সাড়া দেবে তা নির্ধারণ করতে, বিভিন্ন ভেরিয়েবলের সংমিশ্রণের উপর ভিত্তি করে। এমনকি একটি খুব সাধারণ রিগ্রেশন মডেল, যখন ভিজুয়ালাইজ করা হয়, তখন এমন তথ্য দেখাতে পারে যা আপনাকে তাত্ত্বিক ক্লিনিকাল ট্রায়ালগুলো সংগঠিত করতে সাহায্য করবে।\n", "\n", "তাহলে, চলুন এই কাজটি শুরু করা যাক!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> glimpse() এবং slice() হলো [`dplyr`](https://dplyr.tidyverse.org/) প্যাকেজের ফাংশন। Dplyr, যা Tidyverse-এর অংশ, একটি ডেটা ম্যানিপুলেশনের ব্যাকরণ যা একটি সুনির্দিষ্ট সেটের ক্রিয়াপদ সরবরাহ করে, যা আপনাকে সবচেয়ে সাধারণ ডেটা ম্যানিপুলেশনের চ্যালেঞ্জগুলি সমাধান করতে সাহায্য করে।\n",
"\n",
"
\n",
"\n",
"এখন যেহেতু আমাদের কাছে ডেটা রয়েছে, আসুন এই অনুশীলনের জন্য একটি নির্দিষ্ট ফিচার (`bmi`) বেছে নিই। এর জন্য আমাদের প্রয়োজনীয় কলামগুলো নির্বাচন করতে হবে। তাহলে, আমরা কীভাবে এটি করব?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) আমাদের একটি ডেটা ফ্রেম থেকে কলাম *নির্বাচন* (এবং প্রয়োজনে পুনঃনামকরণ) করার সুযোগ দেয়।\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",
"সুপারভাইজড লার্নিং-এ সাধারণত ডেটাকে দুইটি উপসেটে ভাগ করা হয়; একটি (সাধারণত বড়) সেট দিয়ে মডেল প্রশিক্ষণ দেওয়া হয়, এবং একটি ছোট \"হোল্ড-ব্যাক\" সেট দিয়ে দেখা হয় মডেলটি কেমন কাজ করেছে।\n",
"\n",
"এখন যেহেতু আমাদের ডেটা প্রস্তুত, আমরা দেখতে পারি একটি মেশিন এই ডেটাসেটে সংখ্যাগুলোর মধ্যে একটি যৌক্তিক বিভাজন নির্ধারণ করতে সাহায্য করতে পারে কিনা। আমরা [rsample](https://tidymodels.github.io/rsample/) প্যাকেজটি ব্যবহার করতে পারি, যা Tidymodels ফ্রেমওয়ার্কের অংশ, একটি অবজেক্ট তৈরি করতে যা ডেটা কীভাবে ভাগ করা হবে তার তথ্য ধারণ করে। এরপর, তৈরি করা প্রশিক্ষণ এবং পরীক্ষার সেটগুলো বের করতে আরও দুটি rsample ফাংশন ব্যবহার করা যায়:\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 ব্যবহার করে একটি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দিন\n",
"\n",
"এখন আমরা আমাদের মডেল প্রশিক্ষণের জন্য প্রস্তুত!\n",
"\n",
"Tidymodels-এ, আপনি `parsnip()` ব্যবহার করে তিনটি ধারণা নির্ধারণ করে মডেল তৈরি করেন:\n",
"\n",
"- মডেলের **ধরন** বিভিন্ন মডেল যেমন লিনিয়ার রিগ্রেশন, লজিস্টিক রিগ্রেশন, ডিসিশন ট্রি মডেল ইত্যাদি আলাদা করে।\n",
"\n",
"- মডেলের **মোড** সাধারণ বিকল্প যেমন রিগ্রেশন এবং ক্লাসিফিকেশন অন্তর্ভুক্ত করে; কিছু মডেল ধরন উভয় মোড সমর্থন করে, আবার কিছু শুধুমাত্র একটি মোড সমর্থন করে।\n",
"\n",
"- মডেলের **ইঞ্জিন** হলো সেই গণনামূলক টুল যা মডেল ফিট করার জন্য ব্যবহৃত হবে। প্রায়ই এগুলো R প্যাকেজ হয়, যেমন **`\"lm\"`** বা **`\"ranger\"`**\n",
"\n",
"এই মডেলিং তথ্য একটি মডেল স্পেসিফিকেশনে ধারণ করা হয়, তাই চলুন একটি তৈরি করি!\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": [
"মডেলের আউটপুট থেকে আমরা প্রশিক্ষণের সময় শেখা কোয়েফিসিয়েন্টগুলো দেখতে পারি। এগুলো হলো সেরা ফিট লাইনের কোয়েফিসিয়েন্ট, যা আমাদের প্রকৃত এবং পূর্বাভাসিত ভেরিয়েবলের মধ্যে সামগ্রিক ত্রুটি সর্বনিম্ন করে।\n",
"\n",
"
\n",
"\n",
"## ৫. টেস্ট সেটে পূর্বাভাস তৈরি করুন\n",
"\n",
"এখন যেহেতু আমরা একটি মডেল প্রশিক্ষণ করেছি, আমরা এটি ব্যবহার করে টেস্ট ডেটাসেটের জন্য রোগের অগ্রগতি y পূর্বাভাস করতে পারি [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) ব্যবহার করে। এটি ডেটা গ্রুপগুলোর মধ্যে লাইন আঁকার জন্য ব্যবহৃত হবে।\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 এর নিয়ম হলো সবসময় একটি টিবল/ডেটা ফ্রেম তৈরি করা যেখানে ফলাফলের জন্য মানসম্মত কলামের নাম থাকে। এটি মূল ডেটা এবং পূর্বাভাসগুলোকে একত্রিত করে একটি ব্যবহারযোগ্য ফরম্যাটে পরবর্তী কাজের জন্য যেমন প্লটিং-এর জন্য সহজ করে তোলে।\n",
"\n",
"`dplyr::bind_cols()` দক্ষতার সাথে একাধিক ডেটা ফ্রেমের কলাম একত্রিত করে।\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` মানের একটি স্ক্যাটার প্লট তৈরি করব, তারপর পূর্বাভাস ব্যবহার করে মডেলের ডেটা গ্রুপিংয়ের মধ্যে সবচেয়ে উপযুক্ত স্থানে একটি রেখা আঁকব।\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 অক্ষের সাথে সম্পর্কিতভাবে পূর্বাভাস করা উচিত? এই মডেলের ব্যবহারিক দিকটি শব্দে প্রকাশ করার চেষ্টা করুন।\n",
"\n",
"অভিনন্দন, আপনি আপনার প্রথম লিনিয়ার রিগ্রেশন মডেল তৈরি করেছেন, এর মাধ্যমে একটি পূর্বাভাস তৈরি করেছেন এবং এটি একটি প্লটে প্রদর্শন করেছেন!\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"
]
}
]
}