{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6ae4c395-8f32-4bd8-9918-9af47f829b90",
   "metadata": {},
   "outputs": [],
   "source": [
    "# step 1 import libraries\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import mean_squared_error, r2_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6af5baa3-1ac8-499a-afe1-faafc679f90b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Humidity</th>\n",
       "      <th>Wind Speed</th>\n",
       "      <th>Pressure</th>\n",
       "      <th>Rainfall</th>\n",
       "      <th>Temperature</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>65</td>\n",
       "      <td>12</td>\n",
       "      <td>1012</td>\n",
       "      <td>2.1</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>70</td>\n",
       "      <td>15</td>\n",
       "      <td>1008</td>\n",
       "      <td>0.0</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>55</td>\n",
       "      <td>8</td>\n",
       "      <td>1015</td>\n",
       "      <td>1.2</td>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>80</td>\n",
       "      <td>20</td>\n",
       "      <td>1005</td>\n",
       "      <td>5.5</td>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>60</td>\n",
       "      <td>10</td>\n",
       "      <td>1010</td>\n",
       "      <td>0.5</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Humidity  Wind Speed  Pressure  Rainfall  Temperature\n",
       "0        65          12      1012       2.1           28\n",
       "1        70          15      1008       0.0           30\n",
       "2        55           8      1015       1.2           26\n",
       "3        80          20      1005       5.5           32\n",
       "4        60          10      1010       0.5           27"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# step 2 load dataset\n",
    "\n",
    "data = pd.read_csv(\"data/weather_data.csv\")\n",
    "# step clean column names\n",
    "data.columns = data.columns.str.strip()\n",
    "data.columns\n",
    "\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c943c82c-fb84-43ed-b6b6-5b8eadf88737",
   "metadata": {},
   "outputs": [],
   "source": [
    "# step 3 separate inputs and output\n",
    "\n",
    "X = data[['Humidity', 'Wind Speed', 'Pressure', 'Rainfall']]\n",
    "y = data['Temperature']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e88dcf29-3054-4f4b-af50-84ec36186a04",
   "metadata": {},
   "outputs": [],
   "source": [
    "# step 4 split dataset into train and test sets\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y, test_size=0.2, random_state=42\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "4acbe1c3-96aa-4dc1-bffc-6719cdd9f54f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# step 5 choose polynomial degree\n",
    "\n",
    "degree = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "04ffe7b2-97d4-47c0-a607-0451030957a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# step 6 generate polynomial features\n",
    "\n",
    "poly = PolynomialFeatures(degree=degree)\n",
    "X_train_poly = poly.fit_transform(X_train)\n",
    "X_test_poly = poly.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a2fd4f22-e77d-4ded-a555-bd1c1e0fc006",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    font-family: monospace;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td.value pre {\n",
       "    color:rgb(255, 94, 0) !important;\n",
       "    background-color: transparent !important;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LinearRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LinearRegression</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.linear_model.LinearRegression.html\">?<span>Documentation for LinearRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('fit_intercept',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">fit_intercept&nbsp;</td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('copy_X',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">copy_X&nbsp;</td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('tol',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">tol&nbsp;</td>\n",
       "            <td class=\"value\">1e-06</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_jobs',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_jobs&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('positive',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">positive&nbsp;</td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "</script></body>"
      ],
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# step 7 train regression model\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(X_train_poly, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "8e215001-ecbf-4beb-a2ef-38c94ee4ff9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# step 8 predict temperature values\n",
    "\n",
    "y_pred = model.predict(X_test_poly)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b0d32a47-b709-4142-a9e3-33276b102be5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Actual (°C)</th>\n",
       "      <th>Predicted (°C)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30</td>\n",
       "      <td>28.790148</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Actual (°C)  Predicted (°C)\n",
       "0           30       28.790148"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# step 9 compare actual and predicted results\n",
    "\n",
    "results = pd.DataFrame({\n",
    "    'Actual (°C)': y_test.values,\n",
    "    'Predicted (°C)': y_pred\n",
    "})\n",
    "\n",
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "07504797-4726-4418-a5d9-0f0b70557028",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\kuros\\anaconda3\\Lib\\site-packages\\sklearn\\metrics\\_regression.py:1283: UndefinedMetricWarning: R^2 score is not well-defined with less than two samples.\n",
      "  warnings.warn(msg, UndefinedMetricWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(1.463740857861176, nan)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# step 10 evaluate model performance\n",
    "\n",
    "mse = mean_squared_error(y_test, y_pred)\n",
    "r2 = r2_score(y_test, y_pred)\n",
    "\n",
    "mse, r2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "018c002d-d631-4371-b7c2-df656a4e3703",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Bl9f3wJ/fj169NDnn3+u2rVrq3LlylesccmSJVqxYoXTsoYPPvjgqjVeTY8ePTRt2jQdPXpUffr0KfF4RfH+++87LYtYsmSJsrOzHXev6Ny5s7y8vPTTTz8VuFShKPKC5+WB/c0338zX92r/jX333XdObWvXrtW5c+eKVIc79gW43hF4AYtZuXKljh07phdffLHA24U1aNBA//73vzVv3jz16NFDkydP1sqVK9WuXTs9++yzatiwoc6cOaNVq1Zp1KhRqlevnmrXri1/f3+9//77ql+/vipVqqTQ0FCFhoaqf//+evPNN9WvXz89+uijOnXqlF566aV8v97t3r27pk+frgceeEBDhgzRqVOn9Morr5T47N3999+vUaNG6f7771dWVpbTbZokafz48frll1905513KiwsTGfOnNHMmTPl7e2t6OjoEm37at5880117dpVnTt31qBBg1SjRg399ttv2rdvn3bu3Om4Y8bYsWO1YsUKdejQQePHj1eFChX0xhtv6Pz581fdxv3336+4uDg99thj2r9/v+644w7l5uZq69atql+/vmMNd8OGDfX111/rk08+UfXq1RUQEKC6detq8uTJWrNmjVq3bq0nn3xSdevWVWZmpg4dOqTPP/9cc+fOVVhYmAYMGKDXXntNAwYM0JQpU1SnTh19/vnn+uKLL0o8T23atNGQIUP00EMPafv27WrXrp0qVqyo1NRUJSYmqmHDhm5/yEdCQoK8vLx011136fvvv9e4ceN02223OQJ3zZo1NXnyZD333HM6ePCgunTposqVK+v48eP69ttvVbFiRcedGAqT99/OM888I2OMqlSpok8++URr1qzJ17dhw4aSpJkzZ2rgwIHy9vZW3bp1FRAQoP79+2vcuHEaP368oqOjtXfvXv373/92emjHlbhjX4DrXtleMwfA3Xr16mV8fHzMiRMnCu1z3333GS8vL8ddAY4cOWIGDx5sQkJCjLe3twkNDTV9+vQxx48fd3xn4cKFpl69esbb2zvfVePvvPOOqV+/vvHz8zORkZFm8eLFBd6lYf78+aZu3brG19fX3HzzzSY2NtbMmzfvqnciuJoHHnjASDJt2rTJ99mnn35qunbtamrUqGF8fHxMcHCw6datm9m4ceNVx42IiDDdu3e/Yp+8uzS8/PLLBX6+a9cu06dPHxMcHGy8vb1NSEiI6dChg+PuGXm++eYb06pVK+Pr62tCQkLM6NGjzX/+858izc2FCxfM+PHjTZ06dYyPj4+58cYbTYcOHcymTZscfZKTk02bNm1MhQoVjCSnMU6ePGmefPJJU6tWLePt7W2qVKlimjZtap577jlz7tw5R79ffvnF3HPPPaZSpUomICDA3HPPPWbTpk0lvktDnvnz55uWLVuaihUrGn9/f1O7dm0zYMAApzsyREdHm1tvvTXfmIX9rCSZYcOG5dv2jh07zN/+9jfHvtx///1Ox3uejz/+2Nxxxx0mMDDQ+Pr6moiICHPvvfeaL7/80tFn4MCBpmLFigXu6969e81dd91lAgICTOXKlc3f//53c/jw4QLvvBATE2NCQ0ONh4eHkWTWrVtnjDEmKyvLjBkzxoSHhxt/f38THR1tkpOTC71Lw7Zt2wqspSj7AliVzZhi3PEdAIDr0MSJEzVp0iSdPHnSsk95A5Afd2kAAACApRF4AQAAYGksaQAAAIClcYYXAAAAlkbgBQAAgKUReAEAAGBpPHiiALm5uTp27JgCAgIKfFwkAAAAypYxRmfPnlVoaOhVH61O4C3AsWPHFB4eXtZlAAAA4CqOHDmisLCwK/Yh8BYgICBA0h8TePnjUQEAAFD2MjIyFB4e7shtV0LgLUDeMobAwEACLwAAQDlWlOWnXLQGAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALC0Mg28c+bMUaNGjRQYGKjAwEBFRUVp5cqVjs+NMZo4caJCQ0Pl7++v9u3b6/vvv7/quEuXLlVkZKR8fX0VGRmpZcuWleZuAAAAoBwr08AbFhamadOmafv27dq+fbs6dOignj17OkLtSy+9pOnTp+vf//63tm3bppCQEN111106e/ZsoWNu3rxZffv2Vf/+/bVr1y71799fffr00datW6/VbgEAAKAcsRljTFkX8WdVqlTRyy+/rMGDBys0NFRPPfWU/vWvf0mSsrKyVK1aNb344osaOnRogd/v27evMjIynM4Ud+nSRZUrV9bChQuLVENGRobsdrvS09MVGBhY8p0CAACAW7mS18rNGt6cnBwtWrRI58+fV1RUlFJSUpSWlqZOnTo5+vj6+io6OlqbNm0qdJzNmzc7fUeSOnfufMXvZGVlKSMjw+kFAAAAayjzwLt7925VqlRJvr6+euyxx7Rs2TJFRkYqLS1NklStWjWn/tWqVXN8VpC0tDSXvxMbGyu73e54hYeHl2CPAAAAUJ6UeeCtW7eukpOTtWXLFj3++OMaOHCg9u7d6/jcZrM59TfG5Gu7nKvfiYmJUXp6uuN15MiRYuwJAAAAyiOvsi7Ax8dHt9xyiySpWbNm2rZtm2bOnOlYt5uWlqbq1as7+p84cSLfGdw/CwkJyXc292rf8fX1la+vb0l2AwAAAOVUmZ/hvZwxRllZWapVq5ZCQkK0Zs0ax2cXL17U+vXr1bp160K/HxUV5fQdSVq9evUVvwMAAADrKtMzvM8++6y6du2q8PBwnT17VosWLdLXX3+tVatWyWaz6amnntLUqVNVp04d1alTR1OnTlWFChX0wAMPOMYYMGCAatSoodjYWEnSyJEj1a5dO7344ovq2bOnli9fri+//FKJiYlltZsAAAAoQ2UaeI8fP67+/fsrNTVVdrtdjRo10qpVq3TXXXdJksaMGaMLFy7oiSee0OnTp9WyZUutXr1aAQEBjjEOHz4sD4//O1HdunVrLVq0SGPHjtW4ceNUu3ZtLV68WC1btrzm+wcAAICyV+7uw1secB9eAACA8u26vA8vAAAAUBoIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALA0Ai8AAAAsjcALAAAASyPwAgAAwNIIvAAAALC0Mg28sbGxat68uQICAhQcHKxevXpp//79Tn2OHz+uQYMGKTQ0VBUqVFCXLl104MCBK44bHx8vm82W75WZmVmauwMAAIByqEwD7/r16zVs2DBt2bJFa9asUXZ2tjp16qTz589Lkowx6tWrlw4ePKjly5crKSlJERER6tixo6NPYQIDA5Wamur08vPzuxa7BQAAgHLEqyw3vmrVKqf3cXFxCg4O1o4dO9SuXTsdOHBAW7Zs0Z49e3TrrbdKkmbPnq3g4GAtXLhQjzzySKFj22w2hYSElGr9AAAAKP/K1Rre9PR0SVKVKlUkSVlZWZLkdGbW09NTPj4+SkxMvOJY586dU0REhMLCwtSjRw8lJSUV2jcrK0sZGRlOLwAAAFhDuQm8xhiNGjVKbdu2VYMGDSRJ9erVU0REhGJiYnT69GldvHhR06ZNU1pamlJTUwsdq169eoqPj9eKFSu0cOFC+fn5qU2bNoWu/Y2NjZXdbne8wsPDS2UfAQAAcO3ZjDGmrIuQpGHDhumzzz5TYmKiwsLCHO07duzQww8/rF27dsnT01MdO3aUh8cfOf3zzz8v0ti5ublq0qSJ2rVrp1mzZuX7PCsry3E2WZIyMjIUHh6u9PR0BQYGlnDPAAAA4G4ZGRmy2+1FymtluoY3z4gRI7RixQpt2LDBKexKUtOmTZWcnKz09HRdvHhRQUFBatmypZo1a1bk8T08PNS8efNCz/D6+vrK19e3RPsAAACA8qlMlzQYYzR8+HAlJCRo7dq1qlWrVqF97Xa7goKCdODAAW3fvl09e/Z0aTvJycmqXr26O8oGAADAdaRMz/AOGzZMH3zwgZYvX66AgAClpaVJ+iPc+vv7S5I+/PBDBQUF6aabbtLu3bs1cuRI9erVS506dXKMM2DAANWoUUOxsbGSpEmTJqlVq1aqU6eOMjIyNGvWLCUnJ+uNN9649jsJAACAMlWmgXfOnDmSpPbt2zu1x8XFadCgQZKk1NRUjRo1SsePH1f16tU1YMAAjRs3zqn/4cOHHet6JenMmTMaMmSI0tLSZLfb1bhxY23YsEEtWrQo1f0BAABA+VNuLlorT1xZBA0AAIBrz5W8Vm5uSwYAAACUBgIvAAAALI3ACwAAAEsj8AIAAMDSXLpLw/79+7Vw4UJt3LhRhw4d0u+//66goCA1btxYnTt31j333MMDHAAAAFCuFOkuDUlJSRozZow2btyo1q1bq0WLFqpRo4b8/f3122+/ac+ePdq4caMyMjI0ZswYPfXUU9d18OUuDQAAAOWb2x8t3KtXL40ePVqLFy9WlSpVCu23efNmvfbaa3r11Vf17LPPulY1AAAAUAqKdIb34sWL8vHxKfKgrvYvbzjDCwAAUL65/T68robX6znsAgAAwFqKfJeGtWvXKjIyUhkZGfk+S09P16233qqNGze6tTgAAACgpIoceGfMmKFHH320wFPGdrtdQ4cO1fTp091aHAAAAFBSRQ68u3btUpcuXQr9vFOnTtqxY4dbigIAAADcpciB9/jx4/L29i70cy8vL508edItRQEAAADuUuTAW6NGDe3evbvQz7/77jtVr17dLUUBAAAA7lLkwNutWzeNHz9emZmZ+T67cOGCJkyYoB49eri1OAAAAKCkinQfXumPJQ1NmjSRp6enhg8frrp168pms2nfvn164403lJOTo507d6patWqlXXOp4z68AAAA5Zvbn7QmSdWqVdOmTZv0+OOPKyYmRnk52WazqXPnzpo9e7Ylwi4AAACspciBV5IiIiL0+eef6/Tp0/rxxx9ljFGdOnVUuXLl0qoPAAAAKBGXAm+eypUrq3nz5u6uBQAAAHC7IgfeCxcuaMaMGUpPT9fIkSO5IwMAAACuC0W+S8PDDz+sH3/8UTfeeKM6duxYmjUBAAAAblPkuzSEhoZqzZo1uvXWW+Xj46NffvlFwcHBpV1fmeAuDQAAAOVbqdylITo6WjNnztRf/vIX3XTTTZYNuwAAALCWIi9pePvttxUREaHjx4/rq6++Ks2aAAAAALcp8pKG/yYsaQAAACjfXMlrRT7DCwAAAFyPihR4H3vsMR05cqRIAy5evFjvv/9+iYoCAAAA3KVIF60FBQWpQYMGat26te6++241a9ZMoaGh8vPz0+nTp7V3714lJiZq0aJFqlGjhv7zn/+Udt0AAABAkRR5De+JEyc0b948LVq0SHv27HH6LCAgQB07dtSQIUPUqVOnUin0WmINLwAAQPnmSl4r1kVrZ86c0c8//6wLFy6oatWqql27tmw2W7ELLm8IvAAAAOVbqdyH989uuOEG3XDDDcX5KgAAAHBNcZcGAAAAWBqBFwAAAJZG4AUAAIClEXgBAABgacUKvNnZ2fryyy/15ptv6uzZs5KkY8eO6dy5c24tDgAAACgpl+/S8PPPP6tLly46fPiwsrKydNdddykgIEAvvfSSMjMzNXfu3NKoEwAAACgWl8/wjhw5Us2aNdPp06fl7+/vaP+f//kfffXVV24tDgAAACgpl8/wJiYm6ptvvpGPj49Te0REhI4ePeq2wgAAAAB3cPkMb25urnJycvK1//LLLwoICHBLUQAAAIC7uBx477rrLs2YMcPx3maz6dy5c5owYYK6devmztoAAACAErMZY4wrXzh69Kg6dOggT09PHThwQM2aNdOBAwdUtWpVbdiwQcHBwaVV6zXjyrOZAQAAcO25ktdcXsNbo0YNJScna9GiRdqxY4dyc3P18MMP68EHH3S6iA0AAAAoD1w6w3vp0iXVrVtXn376qSIjI0uzrjLFGV4AAIDyzZW85tIaXm9vb2VlZclms5WoQAAAAOBacfmitREjRujFF19UdnZ2adQDAAAAuJXLa3i3bt2qr776SqtXr1bDhg1VsWJFp88TEhLcVhwAAABQUi4H3htuuEH33HNPadQCAAAAuJ3LgTcuLq406gAAAABKhctreAEAAIDrictneGvVqnXFuzQcPHiwRAUBAAAA7uRy4H3qqaec3l+6dElJSUlatWqVRo8e7a66AAAAALdwOfCOHDmywPY33nhD27dvL3FBAAAAgDu5bQ1v165dtXTpUncNBwAAALiF2wLvRx99pCpVqrhrOAAAAMAtXF7S0LhxY6eL1owxSktL08mTJzV79my3FgcAAACUlMuBt2fPnk6B18PDQ0FBQWrfvr3q1avn1uIAAACAkrIZY0xZF1HeZGRkyG63Kz09XYGBgWVdDgAAAC7jSl5zeQ2vp6enTpw4ka/91KlT8vT0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ssG8lw3mvWww72WjPM87F60BAADA0jjDCwAAAEsj8AIAAMDSCLwAAACwNAIvAAAALI3A62axsbFq3ry5AgICFBwcrF69emn//v1Ofc6dO6fhw4crLCxM/v7+ql+/vubMmXPFcePj42Wz2fK9MjMzS3N3rhtFmffjx49r0KBBCg0NVYUKFdSlSxcdOHDgqmMvXbpUkZGR8vX1VWRkpJYtW1Zau3HdKa1553i/sjlz5qhRo0aOm7tHRUVp5cqVjs+NMZo4caJCQ0Pl7++v9u3b6/vvv7/quBzrV1Ya886xfnVXm/eEhAR17txZVatWlc1mU3JycpHG5Xi/stKY97I83gm8brZ+/XoNGzZMW7Zs0Zo1a5Sdna1OnTrp/Pnzjj5PP/20Vq1apffee0/79u3T008/rREjRmj58uVXHDswMFCpqalOLz8/v9LepevC1ebdGKNevXrp4MGDWr58uZKSkhQREaGOHTs6/Wwut3nzZvXt21f9+/fXrl271L9/f/Xp00dbt269VrtWrpXWvEsc71cSFhamadOmafv27dq+fbs6dOignj17OsLVSy+9pOnTp+vf//63tm3bppCQEN111106e/ZsoWNyrF9dacy7xLF+NVeb9/Pnz6tNmzaaNm1akcfkeL+60ph3qQyPd4NSdeLECSPJrF+/3tF26623msmTJzv1a9KkiRk7dmyh48TFxRm73V5aZVrO5fO+f/9+I8ns2bPH0Sc7O9tUqVLFvPXWW4WO06dPH9OlSxents6dO5v77ruvdAq/zrlr3jneXVe5cmXz9ttvm9zcXBMSEmKmTZvm+CwzM9PY7XYzd+7cQr/PsV48JZ13jvXiyZv3P0tJSTGSTFJS0lW/z/FePCWd97I83jnDW8rS09MlSVWqVHG0tW3bVitWrNDRo0dljNG6dev0ww8/qHPnzlcc69y5c4qIiFBYWJh69OihpKSkUq39enb5vGdlZUmS078iPT095ePjo8TExELH2bx5szp16uTU1rlzZ23atMndJVuCu+Zd4ngvqpycHC1atEjnz59XVFSUUlJSlJaW5nTc+vr6Kjo6+orHLce6a9w17xLHuisun/fi4nh3jbvmXSq7453AW4qMMRo1apTatm2rBg0aONpnzZqlyMhIhYWFycfHR126dNHs2bPVtm3bQseqV6+e4uPjtWLFCi1cuFB+fn5q06ZNkdag/rcpaN7r1auniIgIxcTE6PTp07p48aKmTZumtLQ0paamFjpWWlqaqlWr5tRWrVo1paWlleo+XI/cOe8c71e3e/duVapUSb6+vnrssce0bNkyRUZGOo5NV49bjvWicfe8c6wXTWHzXlwc70Xj7nkvy+Pdq9S38F9s+PDh+u677/KdyZo1a5a2bNmiFStWKCIiQhs2bNATTzyh6tWrq2PHjgWO1apVK7Vq1crxvk2bNmrSpIlef/11zZo1q1T343pT0Lx7e3tr6dKlevjhh1WlShV5enqqY8eO6tq161XHs9lsTu+NMfna4N5553i/urp16yo5OVlnzpzR0qVLNXDgQK1fv97xeXGOW471q3P3vHOsF01h816S8MXxfnXunveyPN4JvKVkxIgRWrFihTZs2KCwsDBH+4ULF/Tss89q2bJl6t69uySpUaNGSk5O1iuvvFJo4L2ch4eHmjdvzlmAyxQ275LUtGlTJScnKz09XRcvXlRQUJBatmypZs2aFTpeSEhIvn/xnzhxIt+Zgf927p73y3G85+fj46NbbrlFktSsWTNt27ZNM2fO1L/+9S9Jf5zBql69uqP/1Y5bjvWicfe8X45jvWCFzfubb75ZrPE43ovG3fN+uWt5vLOkwc2MMRo+fLgSEhK0du1a1apVy+nzS5cu6dKlS/LwcJ56T09P5ebmurSd5ORkp/+x/je72rz/md1uV1BQkA4cOKDt27erZ8+ehfaNiorSmjVrnNpWr16t1q1bu63261lpzXtB2+F4vzJjjLKyslSrVi2FhIQ4HbcXL17U+vXrr3jccqwXT0nnvaDxONavLm/ei4vjvXhKOu8FjXfNjvdre42c9T3++OPGbrebr7/+2qSmpjpev//+u6NPdHS0ufXWW826devMwYMHTVxcnPHz8zOzZ8929Onfv7955plnHO8nTpxoVq1aZX766SeTlJRkHnroIePl5WW2bt16TfevvCrKvC9ZssSsW7fO/PTTT+bjjz82ERERpnfv3k7jXD7v33zzjfH09DTTpk0z+/btM9OmTTNeXl5my5Yt12zfyrPSmneO9yuLiYkxGzZsMCkpKea7774zzz77rPHw8DCrV682xhgzbdo0Y7fbTUJCgtm9e7e5//77TfXq1U1GRoZjDI5115XGvHOsX93V5v3UqVMmKSnJfPbZZ0aSWbRokUlKSjKpqamOMTjeXVca816WxzuB180kFfiKi4tz9ElNTTWDBg0yoaGhxs/Pz9StW9e8+uqrJjc319EnOjraDBw40PH+qaeeMjfddJPx8fExQUFBplOnTmbTpk3XcM/Kt6LM+8yZM01YWJjx9vY2N910kxk7dqzJyspyGufyeTfGmA8//NDUrVvXeHt7m3r16pmlS5degz26PpTWvHO8X9ngwYNNRESEY37uvPNOx19CxhiTm5trJkyYYEJCQoyvr69p166d2b17t9MYHOuuK41551i/uqvNe1xcXIH/H5owYYKjD8e760pj3svyeLcZY0zpn0cGAAAAygZreAEAAGBpBF4AAABYGoEXAAAAlkbgBQAAgKUReAEAAGBpBF4AAABYGoEXAAAAlkbgBQAAgKUReAGgBGw2mz7++OOyLgOXmTdvnjp16uTWMZs3b66EhAS3jgng2iDwArgubNq0SZ6enurSpYvL361Zs6ZmzJjh/qKuwmazXfE1aNCga15TaWvfvr2eeuqpMq0hKytL48eP17hx4xxtOTk5euKJJ1S9enV17dpVaWlpTt/JyMjQc889p3r16snPz08hISHq2LGjEhISlPdA0nHjxumZZ55Rbm7uNd0fACVH4AVwXZg/f75GjBihxMREHT58uKzLKZLU1FTHa8aMGQoMDHRqmzlzZlmXWGSXLl26bra3dOlSVapUSX/9618dbQsXLtThw4f1xRdfqGnTpk5h+MyZM2rdurXeffddxcTEaOfOndqwYYP69u2rMWPGKD09XZLUvXt3paen64svvij+jgEoEwReAOXe+fPntWTJEj3++OPq0aOH4uPj8/VZsWKFmjVrJj8/P1WtWlW9e/eW9McZx59//llPP/2048yqJE2cOFG333670xgzZsxQzZo1He+3bdumu+66S1WrVpXdbld0dLR27txZ5LpDQkIcL7vdLpvN5tS2YcMGNW3aVH5+frr55ps1adIkZWdnO75vs9n05ptvqkePHqpQoYLq16+vzZs368cff1T79u1VsWJFRUVF6aeffnJ8J2+/3nzzTYWHh6tChQr6+9//rjNnzjjVFhcXp/r168vPz0/16tXT7NmzHZ8dOnRINptNS5YsUfv27eXn56f33ntPp06d0v3336+wsDBVqFBBDRs21MKFCx3fGzRokNavX6+ZM2c65vrQoUOKj4/XDTfc4LT9jz/+2PGz+HPd8+fP18033yxfX18ZY5Senq4hQ4YoODhYgYGB6tChg3bt2nXFeV+0aJHuvvtup7YzZ84oIiJCDRo0UMOGDR0hVpKeffZZHTp0SFu3btXAgQMVGRmpv/zlL3r00UeVnJysSpUqSZI8PT3VrVs3p30GcH0g8AIo9xYvXqy6deuqbt266tevn+Li4hy/Zpakzz77TL1791b37t2VlJSkr776Ss2aNZMkJSQkKCwsTJMnT3acWS2qs2fPauDAgdq4caO2bNmiOnXqqFu3bjp79myJ9+mLL75Qv3799OSTT2rv3r168803FR8frylTpjj1e/755zVgwAAlJyerXr16euCBBzR06FDFxMRo+/btkqThw4c7fefHH3/UkiVL9Mknn2jVqlVKTk7WsGHDHJ+/9dZbeu655zRlyhTt27dPU6dO1bhx4/TOO+84jfOvf/1LTz75pPbt26fOnTsrMzNTTZs21aeffqo9e/ZoyJAh6t+/v7Zu3SpJmjlzpqKiovToo4865jo8PLzIc5JX99KlS5WcnCzpj7OqaWlp+vzzz7Vjxw41adJEd955p3777bdCx9m4caPj55+nf//+2rJli3x9ffWPf/zDcYY3NzdXixYt0oMPPqjQ0NB8Y1WqVEleXl6O9y1atNDGjRuLvE8AygkDAOVc69atzYwZM4wxxly6dMlUrVrVrFmzxvF5VFSUefDBBwv9fkREhHnttdec2iZMmGBuu+02p7bXXnvNREREFDpOdna2CQgIMJ988omjTZJZtmzZVfchLi7O2O12x/u//vWvZurUqU59FixYYKpXr+409tixYx3vN2/ebCSZefPmOdoWLlxo/Pz8nPbL09PTHDlyxNG2cuVK4+HhYVJTU40xxoSHh5sPPvjAadvPP/+8iYqKMsYYk5KSYiQ55vxKunXrZv7xj3843kdHR5uRI0decd+NMWbZsmXmz38FTZgwwXh7e5sTJ0442r766isTGBhoMjMznb5bu3Zt8+abbxZYz+nTp40ks2HDhgI/T01NNdnZ2Y73x48fN5LM9OnTr7ifeZYvX248PDxMTk5OkfoDKB+8rpCFAaDM7d+/X99++63j6ngvLy/17dtX8+fPV8eOHSVJycnJevTRR92+7RMnTmj8+PFau3atjh8/rpycHP3+++9uWUO8Y8cObdu2zemMbk5OjjIzM/X7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",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# step 11 visualize performance\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plt.scatter(y_test, y_pred)\n",
    "plt.xlabel(\"Actual Temperature (°C)\")\n",
    "plt.ylabel(\"Predicted Temperature (°C)\")\n",
    "plt.title(\"Actual vs Predicted Temperature\")\n",
    "\n",
    "plt.savefig(\"actual_vs_predicted.png\", dpi=300, bbox_inches=\"tight\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
