{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_3-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "5015d65d61ba75a223bfc56c273aa174", "translation_date": "2025-08-29T22:50:00+00:00", "source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb", "language_code": "bn" } }, "cells": [ { "cell_type": "markdown", "source": [ "# একটি রিগ্রেশন মডেল তৈরি করুন: লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন মডেল\n" ], "metadata": { "id": "EgQw8osnsUV-" } }, { "cell_type": "markdown", "source": [ "## কুমড়ার মূল্য নির্ধারণের জন্য লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন - পাঠ ৩\n", "

\n", " \n", "

ইনফোগ্রাফিক: দাসানি মাদিপল্লি
\n", "\n", "\n", "#### ভূমিকা\n", "\n", "এখন পর্যন্ত আপনি রিগ্রেশন কী তা নিয়ে আলোচনা করেছেন, উদাহরণস্বরূপ কুমড়ার মূল্য নির্ধারণের ডেটাসেট থেকে সংগৃহীত ডেটা ব্যবহার করে যা আমরা এই পাঠে ব্যবহার করব। আপনি এটি `ggplot2` ব্যবহার করে ভিজুয়ালাইজও করেছেন।💪\n", "\n", "এখন আপনি মেশিন লার্নিংয়ের জন্য রিগ্রেশন নিয়ে আরও গভীরে যাওয়ার জন্য প্রস্তুত। এই পাঠে, আপনি দুটি ধরণের রিগ্রেশন সম্পর্কে শিখবেন: *বেসিক লিনিয়ার রিগ্রেশন* এবং *পলিনোমিয়াল রিগ্রেশন*, এবং এই পদ্ধতিগুলোর পেছনের কিছু গণিত সম্পর্কেও জানবেন।\n", "\n", "> এই পাঠক্রমে, আমরা গণিতের ন্যূনতম জ্ঞান ধরে নিয়ে এগোই এবং অন্যান্য ক্ষেত্র থেকে আসা শিক্ষার্থীদের জন্য এটি সহজবোধ্য করার চেষ্টা করি। তাই নোট, 🧮 কলআউট, ডায়াগ্রাম এবং অন্যান্য শিক্ষণ উপকরণগুলোর দিকে নজর রাখুন যা বুঝতে সাহায্য করবে।\n", "\n", "#### প্রস্তুতি\n", "\n", "স্মরণ করিয়ে দেওয়া হচ্ছে, আপনি এই ডেটা লোড করছেন যাতে এর উপর প্রশ্ন করতে পারেন।\n", "\n", "- কুমড়া কেনার সেরা সময় কখন?\n", "\n", "- ক্ষুদ্রাকৃতির কুমড়ার একটি কেসের মূল্য কত হতে পারে?\n", "\n", "- আমি কি এগুলো আধা-বাস্কেট ঝুড়িতে কিনব নাকি ১ ১/৯ বাস্কেট বাক্সে? চলুন এই ডেটা নিয়ে আরও গভীরে যাই।\n", "\n", "পূর্ববর্তী পাঠে, আপনি একটি `tibble` (ডেটা ফ্রেমের আধুনিক সংস্করণ) তৈরি করেছিলেন এবং মূল ডেটাসেটের অংশ দিয়ে এটি পূরণ করেছিলেন, বাস্কেট অনুযায়ী মূল্য নির্ধারণ করে। তবে, এর মাধ্যমে আপনি মাত্র ৪০০টি ডেটা পয়েন্ট সংগ্রহ করতে পেরেছিলেন এবং শুধুমাত্র শরৎকালের মাসগুলোর জন্য। হয়তো আমরা ডেটা আরও পরিষ্কার করে এর প্রকৃতি সম্পর্কে আরও বিস্তারিত জানতে পারি? দেখা যাক... 🕵️‍♀️\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", "- `janitor`: [janitor প্যাকেজ](https://github.com/sfirke/janitor) ডেটা পরীক্ষা এবং পরিষ্কার করার জন্য সহজ সরঞ্জাম সরবরাহ করে।\n", "\n", "- `corrplot`: [corrplot প্যাকেজ](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) একটি ভিজুয়াল এক্সপ্লোরেটরি টুল সরবরাহ করে যা ভেরিয়েবলগুলোর মধ্যে লুকানো প্যাটার্ন শনাক্ত করতে সহায়তা করে।\n", "\n", "আপনি এগুলো ইনস্টল করতে পারেন:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n", "\n", "নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে যে এই মডিউল সম্পন্ন করার জন্য আপনার প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি না থাকে তবে সেগুলো ইনস্টল করবে।\n" ], "metadata": { "id": "WqQPS1OAsg3H" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n", "\n", "pacman::p_load(tidyverse, tidymodels, janitor, corrplot)" ], "outputs": [], "metadata": { "id": "tA4C2WN3skCf", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0" } }, { "cell_type": "markdown", "source": [ "আমরা পরে এই চমৎকার প্যাকেজগুলো লোড করব এবং আমাদের বর্তমান R সেশনে উপলব্ধ করব। (এটি শুধুমাত্র উদাহরণের জন্য, `pacman::p_load()` ইতিমধ্যেই এটি আপনার জন্য করেছে)\n", "\n", "## ১. একটি লিনিয়ার রিগ্রেশন লাইন\n", "\n", "লেসন ১-এ আপনি শিখেছেন, একটি লিনিয়ার রিগ্রেশন অনুশীলনের লক্ষ্য হলো একটি *সেরা ফিটের লাইন* আঁকা:\n", "\n", "- **ভেরিয়েবল সম্পর্ক দেখানো**। ভেরিয়েবলগুলোর মধ্যে সম্পর্ক প্রদর্শন করা।\n", "\n", "- **প্রেডিকশন করা**। নতুন ডেটা পয়েন্ট কোথায় পড়বে তা সঠিকভাবে পূর্বাভাস দেওয়া।\n", "\n", "এই ধরনের লাইন আঁকার জন্য আমরা একটি পরিসংখ্যানিক কৌশল ব্যবহার করি, যাকে **লিস্ট-স্কোয়ার রিগ্রেশন** বলা হয়। `লিস্ট-স্কোয়ার` শব্দটি বোঝায় যে রিগ্রেশন লাইনের চারপাশের সমস্ত ডেটা পয়েন্ট স্কোয়ার করা হয় এবং তারপর যোগ করা হয়। আদর্শভাবে, সেই চূড়ান্ত যোগফল যতটা সম্ভব ছোট হওয়া উচিত, কারণ আমরা কম সংখ্যক ত্রুটি চাই, বা `লিস্ট-স্কোয়ার`। সুতরাং, সেরা ফিটের লাইন হলো সেই লাইন যা আমাদের স্কোয়ার ত্রুটিগুলোর যোগফলের জন্য সর্বনিম্ন মান দেয় - তাই নাম *লিস্ট-স্কোয়ার রিগ্রেশন*।\n", "\n", "আমরা এটি করি কারণ আমরা এমন একটি লাইন মডেল করতে চাই যা আমাদের সমস্ত ডেটা পয়েন্ট থেকে সর্বনিম্ন সামগ্রিক দূরত্ব রাখে। আমরা যোগ করার আগে টার্মগুলো স্কোয়ার করি কারণ আমরা এর দিকের চেয়ে এর মাত্রা নিয়ে বেশি চিন্তিত।\n", "\n", "> **🧮 আমাকে গণিত দেখাও**\n", ">\n", "> এই লাইন, যাকে *সেরা ফিটের লাইন* বলা হয়, [একটি সমীকরণ](https://en.wikipedia.org/wiki/Simple_linear_regression) দ্বারা প্রকাশ করা যেতে পারে:\n", ">\n", "> Y = a + bX\n", ">\n", "> `X` হলো '`ব্যাখ্যামূলক ভেরিয়েবল` বা `প্রেডিক্টর`'। `Y` হলো '`নির্ভরশীল ভেরিয়েবল` বা `ফলাফল`'। লাইনের ঢাল হলো `b` এবং `a` হলো y-ইন্টারসেপ্ট, যা `X = 0` হলে `Y` এর মানকে বোঝায়।\n", ">\n", "\n", "> ![](../../../../../../2-Regression/3-Linear/solution/images/slope.png \"slope = $y/x$\")\n", " জেন লুপারের ইনফোগ্রাফিক\n", ">\n", "> প্রথমে, ঢাল `b` গণনা করুন।\n", ">\n", "> অন্য কথায়, এবং আমাদের কুমড়ার ডেটার মূল প্রশ্নের দিকে ইঙ্গিত করে: \"মাস অনুযায়ী প্রতি বাসেল কুমড়ার দাম পূর্বাভাস দিন\", `X` দামকে বোঝাবে এবং `Y` বিক্রয়ের মাসকে বোঝাবে।\n", ">\n", "> ![](../../../../../../translated_images/calculation.989aa7822020d9d0ba9fc781f1ab5192f3421be86ebb88026528aef33c37b0d8.bn.png)\n", " জেন লুপারের ইনফোগ্রাফিক\n", "> \n", "> `Y` এর মান গণনা করুন। যদি আপনি প্রায় \\$4 দিচ্ছেন, তবে এটি অবশ্যই এপ্রিল!\n", ">\n", "> লাইনের ঢাল গণনা করার জন্য যে গণিত ব্যবহার করা হয় তা ইন্টারসেপ্টের উপর নির্ভরশীল, বা যেখানে `X = 0` হলে `Y` অবস্থিত।\n", ">\n", "> এই মানগুলোর গণনার পদ্ধতি আপনি [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) ওয়েবসাইটে দেখতে পারেন। এছাড়াও [এই লিস্ট-স্কোয়ার ক্যালকুলেটর](https://www.mathsisfun.com/data/least-squares-calculator.html) দেখুন, যেখানে আপনি দেখতে পাবেন কীভাবে সংখ্যাগুলোর মান লাইনে প্রভাব ফেলে।\n", "\n", "ভয় পাওয়ার কিছু নেই, তাই না? 🤓\n", "\n", "#### করেলেশন\n", "\n", "আরেকটি গুরুত্বপূর্ণ শব্দ হলো **করেলেশন কোইফিসিয়েন্ট**, যা প্রদত্ত X এবং Y ভেরিয়েবলগুলোর মধ্যে সম্পর্ক বোঝায়। একটি স্ক্যাটারপ্লট ব্যবহার করে আপনি সহজেই এই কোইফিসিয়েন্টটি দেখতে পারেন। একটি প্লটে যদি ডেটাপয়েন্টগুলো একটি সুশৃঙ্খল লাইনে ছড়িয়ে থাকে, তবে করেলেশন বেশি থাকে। কিন্তু যদি ডেটাপয়েন্টগুলো X এবং Y এর মধ্যে এলোমেলোভাবে ছড়িয়ে থাকে, তবে করেলেশন কম থাকে।\n", "\n", "একটি ভালো লিনিয়ার রিগ্রেশন মডেল হবে এমন একটি মডেল যার করেলেশন কোইফিসিয়েন্ট উচ্চ (১ এর কাছাকাছি, ০ এর চেয়ে বেশি) থাকে, যা লিস্ট-স্কোয়ার রিগ্রেশন পদ্ধতি এবং একটি রিগ্রেশন লাইন ব্যবহার করে।\n" ], "metadata": { "id": "cdX5FRpvsoP5" } }, { "cell_type": "markdown", "source": [ "## **২. ডেটার সাথে নৃত্য: একটি ডেটা ফ্রেম তৈরি করা যা মডেলিংয়ের জন্য ব্যবহৃত হবে**\n", "\n", "

\n", " \n", "

চিত্রশিল্প: @allison_horst
\n" ], "metadata": { "id": "WdUKXk7Bs8-V" } }, { "cell_type": "markdown", "source": [ "প্রয়োজনীয় লাইব্রেরি এবং ডেটাসেট লোড করুন। ডেটাকে একটি ডেটা ফ্রেমে রূপান্তর করুন যা ডেটার একটি অংশবিশেষ ধারণ করে:\n", "\n", "- শুধুমাত্র সেই কুমড়াগুলো নিন যেগুলোর দাম বাসেল অনুযায়ী নির্ধারিত\n", "\n", "- তারিখকে মাসে রূপান্তর করুন\n", "\n", "- দামের হিসাব উচ্চ এবং নিম্ন দামের গড় হিসেবে নির্ধারণ করুন\n", "\n", "- দামের হিসাব বাসেল পরিমাণ অনুযায়ী রূপান্তর করুন\n", "\n", "> আমরা এই ধাপগুলো [পূর্ববর্তী পাঠে](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb) আলোচনা করেছি।\n" ], "metadata": { "id": "fMCtu2G2s-p8" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the core Tidyverse packages\n", "library(tidyverse)\n", "library(lubridate)\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 = 5)" ], "outputs": [], "metadata": { "id": "ryMVZEEPtERn" } }, { "cell_type": "markdown", "source": [ "শুদ্ধ অভিযানের চেতনায়, চলুন [`janitor package`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) অন্বেষণ করি যা নোংরা ডেটা পরীক্ষা এবং পরিষ্কার করার জন্য সহজ ফাংশন সরবরাহ করে। উদাহরণস্বরূপ, চলুন আমাদের ডেটার কলামের নামগুলো দেখি:\n" ], "metadata": { "id": "xcNxM70EtJjb" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Return column names\n", "pumpkins %>% \n", " names()" ], "outputs": [], "metadata": { "id": "5XtpaIigtPfW" } }, { "cell_type": "markdown", "source": [ "🤔 আমরা আরও ভালো করতে পারি। চলুন এই কলাম নামগুলোকে `friendR` বানাই [snake_case](https://en.wikipedia.org/wiki/Snake_case) কনভেনশন ব্যবহার করে `janitor::clean_names` এর মাধ্যমে। এই ফাংশন সম্পর্কে আরও জানতে: `?clean_names`\n" ], "metadata": { "id": "IbIqrMINtSHe" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Clean names to the snake_case convention\n", "pumpkins <- pumpkins %>% \n", " clean_names(case = \"snake\")\n", "\n", "# Return column names\n", "pumpkins %>% \n", " names()" ], "outputs": [], "metadata": { "id": "a2uYvclYtWvX" } }, { "cell_type": "markdown", "source": [ "অনেক পরিষ্কার tidyR 🧹! এখন, আগের পাঠের মতো `dplyr` ব্যবহার করে ডেটার সাথে একটি নাচ! 💃\n" ], "metadata": { "id": "HfhnuzDDtaDd" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Select desired columns\n", "pumpkins <- pumpkins %>% \n", " select(variety, city_name, package, low_price, high_price, date)\n", "\n", "\n", "\n", "# Extract the month from the dates to a new column\n", "pumpkins <- pumpkins %>%\n", " mutate(date = mdy(date),\n", " month = month(date)) %>% \n", " select(-date)\n", "\n", "\n", "\n", "# Create a new column for average Price\n", "pumpkins <- pumpkins %>% \n", " mutate(price = (low_price + high_price)/2)\n", "\n", "\n", "# Retain only pumpkins with the string \"bushel\"\n", "new_pumpkins <- pumpkins %>% \n", " filter(str_detect(string = package, pattern = \"bushel\"))\n", "\n", "\n", "# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n", "new_pumpkins <- new_pumpkins %>% \n", " mutate(price = case_when(\n", " str_detect(package, \"1 1/9\") ~ price/(1.1),\n", " str_detect(package, \"1/2\") ~ price*2,\n", " TRUE ~ price))\n", "\n", "# Relocate column positions\n", "new_pumpkins <- new_pumpkins %>% \n", " relocate(month, .before = variety)\n", "\n", "\n", "# Display the first 5 rows\n", "new_pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "X0wU3gQvtd9f" } }, { "cell_type": "markdown", "source": [ "ভালো কাজ!👌 এখন আপনার কাছে একটি পরিষ্কার, সুশৃঙ্খল ডেটা সেট রয়েছে যার উপর আপনি আপনার নতুন রিগ্রেশন মডেল তৈরি করতে পারেন!\n", "\n", "একটি স্ক্যাটার প্লট দেখতে চান?\n" ], "metadata": { "id": "UpaIwaxqth82" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Set theme\n", "theme_set(theme_light())\n", "\n", "# Make a scatter plot of month and price\n", "new_pumpkins %>% \n", " ggplot(mapping = aes(x = month, y = price)) +\n", " geom_point(size = 1.6)\n" ], "outputs": [], "metadata": { "id": "DXgU-j37tl5K" } }, { "cell_type": "markdown", "source": [ "একটি স্ক্যাটার প্লট আমাদের মনে করিয়ে দেয় যে আমাদের কাছে শুধুমাত্র আগস্ট থেকে ডিসেম্বর পর্যন্ত মাসের ডেটা রয়েছে। সম্ভবত আমাদের আরও ডেটা প্রয়োজন যাতে আমরা সরলরৈখিকভাবে উপসংহার টানতে পারি।\n", "\n", "আসুন আবার আমাদের মডেলিং ডেটা দেখে নিই:\n" ], "metadata": { "id": "Ve64wVbwtobI" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Display first 5 rows\n", "new_pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "HFQX2ng1tuSJ" } }, { "cell_type": "markdown", "source": [ "আমরা যদি `city` বা `package` কলামগুলোর উপর ভিত্তি করে একটি কুমড়ার `price` পূর্বাভাস দিতে চাই, যেগুলো চরিত্র টাইপের? অথবা আরও সহজভাবে বললে, আমরা কীভাবে `package` এবং `price` এর মধ্যে সম্পর্ক খুঁজে বের করতে পারি (যার জন্য উভয় ইনপুটই সংখ্যাসূচক হতে হবে)? 🤷🤷\n", "\n", "মেশিন লার্নিং মডেলগুলো সাধারণত সংখ্যাসূচক বৈশিষ্ট্যগুলোর সাথে ভালো কাজ করে, টেক্সট মানগুলোর তুলনায়। তাই সাধারণত আপনাকে শ্রেণীবদ্ধ বৈশিষ্ট্যগুলোকে সংখ্যাসূচক উপস্থাপনায় রূপান্তর করতে হয়।\n", "\n", "এর মানে হলো আমাদের ভবিষ্যদ্বাণীকারীদের এমনভাবে পুনর্গঠন করতে হবে যাতে মডেল সেগুলো আরও কার্যকরভাবে ব্যবহার করতে পারে। এই প্রক্রিয়াটি `feature engineering` নামে পরিচিত।\n" ], "metadata": { "id": "7hsHoxsStyjJ" } }, { "cell_type": "markdown", "source": [ "## ৩. মডেলিংয়ের জন্য ডেটা প্রিপ্রসেসিং রেসিপি দিয়ে 👩‍🍳👨‍🍳\n", "\n", "প্রেডিক্টর মানগুলোকে এমনভাবে পুনরায় ফরম্যাট করা, যাতে মডেল সেগুলো আরও কার্যকরভাবে ব্যবহার করতে পারে, তাকে `ফিচার ইঞ্জিনিয়ারিং` বলা হয়।\n", "\n", "বিভিন্ন মডেলের জন্য বিভিন্ন প্রিপ্রসেসিংয়ের প্রয়োজন হয়। উদাহরণস্বরূপ, লিস্ট স্কয়ার্স মডেলের জন্য `ক্যাটেগরিক্যাল ভেরিয়েবল এনকোডিং` প্রয়োজন হয়, যেমন মাস, ভ্যারাইটি এবং শহরের নাম। এটি মূলত একটি `ক্যাটেগরিক্যাল ভ্যালু` সম্বলিত কলামকে এক বা একাধিক `সংখ্যাসূচক কলামে` রূপান্তর করার প্রক্রিয়া, যা মূল কলামের জায়গা নেয়।\n", "\n", "উদাহরণস্বরূপ, ধরুন আপনার ডেটাতে নিম্নলিখিত ক্যাটেগরিক্যাল ফিচারটি রয়েছে:\n", "\n", "| শহর |\n", "|:-------:|\n", "| ডেনভার |\n", "| নাইরোবি |\n", "| টোকিও |\n", "\n", "আপনি *অর্ডিনাল এনকোডিং* প্রয়োগ করে প্রতিটি ক্যাটেগরির জন্য একটি অনন্য পূর্ণসংখ্যা মান স্থাপন করতে পারেন, যেমন:\n", "\n", "| শহর |\n", "|:----:|\n", "| ০ |\n", "| ১ |\n", "| ২ |\n", "\n", "এবং এটাই আমরা আমাদের ডেটার ক্ষেত্রে করব!\n", "\n", "এই অংশে, আমরা আরেকটি অসাধারণ টিডিমডেলস প্যাকেজ নিয়ে আলোচনা করব: [recipes](https://tidymodels.github.io/recipes/) - যা আপনার ডেটা মডেল ট্রেনিংয়ের **আগে** প্রিপ্রসেস করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে। মূলত, একটি রেসিপি হলো এমন একটি অবজেক্ট যা নির্ধারণ করে যে একটি ডেটাসেটে কোন ধাপগুলো প্রয়োগ করা উচিত, যাতে এটি মডেলিংয়ের জন্য প্রস্তুত হয়।\n", "\n", "এখন, চলুন একটি রেসিপি তৈরি করি, যা আমাদের ডেটাকে মডেলিংয়ের জন্য প্রস্তুত করবে এবং প্রেডিক্টর কলামগুলোর সমস্ত অবজারভেশনের জন্য একটি অনন্য পূর্ণসংখ্যা প্রতিস্থাপন করবে:\n" ], "metadata": { "id": "AD5kQbcvt3Xl" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Specify a recipe\n", "pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n", " step_integer(all_predictors(), zero_based = TRUE)\n", "\n", "\n", "# Print out the recipe\n", "pumpkins_recipe" ], "outputs": [], "metadata": { "id": "BNaFKXfRt9TU" } }, { "cell_type": "markdown", "source": [ "দারুণ! 👏 আমরা ঠিক এখনই আমাদের প্রথম রেসিপি তৈরি করলাম যা একটি ফলাফল (মূল্য) এবং তার সংশ্লিষ্ট পূর্বাভাসকারী নির্ধারণ করে এবং যেখানে সমস্ত পূর্বাভাসকারী কলামগুলোকে একটি পূর্ণসংখ্যার সেটে এনকোড করা উচিত 🙌! চলুন দ্রুত এটি বিশ্লেষণ করি:\n", "\n", "- `recipe()`-এর কলটি একটি ফর্মুলার মাধ্যমে রেসিপিকে জানায় যে ভেরিয়েবলগুলোর *ভূমিকা* কী হবে, যেখানে `new_pumpkins` ডেটা রেফারেন্স হিসেবে ব্যবহৃত হচ্ছে। উদাহরণস্বরূপ, `price` কলামটিকে একটি `outcome` ভূমিকা দেওয়া হয়েছে, আর বাকি কলামগুলোকে `predictor` ভূমিকা দেওয়া হয়েছে।\n", "\n", "- `step_integer(all_predictors(), zero_based = TRUE)` নির্দেশ করে যে সমস্ত পূর্বাভাসকারীকে পূর্ণসংখ্যার একটি সেটে রূপান্তরিত করা উচিত, যেখানে নম্বরিং ০ থেকে শুরু হবে।\n", "\n", "আমরা নিশ্চিত, আপনার মনে হয়তো এমন চিন্তা আসছে: \"এটা তো দারুণ!! কিন্তু যদি আমি নিশ্চিত হতে চাই যে রেসিপিগুলো ঠিক যেমনটা আমি আশা করছি তেমনটাই করছে? 🤔\"\n", "\n", "এটা দারুণ চিন্তা! দেখুন, একবার আপনার রেসিপি সংজ্ঞায়িত হয়ে গেলে, আপনি ডেটা প্রিপ্রসেস করার জন্য প্রয়োজনীয় প্যারামিটারগুলো অনুমান করতে পারেন এবং তারপর প্রক্রিয়াজাত ডেটা বের করতে পারেন। সাধারণত, যখন আপনি Tidymodels ব্যবহার করেন তখন এটি করার প্রয়োজন হয় না (আমরা এক মিনিটের মধ্যেই স্বাভাবিক পদ্ধতি দেখব -> `workflows`), তবে এটি কাজে লাগতে পারে যখন আপনি নিশ্চিত হতে চান যে রেসিপিগুলো আপনার প্রত্যাশা অনুযায়ী কাজ করছে।\n", "\n", "এর জন্য, আপনাকে আরও দুটি ক্রিয়া দরকার হবে: `prep()` এবং `bake()`। এবং সবসময়, আমাদের ছোট্ট R বন্ধুরা [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations)-এর মাধ্যমে আপনাকে এটি আরও ভালোভাবে বুঝতে সাহায্য করবে!\n", "\n", "

\n", " \n", "

Artwork by @allison_horst
\n" ], "metadata": { "id": "KEiO0v7kuC9O" } }, { "cell_type": "markdown", "source": [ "[`prep()`](https://recipes.tidymodels.org/reference/prep.html): একটি প্রশিক্ষণ সেট থেকে প্রয়োজনীয় প্যারামিটার অনুমান করে, যা পরে অন্যান্য ডেটা সেটে প্রয়োগ করা যেতে পারে। উদাহরণস্বরূপ, একটি নির্দিষ্ট পূর্বাভাসকারী কলামের জন্য, কোন পর্যবেক্ষণ integer 0, 1, 2 ইত্যাদি হিসাবে নির্ধারিত হবে।\n", "\n", "[`bake()`](https://recipes.tidymodels.org/reference/bake.html): একটি প্রস্তুত করা রেসিপি নেয় এবং সেটি যেকোনো ডেটা সেটে প্রয়োগ করে।\n", "\n", "এখন, চলুন আমাদের রেসিপিগুলো প্রস্তুত করি এবং প্রয়োগ করি, যাতে নিশ্চিত হওয়া যায় যে অভ্যন্তরীণভাবে পূর্বাভাসকারী কলামগুলো প্রথমে এনকোড করা হবে, তারপর একটি মডেল ফিট করা হবে।\n" ], "metadata": { "id": "Q1xtzebuuTCP" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Prep the recipe\n", "pumpkins_prep <- prep(pumpkins_recipe)\n", "\n", "# Bake the recipe to extract a preprocessed new_pumpkins data\n", "baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n", "\n", "# Print out the baked data set\n", "baked_pumpkins %>% \n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "FGBbJbP_uUUn" } }, { "cell_type": "markdown", "source": [ "হুররে! 🥳 প্রক্রিয়াকৃত ডেটা `baked_pumpkins`-এর সমস্ত পূর্বাভাস এনকোড করা হয়েছে, যা নিশ্চিত করে যে আমাদের সংজ্ঞায়িত প্রিপ্রসেসিং ধাপগুলি প্রত্যাশিতভাবে কাজ করবে। এটি আপনার পড়ার জন্য কিছুটা কঠিন হতে পারে, তবে Tidymodels-এর জন্য অনেক বেশি বোধগম্য। কিছু সময় নিয়ে দেখুন কোন পর্যবেক্ষণটি সংশ্লিষ্ট পূর্ণসংখ্যায় ম্যাপ করা হয়েছে।\n", "\n", "এটি উল্লেখ করার মতো যে `baked_pumpkins` একটি ডেটা ফ্রেম, যার উপর আমরা গণনা করতে পারি।\n", "\n", "উদাহরণস্বরূপ, চলুন আপনার ডেটার দুটি পয়েন্টের মধ্যে একটি ভালো সম্পর্ক খুঁজে বের করার চেষ্টা করি, যাতে একটি সম্ভাব্য ভালো পূর্বাভাস মডেল তৈরি করা যায়। আমরা এটি করার জন্য `cor()` ফাংশন ব্যবহার করব। ফাংশন সম্পর্কে আরও জানতে `?cor()` টাইপ করুন।\n" ], "metadata": { "id": "1dvP0LBUueAW" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Find the correlation between the city_name and the price\n", "cor(baked_pumpkins$city_name, baked_pumpkins$price)\n", "\n", "# Find the correlation between the package and the price\n", "cor(baked_pumpkins$package, baked_pumpkins$price)\n" ], "outputs": [], "metadata": { "id": "3bQzXCjFuiSV" } }, { "cell_type": "markdown", "source": [ "যেমনটা দেখা যাচ্ছে, সিটি এবং দামের মধ্যে খুবই দুর্বল সম্পর্ক রয়েছে। তবে প্যাকেজ এবং এর দামের মধ্যে কিছুটা ভালো সম্পর্ক দেখা যায়। এটা তো স্বাভাবিক, তাই না? সাধারণত, যত বড় প্রোডাক্টের বাক্স, তত বেশি দাম।\n", "\n", "যেহেতু আমরা এই প্রসঙ্গে আছি, চলুন `corrplot` প্যাকেজ ব্যবহার করে সব কলামের একটি সম্পর্ক ম্যাট্রিক্স ভিজুয়ালাইজ করার চেষ্টা করি।\n" ], "metadata": { "id": "BToPWbgjuoZw" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the corrplot package\n", "library(corrplot)\n", "\n", "# Obtain correlation matrix\n", "corr_mat <- cor(baked_pumpkins %>% \n", " # Drop columns that are not really informative\n", " select(-c(low_price, high_price)))\n", "\n", "# Make a correlation plot between the variables\n", "corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")" ], "outputs": [], "metadata": { "id": "ZwAL3ksmutVR" } }, { "cell_type": "markdown", "source": [ "🤩🤩 আরও ভালো হয়েছে।\n", "\n", "এখন এই ডেটা থেকে একটি ভালো প্রশ্ন হতে পারে: '`একটি নির্দিষ্ট কুমড়ার প্যাকেজের জন্য আমি কী দাম আশা করতে পারি?`' চলুন, সরাসরি শুরু করা যাক!\n", "\n", "> নোট: যখন আপনি **`bake()`** ফাংশনটি **`new_data = NULL`** দিয়ে **`pumpkins_prep`** রেসিপি প্রস্তুত করেন, তখন আপনি প্রক্রিয়াজাত (অর্থাৎ এনকোড করা) প্রশিক্ষণ ডেটা বের করেন। উদাহরণস্বরূপ, যদি আপনার আরেকটি ডেটাসেট থাকে, যেমন একটি টেস্ট সেট, এবং আপনি দেখতে চান রেসিপিটি কীভাবে সেটি প্রি-প্রসেস করবে, তাহলে আপনি সহজেই **`pumpkins_prep`** রেসিপিটি **`new_data = test_set`** দিয়ে বেক করতে পারেন।\n", "\n", "## ৪. একটি লিনিয়ার রিগ্রেশন মডেল তৈরি করুন\n", "\n", "

\n", " \n", "

ইনফোগ্রাফিক: দাসানি মাদিপল্লি
\n" ], "metadata": { "id": "YqXjLuWavNxW" } }, { "cell_type": "markdown", "source": [ "এখন যেহেতু আমরা একটি রেসিপি তৈরি করেছি এবং নিশ্চিত করেছি যে ডেটা সঠিকভাবে প্রি-প্রসেস হবে, চলুন একটি রিগ্রেশন মডেল তৈরি করি এই প্রশ্নের উত্তর দেওয়ার জন্য: `একটি নির্দিষ্ট কুমড়ার প্যাকেজের জন্য আমি কী মূল্য আশা করতে পারি?`\n", "\n", "#### প্রশিক্ষণ সেট ব্যবহার করে একটি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দিন\n", "\n", "আপনি হয়তো ইতিমধ্যেই বুঝে গেছেন, *price* কলামটি হলো `outcome` ভেরিয়েবল এবং *package* কলামটি হলো `predictor` ভেরিয়েবল।\n", "\n", "এটি করতে, আমরা প্রথমে ডেটাকে এমনভাবে ভাগ করব যাতে ৮০% প্রশিক্ষণ সেটে এবং ২০% টেস্ট সেটে যায়। এরপর একটি রেসিপি সংজ্ঞায়িত করব যা প্রেডিক্টর কলামটিকে একটি পূর্ণসংখ্যার সেটে এনকোড করবে, তারপর একটি মডেল স্পেসিফিকেশন তৈরি করব। আমরা আমাদের রেসিপি প্রিপ এবং বেক করব না, কারণ আমরা ইতিমধ্যেই জানি এটি ডেটাকে প্রত্যাশিতভাবে প্রি-প্রসেস করবে।\n" ], "metadata": { "id": "Pq0bSzCevW-h" } }, { "cell_type": "code", "execution_count": null, "source": [ "set.seed(2056)\n", "# Split the data into training and test sets\n", "pumpkins_split <- new_pumpkins %>% \n", " initial_split(prop = 0.8)\n", "\n", "\n", "# Extract training and test data\n", "pumpkins_train <- training(pumpkins_split)\n", "pumpkins_test <- testing(pumpkins_split)\n", "\n", "\n", "\n", "# Create a recipe for preprocessing the data\n", "lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n", " step_integer(all_predictors(), zero_based = TRUE)\n", "\n", "\n", "\n", "# Create a linear model specification\n", "lm_spec <- linear_reg() %>% \n", " set_engine(\"lm\") %>% \n", " set_mode(\"regression\")" ], "outputs": [], "metadata": { "id": "CyoEh_wuvcLv" } }, { "cell_type": "markdown", "source": [ "ভালো কাজ! এখন যেহেতু আমাদের কাছে একটি রেসিপি এবং একটি মডেল স্পেসিফিকেশন আছে, আমাদের সেগুলোকে একত্রিত করে এমন একটি অবজেক্ট খুঁজে বের করতে হবে যা প্রথমে ডেটা প্রিপ্রসেস করবে (পেছনে প্রেপ+বেক করবে), প্রিপ্রসেস করা ডেটার উপর মডেল ফিট করবে এবং সম্ভাব্য পোস্ট-প্রসেসিং কার্যক্রমের জন্যও সুযোগ দেবে। কেমন লাগছে, নিশ্চিন্ত মনে?🤩\n", "\n", "Tidymodels-এ, এই সুবিধাজনক অবজেক্টটিকে বলা হয় [`workflow`](https://workflows.tidymodels.org/), যা আপনার মডেলিং উপাদানগুলোকে সহজেই ধরে রাখে! Python-এ যেটিকে আমরা *pipelines* বলি, এটি ঠিক তাই।\n", "\n", "তাহলে চলুন, সবকিছু একত্রিত করে একটি workflow-এ বেঁধে ফেলি!📦\n" ], "metadata": { "id": "G3zF_3DqviFJ" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Hold modelling components in a workflow\n", "lm_wf <- workflow() %>% \n", " add_recipe(lm_pumpkins_recipe) %>% \n", " add_model(lm_spec)\n", "\n", "# Print out the workflow\n", "lm_wf" ], "outputs": [], "metadata": { "id": "T3olroU3v-WX" } }, { "cell_type": "markdown", "source": [ "সাথে সাথে, একটি ওয়ার্কফ্লো প্রায় একইভাবে ফিট/প্রশিক্ষণ করা যেতে পারে যেভাবে একটি মডেল করা যায়।\n" ], "metadata": { "id": "zd1A5tgOwEPX" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Train the model\n", "lm_wf_fit <- lm_wf %>% \n", " fit(data = pumpkins_train)\n", "\n", "# Print the model coefficients learned \n", "lm_wf_fit" ], "outputs": [], "metadata": { "id": "NhJagFumwFHf" } }, { "cell_type": "markdown", "source": [ "মডেলের আউটপুট থেকে আমরা প্রশিক্ষণের সময় শেখা সহগগুলো দেখতে পারি। এগুলো হল সেই রেখার সহগ যা আমাদের প্রকৃত এবং পূর্বাভাসিত ভেরিয়েবলের মধ্যে সর্বনিম্ন সামগ্রিক ত্রুটি দেয়।\n", "\n", "#### টেস্ট সেট ব্যবহার করে মডেলের কার্যকারিতা মূল্যায়ন\n", "\n", "এখন সময় এসেছে মডেলের কার্যকারিতা দেখার 📏! আমরা কীভাবে এটি করব?\n", "\n", "এখন যেহেতু আমরা মডেলটি প্রশিক্ষণ দিয়েছি, আমরা এটি ব্যবহার করে `parsnip::predict()` এর মাধ্যমে test_set এর জন্য পূর্বাভাস তৈরি করতে পারি। এরপর আমরা এই পূর্বাভাসগুলো প্রকৃত লেবেল মানগুলোর সাথে তুলনা করতে পারি, যাতে মডেলটি কতটা ভালো (বা খারাপ!) কাজ করছে তা মূল্যায়ন করা যায়।\n", "\n", "চলুন শুরু করি টেস্ট সেটের জন্য পূর্বাভাস তৈরি করে, তারপর টেস্ট সেটের সাথে কলামগুলো যুক্ত করি।\n" ], "metadata": { "id": "_4QkGtBTwItF" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make predictions for the test set\n", "predictions <- lm_wf_fit %>% \n", " predict(new_data = pumpkins_test)\n", "\n", "\n", "# Bind predictions to the test set\n", "lm_results <- pumpkins_test %>% \n", " select(c(package, price)) %>% \n", " bind_cols(predictions)\n", "\n", "\n", "# Print the first ten rows of the tibble\n", "lm_results %>% \n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "UFZzTG0gwTs9" } }, { "cell_type": "markdown", "source": [ "হ্যাঁ, আপনি একটি মডেল প্রশিক্ষণ দিয়েছেন এবং এটি ব্যবহার করে পূর্বাভাস তৈরি করেছেন!🔮 এটি কতটা কার্যকর, চলুন মডেলের কার্যকারিতা মূল্যায়ন করি!\n", "\n", "Tidymodels-এ, আমরা এটি `yardstick::metrics()` ব্যবহার করে করি! লিনিয়ার রিগ্রেশনের জন্য, আমরা নিম্নলিখিত মেট্রিকগুলোর উপর ফোকাস করব:\n", "\n", "- `Root Mean Square Error (RMSE)`: [MSE](https://en.wikipedia.org/wiki/Mean_squared_error)-এর বর্গমূল। এটি একটি নির্দিষ্ট মেট্রিক প্রদান করে যা লেবেলের (এই ক্ষেত্রে, কুমড়ার দাম) একই এককে থাকে। মান যত ছোট হবে, মডেল তত ভালো (সরলভাবে বলতে গেলে, এটি গড় দামের প্রতিনিধিত্ব করে, যার দ্বারা পূর্বাভাসগুলো ভুল হয়েছে!)\n", "\n", "- `Coefficient of Determination (সাধারণত R-squared বা R2 নামে পরিচিত)`: একটি আপেক্ষিক মেট্রিক, যেখানে মান যত বেশি হবে, মডেলের ফিট তত ভালো হবে। মূলত, এই মেট্রিকটি বোঝায় যে মডেলটি পূর্বাভাসিত এবং প্রকৃত লেবেল মানগুলোর মধ্যে বৈচিত্র্যের কতটা ব্যাখ্যা করতে সক্ষম।\n" ], "metadata": { "id": "0A5MjzM7wW9M" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Evaluate performance of linear regression\n", "metrics(data = lm_results,\n", " truth = price,\n", " estimate = .pred)" ], "outputs": [], "metadata": { "id": "reJ0UIhQwcEH" } }, { "cell_type": "markdown", "source": [ "মডেলের কার্যকারিতা এখানে শেষ। চলুন দেখি, প্যাকেজ এবং দামের একটি স্ক্যাটার প্লট ভিজুয়ালাইজ করে এবং তারপর মডেলের তৈরি করা পূর্বাভাস ব্যবহার করে একটি সেরা ফিট লাইন ওভারলে করে আমরা আরও ভালো ইঙ্গিত পেতে পারি কিনা।\n", "\n", "এর মানে হলো, আমাদের টেস্ট সেট প্রস্তুত এবং বেক করতে হবে যাতে প্যাকেজ কলাম এনকোড করা যায় এবং তারপর এটি মডেলের তৈরি পূর্বাভাসের সাথে যুক্ত করতে হয়।\n" ], "metadata": { "id": "fdgjzjkBwfWt" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Encode package column\n", "package_encode <- lm_pumpkins_recipe %>% \n", " prep() %>% \n", " bake(new_data = pumpkins_test) %>% \n", " select(package)\n", "\n", "\n", "# Bind encoded package column to the results\n", "lm_results <- lm_results %>% \n", " bind_cols(package_encode %>% \n", " rename(package_integer = package)) %>% \n", " relocate(package_integer, .after = package)\n", "\n", "\n", "# Print new results data frame\n", "lm_results %>% \n", " slice_head(n = 5)\n", "\n", "\n", "# Make a scatter plot\n", "lm_results %>% \n", " ggplot(mapping = aes(x = package_integer, y = price)) +\n", " geom_point(size = 1.6) +\n", " # Overlay a line of best fit\n", " geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n", " xlab(\"package\")\n", " \n" ], "outputs": [], "metadata": { "id": "R0nw719lwkHE" } }, { "cell_type": "markdown", "source": [ "দারুণ! যেমনটি আপনি দেখতে পাচ্ছেন, লিনিয়ার রিগ্রেশন মডেলটি প্যাকেজ এবং তার সংশ্লিষ্ট মূল্যের মধ্যে সম্পর্কটি খুব ভালোভাবে সাধারণীকরণ করতে পারে না।\n", "\n", "🎃 অভিনন্দন, আপনি ঠিক এখনই এমন একটি মডেল তৈরি করেছেন যা কিছু প্রজাতির কুমড়ার দাম পূর্বানুমান করতে সাহায্য করতে পারে। আপনার ছুটির কুমড়ার ক্ষেতটি দারুণ সুন্দর হবে। তবে, আপনি সম্ভবত আরও ভালো একটি মডেল তৈরি করতে পারবেন!\n", "\n", "## ৫. একটি পলিনোমিয়াল রিগ্রেশন মডেল তৈরি করুন\n", "\n", "

\n", " \n", "

ইনফোগ্রাফিক: দাসানি মাদিপল্লি
\n", "\n", "\n", "\n" ], "metadata": { "id": "HOCqJXLTwtWI" } }, { "cell_type": "markdown", "source": [ "কখনও কখনও আমাদের ডেটার মধ্যে সরলরৈখিক সম্পর্ক থাকে না, কিন্তু আমরা এখনও একটি ফলাফল পূর্বাভাস দিতে চাই। পলিনোমিয়াল রিগ্রেশন আমাদের আরও জটিল অ-রৈখিক সম্পর্কের জন্য পূর্বাভাস দিতে সাহায্য করতে পারে।\n", "\n", "উদাহরণস্বরূপ, আমাদের কুমড়ার ডেটা সেটে প্যাকেজ এবং দামের মধ্যে সম্পর্কটি বিবেচনা করুন। কখনও কখনও ভেরিয়েবলগুলির মধ্যে একটি সরলরৈখিক সম্পর্ক থাকে - যেমন, কুমড়ার আয়তন যত বড়, দাম তত বেশি - কিন্তু কখনও কখনও এই সম্পর্কগুলোকে একটি সমতল বা সরলরেখা দিয়ে চিত্রিত করা যায় না।\n", "\n", "> ✅ এখানে [আরও কিছু উদাহরণ](https://online.stat.psu.edu/stat501/lesson/9/9.8) রয়েছে যেখানে পলিনোমিয়াল রিগ্রেশন ব্যবহার করা যেতে পারে।\n", ">\n", "> আগের প্লটে Variety এবং Price এর মধ্যে সম্পর্কটি আবার দেখুন। এই স্ক্যাটারপ্লটটি কি সরলরেখা দিয়ে বিশ্লেষণ করা উচিত বলে মনে হয়? সম্ভবত না। এই ক্ষেত্রে, আপনি পলিনোমিয়াল রিগ্রেশন চেষ্টা করতে পারেন।\n", ">\n", "> ✅ পলিনোমিয়াল হল গাণিতিক অভিব্যক্তি যা এক বা একাধিক ভেরিয়েবল এবং কোইফিসিয়েন্ট নিয়ে গঠিত হতে পারে।\n", "\n", "#### প্রশিক্ষণ সেট ব্যবহার করে একটি পলিনোমিয়াল রিগ্রেশন মডেল প্রশিক্ষণ দিন\n", "\n", "পলিনোমিয়াল রিগ্রেশন একটি *বাঁকা রেখা* তৈরি করে যা অ-রৈখিক ডেটার সাথে আরও ভালোভাবে মানানসই হয়।\n", "\n", "চলুন দেখি একটি পলিনোমিয়াল মডেল পূর্বাভাসে আরও ভালো পারফর্ম করে কিনা। আমরা আগের মতোই কিছুটা অনুরূপ পদ্ধতি অনুসরণ করব:\n", "\n", "- একটি রেসিপি তৈরি করুন যা আমাদের ডেটাকে মডেলিংয়ের জন্য প্রস্তুত করতে প্রয়োজনীয় প্রি-প্রসেসিং ধাপগুলি নির্ধারণ করে, যেমন: প্রেডিক্টর এনকোডিং এবং ডিগ্রি *n* এর পলিনোমিয়াল গণনা।\n", "\n", "- একটি মডেল স্পেসিফিকেশন তৈরি করুন।\n", "\n", "- রেসিপি এবং মডেল স্পেসিফিকেশনকে একটি ওয়ার্কফ্লোতে একত্রিত করুন।\n", "\n", "- ওয়ার্কফ্লো ফিট করে একটি মডেল তৈরি করুন।\n", "\n", "- টেস্ট ডেটায় মডেলটি কতটা ভালো পারফর্ম করে তা মূল্যায়ন করুন।\n", "\n", "চলুন শুরু করি!\n" ], "metadata": { "id": "VcEIpRV9wzYr" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Specify a recipe\r\n", "poly_pumpkins_recipe <-\r\n", " recipe(price ~ package, data = pumpkins_train) %>%\r\n", " step_integer(all_predictors(), zero_based = TRUE) %>% \r\n", " step_poly(all_predictors(), degree = 4)\r\n", "\r\n", "\r\n", "# Create a model specification\r\n", "poly_spec <- linear_reg() %>% \r\n", " set_engine(\"lm\") %>% \r\n", " set_mode(\"regression\")\r\n", "\r\n", "\r\n", "# Bundle recipe and model spec into a workflow\r\n", "poly_wf <- workflow() %>% \r\n", " add_recipe(poly_pumpkins_recipe) %>% \r\n", " add_model(poly_spec)\r\n", "\r\n", "\r\n", "# Create a model\r\n", "poly_wf_fit <- poly_wf %>% \r\n", " fit(data = pumpkins_train)\r\n", "\r\n", "\r\n", "# Print learned model coefficients\r\n", "poly_wf_fit\r\n", "\r\n", " " ], "outputs": [], "metadata": { "id": "63n_YyRXw3CC" } }, { "cell_type": "markdown", "source": [ "#### মডেলের কার্যকারিতা মূল্যায়ন করুন\n", "\n", "👏👏আপনি একটি পলিনোমিয়াল মডেল তৈরি করেছেন, চলুন এখন টেস্ট সেটে পূর্বাভাস করি!\n" ], "metadata": { "id": "-LHZtztSxDP0" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make price predictions on test data\r\n", "poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n", " bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n", " relocate(.pred, .after = last_col())\r\n", "\r\n", "\r\n", "# Print the results\r\n", "poly_results %>% \r\n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "YUFpQ_dKxJGx" } }, { "cell_type": "markdown", "source": [ "উহু-হু, চলুন দেখি মডেলটি কীভাবে test_set-এ কাজ করেছে `yardstick::metrics()` ব্যবহার করে।\n" ], "metadata": { "id": "qxdyj86bxNGZ" } }, { "cell_type": "code", "execution_count": null, "source": [ "metrics(data = poly_results, truth = price, estimate = .pred)" ], "outputs": [], "metadata": { "id": "8AW5ltkBxXDm" } }, { "cell_type": "markdown", "source": [ "🤩🤩 অনেক ভালো পারফরম্যান্স।\n", "\n", "`rmse` প্রায় ৭ থেকে প্রায় ৩-এ নেমে এসেছে, যা প্রকৃত মূল্য এবং পূর্বাভাসিত মূল্যের মধ্যে ত্রুটি হ্রাসের ইঙ্গিত দেয়। আপনি এটিকে *আনুমানিকভাবে* এইভাবে ব্যাখ্যা করতে পারেন যে গড়ে ভুল পূর্বাভাস প্রায় \\$৩ এর কাছাকাছি ভুল। `rsq` প্রায় ০.৪ থেকে ০.৮-এ বৃদ্ধি পেয়েছে।\n", "\n", "এই সমস্ত মেট্রিক দেখায় যে পলিনোমিয়াল মডেলটি লিনিয়ার মডেলের তুলনায় অনেক ভালো পারফর্ম করে। দারুণ কাজ!\n", "\n", "চলুন দেখি আমরা এটি ভিজুয়ালাইজ করতে পারি কিনা!\n" ], "metadata": { "id": "6gLHNZDwxYaS" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Bind encoded package column to the results\r\n", "poly_results <- poly_results %>% \r\n", " bind_cols(package_encode %>% \r\n", " rename(package_integer = package)) %>% \r\n", " relocate(package_integer, .after = package)\r\n", "\r\n", "\r\n", "# Print new results data frame\r\n", "poly_results %>% \r\n", " slice_head(n = 5)\r\n", "\r\n", "\r\n", "# Make a scatter plot\r\n", "poly_results %>% \r\n", " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n", " geom_point(size = 1.6) +\r\n", " # Overlay a line of best fit\r\n", " geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n", " xlab(\"package\")\r\n" ], "outputs": [], "metadata": { "id": "A83U16frxdF1" } }, { "cell_type": "markdown", "source": [ "আপনি দেখতে পাচ্ছেন একটি বাঁকানো রেখা যা আপনার ডেটার সাথে আরও ভালোভাবে মানানসই! 🤩\n", "\n", "আপনি এটি আরও মসৃণ করতে পারেন একটি পলিনোমিয়াল সূত্র `geom_smooth`-এ পাস করে, যেমন:\n" ], "metadata": { "id": "4U-7aHOVxlGU" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a scatter plot\r\n", "poly_results %>% \r\n", " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n", " geom_point(size = 1.6) +\r\n", " # Overlay a line of best fit\r\n", " geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n", " xlab(\"package\")" ], "outputs": [], "metadata": { "id": "5vzNT0Uexm-w" } }, { "cell_type": "markdown", "source": [ "একটি মসৃণ বক্ররেখার মতো!🤩\n", "\n", "নতুন পূর্বাভাস তৈরি করার উপায় এখানে:\n" ], "metadata": { "id": "v9u-wwyLxq4G" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a hypothetical data frame\r\n", "hypo_tibble <- tibble(package = \"bushel baskets\")\r\n", "\r\n", "# Make predictions using linear model\r\n", "lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n", "\r\n", "# Make predictions using polynomial model\r\n", "poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n", "\r\n", "# Return predictions in a list\r\n", "list(\"linear model prediction\" = lm_pred, \r\n", " \"polynomial model prediction\" = poly_pred)\r\n" ], "outputs": [], "metadata": { "id": "jRPSyfQGxuQv" } }, { "cell_type": "markdown", "source": [ "`polynomial model` এর পূর্বাভাস `price` এবং `package` এর স্ক্যাটার প্লট দেখে যথাযথ মনে হয়! এবং, যদি এটি আগের মডেলের তুলনায় ভালো হয়, তাহলে একই ডেটা দেখে আপনাকে এই বেশি দামের কুমড়োর জন্য বাজেট করতে হবে!\n", "\n", "🏆 খুব ভালো কাজ! আপনি এক পাঠে দুটি রিগ্রেশন মডেল তৈরি করেছেন। রিগ্রেশনের শেষ অংশে, আপনি ক্যাটাগরি নির্ধারণের জন্য লজিস্টিক রিগ্রেশন সম্পর্কে শিখবেন।\n", "\n", "## **🚀চ্যালেঞ্জ**\n", "\n", "এই নোটবুকে বিভিন্ন ভেরিয়েবল পরীক্ষা করুন এবং দেখুন কিভাবে করেলেশন মডেলের সঠিকতার সাথে সম্পর্কিত।\n", "\n", "## [**পাঠ-পরবর্তী কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n", "\n", "## **পুনরালোচনা ও স্ব-অধ্যয়ন**\n", "\n", "এই পাঠে আমরা লিনিয়ার রিগ্রেশন সম্পর্কে শিখেছি। রিগ্রেশনের আরও কিছু গুরুত্বপূর্ণ ধরণ রয়েছে। Stepwise, Ridge, Lasso এবং Elasticnet পদ্ধতি সম্পর্কে পড়ুন। আরও জানার জন্য একটি ভালো কোর্স হলো [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)।\n", "\n", "যদি আপনি অসাধারণ Tidymodels ফ্রেমওয়ার্ক ব্যবহার করতে আরও শিখতে চান, তাহলে নিচের রিসোর্সগুলো দেখুন:\n", "\n", "- Tidymodels ওয়েবসাইট: [Tidymodels দিয়ে শুরু করুন](https://www.tidymodels.org/start/)\n", "\n", "- ম্যাক্স কুন এবং জুলিয়া সিলজ, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n", "\n", "###### **ধন্যবাদ জানাই:**\n", "\n", "[অ্যালিসন হর্স্ট](https://twitter.com/allison_horst?lang=en) কে, যিনি অসাধারণ ইলাস্ট্রেশন তৈরি করেছেন যা R-কে আরও আকর্ষণীয় এবং বন্ধুত্বপূর্ণ করে তুলেছে। তার আরও ইলাস্ট্রেশন খুঁজে পেতে দেখুন তার [গ্যালারি](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)।\n" ], "metadata": { "id": "8zOLOWqMxzk5" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n" ] } ] }