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/pa/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb

650 lines
39 KiB

{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "lesson_12-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "fab50046ca413a38939d579f8432274f",
"translation_date": "2025-08-29T19:32:23+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "pa"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"# ਇੱਕ ਵਰਗੀਕਰਨ ਮਾਡਲ ਬਣਾਓ: ਸੁਆਦਿਸ਼ਟ ਏਸ਼ੀਆਈ ਅਤੇ ਭਾਰਤੀ ਖਾਣੇ\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## ਖਾਣੇ ਦੇ ਵਰਗੀਕਰਨ 2\n",
"\n",
"ਇਸ ਦੂਜੇ ਵਰਗੀਕਰਨ ਪਾਠ ਵਿੱਚ, ਅਸੀਂ ਸ਼੍ਰੇਣੀਬੱਧ ਡਾਟਾ ਨੂੰ ਵਰਗੀਕ੍ਰਿਤ ਕਰਨ ਦੇ ਹੋਰ ਤਰੀਕਿਆਂ ਦੀ ਪੜਚੋਲ ਕਰਾਂਗੇ। ਅਸੀਂ ਇਹ ਵੀ ਸਿੱਖਾਂਗੇ ਕਿ ਇੱਕ ਵਰਗੀਕਰਕ ਨੂੰ ਚੁਣਨ ਦੇ ਨਤੀਜੇ ਕੀ ਹੋ ਸਕਦੇ ਹਨ।\n",
"\n",
"### [**ਪਾਠ ਤੋਂ ਪਹਿਲਾਂ ਕਵਿਜ਼**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **ਪੂਰਵ ਸ਼ਰਤਾਂ**\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",
"- `themis`: [themis ਪੈਕੇਜ](https://themis.tidymodels.org/) ਅਸੰਤੁਲਿਤ ਡਾਟਾ ਨਾਲ ਨਜਿੱਠਣ ਲਈ ਵਾਧੂ ਰਿਸੀਪੀ ਸਟੈਪ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।\n",
"\n",
"ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹੇਠਾਂ ਦਿੱਤੇ ਤਰੀਕੇ ਨਾਲ ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"ਵਿਕਲਪਕ ਤੌਰ 'ਤੇ, ਹੇਠਾਂ ਦਿੱਤਾ ਸਕ੍ਰਿਪਟ ਜਾਂਚਦਾ ਹੈ ਕਿ ਕੀ ਤੁਹਾਡੇ ਕੋਲ ਇਸ ਮੋਡੀਊਲ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ ਲੋੜੀਂਦੇ ਪੈਕੇਜ ਮੌਜੂਦ ਹਨ ਅਤੇ ਜੇ ਗੈਰਹਾਜ਼ਰ ਹਨ ਤਾਂ ਉਹਨਾਂ ਨੂੰ ਇੰਸਟਾਲ ਕਰਦਾ ਹੈ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vZ57IuUxgyQt"
},
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "z22M-pj4g07x"
},
"source": [
"## **1. ਇੱਕ ਵਰਗੀਕਰਨ ਨਕਸ਼ਾ**\n",
"\n",
"ਸਾਡੇ [ਪਿਛਲੇ ਪਾਠ](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) ਵਿੱਚ, ਅਸੀਂ ਇਹ ਸਵਾਲ ਹੱਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ: ਅਸੀਂ ਕਈ ਮਾਡਲਾਂ ਵਿੱਚੋਂ ਕਿਵੇਂ ਚੁਣਦੇ ਹਾਂ? ਵੱਡੇ ਪੱਧਰ 'ਤੇ, ਇਹ ਡਾਟਾ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਉਸ ਸਮੱਸਿਆ ਦੇ ਕਿਸਮ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ ਜਿਸ ਨੂੰ ਅਸੀਂ ਹੱਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹਾਂ (ਉਦਾਹਰਨ ਲਈ ਵਰਗੀਕਰਨ ਜਾਂ ਰਿਗ੍ਰੈਸ਼ਨ?)\n",
"\n",
"ਪਿਛਲੇ ਪਾਠ ਵਿੱਚ, ਅਸੀਂ ਸਿੱਖਿਆ ਕਿ ਡਾਟਾ ਨੂੰ ਵਰਗੀਕਰਣ ਕਰਦੇ ਸਮੇਂ ਤੁਹਾਡੇ ਕੋਲ ਕਿਹੜੇ ਵਿਕਲਪ ਹਨ, ਜਿਸ ਵਿੱਚ ਮਾਈਕਰੋਸਾਫਟ ਦੀ ਚੀਟ ਸ਼ੀਟ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਗਈ। ਪਾਇਥਨ ਦਾ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਫਰੇਮਵਰਕ, Scikit-learn, ਇੱਕ ਹੋਰ ਵਿਸਤ੍ਰਿਤ ਚੀਟ ਸ਼ੀਟ ਪੇਸ਼ ਕਰਦਾ ਹੈ ਜੋ ਤੁਹਾਡੇ ਐਸਟੀਮੇਟਰ (ਵਰਗੀਕਰਣ ਲਈ ਇੱਕ ਹੋਰ ਸ਼ਬਦ) ਨੂੰ ਹੋਰ ਸੰਕੁਚਿਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ:\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> ਸੁਝਾਅ: [ਇਸ ਨਕਸ਼ੇ ਨੂੰ ਆਨਲਾਈਨ ਵੇਖੋ](https://scikit-learn.org/stable/tutorial/machine_learning_map/) ਅਤੇ ਦਸਤਾਵੇਜ਼ ਪੜ੍ਹਨ ਲਈ ਰਾਹਾਂ 'ਤੇ ਕਲਿਕ ਕਰੋ।\n",
">\n",
"> [Tidymodels ਰਿਫਰੈਂਸ ਸਾਈਟ](https://www.tidymodels.org/find/parsnip/#models) ਵੀ ਵੱਖ-ਵੱਖ ਮਾਡਲਾਂ ਬਾਰੇ ਸ਼ਾਨਦਾਰ ਦਸਤਾਵੇਜ਼ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ।\n",
"\n",
"### **ਯੋਜਨਾ** 🗺️\n",
"\n",
"ਇਹ ਨਕਸ਼ਾ ਤੁਹਾਡੇ ਡਾਟਾ ਦੀ ਸਪਸ਼ਟ ਸਮਝ ਹੋਣ 'ਤੇ ਬਹੁਤ ਮਦਦਗਾਰ ਹੈ, ਕਿਉਂਕਿ ਤੁਸੀਂ ਇਸ ਦੇ ਰਾਹਾਂ 'ਤੇ ਚੱਲ ਕੇ ਫੈਸਲਾ ਕਰ ਸਕਦੇ ਹੋ:\n",
"\n",
"- ਸਾਡੇ ਕੋਲ \\>50 ਨਮੂਨੇ ਹਨ\n",
"\n",
"- ਅਸੀਂ ਇੱਕ ਸ਼੍ਰੇਣੀ ਦੀ ਪੇਸ਼ਗੂਈ ਕਰਨੀ ਚਾਹੁੰਦੇ ਹਾਂ\n",
"\n",
"- ਸਾਡੇ ਕੋਲ ਲੇਬਲ ਕੀਤਾ ਡਾਟਾ ਹੈ\n",
"\n",
"- ਸਾਡੇ ਕੋਲ 100K ਤੋਂ ਘੱਟ ਨਮੂਨੇ ਹਨ\n",
"\n",
"- ✨ ਅਸੀਂ ਇੱਕ Linear SVC ਚੁਣ ਸਕਦੇ ਹਾਂ\n",
"\n",
"- ਜੇ ਇਹ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਕਿਉਂਕਿ ਸਾਡੇ ਕੋਲ ਗਿਣਤੀ ਵਾਲਾ ਡਾਟਾ ਹੈ\n",
"\n",
" - ਅਸੀਂ ✨ KNeighbors Classifier ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹਾਂ\n",
"\n",
" - ਜੇ ਇਹ ਵੀ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ✨ SVC ਅਤੇ ✨ Ensemble Classifiers ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ\n",
"\n",
"ਇਹ ਪਾਲਣਾ ਕਰਨ ਲਈ ਬਹੁਤ ਹੀ ਮਦਦਗਾਰ ਰਾਹ ਹੈ। ਹੁਣ, ਚਲੋ ਇਸ ਨੂੰ [tidymodels](https://www.tidymodels.org/) ਮਾਡਲਿੰਗ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸ਼ੁਰੂ ਕਰੀਏ: R ਪੈਕੇਜਾਂ ਦਾ ਇੱਕ ਸਥਿਰ ਅਤੇ ਲਚਕਦਾਰ ਸੰਗ੍ਰਹਿ ਜੋ ਚੰਗੀ ਸਾਂਖਿਆਕੀ ਅਭਿਆਸ ਨੂੰ ਉਤਸ਼ਾਹਿਤ ਕਰਨ ਲਈ ਵਿਕਸਿਤ ਕੀਤਾ ਗਿਆ ਹੈ 😊।\n",
"\n",
"## 2. ਡਾਟਾ ਨੂੰ ਵੰਡੋ ਅਤੇ ਅਸਮਾਨ ਡਾਟਾ ਸੈਟ ਨਾਲ ਨਿਪਟੋ।\n",
"\n",
"ਪਿਛਲੇ ਪਾਠਾਂ ਵਿੱਚ, ਅਸੀਂ ਸਿੱਖਿਆ ਕਿ ਸਾਡੇ ਖਾਣਿਆਂ ਵਿੱਚ ਕੁਝ ਆਮ ਸਮੱਗਰੀਆਂ ਸਨ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਖਾਣਿਆਂ ਦੀ ਗਿਣਤੀ ਵਿੱਚ ਕਾਫ਼ੀ ਅਸਮਾਨ ਵੰਡ ਸੀ।\n",
"\n",
"ਅਸੀਂ ਇਹਨਾਂ ਨਾਲ ਨਿਪਟਾਂਗੇ\n",
"\n",
"- `dplyr::select()` ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਭ ਤੋਂ ਆਮ ਸਮੱਗਰੀਆਂ ਨੂੰ ਹਟਾ ਕੇ ਜੋ ਵੱਖ-ਵੱਖ ਖਾਣਿਆਂ ਵਿੱਚ ਗੁੰਝਲ ਪੈਦਾ ਕਰਦੀਆਂ ਹਨ।\n",
"\n",
"- ਇੱਕ `recipe` ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜੋ ਡਾਟਾ ਨੂੰ ਮਾਡਲਿੰਗ ਲਈ ਤਿਆਰ ਕਰਨ ਲਈ ਪ੍ਰੀ-ਪ੍ਰੋਸੈਸ ਕਰਦੀ ਹੈ ਅਤੇ ਇੱਕ `over-sampling` algorithm ਲਾਗੂ ਕਰਦੀ ਹੈ।\n",
"\n",
"ਅਸੀਂ ਪਿਛਲੇ ਪਾਠ ਵਿੱਚ ਉਪਰੋਕਤ ਨੂੰ ਪਹਿਲਾਂ ਹੀ ਦੇਖਿਆ ਹੈ ਇਸ ਲਈ ਇਹ ਬਹੁਤ ਆਸਾਨ ਹੋਵੇਗਾ 🥳!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6tj_rN00hClA"
},
"source": [
"# Load the core Tidyverse and Tidymodels packages\n",
"library(tidyverse)\n",
"library(tidymodels)\n",
"\n",
"# Load the original cuisines data\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
"\n",
"# Drop id column, rice, garlic and ginger from our original data set\n",
"df_select <- df %>% \n",
" select(-c(1, rice, garlic, ginger)) %>%\n",
" # Encode cuisine column as categorical\n",
" mutate(cuisine = factor(cuisine))\n",
"\n",
"\n",
"# Create data split specification\n",
"set.seed(2056)\n",
"cuisines_split <- initial_split(data = df_select,\n",
" strata = cuisine,\n",
" prop = 0.7)\n",
"\n",
"# Extract the data in each split\n",
"cuisines_train <- training(cuisines_split)\n",
"cuisines_test <- testing(cuisines_split)\n",
"\n",
"# Display distribution of cuisines in the training set\n",
"cuisines_train %>% \n",
" count(cuisine) %>% \n",
" arrange(desc(n))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zFin5yw3hHb1"
},
"source": [
"### ਅਸੰਤੁਲਿਤ ਡਾਟਾ ਨਾਲ ਨਿਪਟਣਾ\n",
"\n",
"ਅਸੰਤੁਲਿਤ ਡਾਟਾ ਅਕਸਰ ਮਾਡਲ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ 'ਤੇ ਨਕਾਰਾਤਮਕ ਪ੍ਰਭਾਵ ਪਾਉਂਦਾ ਹੈ। ਬਹੁਤ ਸਾਰੇ ਮਾਡਲ ਉਸ ਸਮੇਂ ਸਭ ਤੋਂ ਵਧੀਆ ਕੰਮ ਕਰਦੇ ਹਨ ਜਦੋਂ ਅਵਲੋਕਨਾਂ ਦੀ ਗਿਣਤੀ ਬਰਾਬਰ ਹੁੰਦੀ ਹੈ ਅਤੇ ਇਸ ਕਰਕੇ ਅਸੰਤੁਲਿਤ ਡਾਟਾ ਨਾਲ ਸੰਘਰਸ਼ ਕਰਦੇ ਹਨ।\n",
"\n",
"ਅਸੰਤੁਲਿਤ ਡਾਟਾ ਸੈੱਟਸ ਨਾਲ ਨਿਪਟਣ ਦੇ ਮੁੱਖ ਤੌਰ 'ਤੇ ਦੋ ਤਰੀਕੇ ਹਨ:\n",
"\n",
"- ਘੱਟ ਗਿਣਤੀ ਵਾਲੇ ਵਰਗ ਵਿੱਚ ਅਵਲੋਕਨ ਸ਼ਾਮਲ ਕਰਨਾ: `ਓਵਰ-ਸੈਂਪਲਿੰਗ` ਜਿਵੇਂ ਕਿ SMOTE ਐਲਗੋਰਿਦਮ ਦੀ ਵਰਤੋਂ ਕਰਨਾ, ਜੋ ਘੱਟ ਗਿਣਤੀ ਵਾਲੇ ਵਰਗ ਦੇ ਨਵੇਂ ਉਦਾਹਰਨਾਂ ਨੂੰ ਇਨ੍ਹਾਂ ਕੇਸਾਂ ਦੇ ਸਭ ਤੋਂ ਨੇੜਲੇ ਪੜੋਸੀਆਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕ੍ਰਿਤ੍ਰਿਮ ਤੌਰ 'ਤੇ ਤਿਆਰ ਕਰਦਾ ਹੈ।\n",
"\n",
"- ਵੱਧ ਗਿਣਤੀ ਵਾਲੇ ਵਰਗ ਤੋਂ ਅਵਲੋਕਨ ਹਟਾਉਣਾ: `ਅੰਡਰ-ਸੈਂਪਲਿੰਗ`\n",
"\n",
"ਸਾਡੇ ਪਿਛਲੇ ਪਾਠ ਵਿੱਚ, ਅਸੀਂ ਦਿਖਾਇਆ ਸੀ ਕਿ ਕਿਵੇਂ ਇੱਕ `recipe` ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਸੰਤੁਲਿਤ ਡਾਟਾ ਸੈੱਟਸ ਨਾਲ ਨਿਪਟਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਇੱਕ recipe ਨੂੰ ਇੱਕ ਬਲੂਪ੍ਰਿੰਟ ਵਜੋਂ ਸੋਚਿਆ ਜਾ ਸਕਦਾ ਹੈ ਜੋ ਵੇਰਵਾ ਦਿੰਦਾ ਹੈ ਕਿ ਡਾਟਾ ਵਿਸ਼ਲੇਸ਼ਣ ਲਈ ਤਿਆਰ ਕਰਨ ਲਈ ਕਿਸ ਤਰ੍ਹਾਂ ਦੇ ਕਦਮ ਲਾਗੂ ਕੀਤੇ ਜਾਣੇ ਚਾਹੀਦੇ ਹਨ। ਸਾਡੇ ਕੇਸ ਵਿੱਚ, ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਸਾਡੇ `training set` ਵਿੱਚ ਸਾਡੇ ਖਾਣਿਆਂ ਦੀ ਗਿਣਤੀ ਦਾ ਵੰਡਨ ਬਰਾਬਰ ਹੋਵੇ। ਆਓ ਇਸਨੂੰ ਸ਼ੁਰੂ ਕਰੀਏ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cRzTnHolhLWd"
},
"source": [
"# Load themis package for dealing with imbalanced data\n",
"library(themis)\n",
"\n",
"# Create a recipe for preprocessing training data\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
" step_smote(cuisine) \n",
"\n",
"# Print recipe\n",
"cuisines_recipe"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KxOQ2ORhhO81"
},
"source": [
"ਹੁਣ ਅਸੀਂ ਮਾਡਲਾਂ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨ ਲਈ ਤਿਆਰ ਹਾਂ 👩‍💻👨‍💻!\n",
"\n",
"## 3. ਮਲਟੀਨੋਮਿਅਲ ਰਿਗ੍ਰੈਸ਼ਨ ਮਾਡਲਾਂ ਤੋਂ ਅੱਗੇ\n",
"\n",
"ਸਾਡੇ ਪਿਛਲੇ ਪਾਠ ਵਿੱਚ, ਅਸੀਂ ਮਲਟੀਨੋਮਿਅਲ ਰਿਗ੍ਰੈਸ਼ਨ ਮਾਡਲਾਂ ਦੇਖੇ ਸਨ। ਆਓ ਵਰਗੀਕਰਨ ਲਈ ਕੁਝ ਹੋਰ ਲਚਕੀਲੇ ਮਾਡਲਾਂ ਦੀ ਪੜਚੋਲ ਕਰੀਏ।\n",
"\n",
"### ਸਪੋਰਟ ਵੇਕਟਰ ਮਸ਼ੀਨਜ਼\n",
"\n",
"ਵਰਗੀਕਰਨ ਦੇ ਸੰਦਰਭ ਵਿੱਚ, `ਸਪੋਰਟ ਵੇਕਟਰ ਮਸ਼ੀਨਜ਼` ਇੱਕ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਤਕਨੀਕ ਹੈ ਜੋ ਇੱਕ *ਹਾਈਪਰਪਲੇਨ* ਲੱਭਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੀ ਹੈ ਜੋ ਕਲਾਸਾਂ ਨੂੰ \"ਸਭ ਤੋਂ ਵਧੀਆ\" ਤਰੀਕੇ ਨਾਲ ਵੱਖ ਕਰ ਸਕੇ। ਆਓ ਇੱਕ ਸਧਾਰਣ ਉਦਾਹਰਨ ਦੇਖੀਏ:\n",
"\n",
"<p >\n",
" <img src=\"../../images/svm.png\"\n",
" width=\"300\"/>\n",
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C4Wsd0vZhXYu"
},
"source": [
"H1~ ਕਲਾਸਾਂ ਨੂੰ ਵੱਖ ਨਹੀਂ ਕਰਦਾ। H2~ ਕਰਦਾ ਹੈ, ਪਰ ਸਿਰਫ਼ ਥੋੜ੍ਹੇ ਮਾਰਜਿਨ ਨਾਲ। H3~ ਉਨ੍ਹਾਂ ਨੂੰ ਵੱਧ ਤੋਂ ਵੱਧ ਮਾਰਜਿਨ ਨਾਲ ਵੱਖ ਕਰਦਾ ਹੈ।\n",
"\n",
"#### ਲੀਨੀਅਰ ਸਪੋਰਟ ਵੈਕਟਰ ਕਲਾਸੀਫਾਇਰ\n",
"\n",
"ਸਪੋਰਟ-ਵੈਕਟਰ ਕਲੱਸਟਰਿੰਗ (SVC) ਸਪੋਰਟ-ਵੈਕਟਰ ਮਸ਼ੀਨਾਂ ਦੇ ML ਤਕਨੀਕਾਂ ਦੇ ਪਰਿਵਾਰ ਦਾ ਹਿੱਸਾ ਹੈ। SVC ਵਿੱਚ, ਹਾਈਪਰਪਲੇਨ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਚੁਣਿਆ ਜਾਂਦਾ ਹੈ ਕਿ ਇਹ `ਜ਼ਿਆਦਾਤਰ` ਟ੍ਰੇਨਿੰਗ ਅਬਜ਼ਰਵੇਸ਼ਨ ਨੂੰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਵੱਖ ਕਰੇ, ਪਰ ਕੁਝ ਅਬਜ਼ਰਵੇਸ਼ਨ ਨੂੰ `ਗਲਤ ਕਲਾਸੀਫਾਈ` ਕਰ ਸਕਦਾ ਹੈ। ਕੁਝ ਪਾਇੰਟਸ ਨੂੰ ਗਲਤ ਪਾਸੇ ਹੋਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਨਾਲ, SVM ਆਉਟਲਾਇਰਜ਼ ਲਈ ਹੋਰ ਮਜ਼ਬੂਤ ਬਣ ਜਾਂਦਾ ਹੈ ਅਤੇ ਨਵੇਂ ਡਾਟਾ ਲਈ ਬਿਹਤਰ ਜਨਰਲਾਈਜ਼ੇਸ਼ਨ ਹੁੰਦੀ ਹੈ। ਇਸ ਉਲੰਘਣਾ ਨੂੰ ਨਿਯਮਿਤ ਕਰਨ ਵਾਲੇ ਪੈਰਾਮੀਟਰ ਨੂੰ `cost` ਕਿਹਾ ਜਾਂਦਾ ਹੈ ਜਿਸਦੀ ਡਿਫਾਲਟ ਵੈਲਿਊ 1 ਹੈ (ਵੇਖੋ `help(\"svm_poly\")`)।\n",
"\n",
"ਆਓ ਇੱਕ ਲੀਨੀਅਰ SVC ਬਣਾਈਏ ਜਿੱਥੇ ਪੋਲਿਨੋਮਿਅਲ SVM ਮਾਡਲ ਵਿੱਚ `degree = 1` ਸੈਟ ਕੀਤਾ ਗਿਆ ਹੈ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vJpp6nuChlBz"
},
"source": [
"# Make a linear SVC specification\n",
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svc_linear_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svc_linear_spec)\n",
"\n",
"# Print out workflow\n",
"svc_linear_wf"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDs8cWNkhoqu"
},
"source": [
"ਹੁਣ ਜਦੋਂ ਅਸੀਂ ਪ੍ਰੀ-ਪ੍ਰੋਸੈਸਿੰਗ ਕਦਮਾਂ ਅਤੇ ਮਾਡਲ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਇੱਕ *workflow* ਵਿੱਚ ਕੈਪਚਰ ਕਰ ਲਿਆ ਹੈ, ਅਸੀਂ linear SVC ਨੂੰ ਟ੍ਰੇਨ ਕਰ ਸਕਦੇ ਹਾਂ ਅਤੇ ਇਸ ਦੌਰਾਨ ਨਤੀਜਿਆਂ ਦਾ ਮੁਲਾਂਕਣ ਕਰ ਸਕਦੇ ਹਾਂ। ਪ੍ਰਦਰਸ਼ਨ ਮਾਪਦੰਡਾਂ ਲਈ, ਆਓ ਇੱਕ ਮੈਟ੍ਰਿਕ ਸੈੱਟ ਬਣਾਈਏ ਜੋ ਇਹਨਾਂ ਦਾ ਮੁਲਾਂਕਣ ਕਰੇਗਾ: `accuracy`, `sensitivity`, `Positive Predicted Value` ਅਤੇ `F Measure`\n",
"\n",
"> `augment()` ਦਿੱਤੇ ਗਏ ਡਾਟਾ ਵਿੱਚ ਭਵਿੱਖਬਾਣੀਆਂ ਲਈ ਕਾਲਮ ਸ਼ਾਮਲ ਕਰੇਗਾ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "81wiqcwuhrnq"
},
"source": [
"# Train a linear SVC model\n",
"svc_linear_fit <- svc_linear_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svc_linear_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0UFQvHf-huo3"
},
"source": [
"#### ਸਪੋਰਟ ਵੈਕਟਰ ਮਸ਼ੀਨ\n",
"\n",
"ਸਪੋਰਟ ਵੈਕਟਰ ਮਸ਼ੀਨ (SVM) ਸਪੋਰਟ ਵੈਕਟਰ ਕਲਾਸੀਫਾਇਰ ਦਾ ਇੱਕ ਵਧਿਆ ਵਰਜਨ ਹੈ, ਜੋ ਕਲਾਸਾਂ ਦੇ ਵਿਚਕਾਰ ਗੈਰ-ਰੇਖੀ ਸੀਮਾ ਨੂੰ ਸਮਰਥਨ ਦੇਣ ਲਈ ਬਣਾਇਆ ਗਿਆ ਹੈ। ਅਸਲ ਵਿੱਚ, SVMs *ਕਰਨਲ ਟ੍ਰਿਕ* ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ ਤਾਂ ਜੋ ਫੀਚਰ ਸਪੇਸ ਨੂੰ ਵਧਾਇਆ ਜਾ ਸਕੇ ਅਤੇ ਕਲਾਸਾਂ ਦੇ ਵਿਚਕਾਰ ਗੈਰ-ਰੇਖੀ ਸੰਬੰਧਾਂ ਨੂੰ ਅਨੁਕੂਲ ਕੀਤਾ ਜਾ ਸਕੇ। SVMs ਦੁਆਰਾ ਵਰਤਿਆ ਜਾਣ ਵਾਲਾ ਇੱਕ ਪ੍ਰਸਿੱਧ ਅਤੇ ਬਹੁਤ ਲਚਕਦਾਰ ਕਰਨਲ ਫੰਕਸ਼ਨ *ਰੈਡੀਅਲ ਬੇਸਿਸ ਫੰਕਸ਼ਨ* ਹੈ। ਆਓ ਵੇਖੀਏ ਕਿ ਇਹ ਸਾਡੇ ਡਾਟਾ 'ਤੇ ਕਿਵੇਂ ਪ੍ਰਦਰਸ਼ਨ ਕਰੇਗਾ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-KX4S8mzhzmp"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Make an RBF SVM specification\n",
"svm_rbf_spec <- svm_rbf() %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svm_rbf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svm_rbf_spec)\n",
"\n",
"\n",
"# Train an RBF model\n",
"svm_rbf_fit <- svm_rbf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svm_rbf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QBFSa7WSh4HQ"
},
"source": [
"ਬਹੁਤ ਵਧੀਆ 🤩!\n",
"\n",
"> ✅ ਕਿਰਪਾ ਕਰਕੇ ਵੇਖੋ:\n",
">\n",
"> - [*ਸਪੋਰਟ ਵੈਕਟਰ ਮਸ਼ੀਨ*](https://bradleyboehmke.github.io/HOML/svm.html), R ਨਾਲ ਹੈਂਡਸ-ਆਨ ਮਸ਼ੀਨ ਲਰਨਿੰਗ\n",
">\n",
"> - [*ਸਪੋਰਟ ਵੈਕਟਰ ਮਸ਼ੀਨ*](https://www.statlearning.com/), R ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਨਾਲ ਸਟੈਟਿਸਟਿਕਲ ਲਰਨਿੰਗ ਦਾ ਪਰਿਚਯ\n",
">\n",
"> ਹੋਰ ਪੜ੍ਹਾਈ ਲਈ।\n",
"\n",
"### ਨੀਅਰੇਸਟ ਨੇighbor ਕਲਾਸੀਫਾਇਰ\n",
"\n",
"*K*-ਨੀਅਰੇਸਟ ਨੇighbor (KNN) ਇੱਕ ਐਲਗੋਰਿਥਮ ਹੈ ਜਿਸ ਵਿੱਚ ਹਰ ਅਬਜ਼ਰਵੇਸ਼ਨ ਨੂੰ ਹੋਰ ਅਬਜ਼ਰਵੇਸ਼ਨ ਨਾਲ ਇਸਦੀ *ਸਮਾਨਤਾ* ਦੇ ਆਧਾਰ 'ਤੇ ਅਨੁਮਾਨਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n",
"\n",
"ਆਓ ਇਸਨੂੰ ਆਪਣੇ ਡਾਟਾ 'ਤੇ ਫਿੱਟ ਕਰੀਏ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "k4BxxBcdh9Ka"
},
"source": [
"# Make a KNN specification\n",
"knn_spec <- nearest_neighbor() %>% \n",
" set_engine(\"kknn\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"knn_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(knn_spec)\n",
"\n",
"# Train a boosted tree model\n",
"knn_wf_fit <- knn_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"knn_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HaegQseriAcj"
},
"source": [
"ਇਹ ਲੱਗਦਾ ਹੈ ਕਿ ਇਹ ਮਾਡਲ ਵਧੀਆ ਪ੍ਰਦਰਸ਼ਨ ਨਹੀਂ ਕਰ ਰਿਹਾ। ਸ਼ਾਇਦ ਮਾਡਲ ਦੇ ਆਰਗੂਮੈਂਟਸ ਨੂੰ ਬਦਲਣਾ (ਵੇਖੋ `help(\"nearest_neighbor\")`) ਮਾਡਲ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਸੁਧਾਰ ਸਕਦਾ ਹੈ। ਇਸਨੂੰ ਜ਼ਰੂਰ ਅਜ਼ਮਾਓ।\n",
"\n",
"> ✅ ਕਿਰਪਾ ਕਰਕੇ ਵੇਖੋ:\n",
">\n",
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
">\n",
"> *K*-Nearest Neighbors ਕਲਾਸੀਫਾਇਰਜ਼ ਬਾਰੇ ਹੋਰ ਜਾਣਨ ਲਈ।\n",
"\n",
"### ਐਨਸੈਂਬਲ ਕਲਾਸੀਫਾਇਰਜ਼\n",
"\n",
"ਐਨਸੈਂਬਲ ਐਲਗੋਰਿਥਮ ਕਈ ਬੇਸ ਐਸਟੀਮੇਟਰਜ਼ ਨੂੰ ਮਿਲਾ ਕੇ ਇੱਕ ਵਧੀਆ ਮਾਡਲ ਬਣਾਉਣ ਲਈ ਕੰਮ ਕਰਦੇ ਹਨ, ਜਿਹੜਾ ਕਿ:\n",
"\n",
"`bagging`: ਬੇਸ ਮਾਡਲਾਂ ਦੇ ਇਕੱਠ 'ਤੇ *ਐਵਰੇਜਿੰਗ ਫੰਕਸ਼ਨ* ਲਾਗੂ ਕਰਨਾ\n",
"\n",
"`boosting`: ਮਾਡਲਾਂ ਦੀ ਇੱਕ ਲੜੀ ਬਣਾਉਣਾ ਜੋ ਇੱਕ ਦੂਜੇ 'ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਨ ਤਾਂ ਜੋ ਪਰੇਡਿਕਟਿਵ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਸੁਧਾਰਿਆ ਜਾ ਸਕੇ।\n",
"\n",
"ਆਓ ਸ਼ੁਰੂ ਕਰੀਏ Random Forest ਮਾਡਲ ਨਾਲ, ਜੋ ਕਿ ਫੈਸਲਾ ਲੈਣ ਵਾਲੇ ਦਰੱਖਤਾਂ ਦੀ ਇੱਕ ਵੱਡੀ ਗਿਣਤੀ ਬਣਾਉਂਦਾ ਹੈ ਅਤੇ ਫਿਰ ਇੱਕ ਐਵਰੇਜਿੰਗ ਫੰਕਸ਼ਨ ਲਾਗੂ ਕਰਦਾ ਹੈ ਤਾਂ ਜੋ ਇੱਕ ਵਧੀਆ ਸਮੁੱਚੇ ਮਾਡਲ ਲਈ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "49DPoVs6iK1M"
},
"source": [
"# Make a random forest specification\n",
"rf_spec <- rand_forest() %>% \n",
" set_engine(\"ranger\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"rf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(rf_spec)\n",
"\n",
"# Train a random forest model\n",
"rf_wf_fit <- rf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"rf_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "RGVYwC_aiUWc"
},
"source": [
"ਸ਼ਾਨਦਾਰ ਕੰਮ 👏!\n",
"\n",
"ਆਓ Boosted Tree ਮਾਡਲ ਨਾਲ ਵੀ ਪ੍ਰਯੋਗ ਕਰੀਏ।\n",
"\n",
"Boosted Tree ਇੱਕ ensemble ਵਿਧੀ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ ਜੋ ਲਗਾਤਾਰ ਫੈਸਲਾ ਲੈਣ ਵਾਲੇ ਦਰੱਖਤਾਂ ਦੀ ਇੱਕ ਲੜੀ ਬਣਾਉਂਦਾ ਹੈ, ਜਿੱਥੇ ਹਰ ਦਰੱਖਤ ਪਿਛਲੇ ਦਰੱਖਤਾਂ ਦੇ ਨਤੀਜਿਆਂ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ, ਗਲਤੀ ਨੂੰ ਕਮ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ। ਇਹ ਗਲਤ ਤਰੀਕੇ ਨਾਲ ਵਰਗੀਕ੍ਰਿਤ ਆਈਟਮਾਂ ਦੇ ਵਜ਼ਨ 'ਤੇ ਧਿਆਨ ਕੇਂਦਰਿਤ ਕਰਦਾ ਹੈ ਅਤੇ ਅਗਲੇ ਵਰਗੀਕਰਤਾ ਲਈ ਫਿੱਟ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਸਮਾਯੋਜਿਤ ਕਰਦਾ ਹੈ।\n",
"\n",
"ਇਸ ਮਾਡਲ ਨੂੰ ਫਿੱਟ ਕਰਨ ਦੇ ਵੱਖ-ਵੱਖ ਤਰੀਕੇ ਹਨ (ਵੇਖੋ `help(\"boost_tree\")`)। ਇਸ ਉਦਾਹਰਨ ਵਿੱਚ, ਅਸੀਂ Boosted trees ਨੂੰ `xgboost` ਇੰਜਨ ਰਾਹੀਂ ਫਿੱਟ ਕਰਾਂਗੇ।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Py1YWo-micWs"
},
"source": [
"# Make a boosted tree specification\n",
"boost_spec <- boost_tree(trees = 200) %>% \n",
" set_engine(\"xgboost\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"boost_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(boost_spec)\n",
"\n",
"# Train a boosted tree model\n",
"boost_wf_fit <- boost_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"boost_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zNQnbuejigZM"
},
"source": [
"> ✅ ਕਿਰਪਾ ਕਰਕੇ ਵੇਖੋ:\n",
">\n",
"> - [ਸਮਾਜਿਕ ਵਿਗਿਆਨੀਆਂ ਲਈ ਮਸ਼ੀਨ ਲਰਨਿੰਗ](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
">\n",
"> - [R ਨਾਲ ਹੈਂਡਸ-ਆਨ ਮਸ਼ੀਨ ਲਰਨਿੰਗ](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [R ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਨਾਲ ਸਾਂਖਿਆਤਿਕ ਲਰਨਿੰਗ ਦਾ ਪਰਿਚਯ](https://www.statlearning.com/)\n",
">\n",
"> - <https://algotech.netlify.app/blog/xgboost/> - AdaBoost ਮਾਡਲ ਦੀ ਪੜਚੋਲ ਕਰਦਾ ਹੈ ਜੋ xgboost ਦਾ ਇੱਕ ਵਧੀਆ ਵਿਕਲਪ ਹੈ।\n",
">\n",
"> ਐਂਸੇਮਬਲ ਕਲਾਸੀਫਾਇਰਾਂ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ।\n",
"\n",
"## 4. ਵਾਧੂ - ਕਈ ਮਾਡਲਾਂ ਦੀ ਤੁਲਨਾ ਕਰਨਾ\n",
"\n",
"ਅਸੀਂ ਇਸ ਲੈਬ ਵਿੱਚ ਕਾਫ਼ੀ ਸਾਰੇ ਮਾਡਲ ਫਿੱਟ ਕੀਤੇ ਹਨ 🙌। ਵੱਖ-ਵੱਖ ਪ੍ਰੀ-ਪ੍ਰੋਸੈਸਰਾਂ ਅਤੇ/ਜਾਂ ਮਾਡਲ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੇ ਸੈੱਟ ਤੋਂ ਬਹੁਤ ਸਾਰੇ ਵਰਕਫਲੋ ਬਣਾਉਣਾ ਅਤੇ ਫਿਰ ਪ੍ਰਦਰਸ਼ਨ ਮਾਪਦੰਡ ਇੱਕ-ਇੱਕ ਕਰਕੇ ਗਣਨਾ ਕਰਨਾ ਥੋੜ੍ਹਾ ਥਕਾਵਟ ਭਰਿਆ ਜਾਂ ਔਖਾ ਹੋ ਸਕਦਾ ਹੈ।\n",
"\n",
"ਆਓ ਵੇਖੀਏ ਕਿ ਕੀ ਅਸੀਂ ਇਸਨੂੰ ਇੱਕ ਫੰਕਸ਼ਨ ਬਣਾਕੇ ਹੱਲ ਕਰ ਸਕਦੇ ਹਾਂ ਜੋ ਟ੍ਰੇਨਿੰਗ ਸੈੱਟ 'ਤੇ ਵਰਕਫਲੋਜ਼ ਦੀ ਸੂਚੀ ਫਿੱਟ ਕਰਦਾ ਹੈ ਅਤੇ ਫਿਰ ਟੈਸਟ ਸੈੱਟ ਦੇ ਆਧਾਰ 'ਤੇ ਪ੍ਰਦਰਸ਼ਨ ਮਾਪਦੰਡ ਵਾਪਸ ਕਰਦਾ ਹੈ। ਅਸੀਂ [purrr](https://purrr.tidyverse.org/) ਪੈਕੇਜ ਤੋਂ `map()` ਅਤੇ `map_dfr()` ਵਰਤਾਂਗੇ ਤਾਂ ਜੋ ਸੂਚੀ ਵਿੱਚ ਹਰ ਤੱਤ 'ਤੇ ਫੰਕਸ਼ਨ ਲਾਗੂ ਕੀਤਾ ਜਾ ਸਕੇ।\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html) ਫੰਕਸ਼ਨ ਤੁਹਾਨੂੰ ਕਈ for ਲੂਪਾਂ ਨੂੰ ਐਸੇ ਕੋਡ ਨਾਲ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿੰਦੇ ਹਨ ਜੋ ਜ਼ਿਆਦਾ ਸੰਖੇਪ ਅਤੇ ਪੜ੍ਹਨ ਵਿੱਚ ਆਸਾਨ ਹੁੰਦਾ ਹੈ। [`map()`](https://purrr.tidyverse.org/reference/map.html) ਫੰਕਸ਼ਨਾਂ ਬਾਰੇ ਸਿਖਣ ਲਈ ਸਭ ਤੋਂ ਵਧੀਆ ਜਗ੍ਹਾ ਹੈ R ਫਾਰ ਡਾਟਾ ਸਾਇੰਸ ਵਿੱਚ [iteration chapter](http://r4ds.had.co.nz/iteration.html)।\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Qzb7LyZnimd2"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"# Define a function that returns performance metrics\n",
"compare_models <- function(workflow_list, train_set, test_set){\n",
" \n",
" suppressWarnings(\n",
" # Fit each model to the train_set\n",
" map(workflow_list, fit, data = train_set) %>% \n",
" # Make predictions on the test set\n",
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
" # Select desired columns\n",
" select(model, cuisine, .pred_class) %>% \n",
" # Evaluate model performance\n",
" group_by(model) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
" ungroup()\n",
" )\n",
" \n",
"} # End of function"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Fwa712sNisDA"
},
"source": []
},
{
"cell_type": "code",
"metadata": {
"id": "3i4VJOi2iu-a"
},
"source": [
"# Make a list of workflows\n",
"workflow_list <- list(\n",
" \"svc\" = svc_linear_wf,\n",
" \"svm\" = svm_rbf_wf,\n",
" \"knn\" = knn_wf,\n",
" \"random_forest\" = rf_wf,\n",
" \"xgboost\" = boost_wf)\n",
"\n",
"# Call the function\n",
"set.seed(2056)\n",
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
"\n",
"# Print out performance metrics\n",
"perf_metrics %>% \n",
" group_by(.metric) %>% \n",
" arrange(desc(.estimate)) %>% \n",
" slice_head(n=7)\n",
"\n",
"# Compare accuracy\n",
"perf_metrics %>% \n",
" filter(.metric == \"accuracy\") %>% \n",
" arrange(desc(.estimate))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KuWK_lEli4nW"
},
"source": [
"[**workflowset**](https://workflowsets.tidymodels.org/) ਪੈਕੇਜ ਯੂਜ਼ਰਾਂ ਨੂੰ ਬਹੁਤ ਸਾਰੇ ਮਾਡਲ ਬਣਾਉਣ ਅਤੇ ਆਸਾਨੀ ਨਾਲ ਫਿੱਟ ਕਰਨ ਦੀ ਸਹੂਲਤ ਦਿੰਦਾ ਹੈ, ਪਰ ਇਹ ਜ਼ਿਆਦਾਤਰ `cross-validation` ਵਰਗੀਆਂ ਰੀਸੈਂਪਲਿੰਗ ਤਕਨੀਕਾਂ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ ਡਿਜ਼ਾਈਨ ਕੀਤਾ ਗਿਆ ਹੈ, ਜਿਸ ਬਾਰੇ ਅਸੀਂ ਅਜੇ ਕਵਰ ਕਰਨਾ ਹੈ।\n",
"\n",
"## **🚀ਚੁਣੌਤੀ**\n",
"\n",
"ਇਨ੍ਹਾਂ ਤਕਨੀਕਾਂ ਵਿੱਚ ਬਹੁਤ ਸਾਰੇ ਪੈਰਾਮੀਟਰ ਹੁੰਦੇ ਹਨ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਸਕਦੇ ਹੋ, ਜਿਵੇਂ ਕਿ SVMs ਵਿੱਚ `cost`, KNN ਵਿੱਚ `neighbors`, ਅਤੇ ਰੈਂਡਮ ਫਾਰੇਸਟ ਵਿੱਚ `mtry` (ਰੈਂਡਮਲੀ ਚੁਣੇ ਗਏ ਪ੍ਰਡਿਕਟਰ)।\n",
"\n",
"ਹਰ ਇੱਕ ਦੇ ਡਿਫਾਲਟ ਪੈਰਾਮੀਟਰਾਂ ਦੀ ਖੋਜ ਕਰੋ ਅਤੇ ਸੋਚੋ ਕਿ ਇਹ ਪੈਰਾਮੀਟਰ ਬਦਲਣ ਨਾਲ ਮਾਡਲ ਦੀ ਗੁਣਵੱਤਾ 'ਤੇ ਕੀ ਅਸਰ ਪਵੇਗਾ।\n",
"\n",
"ਕਿਸੇ ਖਾਸ ਮਾਡਲ ਅਤੇ ਇਸਦੇ ਪੈਰਾਮੀਟਰਾਂ ਬਾਰੇ ਹੋਰ ਜਾਣਨ ਲਈ, ਇਸਦਾ ਇਸਤੇਮਾਲ ਕਰੋ: `help(\"model\")` ਜਿਵੇਂ `help(\"rand_forest\")`\n",
"\n",
"> ਅਮਲ ਵਿੱਚ, ਅਸੀਂ ਆਮ ਤੌਰ 'ਤੇ *ਸਰਵੋਤਮ ਮੁੱਲਾਂ* ਦਾ *ਅਨੁਮਾਨ* ਲਗਾਉਂਦੇ ਹਾਂ, ਬਹੁਤ ਸਾਰੇ ਮਾਡਲਾਂ ਨੂੰ `simulated data set` 'ਤੇ ਟ੍ਰੇਨ ਕਰਕੇ ਅਤੇ ਇਹ ਦੇਖ ਕੇ ਕਿ ਇਹ ਸਾਰੇ ਮਾਡਲ ਕਿੰਨਾ ਵਧੀਆ ਪ੍ਰਦਰਸ਼ਨ ਕਰਦੇ ਹਨ। ਇਸ ਪ੍ਰਕਿਰਿਆ ਨੂੰ **tuning** ਕਿਹਾ ਜਾਂਦਾ ਹੈ।\n",
"\n",
"### [**ਪੋਸਟ-ਲੈਕਚਰ ਕਵਿਜ਼**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **ਸਮੀਖਿਆ ਅਤੇ ਸਵੈ ਅਧਿਐਨ**\n",
"\n",
"ਇਨ੍ਹਾਂ ਪਾਠਾਂ ਵਿੱਚ ਕਾਫ਼ੀ ਸਾਰਾ ਜਾਰਗਨ ਹੈ, ਇਸ ਲਈ ਇੱਕ ਮਿੰਟ ਲੈ ਕੇ [ਇਸ ਸੂਚੀ](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) ਨੂੰ ਸਮੀਖਿਆ ਕਰੋ, ਜਿਸ ਵਿੱਚ ਲਾਭਦਾਇਕ ਸ਼ਬਦਾਵਲੀ ਦਿੱਤੀ ਗਈ ਹੈ!\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",
"ਖੁਸ਼ ਰਹੋ ਅਤੇ ਸਿੱਖਦੇ ਰਹੋ,\n",
"\n",
"[Eric](https://twitter.com/ericntay), ਗੋਲਡ ਮਾਈਕਰੋਸਾਫਟ ਲਰਨ ਸਟੂਡੈਂਟ ਐਮਬੈਸਡਰ।\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"569\"/>\n",
" <figcaption>ਕਲਾ @allison_horst ਦੁਆਰਾ</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ਅਸਵੀਕਾਰਨਾ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦਾ ਯਤਨ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚੱਜੇਪਣ ਹੋ ਸਕਦੇ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼, ਜੋ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਹੈ, ਨੂੰ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।\n"
]
}
]
}