{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## لاجسٹک ریگریشن ماڈل بنائیں - سبق 4\n", "\n", "![لاجسٹک بمقابلہ لینیئر ریگریشن انفوگرافک](../../../../../../translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.ur.png)\n", "\n", "#### **[لیکچر سے پہلے کا کوئز](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n", "\n", "#### تعارف\n", "\n", "ریگریشن کے اس آخری سبق میں، جو کہ مشین لرننگ کی بنیادی *کلاسک* تکنیکوں میں سے ایک ہے، ہم لاجسٹک ریگریشن پر نظر ڈالیں گے۔ آپ اس تکنیک کو بائنری کیٹیگریز کی پیش گوئی کے لیے پیٹرنز دریافت کرنے میں استعمال کریں گے۔ کیا یہ کینڈی چاکلیٹ ہے یا نہیں؟ کیا یہ بیماری متعدی ہے یا نہیں؟ کیا یہ گاہک اس پروڈکٹ کو منتخب کرے گا یا نہیں؟\n", "\n", "اس سبق میں، آپ سیکھیں گے:\n", "\n", "- لاجسٹک ریگریشن کے لیے تکنیکیں\n", "\n", "✅ اس قسم کی ریگریشن کے ساتھ کام کرنے کی اپنی سمجھ کو اس [Learn module](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott) میں مزید گہرا کریں۔\n", "\n", "## پیشگی شرط\n", "\n", "کدو کے ڈیٹا کے ساتھ کام کرنے کے بعد، ہم اب اس سے اتنے واقف ہو چکے ہیں کہ یہ جان سکیں کہ ایک بائنری کیٹیگری موجود ہے جس پر ہم کام کر سکتے ہیں: `Color`۔\n", "\n", "آئیے ایک لاجسٹک ریگریشن ماڈل بناتے ہیں تاکہ یہ پیش گوئی کی جا سکے کہ دیے گئے کچھ متغیرات کی بنیاد پر *کسی کدو کا ممکنہ رنگ کیا ہوگا* (نارنجی 🎃 یا سفید 👻)۔\n", "\n", "> ہم ریگریشن کے سبق کے گروپ میں بائنری کلاسیفکیشن کے بارے میں کیوں بات کر رہے ہیں؟ صرف لسانی سہولت کے لیے، کیونکہ لاجسٹک ریگریشن [حقیقت میں ایک کلاسیفکیشن طریقہ](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) ہے، اگرچہ یہ لینیئر پر مبنی ہے۔ ڈیٹا کو کلاسیفائی کرنے کے دیگر طریقوں کے بارے میں اگلے سبق کے گروپ میں جانیں۔\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", "- `ggbeeswarm`: [ggbeeswarm پیکج](https://github.com/eclarke/ggbeeswarm) ggplot2 کا استعمال کرتے ہوئے beeswarm طرز کے پلاٹس بنانے کے طریقے فراہم کرتا ہے۔\n", "\n", "آپ انہیں اس طرح انسٹال کر سکتے ہیں:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n", "\n", "متبادل کے طور پر، نیچے دیا گیا اسکرپٹ چیک کرتا ہے کہ آیا آپ کے پاس اس ماڈیول کو مکمل کرنے کے لیے درکار پیکجز موجود ہیں، اور اگر وہ غائب ہوں تو انہیں انسٹال کر دیتا ہے۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n", "\n", "pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **سوال کی وضاحت کریں**\n", "\n", "ہمارے مقصد کے لیے، ہم اسے ایک بائنری کے طور پر بیان کریں گے: 'سفید' یا 'غیر سفید'۔ ہمارے ڈیٹا سیٹ میں ایک 'دھاری دار' کیٹیگری بھی موجود ہے لیکن اس کے چند ہی مثالیں ہیں، اس لیے ہم اسے استعمال نہیں کریں گے۔ ویسے بھی، یہ تب ختم ہو جاتی ہے جب ہم ڈیٹا سیٹ سے null ویلیوز کو ہٹا دیتے ہیں۔\n", "\n", "> 🎃 دلچسپ حقیقت، ہم کبھی کبھی سفید کدو کو 'بھوت' کدو کہتے ہیں۔ انہیں تراشنا آسان نہیں ہوتا، اس لیے وہ نارنجی کدو کی طرح مقبول نہیں ہیں لیکن وہ دیکھنے میں بہت اچھے لگتے ہیں! تو ہم اپنے سوال کو یوں بھی دوبارہ ترتیب دے سکتے ہیں: 'بھوت' یا 'غیر بھوت'۔ 👻\n", "\n", "## **لاجسٹک ریگریشن کے بارے میں**\n", "\n", "لاجسٹک ریگریشن کچھ اہم طریقوں سے لینیئر ریگریشن سے مختلف ہے، جس کے بارے میں آپ نے پہلے سیکھا تھا۔\n", "\n", "#### **بائنری کلاسیفیکیشن**\n", "\n", "لاجسٹک ریگریشن وہی خصوصیات پیش نہیں کرتا جو لینیئر ریگریشن کرتا ہے۔ پہلا ایک `بائنری کیٹیگری` (\"نارنجی یا غیر نارنجی\") کے بارے میں پیش گوئی کرتا ہے جبکہ دوسرا `مسلسل ویلیوز` کی پیش گوئی کرنے کی صلاحیت رکھتا ہے، جیسے کہ کدو کی اصل اور فصل کے وقت کے حساب سے *اس کی قیمت کتنی بڑھے گی*۔\n", "\n", "![Dasani Madipalli کی انفوگرافک](../../../../../../translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.ur.png)\n", "\n", "### دیگر کلاسیفیکیشنز\n", "\n", "لاجسٹک ریگریشن کی دیگر اقسام بھی ہیں، جن میں ملٹی نومیئل اور آرڈینل شامل ہیں:\n", "\n", "- **ملٹی نومیئل**، جس میں ایک سے زیادہ کیٹیگریز شامل ہوتی ہیں - \"نارنجی، سفید، اور دھاری دار\"۔\n", "\n", "- **آرڈینل**، جس میں ترتیب شدہ کیٹیگریز شامل ہوتی ہیں، جو اس وقت مفید ہوتی ہیں جب ہم اپنے نتائج کو منطقی طور پر ترتیب دینا چاہتے ہیں، جیسے ہمارے کدو جو ایک محدود تعداد کے سائز (mini, sm, med, lg, xl, xxl) کے حساب سے ترتیب دیے گئے ہیں۔\n", "\n", "![ملٹی نومیئل بمقابلہ آرڈینل ریگریشن](../../../../../../translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.ur.png)\n", "\n", "#### **ویریبلز کا آپس میں تعلق ہونا ضروری نہیں**\n", "\n", "یاد ہے کہ لینیئر ریگریشن زیادہ correlated ویریبلز کے ساتھ بہتر کام کرتا تھا؟ لاجسٹک ریگریشن اس کے برعکس ہے - ویریبلز کا آپس میں تعلق ہونا ضروری نہیں۔ یہ اس ڈیٹا کے لیے کام کرتا ہے جس میں تعلقات قدرے کمزور ہیں۔\n", "\n", "#### **آپ کو بہت زیادہ صاف ڈیٹا کی ضرورت ہے**\n", "\n", "لاجسٹک ریگریشن زیادہ درست نتائج دے گا اگر آپ زیادہ ڈیٹا استعمال کریں؛ ہمارا چھوٹا ڈیٹا سیٹ اس کام کے لیے مثالی نہیں ہے، لہذا اسے ذہن میں رکھیں۔\n", "\n", "✅ ان ڈیٹا کی اقسام کے بارے میں سوچیں جو لاجسٹک ریگریشن کے لیے موزوں ہوں گی۔\n", "\n", "## مشق - ڈیٹا کو صاف کریں\n", "\n", "پہلے، ڈیٹا کو تھوڑا صاف کریں، null ویلیوز کو ہٹائیں اور صرف کچھ کالمز کو منتخب کریں:\n", "\n", "1. درج ذیل کوڈ شامل کریں:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Load the core tidyverse packages\n", "library(tidyverse)\n", "\n", "# Import the data and clean column names\n", "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n", " clean_names()\n", "\n", "# Select desired columns\n", "pumpkins_select <- pumpkins %>% \n", " select(c(city_name, package, variety, origin, item_size, color)) \n", "\n", "# Drop rows containing missing values and encode color as factor (category)\n", "pumpkins_select <- pumpkins_select %>% \n", " drop_na() %>% \n", " mutate(color = factor(color))\n", "\n", "# View the first few rows\n", "pumpkins_select %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "آپ ہمیشہ اپنے نئے ڈیٹا فریم پر ایک نظر ڈال سکتے ہیں، نیچے دی گئی [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) فنکشن کا استعمال کرتے ہوئے:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "pumpkins_select %>% \n", " glimpse()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "آئیے تصدیق کریں کہ ہم واقعی ایک بائنری کلاسیفکیشن مسئلہ حل کرنے جا رہے ہیں:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Subset distinct observations in outcome column\n", "pumpkins_select %>% \n", " distinct(color)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### بصری نمائندگی - زمرہ وار پلاٹ\n", "اب تک آپ نے کدو کے ڈیٹا کو دوبارہ لوڈ کیا ہے اور اسے صاف کیا ہے تاکہ ایک ڈیٹا سیٹ محفوظ کیا جا سکے جس میں چند متغیرات شامل ہوں، جیسے کہ رنگ۔ آئیے نوٹ بک میں ggplot لائبریری کا استعمال کرتے ہوئے ڈیٹا فریم کو بصری طور پر پیش کریں۔\n", "\n", "ggplot لائبریری آپ کے ڈیٹا کو بصری طور پر پیش کرنے کے لیے کچھ عمدہ طریقے فراہم کرتی ہے۔ مثال کے طور پر، آپ ہر قسم اور رنگ کے لیے ڈیٹا کی تقسیم کا موازنہ زمرہ وار پلاٹ میں کر سکتے ہیں۔\n", "\n", "1. ایسا پلاٹ بنائیں جس میں geombar فنکشن استعمال کیا جائے، ہمارے کدو کے ڈیٹا کو استعمال کرتے ہوئے، اور ہر کدو کی قسم (نارنجی یا سفید) کے لیے رنگ کی میپنگ کو مخصوص کریں:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "# Specify colors for each value of the hue variable\n", "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n", "\n", "# Create the bar plot\n", "ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n", " geom_bar(position = \"dodge\") +\n", " scale_fill_manual(values = palette) +\n", " labs(y = \"Variety\", fill = \"Color\") +\n", " theme_minimal()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ڈیٹا کا مشاہدہ کرتے ہوئے، آپ دیکھ سکتے ہیں کہ رنگ کے ڈیٹا کا تعلق قسم سے کیسے ہے۔\n", "\n", "✅ اس زمرہ بندی والے پلاٹ کو دیکھتے ہوئے، آپ کون سی دلچسپ تحقیقات کا تصور کر سکتے ہیں؟\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ڈیٹا کی پیشگی پروسیسنگ: فیچر انکوڈنگ\n", "\n", "ہمارے کدو کے ڈیٹا سیٹ میں تمام کالمز کے لیے سٹرنگ ویلیوز موجود ہیں۔ انسانوں کے لیے زمرہ وار ڈیٹا کے ساتھ کام کرنا آسان ہوتا ہے لیکن مشینوں کے لیے نہیں۔ مشین لرننگ الگورتھمز نمبروں کے ساتھ بہتر کام کرتے ہیں۔ اسی لیے انکوڈنگ ڈیٹا کی پیشگی پروسیسنگ کے مرحلے میں ایک بہت اہم قدم ہے، کیونکہ یہ ہمیں زمرہ وار ڈیٹا کو عددی ڈیٹا میں تبدیل کرنے کی اجازت دیتا ہے، بغیر کسی معلومات کو کھوئے۔ اچھی انکوڈنگ ایک اچھے ماڈل کی تعمیر میں مدد دیتی ہے۔\n", "\n", "فیچر انکوڈنگ کے لیے دو اہم قسم کے انکوڈرز ہیں:\n", "\n", "1. **آرڈینل انکوڈر**: یہ آرڈینل ویریبلز کے لیے موزوں ہے، جو زمرہ وار ویریبلز ہیں جہاں ان کا ڈیٹا منطقی ترتیب کی پیروی کرتا ہے، جیسے ہمارے ڈیٹا سیٹ میں `item_size` کالم۔ یہ ایک میپنگ بناتا ہے تاکہ ہر زمرہ ایک نمبر کے ذریعے ظاہر ہو، جو کالم میں زمرے کی ترتیب ہے۔\n", "\n", "2. **کیٹیگوریکل انکوڈر**: یہ نومینل ویریبلز کے لیے موزوں ہے، جو زمرہ وار ویریبلز ہیں جہاں ان کا ڈیٹا منطقی ترتیب کی پیروی نہیں کرتا، جیسے ہمارے ڈیٹا سیٹ میں `item_size` کے علاوہ تمام فیچرز۔ یہ ایک ون-ہاٹ انکوڈنگ ہے، جس کا مطلب ہے کہ ہر زمرہ ایک بائنری کالم کے ذریعے ظاہر ہوتا ہے: انکوڈ شدہ ویریبل 1 کے برابر ہے اگر کدو اس قسم سے تعلق رکھتا ہو اور 0 ورنہ۔\n", "\n", "Tidymodels ایک اور بہترین پیکیج فراہم کرتا ہے: [recipes](https://recipes.tidymodels.org/) - ڈیٹا کی پیشگی پروسیسنگ کے لیے ایک پیکیج۔ ہم ایک `recipe` کی وضاحت کریں گے جو یہ بتاتا ہے کہ تمام پیشگوئی کرنے والے کالمز کو عددی سیٹ میں انکوڈ کیا جانا چاہیے، اسے `prep` کریں گے تاکہ مطلوبہ مقدار اور شماریات کا اندازہ لگایا جا سکے جو کسی بھی آپریشن کے لیے ضروری ہیں، اور آخر میں `bake` کریں گے تاکہ نئے ڈیٹا پر حسابات کا اطلاق کیا جا سکے۔\n", "\n", "> عام طور پر، recipes کو ماڈلنگ کے لیے ایک پری پروسیسر کے طور پر استعمال کیا جاتا ہے جہاں یہ وضاحت کرتا ہے کہ ڈیٹا سیٹ پر کون سے مراحل لاگو کیے جائیں تاکہ اسے ماڈلنگ کے لیے تیار کیا جا سکے۔ اس صورت میں یہ **بہت زیادہ سفارش کی جاتی ہے** کہ آپ `workflow()` استعمال کریں بجائے اس کے کہ دستی طور پر recipe کو prep اور bake کے ذریعے اندازہ لگائیں۔ ہم یہ سب کچھ ابھی دیکھیں گے۔\n", ">\n", "> تاہم، فی الحال ہم recipes + prep + bake استعمال کر رہے ہیں تاکہ یہ وضاحت کی جا سکے کہ ڈیٹا سیٹ پر کون سے مراحل لاگو کیے جائیں تاکہ اسے ڈیٹا کے تجزیے کے لیے تیار کیا جا سکے اور پھر ان مراحل کے ساتھ پروسیس شدہ ڈیٹا نکالا جا سکے۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Preprocess and extract data to allow some data analysis\n", "baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n", " # Define ordering for item_size column\n", " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n", " # Convert factors to numbers using the order defined above (Ordinal encoding)\n", " step_integer(item_size, zero_based = F) %>%\n", " # Encode all other predictors using one hot encoding\n", " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n", " prep(data = pumpkin_select) %>%\n", " bake(new_data = NULL)\n", "\n", "# Display the first few rows of preprocessed data\n", "baked_pumpkins %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "✅ آئٹم سائز کالم کے لیے آرڈینل انکوڈر استعمال کرنے کے فوائد کیا ہیں؟\n", "\n", "### متغیرات کے درمیان تعلقات کا تجزیہ کریں\n", "\n", "اب جب کہ ہم نے اپنے ڈیٹا کو پہلے سے پروسیس کر لیا ہے، ہم فیچرز اور لیبل کے درمیان تعلقات کا تجزیہ کر سکتے ہیں تاکہ یہ سمجھ سکیں کہ ماڈل فیچرز کی بنیاد پر لیبل کی پیش گوئی کتنی اچھی طرح کر سکے گا۔ اس قسم کے تجزیے کو انجام دینے کا بہترین طریقہ ڈیٹا کو پلاٹ کرنا ہے۔ \n", "ہم دوبارہ ggplot geom_boxplot_ فنکشن استعمال کریں گے تاکہ آئٹم سائز، قسم اور رنگ کے درمیان تعلقات کو ایک کیٹیگوریکل پلاٹ میں دیکھ سکیں۔ ڈیٹا کو بہتر طور پر پلاٹ کرنے کے لیے ہم انکوڈڈ آئٹم سائز کالم اور ان انکوڈڈ قسم کالم استعمال کریں گے۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Define the color palette\n", "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n", "\n", "# We need the encoded Item Size column to use it as the x-axis values in the plot\n", "pumpkins_select_plot<-pumpkins_select\n", "pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n", "\n", "# Create the grouped box plot\n", "ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n", " geom_boxplot() +\n", " facet_grid(variety ~ ., scales = \"free_x\") +\n", " scale_fill_manual(values = palette) +\n", " labs(x = \"Item Size\", y = \"\") +\n", " theme_minimal() +\n", " theme(strip.text = element_text(size = 12)) +\n", " theme(axis.text.x = element_text(size = 10)) +\n", " theme(axis.title.x = element_text(size = 12)) +\n", " theme(axis.title.y = element_blank()) +\n", " theme(legend.position = \"bottom\") +\n", " guides(fill = guide_legend(title = \"Color\")) +\n", " theme(panel.spacing = unit(0.5, \"lines\"))+\n", " theme(strip.text.y = element_text(size = 4, hjust = 0)) \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ایک swarm plot استعمال کریں\n", "\n", "چونکہ رنگ ایک دو حصوں میں تقسیم ہونے والی قسم ہے (سفید یا نہیں)، اس کے لیے بصری طور پر پیش کرنے کے لیے 'ایک [خصوصی طریقہ](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf)' کی ضرورت ہے۔\n", "\n", "رنگ کی تقسیم کو آئٹم سائز کے لحاظ سے دکھانے کے لیے `swarm plot` آزمائیں۔\n", "\n", "ہم [ggbeeswarm پیکج](https://github.com/eclarke/ggbeeswarm) استعمال کریں گے جو ggplot2 کے ذریعے beeswarm-style plots بنانے کے طریقے فراہم کرتا ہے۔ Beeswarm plots ایک ایسا طریقہ ہے جس میں وہ پوائنٹس جو عام طور پر ایک دوسرے کے اوپر آ جاتے ہیں، اس طرح ترتیب دیے جاتے ہیں کہ وہ ایک دوسرے کے ساتھ نظر آئیں۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Create beeswarm plots of color and item_size\n", "baked_pumpkins %>% \n", " mutate(color = factor(color)) %>% \n", " ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n", " geom_quasirandom() +\n", " scale_color_brewer(palette = \"Dark2\", direction = -1) +\n", " theme(legend.position = \"none\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "اب جب کہ ہمیں رنگ کے دو حصوں اور سائز کے بڑے گروپ کے درمیان تعلق کا اندازہ ہو گیا ہے، آئیے لاجسٹک ریگریشن کا جائزہ لیتے ہیں تاکہ کسی دیے گئے کدو کے ممکنہ رنگ کا تعین کیا جا سکے۔\n", "\n", "## اپنا ماڈل بنائیں\n", "\n", "ان متغیرات کا انتخاب کریں جنہیں آپ اپنے درجہ بندی ماڈل میں استعمال کرنا چاہتے ہیں اور ڈیٹا کو تربیتی اور ٹیسٹ سیٹ میں تقسیم کریں۔ [rsample](https://rsample.tidymodels.org/)، جو کہ Tidymodels میں ایک پیکیج ہے، مؤثر ڈیٹا تقسیم اور دوبارہ نمونے لینے کے لیے بنیادی ڈھانچہ فراہم کرتا ہے:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Split data into 80% for training and 20% for testing\n", "set.seed(2056)\n", "pumpkins_split <- pumpkins_select %>% \n", " initial_split(prop = 0.8)\n", "\n", "# Extract the data in each split\n", "pumpkins_train <- training(pumpkins_split)\n", "pumpkins_test <- testing(pumpkins_split)\n", "\n", "# Print out the first 5 rows of the training set\n", "pumpkins_train %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "🙌 ہم اب ایک ماڈل کو تربیت دینے کے لیے تیار ہیں، جس میں تربیتی خصوصیات کو تربیتی لیبل (رنگ) کے ساتھ فٹ کیا جائے گا۔\n", "\n", "ہم ایک نسخہ بنانے سے شروع کریں گے جو ان اقدامات کو بیان کرے گا جو ہمارے ڈیٹا پر ماڈلنگ کے لیے تیار کرنے کے لیے کیے جانے چاہئیں، یعنی: زمرہ وار متغیرات کو عددی سیٹ میں تبدیل کرنا۔ بالکل `baked_pumpkins` کی طرح، ہم ایک `pumpkins_recipe` بناتے ہیں لیکن اسے `prep` اور `bake` نہیں کرتے کیونکہ یہ ایک ورک فلو میں شامل کیا جائے گا، جیسا کہ آپ چند مراحل میں دیکھیں گے۔\n", "\n", "Tidymodels میں لاجسٹک ریگریشن ماڈل کو بیان کرنے کے کئی طریقے ہیں۔ دیکھیں `?logistic_reg()`۔ فی الحال، ہم لاجسٹک ریگریشن ماڈل کو ڈیفالٹ `stats::glm()` انجن کے ذریعے بیان کریں گے۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Create a recipe that specifies preprocessing steps for modelling\n", "pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n", " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n", " step_integer(item_size, zero_based = F) %>% \n", " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n", "\n", "# Create a logistic model specification\n", "log_reg <- logistic_reg() %>% \n", " set_engine(\"glm\") %>% \n", " set_mode(\"classification\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "اب جب ہمارے پاس ایک نسخہ اور ماڈل کی وضاحت موجود ہے، ہمیں انہیں ایک ایسے آبجیکٹ میں اکٹھا کرنے کا طریقہ تلاش کرنا ہوگا جو پہلے ڈیٹا کو پہلے سے پروسیس کرے (پس منظر میں تیاری + بیک)، ماڈل کو پہلے سے پروسیس شدہ ڈیٹا پر فٹ کرے اور ممکنہ بعد از پروسیسنگ سرگرمیوں کی اجازت بھی دے۔\n", "\n", "Tidymodels میں، یہ آسان آبجیکٹ [`workflow`](https://workflows.tidymodels.org/) کہلاتا ہے اور آپ کے ماڈلنگ اجزاء کو آسانی سے رکھتا ہے۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Bundle modelling components in a workflow\n", "log_reg_wf <- workflow() %>% \n", " add_recipe(pumpkins_recipe) %>% \n", " add_model(log_reg)\n", "\n", "# Print out the workflow\n", "log_reg_wf\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ایک ورک فلو کو *مخصوص* کرنے کے بعد، ماڈل کو [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html) فنکشن کے ذریعے `تربیت` دی جا سکتی ہے۔ ورک فلو ایک نسخہ کا اندازہ لگائے گا اور تربیت سے پہلے ڈیٹا کو پہلے سے پروسیس کرے گا، اس لیے ہمیں دستی طور پر یہ کام prep اور bake کے ذریعے کرنے کی ضرورت نہیں ہوگی۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Train the model\n", "wf_fit <- log_reg_wf %>% \n", " fit(data = pumpkins_train)\n", "\n", "# Print the trained workflow\n", "wf_fit\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ماڈل پرنٹ آؤٹ تربیت کے دوران سیکھے گئے کوائف کو ظاہر کرتا ہے۔\n", "\n", "اب جب کہ ہم نے تربیتی ڈیٹا کا استعمال کرتے ہوئے ماڈل کو تربیت دے دیا ہے، ہم [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) کا استعمال کرتے ہوئے ٹیسٹ ڈیٹا پر پیش گوئیاں کر سکتے ہیں۔ آئیے ماڈل کا استعمال کرتے ہوئے ہمارے ٹیسٹ سیٹ کے لیبلز اور ہر لیبل کے امکانات کی پیش گوئی کرتے ہیں۔ جب امکان 0.5 سے زیادہ ہو، تو پیش گوئی شدہ کلاس `WHITE` ہوگی ورنہ `ORANGE`۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Make predictions for color and corresponding probabilities\n", "results <- pumpkins_test %>% select(color) %>% \n", " bind_cols(wf_fit %>% \n", " predict(new_data = pumpkins_test)) %>%\n", " bind_cols(wf_fit %>%\n", " predict(new_data = pumpkins_test, type = \"prob\"))\n", "\n", "# Compare predictions\n", "results %>% \n", " slice_head(n = 10)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "یہ واقعی بہت اچھا ہے! یہ لاجسٹک ریگریشن کے کام کرنے کے طریقے کے بارے میں مزید بصیرت فراہم کرتا ہے۔\n", "\n", "### الجھن میٹرکس کے ذریعے بہتر سمجھ بوجھ\n", "\n", "ہر پیش گوئی کو اس کی متعلقہ \"حقیقی حقیقت\" کے اصل قدر کے ساتھ موازنہ کرنا یہ جاننے کا کوئی مؤثر طریقہ نہیں ہے کہ ماڈل کتنی اچھی پیش گوئی کر رہا ہے۔ خوش قسمتی سے، Tidymodels کے پاس کچھ اور چالیں ہیں: [`yardstick`](https://yardstick.tidymodels.org/) - ایک پیکیج جو کارکردگی کے میٹرکس استعمال کرتے ہوئے ماڈلز کی تاثیر کو ماپنے کے لیے استعمال ہوتا ہے۔\n", "\n", "کلاسفیکیشن مسائل سے متعلق ایک کارکردگی میٹرک [`confusion matrix`](https://wikipedia.org/wiki/Confusion_matrix) ہے۔ الجھن میٹرکس بیان کرتی ہے کہ کلاسفیکیشن ماڈل کتنی اچھی کارکردگی دکھاتا ہے۔ الجھن میٹرکس یہ بتاتی ہے کہ ہر کلاس میں کتنی مثالیں کو ماڈل نے صحیح طور پر کلاسفائی کیا۔ ہمارے معاملے میں، یہ آپ کو دکھائے گی کہ کتنے نارنجی کدو کو نارنجی کے طور پر کلاسفائی کیا گیا اور کتنے سفید کدو کو سفید کے طور پر کلاسفائی کیا گیا؛ الجھن میٹرکس یہ بھی دکھائے گی کہ کتنے غلط کیٹیگریز میں کلاسفائی کیے گئے۔\n", "\n", "[`conf_mat()`](https://tidymodels.github.io/yardstick/reference/conf_mat.html) فنکشن yardstick سے مشاہدہ شدہ اور پیش گوئی شدہ کلاسز کی اس کراس-ٹیبولیشن کا حساب لگاتا ہے۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Confusion matrix for prediction results\n", "conf_mat(data = results, truth = color, estimate = .pred_class)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "آئیے کنفیوزن میٹرکس کو سمجھتے ہیں۔ ہمارا ماڈل کدو کو دو بائنری کیٹیگریز میں تقسیم کرنے کے لیے کہا گیا ہے، کیٹیگری `سفید` اور کیٹیگری `غیر سفید`۔\n", "\n", "- اگر آپ کا ماڈل کسی کدو کو سفید پیش گوئی کرتا ہے اور حقیقت میں وہ کیٹیگری 'سفید' سے تعلق رکھتا ہے، تو ہم اسے `صحیح مثبت` کہتے ہیں، جو اوپر بائیں نمبر سے ظاہر ہوتا ہے۔\n", "\n", "- اگر آپ کا ماڈل کسی کدو کو غیر سفید پیش گوئی کرتا ہے اور حقیقت میں وہ کیٹیگری 'سفید' سے تعلق رکھتا ہے، تو ہم اسے `غلط منفی` کہتے ہیں، جو نیچے بائیں نمبر سے ظاہر ہوتا ہے۔\n", "\n", "- اگر آپ کا ماڈل کسی کدو کو سفید پیش گوئی کرتا ہے اور حقیقت میں وہ کیٹیگری 'غیر سفید' سے تعلق رکھتا ہے، تو ہم اسے `غلط مثبت` کہتے ہیں، جو اوپر دائیں نمبر سے ظاہر ہوتا ہے۔\n", "\n", "- اگر آپ کا ماڈل کسی کدو کو غیر سفید پیش گوئی کرتا ہے اور حقیقت میں وہ کیٹیگری 'غیر سفید' سے تعلق رکھتا ہے، تو ہم اسے `صحیح منفی` کہتے ہیں، جو نیچے دائیں نمبر سے ظاہر ہوتا ہے۔\n", "\n", "| حقیقت |\n", "|:-----:|\n", "\n", "\n", "| | | |\n", "|---------------|--------|-------|\n", "| **پیش گوئی** | سفید | نارنجی |\n", "| سفید | TP | FP |\n", "| نارنجی | FN | TN |\n", "\n", "جیسا کہ آپ نے اندازہ لگایا ہوگا، یہ بہتر ہے کہ صحیح مثبت اور صحیح منفی کی تعداد زیادہ ہو اور غلط مثبت اور غلط منفی کی تعداد کم ہو، جو ظاہر کرتا ہے کہ ماڈل بہتر کارکردگی دکھا رہا ہے۔\n", "\n", "کنفیوزن میٹرکس مددگار ہے کیونکہ یہ دیگر میٹرکس کو جنم دیتا ہے جو ہمیں ایک کلاسفیکیشن ماڈل کی کارکردگی کو بہتر انداز میں جانچنے میں مدد دیتے ہیں۔ آئیے ان میں سے کچھ پر بات کرتے ہیں:\n", "\n", "🎓 پریسیژن: `TP/(TP + FP)` جو پیش گوئی کیے گئے مثبت نتائج میں سے حقیقت میں مثبت نتائج کا تناسب ظاہر کرتا ہے۔ اسے [مثبت پیش گوئی کی قدر](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\") بھی کہا جاتا ہے۔\n", "\n", "🎓 ریکال: `TP/(TP + FN)` جو مثبت نتائج کا تناسب ظاہر کرتا ہے، ان نمونوں کی تعداد کے مقابلے میں جو حقیقت میں مثبت تھے۔ اسے `حساسیت` بھی کہا جاتا ہے۔\n", "\n", "🎓 اسپیسفیسٹی: `TN/(TN + FP)` جو منفی نتائج کا تناسب ظاہر کرتا ہے، ان نمونوں کی تعداد کے مقابلے میں جو حقیقت میں منفی تھے۔\n", "\n", "🎓 ایکیوریسی: `TP + TN/(TP + TN + FP + FN)` وہ فیصد جو کسی نمونے کے لیے درست لیبلز کی پیش گوئی کرتا ہے۔\n", "\n", "🎓 ایف میژر: پریسیژن اور ریکال کا وزنی اوسط، جس میں بہترین 1 اور بدترین 0 ہوتا ہے۔\n", "\n", "آئیے ان میٹرکس کا حساب لگاتے ہیں!\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Combine metric functions and calculate them all at once\n", "eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n", "eval_metrics(data = results, truth = color, estimate = .pred_class)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## اس ماڈل کے ROC وکر کو دیکھیں\n", "\n", "آئیے ایک اور بصری جائزہ لیتے ہیں تاکہ نام نہاد [`ROC وکر`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) کو دیکھ سکیں:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Make a roc_curve\n", "results %>% \n", " roc_curve(color, .pred_ORANGE) %>% \n", " autoplot()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "آر او سی (ROC) منحنیات اکثر کسی کلاسیفائر کے نتائج کو اس کے درست اور غلط مثبتات کے لحاظ سے دیکھنے کے لیے استعمال کی جاتی ہیں۔ آر او سی منحنیات عام طور پر Y محور پر `True Positive Rate`/حساسیت اور X محور پر `False Positive Rate`/1-خصوصیت کو ظاہر کرتی ہیں۔ اس طرح، منحنی کی ڈھلوان اور درمیانی لائن اور منحنی کے درمیان جگہ اہمیت رکھتی ہے: آپ ایسی منحنی چاہتے ہیں جو تیزی سے اوپر جائے اور لائن کے اوپر پہنچے۔ ہمارے معاملے میں، شروع میں کچھ غلط مثبتات موجود ہیں، اور پھر لائن مناسب طریقے سے اوپر اور آگے بڑھتی ہے۔\n", "\n", "آخر میں، آئیے `yardstick::roc_auc()` کا استعمال کرتے ہیں تاکہ منحنی کے نیچے کے علاقے (Area Under the Curve) کا حساب لگایا جا سکے۔ AUC کی تشریح کا ایک طریقہ یہ ہے کہ یہ ماڈل کے اس امکان کو ظاہر کرتا ہے کہ وہ کسی تصادفی مثبت مثال کو کسی تصادفی منفی مثال سے زیادہ درجہ دے گا۔\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Calculate area under curve\n", "results %>% \n", " roc_auc(color, .pred_ORANGE)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "نتیجہ تقریباً `0.975` ہے۔ چونکہ AUC کا دائرہ 0 سے 1 تک ہوتا ہے، آپ ایک بڑا اسکور چاہتے ہیں، کیونکہ ایک ماڈل جو اپنی پیش گوئیوں میں 100% درست ہو، اس کا AUC 1 ہوگا؛ اس صورت میں، ماڈل *کافی اچھا* ہے۔\n", "\n", "آئندہ اسباق میں، جہاں آپ کلاسیفکیشن کے بارے میں مزید سیکھیں گے، آپ یہ بھی جانیں گے کہ اپنے ماڈل کے اسکورز کو کیسے بہتر بنایا جا سکتا ہے (جیسے کہ اس کیس میں غیر متوازن ڈیٹا کو ہینڈل کرنا)۔\n", "\n", "## 🚀چیلنج\n", "\n", "لاجسٹک ریگریشن کے بارے میں جاننے کے لیے ابھی بہت کچھ باقی ہے! لیکن سیکھنے کا بہترین طریقہ تجربہ کرنا ہے۔ ایسا ڈیٹاسیٹ تلاش کریں جو اس قسم کے تجزیے کے لیے موزوں ہو اور اس کے ساتھ ایک ماڈل بنائیں۔ آپ نے کیا سیکھا؟ ایک مشورہ: دلچسپ ڈیٹاسیٹس کے لیے [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) کو آزمائیں۔\n", "\n", "## جائزہ اور خود مطالعہ\n", "\n", "[اسٹینفورڈ کی اس تحقیق](https://web.stanford.edu/~jurafsky/slp3/5.pdf) کے ابتدائی چند صفحات پڑھیں، جو لاجسٹک ریگریشن کے عملی استعمالات پر روشنی ڈالتی ہے۔ ان کاموں کے بارے میں سوچیں جو اب تک پڑھے گئے مختلف ریگریشن ٹاسکس کے لیے زیادہ موزوں ہیں۔ کس قسم کا ریگریشن بہترین کام کرے گا؟\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**ڈسکلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستگی ہو سکتی ہیں۔ اصل دستاویز، جو اس کی اصل زبان میں ہے، کو مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔\n" ] } ], "metadata": { "anaconda-cloud": "", "kernelspec": { "display_name": "R", "langauge": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.1" }, "coopTranslator": { "original_hash": "feaf125f481a89c468fa115bf2aed580", "translation_date": "2025-08-29T14:52:33+00:00", "source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb", "language_code": "ur" } }, "nbformat": 4, "nbformat_minor": 1 }