firefighter / model.ipynb
model.ipynb
Raw
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Wildfire Detection Model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Wildfire Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(305, 13)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import ast #for strings\n",
    "import re #regex\n",
    "\n",
    "fname='Weather Data.csv'\n",
    "\n",
    "def convert_to_numpy_array(string: str):\n",
    "    # Verify string is written like a python list\n",
    "    stripped = string.strip()\n",
    "    pattern = r\"\\[(.*)\\]\"\n",
    "    match = re.match(pattern, stripped)\n",
    "    if not match:\n",
    "        raise NotImplementedError(f\"{stripped}\")\n",
    "    # Group 1 captures the content inside the square brackets\n",
    "    contents = match.group(1)\n",
    "    \n",
    "    try:\n",
    "        # Use ast.literal_eval to safely evaluate string literals\n",
    "        evaluated = ast.literal_eval(stripped)\n",
    "        if type(evaluated) is not list:\n",
    "            raise NotImplementedError()\n",
    "        # series = pd.Series(evaluated)\n",
    "        return np.array(evaluated)\n",
    "    except (SyntaxError, ValueError):  # this occurs with the \"Condition\" column\n",
    "        # If parsing as a list fails, split the contents within the square brackets by comma, \n",
    "        # interpret each value as a string and strip whitespace\n",
    "        return np.array([ item.strip() for item in contents.split(',') ])\n",
    "\n",
    "# Read CSV file with the custom function\n",
    "numerical_vector_column_labels = ['Temperature (F)', 'Dewpoint (F)', 'Humidity (%)', 'Wind Speed (mph)', 'Pressure (in)', 'Percipitation (in)']\n",
    "categorical_vector_column_labels = [\"Condition\"]\n",
    "vector_column_labels = numerical_vector_column_labels + categorical_vector_column_labels\n",
    "\n",
    "# Create a converters dictionary mapping each column to the converter function\n",
    "converters = {col: convert_to_numpy_array for col in vector_column_labels}\n",
    "df = pd.read_csv(fname, converters=converters)\n",
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "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>Fire Name</th>\n",
       "      <th>Year</th>\n",
       "      <th>Season Started</th>\n",
       "      <th>Locations Affected</th>\n",
       "      <th>Temperature (F)</th>\n",
       "      <th>Dewpoint (F)</th>\n",
       "      <th>Humidity (%)</th>\n",
       "      <th>Wind Speed (mph)</th>\n",
       "      <th>Pressure (in)</th>\n",
       "      <th>Percipitation (in)</th>\n",
       "      <th>Condition</th>\n",
       "      <th>Type Of Location</th>\n",
       "      <th>Y-Value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Cagua Fire</td>\n",
       "      <td>2020</td>\n",
       "      <td>Winter</td>\n",
       "      <td>CA</td>\n",
       "      <td>[75, 75, 73, 73, 72, 72, 71, 72, 72, 78, 82, 81]</td>\n",
       "      <td>[75, 75, 76, 76, 76, 76, 76, 76, 75, 77, 77, 77]</td>\n",
       "      <td>[85, 86, 86, 88, 90, 90, 94, 89, 74, 62, 55, 53]</td>\n",
       "      <td>[2, 3, 3, 3, 4, 4, 2, 4, 2, 4, 6, 6]</td>\n",
       "      <td>[29.8, 29.83, 29.83, 29.86, 29.86, 29.8, 29.83...</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Fair, Partly Cloudy, Fair, Fair, Partly...</td>\n",
       "      <td>Mountains</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Vietnam Fires</td>\n",
       "      <td>2019</td>\n",
       "      <td>Summer</td>\n",
       "      <td>MA</td>\n",
       "      <td>[79, 81, 81, 82, 84, 86, 88, 90, 91, 93, 95, 97]</td>\n",
       "      <td>[72, 73, 73, 73, 73, 75, 75, 75, 75, 75, 77, 77]</td>\n",
       "      <td>[78, 79, 79, 74, 70, 70, 66, 62, 59, 56, 56, 53]</td>\n",
       "      <td>[5, 6, 2, 5, 7, 5, 5, 7, 5, 6, 5, 2]</td>\n",
       "      <td>[29.64, 29.64, 29.64, 29.64, 29.67, 29.67, 29....</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...</td>\n",
       "      <td>Coastal Hills</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2024</td>\n",
       "      <td>Winter</td>\n",
       "      <td>BC</td>\n",
       "      <td>[78, 78, 78, 80, 82, 78, 77, 77, 77, 75, 73, 73]</td>\n",
       "      <td>[22, 8, 12, 19, 20, 18, 16, 13, 7, 41, 38, 22]</td>\n",
       "      <td>[74, 79, 84, 79, 74, 79, 83, 83, 83, 94, 94, 89]</td>\n",
       "      <td>[18, 18, 20, 21, 20, 20, 20, 20, 17, 10, 11, 11]</td>\n",
       "      <td>[30.09, 30.09, 30.06, 30.06, 30.06, 30.06, 30....</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Partly Cloudy, Mostly Cloudy, Fair, Par...</td>\n",
       "      <td>Mountains</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2024</td>\n",
       "      <td>Winter</td>\n",
       "      <td>AB</td>\n",
       "      <td>[77, 81, 84, 88, 90, 90, 88, 86, 84, 81, 79, 75]</td>\n",
       "      <td>[55, 54, 55, 54, 55, 55, 52, 54, 54, 54, 54, 54]</td>\n",
       "      <td>[47, 39, 37, 31, 31, 31, 31, 31, 35, 39, 42, 47]</td>\n",
       "      <td>[3, 6, 8, 12, 13, 15, 16, 18, 15, 15, 13, 9]</td>\n",
       "      <td>[28.31, 28.31, 28.28, 28.25, 28.25, 28.22, 28....</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...</td>\n",
       "      <td>Coastal Mountain</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2023</td>\n",
       "      <td>Winter</td>\n",
       "      <td>MB</td>\n",
       "      <td>[72, 73, 73, 73, 75, 77, 75, 73, 70, 68, 64, 63]</td>\n",
       "      <td>[59, 59, 59, 59, 59, 59, 57, 55, 55, 54, 52, 52]</td>\n",
       "      <td>[64, 61, 61, 57, 57, 54, 53, 53, 60, 60, 64, 68]</td>\n",
       "      <td>[13, 17, 18, 17, 21, 23, 21, 23, 18, 20, 17, 15]</td>\n",
       "      <td>[29.87, 29.84, 29.84, 29.84, 29.81, 29.81, 29....</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...</td>\n",
       "      <td>Coastal Mountain</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Russian Wildfires</td>\n",
       "      <td>2019</td>\n",
       "      <td>Summer</td>\n",
       "      <td>ON</td>\n",
       "      <td>[57, 59, 59, 61, 61, 61, 59, 61, 61, 63, 61, 63]</td>\n",
       "      <td>[43, 41, 41, 41, 41, 41, 39, 39, 37, 37, 37, 37]</td>\n",
       "      <td>[51, 51, 48, 48, 48, 48, 45, 42, 39, 42, 39, 39]</td>\n",
       "      <td>[11, 13, 11, 16, 18, 16, 16, 18, 16, 16, 11, 13]</td>\n",
       "      <td>[29.11, 29.11, 29.11, 29.11, 29.11, 29.11, 29....</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...</td>\n",
       "      <td>Hills</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chilean Patagonia Wildfire</td>\n",
       "      <td>2021</td>\n",
       "      <td>Summer</td>\n",
       "      <td>YT</td>\n",
       "      <td>[45, 45, 45, 45, 45, 43, 46, 46, 45, 45, 45, 45]</td>\n",
       "      <td>[39, 41, 41, 41, 41, 39, 37, 37, 37, 37, 37, 37]</td>\n",
       "      <td>[81, 87, 87, 87, 87, 87, 71, 71, 76, 76, 76, 76]</td>\n",
       "      <td>[23, 25, 22, 18, 21, 17, 25, 25, 29, 23, 23, 23]</td>\n",
       "      <td>[27.81, 27.86, 27.89, 27.89, 27.95, 27.92, 27....</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Windy, Windy, Rain, Light Rain, Windy, Light ...</td>\n",
       "      <td>Coastal Forest</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2017</td>\n",
       "      <td>Winter</td>\n",
       "      <td>MA</td>\n",
       "      <td>[84, 86, 84, 88, 86, 90, 90, 86, 84, 79, 75, 72]</td>\n",
       "      <td>[59, 61, 59, 61, 61, 63, 59, 59, 61, 57, 57, 57]</td>\n",
       "      <td>[42, 43, 42, 40, 36, 40, 45, 47, 53, 47, 53, 60]</td>\n",
       "      <td>[12, 14, 18, 15, 17, 20, 23, 24, 20, 16, 13, 9]</td>\n",
       "      <td>[29.93, 29.9, 29.9, 29.87, 29.87, 29.87, 29.84...</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...</td>\n",
       "      <td>Coastal Mountain</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Valparaiso Wildfire</td>\n",
       "      <td>2014</td>\n",
       "      <td>Spring</td>\n",
       "      <td>CA</td>\n",
       "      <td>[50, 50, 52, 46, 48, 52, 55, 57, 61, 64, 66, 70]</td>\n",
       "      <td>[41, 41, 41, 43, 41, 43, 43, 43, 45, 45, 46, 46]</td>\n",
       "      <td>[71, 71, 71, 81, 82, 71, 63, 59, 55, 49, 49, 43]</td>\n",
       "      <td>[2, 1, 5, 2, 3, 5, 2, 1, 2, 2, 1, 5]</td>\n",
       "      <td>[28.36, 28.36, 28.36, 28.36, 28.36, 28.39, 28....</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Mos...</td>\n",
       "      <td>Coastal Forest</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Araucania Wildfire</td>\n",
       "      <td>2012</td>\n",
       "      <td>Winter</td>\n",
       "      <td>BC</td>\n",
       "      <td>[66, 66, 68, 68, 68, 68, 66, 0, 64, 63, 63, 63]</td>\n",
       "      <td>[57, 57, 57, 59, 57, 57, 59, 0, 59, 59, 59, 59]</td>\n",
       "      <td>[73, 73, 68, 73, 68, 68, 78, 0, 83, 88, 88, 88]</td>\n",
       "      <td>[10, 14, 15, 16, 17, 13, 14, 13, 12, 9, 3, 5]</td>\n",
       "      <td>[29.93, 29.93, 29.93, 29.93, 29.93, 29.9, 29.9...</td>\n",
       "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]</td>\n",
       "      <td>[Cloudy, Cloudy, Mostly Cloudy, Mostly Cloudy,...</td>\n",
       "      <td>Coastal Forest</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    Fire Name  Year Season Started Locations Affected  \\\n",
       "0                  Cagua Fire  2020         Winter                 CA   \n",
       "1               Vietnam Fires  2019         Summer                 MA   \n",
       "2             Chile Wildfires  2024         Winter                 BC   \n",
       "3             Chile Wildfires  2024         Winter                 AB   \n",
       "4             Chile Wildfires  2023         Winter                 MB   \n",
       "5           Russian Wildfires  2019         Summer                 ON   \n",
       "6  Chilean Patagonia Wildfire  2021         Summer                 YT   \n",
       "7             Chile Wildfires  2017         Winter                 MA   \n",
       "8         Valparaiso Wildfire  2014         Spring                 CA   \n",
       "9          Araucania Wildfire  2012         Winter                 BC   \n",
       "\n",
       "                                    Temperature (F)  \\\n",
       "0  [75, 75, 73, 73, 72, 72, 71, 72, 72, 78, 82, 81]   \n",
       "1  [79, 81, 81, 82, 84, 86, 88, 90, 91, 93, 95, 97]   \n",
       "2  [78, 78, 78, 80, 82, 78, 77, 77, 77, 75, 73, 73]   \n",
       "3  [77, 81, 84, 88, 90, 90, 88, 86, 84, 81, 79, 75]   \n",
       "4  [72, 73, 73, 73, 75, 77, 75, 73, 70, 68, 64, 63]   \n",
       "5  [57, 59, 59, 61, 61, 61, 59, 61, 61, 63, 61, 63]   \n",
       "6  [45, 45, 45, 45, 45, 43, 46, 46, 45, 45, 45, 45]   \n",
       "7  [84, 86, 84, 88, 86, 90, 90, 86, 84, 79, 75, 72]   \n",
       "8  [50, 50, 52, 46, 48, 52, 55, 57, 61, 64, 66, 70]   \n",
       "9   [66, 66, 68, 68, 68, 68, 66, 0, 64, 63, 63, 63]   \n",
       "\n",
       "                                       Dewpoint (F)  \\\n",
       "0  [75, 75, 76, 76, 76, 76, 76, 76, 75, 77, 77, 77]   \n",
       "1  [72, 73, 73, 73, 73, 75, 75, 75, 75, 75, 77, 77]   \n",
       "2    [22, 8, 12, 19, 20, 18, 16, 13, 7, 41, 38, 22]   \n",
       "3  [55, 54, 55, 54, 55, 55, 52, 54, 54, 54, 54, 54]   \n",
       "4  [59, 59, 59, 59, 59, 59, 57, 55, 55, 54, 52, 52]   \n",
       "5  [43, 41, 41, 41, 41, 41, 39, 39, 37, 37, 37, 37]   \n",
       "6  [39, 41, 41, 41, 41, 39, 37, 37, 37, 37, 37, 37]   \n",
       "7  [59, 61, 59, 61, 61, 63, 59, 59, 61, 57, 57, 57]   \n",
       "8  [41, 41, 41, 43, 41, 43, 43, 43, 45, 45, 46, 46]   \n",
       "9   [57, 57, 57, 59, 57, 57, 59, 0, 59, 59, 59, 59]   \n",
       "\n",
       "                                       Humidity (%)  \\\n",
       "0  [85, 86, 86, 88, 90, 90, 94, 89, 74, 62, 55, 53]   \n",
       "1  [78, 79, 79, 74, 70, 70, 66, 62, 59, 56, 56, 53]   \n",
       "2  [74, 79, 84, 79, 74, 79, 83, 83, 83, 94, 94, 89]   \n",
       "3  [47, 39, 37, 31, 31, 31, 31, 31, 35, 39, 42, 47]   \n",
       "4  [64, 61, 61, 57, 57, 54, 53, 53, 60, 60, 64, 68]   \n",
       "5  [51, 51, 48, 48, 48, 48, 45, 42, 39, 42, 39, 39]   \n",
       "6  [81, 87, 87, 87, 87, 87, 71, 71, 76, 76, 76, 76]   \n",
       "7  [42, 43, 42, 40, 36, 40, 45, 47, 53, 47, 53, 60]   \n",
       "8  [71, 71, 71, 81, 82, 71, 63, 59, 55, 49, 49, 43]   \n",
       "9   [73, 73, 68, 73, 68, 68, 78, 0, 83, 88, 88, 88]   \n",
       "\n",
       "                                   Wind Speed (mph)  \\\n",
       "0              [2, 3, 3, 3, 4, 4, 2, 4, 2, 4, 6, 6]   \n",
       "1              [5, 6, 2, 5, 7, 5, 5, 7, 5, 6, 5, 2]   \n",
       "2  [18, 18, 20, 21, 20, 20, 20, 20, 17, 10, 11, 11]   \n",
       "3      [3, 6, 8, 12, 13, 15, 16, 18, 15, 15, 13, 9]   \n",
       "4  [13, 17, 18, 17, 21, 23, 21, 23, 18, 20, 17, 15]   \n",
       "5  [11, 13, 11, 16, 18, 16, 16, 18, 16, 16, 11, 13]   \n",
       "6  [23, 25, 22, 18, 21, 17, 25, 25, 29, 23, 23, 23]   \n",
       "7   [12, 14, 18, 15, 17, 20, 23, 24, 20, 16, 13, 9]   \n",
       "8              [2, 1, 5, 2, 3, 5, 2, 1, 2, 2, 1, 5]   \n",
       "9     [10, 14, 15, 16, 17, 13, 14, 13, 12, 9, 3, 5]   \n",
       "\n",
       "                                       Pressure (in)  \\\n",
       "0  [29.8, 29.83, 29.83, 29.86, 29.86, 29.8, 29.83...   \n",
       "1  [29.64, 29.64, 29.64, 29.64, 29.67, 29.67, 29....   \n",
       "2  [30.09, 30.09, 30.06, 30.06, 30.06, 30.06, 30....   \n",
       "3  [28.31, 28.31, 28.28, 28.25, 28.25, 28.22, 28....   \n",
       "4  [29.87, 29.84, 29.84, 29.84, 29.81, 29.81, 29....   \n",
       "5  [29.11, 29.11, 29.11, 29.11, 29.11, 29.11, 29....   \n",
       "6  [27.81, 27.86, 27.89, 27.89, 27.95, 27.92, 27....   \n",
       "7  [29.93, 29.9, 29.9, 29.87, 29.87, 29.87, 29.84...   \n",
       "8  [28.36, 28.36, 28.36, 28.36, 28.36, 28.39, 28....   \n",
       "9  [29.93, 29.93, 29.93, 29.93, 29.93, 29.9, 29.9...   \n",
       "\n",
       "                     Percipitation (in)  \\\n",
       "0  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "1  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "2  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "3  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "4  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "5  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "6  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "7  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "8  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "9  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       "\n",
       "                                           Condition  Type Of Location Y-Value  \n",
       "0  [Fair, Fair, Partly Cloudy, Fair, Fair, Partly...         Mountains    Fire  \n",
       "1  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...     Coastal Hills    Fire  \n",
       "2  [Fair, Partly Cloudy, Mostly Cloudy, Fair, Par...         Mountains    Fire  \n",
       "3  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...  Coastal Mountain    Fire  \n",
       "4  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...  Coastal Mountain    Fire  \n",
       "5  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...             Hills    Fire  \n",
       "6  [Windy, Windy, Rain, Light Rain, Windy, Light ...    Coastal Forest    Fire  \n",
       "7  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...  Coastal Mountain    Fire  \n",
       "8  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Mos...    Coastal Forest    Fire  \n",
       "9  [Cloudy, Cloudy, Mostly Cloudy, Mostly Cloudy,...    Coastal Forest    Fire  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Checking Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Check Categorical Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "categorical_column_labels = [\"Season Started\", \"Locations Affected\", \"Condition\", \"Type Of Location\", \"Y-Value\"]\n",
    "categorical_scalar_column_labels = [\"Season Started\", \"Locations Affected\", \"Type Of Location\", \"Y-Value\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summer    135\n",
      "Spring     75\n",
      "Fall       49\n",
      "Winter     46\n",
      "Name: Season Started, dtype: int64\n",
      "\n",
      "CA      40\n",
      "BC      35\n",
      "AB      33\n",
      "MB      25\n",
      "NT      17\n",
      "ON      17\n",
      "YT      12\n",
      "AZ       9\n",
      "NM       8\n",
      "FL       8\n",
      "CO       8\n",
      "QC       8\n",
      "WA       7\n",
      "TX       6\n",
      "ID       6\n",
      "SK       6\n",
      "NY       5\n",
      "OR       5\n",
      "MA       5\n",
      "TN       3\n",
      "UT       3\n",
      "SC       3\n",
      "WY       3\n",
      "MT       3\n",
      "MN       3\n",
      "DC       3\n",
      "IL       3\n",
      "AL       3\n",
      "WC       2\n",
      "PN       2\n",
      "DK       2\n",
      "NC       2\n",
      "NJ       2\n",
      "Utah     1\n",
      "OK       1\n",
      "MS       1\n",
      "VN       1\n",
      "Lyon     1\n",
      "AK       1\n",
      "MI       1\n",
      "NF       1\n",
      "Name: Locations Affected, dtype: int64\n",
      "\n",
      "Forest              77\n",
      "Mountains           60\n",
      "Coastal Mountain    17\n",
      "Hills               16\n",
      "Coastal Forest      13\n",
      "Arctic              11\n",
      "Rainforest           8\n",
      "Flat                 8\n",
      "Grasslands           6\n",
      "Plains               6\n",
      "Desert               4\n",
      "Coastal Hills        3\n",
      "Swamp                3\n",
      "Coastal Lowland      2\n",
      "Coastal              1\n",
      "Name: Type Of Location, dtype: int64\n",
      "\n",
      "Fire       155\n",
      "No Fire    150\n",
      "Name: Y-Value, dtype: int64\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for cl in categorical_scalar_column_labels:\n",
    "    print(df[cl].value_counts())\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Checking Vectors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Check whether collected for all numerical stats are of vectors of size 12 (For the recorded stats of a 12 hour period before a fire)\n",
    "vector_columns = df[vector_column_labels]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Verifying all are ndarray\n",
    "is_ndarray = vector_columns.applymap(lambda x: isinstance(x, np.ndarray))\n",
    "is_ndarray.all().all()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "desired_shape = (12,)\n",
    "\n",
    "shape = vector_columns.applymap(lambda x: x.shape)\n",
    "is_desired_shape = shape.applymap(lambda x: x == desired_shape)\n",
    "\n",
    "is_desired_shape = vector_columns.applymap(lambda x: x.shape == desired_shape)\n",
    "\n",
    "# Boolean series containing whether all vectors in that row are of the desired shape\n",
    "valid_shape_rows = is_desired_shape.all(axis=1)\n",
    "\n",
    "# Whether all vectors are of desired shape\n",
    "is_desired_shape.all().all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Convert Vector to Min, Max, Avg Calculation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We originally had vectors of size 12 to store data recorded in the past 12 hours before a fire (or of a non-fire day)\n",
    "\n",
    "However because the models required our data to be strictly 2-dimensional, we decided to generate minimum, average, and maximum values for specified columns instead"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "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>Fire Name</th>\n",
       "      <th>Year</th>\n",
       "      <th>Season Started</th>\n",
       "      <th>Locations Affected</th>\n",
       "      <th>Temperature (F)_min</th>\n",
       "      <th>Temperature (F)_avg</th>\n",
       "      <th>Temperature (F)_max</th>\n",
       "      <th>Dewpoint (F)_min</th>\n",
       "      <th>Dewpoint (F)_avg</th>\n",
       "      <th>Dewpoint (F)_max</th>\n",
       "      <th>...</th>\n",
       "      <th>Wind Speed (mph)_max</th>\n",
       "      <th>Pressure (in)_min</th>\n",
       "      <th>Pressure (in)_avg</th>\n",
       "      <th>Pressure (in)_max</th>\n",
       "      <th>Percipitation (in)_min</th>\n",
       "      <th>Percipitation (in)_avg</th>\n",
       "      <th>Percipitation (in)_max</th>\n",
       "      <th>Condition</th>\n",
       "      <th>Type Of Location</th>\n",
       "      <th>Y-Value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Cagua Fire</td>\n",
       "      <td>2020</td>\n",
       "      <td>Winter</td>\n",
       "      <td>CA</td>\n",
       "      <td>71.0</td>\n",
       "      <td>74.666667</td>\n",
       "      <td>82.0</td>\n",
       "      <td>75.0</td>\n",
       "      <td>76.000000</td>\n",
       "      <td>77.0</td>\n",
       "      <td>...</td>\n",
       "      <td>6.0</td>\n",
       "      <td>29.80</td>\n",
       "      <td>29.835000</td>\n",
       "      <td>29.86</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Fair, Partly Cloudy, Fair, Fair, Partly...</td>\n",
       "      <td>Mountains</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Vietnam Fires</td>\n",
       "      <td>2019</td>\n",
       "      <td>Summer</td>\n",
       "      <td>MA</td>\n",
       "      <td>79.0</td>\n",
       "      <td>87.250000</td>\n",
       "      <td>97.0</td>\n",
       "      <td>72.0</td>\n",
       "      <td>74.416667</td>\n",
       "      <td>77.0</td>\n",
       "      <td>...</td>\n",
       "      <td>7.0</td>\n",
       "      <td>29.64</td>\n",
       "      <td>29.652500</td>\n",
       "      <td>29.67</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...</td>\n",
       "      <td>Coastal Hills</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2024</td>\n",
       "      <td>Winter</td>\n",
       "      <td>BC</td>\n",
       "      <td>73.0</td>\n",
       "      <td>77.166667</td>\n",
       "      <td>82.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>19.666667</td>\n",
       "      <td>41.0</td>\n",
       "      <td>...</td>\n",
       "      <td>21.0</td>\n",
       "      <td>30.03</td>\n",
       "      <td>30.067500</td>\n",
       "      <td>30.09</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Partly Cloudy, Mostly Cloudy, Fair, Par...</td>\n",
       "      <td>Mountains</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2024</td>\n",
       "      <td>Winter</td>\n",
       "      <td>AB</td>\n",
       "      <td>75.0</td>\n",
       "      <td>83.583333</td>\n",
       "      <td>90.0</td>\n",
       "      <td>52.0</td>\n",
       "      <td>54.166667</td>\n",
       "      <td>55.0</td>\n",
       "      <td>...</td>\n",
       "      <td>18.0</td>\n",
       "      <td>28.22</td>\n",
       "      <td>28.252500</td>\n",
       "      <td>28.31</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...</td>\n",
       "      <td>Coastal Mountain</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2023</td>\n",
       "      <td>Winter</td>\n",
       "      <td>MB</td>\n",
       "      <td>63.0</td>\n",
       "      <td>71.333333</td>\n",
       "      <td>77.0</td>\n",
       "      <td>52.0</td>\n",
       "      <td>56.583333</td>\n",
       "      <td>59.0</td>\n",
       "      <td>...</td>\n",
       "      <td>23.0</td>\n",
       "      <td>29.78</td>\n",
       "      <td>29.822500</td>\n",
       "      <td>29.87</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...</td>\n",
       "      <td>Coastal Mountain</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Russian Wildfires</td>\n",
       "      <td>2019</td>\n",
       "      <td>Summer</td>\n",
       "      <td>ON</td>\n",
       "      <td>57.0</td>\n",
       "      <td>60.500000</td>\n",
       "      <td>63.0</td>\n",
       "      <td>37.0</td>\n",
       "      <td>39.500000</td>\n",
       "      <td>43.0</td>\n",
       "      <td>...</td>\n",
       "      <td>18.0</td>\n",
       "      <td>29.11</td>\n",
       "      <td>29.110000</td>\n",
       "      <td>29.11</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...</td>\n",
       "      <td>Hills</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chilean Patagonia Wildfire</td>\n",
       "      <td>2021</td>\n",
       "      <td>Summer</td>\n",
       "      <td>YT</td>\n",
       "      <td>43.0</td>\n",
       "      <td>45.000000</td>\n",
       "      <td>46.0</td>\n",
       "      <td>37.0</td>\n",
       "      <td>38.666667</td>\n",
       "      <td>41.0</td>\n",
       "      <td>...</td>\n",
       "      <td>29.0</td>\n",
       "      <td>27.81</td>\n",
       "      <td>27.883333</td>\n",
       "      <td>27.95</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Windy, Windy, Rain, Light Rain, Windy, Light ...</td>\n",
       "      <td>Coastal Forest</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Chile Wildfires</td>\n",
       "      <td>2017</td>\n",
       "      <td>Winter</td>\n",
       "      <td>MA</td>\n",
       "      <td>72.0</td>\n",
       "      <td>83.666667</td>\n",
       "      <td>90.0</td>\n",
       "      <td>57.0</td>\n",
       "      <td>59.500000</td>\n",
       "      <td>63.0</td>\n",
       "      <td>...</td>\n",
       "      <td>24.0</td>\n",
       "      <td>29.84</td>\n",
       "      <td>29.872500</td>\n",
       "      <td>29.93</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...</td>\n",
       "      <td>Coastal Mountain</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Valparaiso Wildfire</td>\n",
       "      <td>2014</td>\n",
       "      <td>Spring</td>\n",
       "      <td>CA</td>\n",
       "      <td>46.0</td>\n",
       "      <td>55.916667</td>\n",
       "      <td>70.0</td>\n",
       "      <td>41.0</td>\n",
       "      <td>43.166667</td>\n",
       "      <td>46.0</td>\n",
       "      <td>...</td>\n",
       "      <td>5.0</td>\n",
       "      <td>28.33</td>\n",
       "      <td>28.367500</td>\n",
       "      <td>28.39</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Fair, Fair, Fair, Fair, Fair, Fair, Fair, Mos...</td>\n",
       "      <td>Coastal Forest</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Araucania Wildfire</td>\n",
       "      <td>2012</td>\n",
       "      <td>Winter</td>\n",
       "      <td>BC</td>\n",
       "      <td>0.0</td>\n",
       "      <td>60.250000</td>\n",
       "      <td>68.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>53.250000</td>\n",
       "      <td>59.0</td>\n",
       "      <td>...</td>\n",
       "      <td>17.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>27.420833</td>\n",
       "      <td>29.93</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>[Cloudy, Cloudy, Mostly Cloudy, Mostly Cloudy,...</td>\n",
       "      <td>Coastal Forest</td>\n",
       "      <td>Fire</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 25 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                    Fire Name  Year Season Started Locations Affected  \\\n",
       "0                  Cagua Fire  2020         Winter                 CA   \n",
       "1               Vietnam Fires  2019         Summer                 MA   \n",
       "2             Chile Wildfires  2024         Winter                 BC   \n",
       "3             Chile Wildfires  2024         Winter                 AB   \n",
       "4             Chile Wildfires  2023         Winter                 MB   \n",
       "5           Russian Wildfires  2019         Summer                 ON   \n",
       "6  Chilean Patagonia Wildfire  2021         Summer                 YT   \n",
       "7             Chile Wildfires  2017         Winter                 MA   \n",
       "8         Valparaiso Wildfire  2014         Spring                 CA   \n",
       "9          Araucania Wildfire  2012         Winter                 BC   \n",
       "\n",
       "   Temperature (F)_min  Temperature (F)_avg  Temperature (F)_max  \\\n",
       "0                 71.0            74.666667                 82.0   \n",
       "1                 79.0            87.250000                 97.0   \n",
       "2                 73.0            77.166667                 82.0   \n",
       "3                 75.0            83.583333                 90.0   \n",
       "4                 63.0            71.333333                 77.0   \n",
       "5                 57.0            60.500000                 63.0   \n",
       "6                 43.0            45.000000                 46.0   \n",
       "7                 72.0            83.666667                 90.0   \n",
       "8                 46.0            55.916667                 70.0   \n",
       "9                  0.0            60.250000                 68.0   \n",
       "\n",
       "   Dewpoint (F)_min  Dewpoint (F)_avg  Dewpoint (F)_max  ...  \\\n",
       "0              75.0         76.000000              77.0  ...   \n",
       "1              72.0         74.416667              77.0  ...   \n",
       "2               7.0         19.666667              41.0  ...   \n",
       "3              52.0         54.166667              55.0  ...   \n",
       "4              52.0         56.583333              59.0  ...   \n",
       "5              37.0         39.500000              43.0  ...   \n",
       "6              37.0         38.666667              41.0  ...   \n",
       "7              57.0         59.500000              63.0  ...   \n",
       "8              41.0         43.166667              46.0  ...   \n",
       "9               0.0         53.250000              59.0  ...   \n",
       "\n",
       "   Wind Speed (mph)_max  Pressure (in)_min  Pressure (in)_avg  \\\n",
       "0                   6.0              29.80          29.835000   \n",
       "1                   7.0              29.64          29.652500   \n",
       "2                  21.0              30.03          30.067500   \n",
       "3                  18.0              28.22          28.252500   \n",
       "4                  23.0              29.78          29.822500   \n",
       "5                  18.0              29.11          29.110000   \n",
       "6                  29.0              27.81          27.883333   \n",
       "7                  24.0              29.84          29.872500   \n",
       "8                   5.0              28.33          28.367500   \n",
       "9                  17.0               0.00          27.420833   \n",
       "\n",
       "   Pressure (in)_max  Percipitation (in)_min  Percipitation (in)_avg  \\\n",
       "0              29.86                     0.0                     0.0   \n",
       "1              29.67                     0.0                     0.0   \n",
       "2              30.09                     0.0                     0.0   \n",
       "3              28.31                     0.0                     0.0   \n",
       "4              29.87                     0.0                     0.0   \n",
       "5              29.11                     0.0                     0.0   \n",
       "6              27.95                     0.0                     0.0   \n",
       "7              29.93                     0.0                     0.0   \n",
       "8              28.39                     0.0                     0.0   \n",
       "9              29.93                     0.0                     0.0   \n",
       "\n",
       "   Percipitation (in)_max                                          Condition  \\\n",
       "0                     0.0  [Fair, Fair, Partly Cloudy, Fair, Fair, Partly...   \n",
       "1                     0.0  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...   \n",
       "2                     0.0  [Fair, Partly Cloudy, Mostly Cloudy, Fair, Par...   \n",
       "3                     0.0  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...   \n",
       "4                     0.0  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...   \n",
       "5                     0.0  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...   \n",
       "6                     0.0  [Windy, Windy, Rain, Light Rain, Windy, Light ...   \n",
       "7                     0.0  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...   \n",
       "8                     0.0  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Mos...   \n",
       "9                     0.0  [Cloudy, Cloudy, Mostly Cloudy, Mostly Cloudy,...   \n",
       "\n",
       "   Type Of Location  Y-Value  \n",
       "0         Mountains     Fire  \n",
       "1     Coastal Hills     Fire  \n",
       "2         Mountains     Fire  \n",
       "3  Coastal Mountain     Fire  \n",
       "4  Coastal Mountain     Fire  \n",
       "5             Hills     Fire  \n",
       "6    Coastal Forest     Fire  \n",
       "7  Coastal Mountain     Fire  \n",
       "8    Coastal Forest     Fire  \n",
       "9    Coastal Forest     Fire  \n",
       "\n",
       "[10 rows x 25 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Columns to generate stats for\n",
    "columns_to_process = numerical_vector_column_labels\n",
    "\n",
    "# Function to compute min, avg, and max and return as a Series\n",
    "def compute_stats(arr):\n",
    "    return pd.Series([np.min(arr), np.mean(arr), np.max(arr)], index=['min', 'avg', 'max'])\n",
    "\n",
    "# New DataFrame to store results\n",
    "num_stats_df = pd.DataFrame()\n",
    "\n",
    "# Iterate over specified columns\n",
    "for col in df.columns:\n",
    "    # If the column contains numpy arrays and is in the columns to process\n",
    "    if col in columns_to_process:  # and np.issubdtype(df[col].dtype, np.ndarray)\n",
    "        # Compute statistics for each numpy array element in the column\n",
    "        stats = df[col].apply(compute_stats)\n",
    "        # Rename columns to include the statistics\n",
    "        stats.columns = [f\"{col}_min\", f\"{col}_avg\", f\"{col}_max\"]\n",
    "        # Concatenate the statistics columns with the original column and insert them into the new DataFrame\n",
    "        #num_stats_df = pd.concat([num_stats_df, df[col], stats], axis=1)\n",
    "        num_stats_df = pd.concat([num_stats_df, stats], axis=1)\n",
    "    else:\n",
    "        # If not a numpy array column or not in columns to process, copy it to the new DataFrame\n",
    "        num_stats_df[col] = df[col]\n",
    "\n",
    "num_stats_df.head(10)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data Preparation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Dealing with Outliers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We keep the outlier data in our wildfire prediction dataset, which includes weather and location information, for several important reasons. Firstly, outliers might represent extreme weather conditions that could lead to wildfires, so it's crucial for our model to learn from these instances. Secondly, removing outliers could lead to losing important information, making our model less effective in real-world situations. Additionally, outliers help us understand the full range of environmental conditions that contribute to wildfires. By training our model with outlier data, we ensure it can recognize high-risk conditions accurately. Plus, investigating outliers helps us maintain data accuracy and address any issues with measurements. Finally, keeping outlier data ensures fairness and prevents bias in our predictions, treating all data equally.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Dealing with Duplicates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      False\n",
       "1      False\n",
       "2      False\n",
       "3      False\n",
       "4      False\n",
       "       ...  \n",
       "300    False\n",
       "301    False\n",
       "302    False\n",
       "303    False\n",
       "304    False\n",
       "Length: 305, dtype: bool"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols_to_look_at = num_stats_df.drop(['Condition'], axis=1).columns.tolist()\n",
    "num_stats_df[cols_to_look_at].duplicated()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are no duplicated values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Dealing with missing values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The missing data seems to be for non-fire data because the column for Fire Name is empty. Instead of dropping missing data,  which we believe is only on the names of the fire/type of location, we fill in default No Fire and default location."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "           Fire Name  Year Season Started Locations Affected  \\\n",
      "0         Cagua Fire  2020         Winter                 CA   \n",
      "1      Vietnam Fires  2019         Summer                 MA   \n",
      "2    Chile Wildfires  2024         Winter                 BC   \n",
      "3    Chile Wildfires  2024         Winter                 AB   \n",
      "4    Chile Wildfires  2023         Winter                 MB   \n",
      "..               ...   ...            ...                ...   \n",
      "300         Non Fire  2020         Summer                 MB   \n",
      "301         Non Fire  2020         Summer                 MB   \n",
      "302         Non Fire  2020           Fall                 MB   \n",
      "303         Non Fire  2020         Summer                 NT   \n",
      "304         Non Fire  2020         Summer                 NT   \n",
      "\n",
      "     Temperature (F)_min  Temperature (F)_avg  Temperature (F)_max  \\\n",
      "0                   71.0            74.666667                 82.0   \n",
      "1                   79.0            87.250000                 97.0   \n",
      "2                   73.0            77.166667                 82.0   \n",
      "3                   75.0            83.583333                 90.0   \n",
      "4                   63.0            71.333333                 77.0   \n",
      "..                   ...                  ...                  ...   \n",
      "300                 54.0            67.666667                 75.0   \n",
      "301                 57.0            65.916667                 73.0   \n",
      "302                 37.0            39.000000                 43.0   \n",
      "303                 45.0            56.083333                 64.0   \n",
      "304                 63.0            76.416667                 90.0   \n",
      "\n",
      "     Dewpoint (F)_min  Dewpoint (F)_avg  Dewpoint (F)_max  ...  \\\n",
      "0                75.0         76.000000              77.0  ...   \n",
      "1                72.0         74.416667              77.0  ...   \n",
      "2                 7.0         19.666667              41.0  ...   \n",
      "3                52.0         54.166667              55.0  ...   \n",
      "4                52.0         56.583333              59.0  ...   \n",
      "..                ...               ...               ...  ...   \n",
      "300               0.0         40.583333              57.0  ...   \n",
      "301              57.0         60.666667              64.0  ...   \n",
      "302              32.0         35.333333              37.0  ...   \n",
      "303              30.0         34.000000              36.0  ...   \n",
      "304              55.0         59.166667              63.0  ...   \n",
      "\n",
      "     Wind Speed (mph)_max  Pressure (in)_min  Pressure (in)_avg  \\\n",
      "0                     6.0              29.80          29.835000   \n",
      "1                     7.0              29.64          29.652500   \n",
      "2                    21.0              30.03          30.067500   \n",
      "3                    18.0              28.22          28.252500   \n",
      "4                    23.0              29.78          29.822500   \n",
      "..                    ...                ...                ...   \n",
      "300                   0.0              28.95          28.982500   \n",
      "301                   9.0              28.46          28.486667   \n",
      "302                  16.0              28.70          28.914167   \n",
      "303                  10.0              29.19          29.209167   \n",
      "304                  12.0              29.37          29.442500   \n",
      "\n",
      "     Pressure (in)_max  Percipitation (in)_min  Percipitation (in)_avg  \\\n",
      "0                29.86                     0.0                     0.0   \n",
      "1                29.67                     0.0                     0.0   \n",
      "2                30.09                     0.0                     0.0   \n",
      "3                28.31                     0.0                     0.0   \n",
      "4                29.87                     0.0                     0.0   \n",
      "..                 ...                     ...                     ...   \n",
      "300              29.01                     0.0                     0.0   \n",
      "301              28.50                     0.0                     0.0   \n",
      "302              29.06                     0.0                     0.0   \n",
      "303              29.22                     0.0                     0.0   \n",
      "304              29.51                     0.0                     0.0   \n",
      "\n",
      "     Percipitation (in)_max  \\\n",
      "0                       0.0   \n",
      "1                       0.0   \n",
      "2                       0.0   \n",
      "3                       0.0   \n",
      "4                       0.0   \n",
      "..                      ...   \n",
      "300                     0.0   \n",
      "301                     0.0   \n",
      "302                     0.0   \n",
      "303                     0.0   \n",
      "304                     0.0   \n",
      "\n",
      "                                             Condition  Type Of Location  \\\n",
      "0    [Fair, Fair, Partly Cloudy, Fair, Fair, Partly...         Mountains   \n",
      "1    [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...     Coastal Hills   \n",
      "2    [Fair, Partly Cloudy, Mostly Cloudy, Fair, Par...         Mountains   \n",
      "3    [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...  Coastal Mountain   \n",
      "4    [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...  Coastal Mountain   \n",
      "..                                                 ...               ...   \n",
      "300  [Fog, Partly Cloudy, Fair, Fair, Partly Cloudy...            Forest   \n",
      "301  [Thunder, Thunder, Thunder, Light Rain with Th...            Forest   \n",
      "302  [Cloudy, Mist, Cloudy, Cloudy, Light Rain, Clo...            Forest   \n",
      "303  [Mostly Cloudy, Mostly Cloudy, Partly Cloudy, ...            Forest   \n",
      "304  [Partly Cloudy, Fair, Fair, Fair, Fair, Fair, ...            Forest   \n",
      "\n",
      "     Y-Value  \n",
      "0       Fire  \n",
      "1       Fire  \n",
      "2       Fire  \n",
      "3       Fire  \n",
      "4       Fire  \n",
      "..       ...  \n",
      "300  No Fire  \n",
      "301  No Fire  \n",
      "302  No Fire  \n",
      "303  No Fire  \n",
      "304  No Fire  \n",
      "\n",
      "[305 rows x 25 columns]\n"
     ]
    }
   ],
   "source": [
    "na_rows_2 = num_stats_df[num_stats_df.isna().any(axis=1)]\n",
    "\n",
    "# Iterate over rows with NaN values\n",
    "for index, row in na_rows_2.iterrows():\n",
    "    # Check if 'Fire Name' column is NaN, and if so, replace with 'Non Fire'\n",
    "    if pd.isna(row['Fire Name']):\n",
    "        num_stats_df.at[index, 'Fire Name'] = 'Non Fire'\n",
    "    # Check if 'Type of Location' column is NaN, and if so, replace with 'Forest'\n",
    "    if pd.isna(row['Type Of Location']):\n",
    "        num_stats_df.at[index, 'Type Of Location'] = 'Forest'\n",
    "\n",
    "print(num_stats_df)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Checking contents for numpy arrays (numerical only)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "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>Fire Name</th>\n",
       "      <th>Year</th>\n",
       "      <th>Season Started</th>\n",
       "      <th>Locations Affected</th>\n",
       "      <th>Temperature (F)_min</th>\n",
       "      <th>Temperature (F)_avg</th>\n",
       "      <th>Temperature (F)_max</th>\n",
       "      <th>Dewpoint (F)_min</th>\n",
       "      <th>Dewpoint (F)_avg</th>\n",
       "      <th>Dewpoint (F)_max</th>\n",
       "      <th>...</th>\n",
       "      <th>Wind Speed (mph)_max</th>\n",
       "      <th>Pressure (in)_min</th>\n",
       "      <th>Pressure (in)_avg</th>\n",
       "      <th>Pressure (in)_max</th>\n",
       "      <th>Percipitation (in)_min</th>\n",
       "      <th>Percipitation (in)_avg</th>\n",
       "      <th>Percipitation (in)_max</th>\n",
       "      <th>Condition</th>\n",
       "      <th>Type Of Location</th>\n",
       "      <th>Y-Value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 25 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [Fire Name, Year, Season Started, Locations Affected, Temperature (F)_min, Temperature (F)_avg, Temperature (F)_max, Dewpoint (F)_min, Dewpoint (F)_avg, Dewpoint (F)_max, Humidity (%)_min, Humidity (%)_avg, Humidity (%)_max, Wind Speed (mph)_min, Wind Speed (mph)_avg, Wind Speed (mph)_max, Pressure (in)_min, Pressure (in)_avg, Pressure (in)_max, Percipitation (in)_min, Percipitation (in)_avg, Percipitation (in)_max, Condition, Type Of Location, Y-Value]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 25 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "na_rows = num_stats_df[num_stats_df.isna().any(axis=1)]\n",
    "na_rows"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dealing with categorical data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For output we will use Label Encoding since it is binary data (0 or 1). For remaining categorical data we will use one-hot encoding."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "le = LabelEncoder()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fire       155\n",
      "No Fire    150\n",
      "Name: Y-Value, dtype: int64\n",
      "CA      40\n",
      "BC      35\n",
      "AB      33\n",
      "MB      25\n",
      "NT      17\n",
      "ON      17\n",
      "YT      12\n",
      "AZ       9\n",
      "NM       8\n",
      "FL       8\n",
      "CO       8\n",
      "QC       8\n",
      "WA       7\n",
      "TX       6\n",
      "ID       6\n",
      "SK       6\n",
      "NY       5\n",
      "OR       5\n",
      "MA       5\n",
      "TN       3\n",
      "UT       3\n",
      "SC       3\n",
      "WY       3\n",
      "MT       3\n",
      "MN       3\n",
      "DC       3\n",
      "IL       3\n",
      "AL       3\n",
      "WC       2\n",
      "PN       2\n",
      "DK       2\n",
      "NC       2\n",
      "NJ       2\n",
      "Utah     1\n",
      "OK       1\n",
      "MS       1\n",
      "VN       1\n",
      "Lyon     1\n",
      "AK       1\n",
      "MI       1\n",
      "NF       1\n",
      "Name: Locations Affected, dtype: int64\n",
      "Fire       155\n",
      "No Fire    150\n",
      "Name: Y-Value, dtype: int64\n",
      "CA      40\n",
      "BC      35\n",
      "AB      33\n",
      "MB      25\n",
      "NT      17\n",
      "ON      17\n",
      "YT      12\n",
      "AZ       9\n",
      "NM       8\n",
      "FL       8\n",
      "CO       8\n",
      "QC       8\n",
      "WA       7\n",
      "TX       6\n",
      "ID       6\n",
      "SK       6\n",
      "NY       5\n",
      "OR       5\n",
      "MA       5\n",
      "TN       3\n",
      "UT       3\n",
      "SC       3\n",
      "WY       3\n",
      "MT       3\n",
      "MN       3\n",
      "DC       3\n",
      "IL       3\n",
      "AL       3\n",
      "WC       2\n",
      "PN       2\n",
      "DK       2\n",
      "NC       2\n",
      "NJ       2\n",
      "Utah     1\n",
      "OK       1\n",
      "MS       1\n",
      "VN       1\n",
      "Lyon     1\n",
      "AK       1\n",
      "MI       1\n",
      "NF       1\n",
      "Name: Locations Affected, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(df['Y-Value'].value_counts())\n",
    "print(df['Locations Affected'].value_counts())\n",
    "print(num_stats_df['Y-Value'].value_counts())\n",
    "print(num_stats_df['Locations Affected'].value_counts())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### One-hot encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1    155\n",
      "0    150\n",
      "Name: Y-Value, dtype: int64\n",
      "CA      40\n",
      "BC      35\n",
      "AB      33\n",
      "MB      25\n",
      "NT      17\n",
      "ON      17\n",
      "YT      12\n",
      "AZ       9\n",
      "NM       8\n",
      "FL       8\n",
      "CO       8\n",
      "QC       8\n",
      "WA       7\n",
      "TX       6\n",
      "ID       6\n",
      "SK       6\n",
      "NY       5\n",
      "OR       5\n",
      "MA       5\n",
      "TN       3\n",
      "UT       3\n",
      "SC       3\n",
      "WY       3\n",
      "MT       3\n",
      "MN       3\n",
      "DC       3\n",
      "IL       3\n",
      "AL       3\n",
      "WC       2\n",
      "PN       2\n",
      "DK       2\n",
      "NC       2\n",
      "NJ       2\n",
      "Utah     1\n",
      "OK       1\n",
      "MS       1\n",
      "VN       1\n",
      "Lyon     1\n",
      "AK       1\n",
      "MI       1\n",
      "NF       1\n",
      "Name: Locations Affected, dtype: int64\n",
      "1    155\n",
      "0    150\n",
      "Name: Y-Value, dtype: int64\n",
      "CA      40\n",
      "BC      35\n",
      "AB      33\n",
      "MB      25\n",
      "NT      17\n",
      "ON      17\n",
      "YT      12\n",
      "AZ       9\n",
      "NM       8\n",
      "FL       8\n",
      "CO       8\n",
      "QC       8\n",
      "WA       7\n",
      "TX       6\n",
      "ID       6\n",
      "SK       6\n",
      "NY       5\n",
      "OR       5\n",
      "MA       5\n",
      "TN       3\n",
      "UT       3\n",
      "SC       3\n",
      "WY       3\n",
      "MT       3\n",
      "MN       3\n",
      "DC       3\n",
      "IL       3\n",
      "AL       3\n",
      "WC       2\n",
      "PN       2\n",
      "DK       2\n",
      "NC       2\n",
      "NJ       2\n",
      "Utah     1\n",
      "OK       1\n",
      "MS       1\n",
      "VN       1\n",
      "Lyon     1\n",
      "AK       1\n",
      "MI       1\n",
      "NF       1\n",
      "Name: Locations Affected, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# Replace y value\n",
    "# with pd.option_context('future.no_silent_downcasting', True):\n",
    "fire_map = {'Fire': 1, 'Fire\\r\\n': 1, 'No Fire': 0, 'Not Fire': 0}\n",
    "#     coded_df = pd.DataFrame()\n",
    "#     coded_df['Y-Value_encoded'] = unencoded_df['Y-Value'].replace(fire_map).astype(int)\n",
    "#     coded_df['Y-Value_encoded'].value_counts()\n",
    "df['Y-Value'] = df['Y-Value'].replace(fire_map)\n",
    "num_stats_df['Y-Value'] = num_stats_df['Y-Value'].replace(fire_map)\n",
    "print(df['Y-Value'].value_counts())\n",
    "print(df['Locations Affected'].value_counts())\n",
    "print(num_stats_df['Y-Value'].value_counts())\n",
    "print(num_stats_df['Locations Affected'].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(                    Fire Name  Year Locations Affected  \\\n",
       " 0                  Cagua Fire  2020                 CA   \n",
       " 1               Vietnam Fires  2019                 MA   \n",
       " 2             Chile Wildfires  2024                 BC   \n",
       " 3             Chile Wildfires  2024                 AB   \n",
       " 4             Chile Wildfires  2023                 MB   \n",
       " 5           Russian Wildfires  2019                 ON   \n",
       " 6  Chilean Patagonia Wildfire  2021                 YT   \n",
       " 7             Chile Wildfires  2017                 MA   \n",
       " 8         Valparaiso Wildfire  2014                 CA   \n",
       " 9          Araucania Wildfire  2012                 BC   \n",
       " \n",
       "                                     Temperature (F)  \\\n",
       " 0  [75, 75, 73, 73, 72, 72, 71, 72, 72, 78, 82, 81]   \n",
       " 1  [79, 81, 81, 82, 84, 86, 88, 90, 91, 93, 95, 97]   \n",
       " 2  [78, 78, 78, 80, 82, 78, 77, 77, 77, 75, 73, 73]   \n",
       " 3  [77, 81, 84, 88, 90, 90, 88, 86, 84, 81, 79, 75]   \n",
       " 4  [72, 73, 73, 73, 75, 77, 75, 73, 70, 68, 64, 63]   \n",
       " 5  [57, 59, 59, 61, 61, 61, 59, 61, 61, 63, 61, 63]   \n",
       " 6  [45, 45, 45, 45, 45, 43, 46, 46, 45, 45, 45, 45]   \n",
       " 7  [84, 86, 84, 88, 86, 90, 90, 86, 84, 79, 75, 72]   \n",
       " 8  [50, 50, 52, 46, 48, 52, 55, 57, 61, 64, 66, 70]   \n",
       " 9   [66, 66, 68, 68, 68, 68, 66, 0, 64, 63, 63, 63]   \n",
       " \n",
       "                                        Dewpoint (F)  \\\n",
       " 0  [75, 75, 76, 76, 76, 76, 76, 76, 75, 77, 77, 77]   \n",
       " 1  [72, 73, 73, 73, 73, 75, 75, 75, 75, 75, 77, 77]   \n",
       " 2    [22, 8, 12, 19, 20, 18, 16, 13, 7, 41, 38, 22]   \n",
       " 3  [55, 54, 55, 54, 55, 55, 52, 54, 54, 54, 54, 54]   \n",
       " 4  [59, 59, 59, 59, 59, 59, 57, 55, 55, 54, 52, 52]   \n",
       " 5  [43, 41, 41, 41, 41, 41, 39, 39, 37, 37, 37, 37]   \n",
       " 6  [39, 41, 41, 41, 41, 39, 37, 37, 37, 37, 37, 37]   \n",
       " 7  [59, 61, 59, 61, 61, 63, 59, 59, 61, 57, 57, 57]   \n",
       " 8  [41, 41, 41, 43, 41, 43, 43, 43, 45, 45, 46, 46]   \n",
       " 9   [57, 57, 57, 59, 57, 57, 59, 0, 59, 59, 59, 59]   \n",
       " \n",
       "                                        Humidity (%)  \\\n",
       " 0  [85, 86, 86, 88, 90, 90, 94, 89, 74, 62, 55, 53]   \n",
       " 1  [78, 79, 79, 74, 70, 70, 66, 62, 59, 56, 56, 53]   \n",
       " 2  [74, 79, 84, 79, 74, 79, 83, 83, 83, 94, 94, 89]   \n",
       " 3  [47, 39, 37, 31, 31, 31, 31, 31, 35, 39, 42, 47]   \n",
       " 4  [64, 61, 61, 57, 57, 54, 53, 53, 60, 60, 64, 68]   \n",
       " 5  [51, 51, 48, 48, 48, 48, 45, 42, 39, 42, 39, 39]   \n",
       " 6  [81, 87, 87, 87, 87, 87, 71, 71, 76, 76, 76, 76]   \n",
       " 7  [42, 43, 42, 40, 36, 40, 45, 47, 53, 47, 53, 60]   \n",
       " 8  [71, 71, 71, 81, 82, 71, 63, 59, 55, 49, 49, 43]   \n",
       " 9   [73, 73, 68, 73, 68, 68, 78, 0, 83, 88, 88, 88]   \n",
       " \n",
       "                                    Wind Speed (mph)  \\\n",
       " 0              [2, 3, 3, 3, 4, 4, 2, 4, 2, 4, 6, 6]   \n",
       " 1              [5, 6, 2, 5, 7, 5, 5, 7, 5, 6, 5, 2]   \n",
       " 2  [18, 18, 20, 21, 20, 20, 20, 20, 17, 10, 11, 11]   \n",
       " 3      [3, 6, 8, 12, 13, 15, 16, 18, 15, 15, 13, 9]   \n",
       " 4  [13, 17, 18, 17, 21, 23, 21, 23, 18, 20, 17, 15]   \n",
       " 5  [11, 13, 11, 16, 18, 16, 16, 18, 16, 16, 11, 13]   \n",
       " 6  [23, 25, 22, 18, 21, 17, 25, 25, 29, 23, 23, 23]   \n",
       " 7   [12, 14, 18, 15, 17, 20, 23, 24, 20, 16, 13, 9]   \n",
       " 8              [2, 1, 5, 2, 3, 5, 2, 1, 2, 2, 1, 5]   \n",
       " 9     [10, 14, 15, 16, 17, 13, 14, 13, 12, 9, 3, 5]   \n",
       " \n",
       "                                        Pressure (in)  \\\n",
       " 0  [29.8, 29.83, 29.83, 29.86, 29.86, 29.8, 29.83...   \n",
       " 1  [29.64, 29.64, 29.64, 29.64, 29.67, 29.67, 29....   \n",
       " 2  [30.09, 30.09, 30.06, 30.06, 30.06, 30.06, 30....   \n",
       " 3  [28.31, 28.31, 28.28, 28.25, 28.25, 28.22, 28....   \n",
       " 4  [29.87, 29.84, 29.84, 29.84, 29.81, 29.81, 29....   \n",
       " 5  [29.11, 29.11, 29.11, 29.11, 29.11, 29.11, 29....   \n",
       " 6  [27.81, 27.86, 27.89, 27.89, 27.95, 27.92, 27....   \n",
       " 7  [29.93, 29.9, 29.9, 29.87, 29.87, 29.87, 29.84...   \n",
       " 8  [28.36, 28.36, 28.36, 28.36, 28.36, 28.39, 28....   \n",
       " 9  [29.93, 29.93, 29.93, 29.93, 29.93, 29.9, 29.9...   \n",
       " \n",
       "                      Percipitation (in)  \\\n",
       " 0  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 1  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 2  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 3  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 4  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 5  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 6  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 7  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 8  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " 9  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]   \n",
       " \n",
       "                                            Condition  Type Of Location  \\\n",
       " 0  [Fair, Fair, Partly Cloudy, Fair, Fair, Partly...         Mountains   \n",
       " 1  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...     Coastal Hills   \n",
       " 2  [Fair, Partly Cloudy, Mostly Cloudy, Fair, Par...         Mountains   \n",
       " 3  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...  Coastal Mountain   \n",
       " 4  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...  Coastal Mountain   \n",
       " 5  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...             Hills   \n",
       " 6  [Windy, Windy, Rain, Light Rain, Windy, Light ...    Coastal Forest   \n",
       " 7  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...  Coastal Mountain   \n",
       " 8  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Mos...    Coastal Forest   \n",
       " 9  [Cloudy, Cloudy, Mostly Cloudy, Mostly Cloudy,...    Coastal Forest   \n",
       " \n",
       "    Y-Value  Season_Started_Fall  Season_Started_Spring  Season_Started_Summer  \\\n",
       " 0        1                    0                      0                      0   \n",
       " 1        1                    0                      0                      1   \n",
       " 2        1                    0                      0                      0   \n",
       " 3        1                    0                      0                      0   \n",
       " 4        1                    0                      0                      0   \n",
       " 5        1                    0                      0                      1   \n",
       " 6        1                    0                      0                      1   \n",
       " 7        1                    0                      0                      0   \n",
       " 8        1                    0                      1                      0   \n",
       " 9        1                    0                      0                      0   \n",
       " \n",
       "    Season_Started_Winter  \n",
       " 0                      1  \n",
       " 1                      0  \n",
       " 2                      1  \n",
       " 3                      1  \n",
       " 4                      1  \n",
       " 5                      0  \n",
       " 6                      0  \n",
       " 7                      1  \n",
       " 8                      0  \n",
       " 9                      1  ,\n",
       "                     Fire Name  Year Locations Affected  Temperature (F)_min  \\\n",
       " 0                  Cagua Fire  2020                 CA                 71.0   \n",
       " 1               Vietnam Fires  2019                 MA                 79.0   \n",
       " 2             Chile Wildfires  2024                 BC                 73.0   \n",
       " 3             Chile Wildfires  2024                 AB                 75.0   \n",
       " 4             Chile Wildfires  2023                 MB                 63.0   \n",
       " 5           Russian Wildfires  2019                 ON                 57.0   \n",
       " 6  Chilean Patagonia Wildfire  2021                 YT                 43.0   \n",
       " 7             Chile Wildfires  2017                 MA                 72.0   \n",
       " 8         Valparaiso Wildfire  2014                 CA                 46.0   \n",
       " 9          Araucania Wildfire  2012                 BC                  0.0   \n",
       " \n",
       "    Temperature (F)_avg  Temperature (F)_max  Dewpoint (F)_min  \\\n",
       " 0            74.666667                 82.0              75.0   \n",
       " 1            87.250000                 97.0              72.0   \n",
       " 2            77.166667                 82.0               7.0   \n",
       " 3            83.583333                 90.0              52.0   \n",
       " 4            71.333333                 77.0              52.0   \n",
       " 5            60.500000                 63.0              37.0   \n",
       " 6            45.000000                 46.0              37.0   \n",
       " 7            83.666667                 90.0              57.0   \n",
       " 8            55.916667                 70.0              41.0   \n",
       " 9            60.250000                 68.0               0.0   \n",
       " \n",
       "    Dewpoint (F)_avg  Dewpoint (F)_max  Humidity (%)_min  ...  \\\n",
       " 0         76.000000              77.0              53.0  ...   \n",
       " 1         74.416667              77.0              53.0  ...   \n",
       " 2         19.666667              41.0              74.0  ...   \n",
       " 3         54.166667              55.0              31.0  ...   \n",
       " 4         56.583333              59.0              53.0  ...   \n",
       " 5         39.500000              43.0              39.0  ...   \n",
       " 6         38.666667              41.0              71.0  ...   \n",
       " 7         59.500000              63.0              36.0  ...   \n",
       " 8         43.166667              46.0              43.0  ...   \n",
       " 9         53.250000              59.0               0.0  ...   \n",
       " \n",
       "    Percipitation (in)_min  Percipitation (in)_avg  Percipitation (in)_max  \\\n",
       " 0                     0.0                     0.0                     0.0   \n",
       " 1                     0.0                     0.0                     0.0   \n",
       " 2                     0.0                     0.0                     0.0   \n",
       " 3                     0.0                     0.0                     0.0   \n",
       " 4                     0.0                     0.0                     0.0   \n",
       " 5                     0.0                     0.0                     0.0   \n",
       " 6                     0.0                     0.0                     0.0   \n",
       " 7                     0.0                     0.0                     0.0   \n",
       " 8                     0.0                     0.0                     0.0   \n",
       " 9                     0.0                     0.0                     0.0   \n",
       " \n",
       "                                            Condition  Type Of Location  \\\n",
       " 0  [Fair, Fair, Partly Cloudy, Fair, Fair, Partly...         Mountains   \n",
       " 1  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...     Coastal Hills   \n",
       " 2  [Fair, Partly Cloudy, Mostly Cloudy, Fair, Par...         Mountains   \n",
       " 3  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...  Coastal Mountain   \n",
       " 4  [Fair, Fair, Fair, Fair, Windy, Windy, Windy, ...  Coastal Mountain   \n",
       " 5  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...             Hills   \n",
       " 6  [Windy, Windy, Rain, Light Rain, Windy, Light ...    Coastal Forest   \n",
       " 7  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Fai...  Coastal Mountain   \n",
       " 8  [Fair, Fair, Fair, Fair, Fair, Fair, Fair, Mos...    Coastal Forest   \n",
       " 9  [Cloudy, Cloudy, Mostly Cloudy, Mostly Cloudy,...    Coastal Forest   \n",
       " \n",
       "    Y-Value  Season_Started_Fall  Season_Started_Spring  Season_Started_Summer  \\\n",
       " 0        1                    0                      0                      0   \n",
       " 1        1                    0                      0                      1   \n",
       " 2        1                    0                      0                      0   \n",
       " 3        1                    0                      0                      0   \n",
       " 4        1                    0                      0                      0   \n",
       " 5        1                    0                      0                      1   \n",
       " 6        1                    0                      0                      1   \n",
       " 7        1                    0                      0                      0   \n",
       " 8        1                    0                      1                      0   \n",
       " 9        1                    0                      0                      0   \n",
       " \n",
       "    Season_Started_Winter  \n",
       " 0                      1  \n",
       " 1                      0  \n",
       " 2                      1  \n",
       " 3                      1  \n",
       " 4                      1  \n",
       " 5                      0  \n",
       " 6                      0  \n",
       " 7                      1  \n",
       " 8                      0  \n",
       " 9                      1  \n",
       " \n",
       " [10 rows x 28 columns])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # Replace seasons\n",
    "indicator = pd.get_dummies(df['Season Started'], prefix='Season_Started')\n",
    "indicator_stats = pd.get_dummies(num_stats_df['Season Started'], prefix='Season_Started')\n",
    "# indicator, indicator_stats\n",
    "df = df.drop(['Season Started'], axis=1)\n",
    "df = df.join(indicator)\n",
    "num_stats_df = num_stats_df.join(indicator_stats)\n",
    "num_stats_df = num_stats_df.drop(['Season Started'], axis=1)\n",
    "df.head(10), num_stats_df.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Fire Name',\n",
       " 'Year',\n",
       " 'Temperature (F)',\n",
       " 'Dewpoint (F)',\n",
       " 'Humidity (%)',\n",
       " 'Wind Speed (mph)',\n",
       " 'Pressure (in)',\n",
       " 'Percipitation (in)',\n",
       " 'Condition',\n",
       " 'Type Of Location',\n",
       " 'Y-Value',\n",
       " 'Season_Started_Fall',\n",
       " 'Season_Started_Spring',\n",
       " 'Season_Started_Summer',\n",
       " 'Season_Started_Winter',\n",
       " 'Locations_Affected_AB',\n",
       " 'Locations_Affected_AK',\n",
       " 'Locations_Affected_AL',\n",
       " 'Locations_Affected_AZ',\n",
       " 'Locations_Affected_BC',\n",
       " 'Locations_Affected_CA',\n",
       " 'Locations_Affected_CO',\n",
       " 'Locations_Affected_DC',\n",
       " 'Locations_Affected_DK',\n",
       " 'Locations_Affected_FL',\n",
       " 'Locations_Affected_ID',\n",
       " 'Locations_Affected_IL',\n",
       " 'Locations_Affected_Lyon',\n",
       " 'Locations_Affected_MA',\n",
       " 'Locations_Affected_MB',\n",
       " 'Locations_Affected_MI',\n",
       " 'Locations_Affected_MN',\n",
       " 'Locations_Affected_MS',\n",
       " 'Locations_Affected_MT',\n",
       " 'Locations_Affected_NC',\n",
       " 'Locations_Affected_NF',\n",
       " 'Locations_Affected_NJ',\n",
       " 'Locations_Affected_NM',\n",
       " 'Locations_Affected_NT',\n",
       " 'Locations_Affected_NY',\n",
       " 'Locations_Affected_OK',\n",
       " 'Locations_Affected_ON',\n",
       " 'Locations_Affected_OR',\n",
       " 'Locations_Affected_PN',\n",
       " 'Locations_Affected_QC',\n",
       " 'Locations_Affected_SC',\n",
       " 'Locations_Affected_SK',\n",
       " 'Locations_Affected_TN',\n",
       " 'Locations_Affected_TX',\n",
       " 'Locations_Affected_UT',\n",
       " 'Locations_Affected_Utah',\n",
       " 'Locations_Affected_VN',\n",
       " 'Locations_Affected_WA',\n",
       " 'Locations_Affected_WC',\n",
       " 'Locations_Affected_WY',\n",
       " 'Locations_Affected_YT']"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Locations Affected\n",
    "indicator_new = pd.get_dummies(df['Locations Affected'], prefix='Locations_Affected')\n",
    "indicator_stats_new = pd.get_dummies(num_stats_df['Locations Affected'], prefix='Locations_Affected')\n",
    "# indicator, indicator_stats\n",
    "df = df.drop(['Locations Affected'], axis=1)\n",
    "df = df.join(indicator_new)\n",
    "num_stats_df = num_stats_df.join(indicator_stats_new)\n",
    "num_stats_df = num_stats_df.drop(['Locations Affected'], axis=1)\n",
    "#df.head(10), num_stats_df.head(10)\n",
    "df.columns.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Fire Name',\n",
       " 'Year',\n",
       " 'Temperature (F)',\n",
       " 'Dewpoint (F)',\n",
       " 'Humidity (%)',\n",
       " 'Wind Speed (mph)',\n",
       " 'Pressure (in)',\n",
       " 'Percipitation (in)',\n",
       " 'Condition',\n",
       " 'Y-Value',\n",
       " 'Season_Started_Fall',\n",
       " 'Season_Started_Spring',\n",
       " 'Season_Started_Summer',\n",
       " 'Season_Started_Winter',\n",
       " 'Locations_Affected_AB',\n",
       " 'Locations_Affected_AK',\n",
       " 'Locations_Affected_AL',\n",
       " 'Locations_Affected_AZ',\n",
       " 'Locations_Affected_BC',\n",
       " 'Locations_Affected_CA',\n",
       " 'Locations_Affected_CO',\n",
       " 'Locations_Affected_DC',\n",
       " 'Locations_Affected_DK',\n",
       " 'Locations_Affected_FL',\n",
       " 'Locations_Affected_ID',\n",
       " 'Locations_Affected_IL',\n",
       " 'Locations_Affected_Lyon',\n",
       " 'Locations_Affected_MA',\n",
       " 'Locations_Affected_MB',\n",
       " 'Locations_Affected_MI',\n",
       " 'Locations_Affected_MN',\n",
       " 'Locations_Affected_MS',\n",
       " 'Locations_Affected_MT',\n",
       " 'Locations_Affected_NC',\n",
       " 'Locations_Affected_NF',\n",
       " 'Locations_Affected_NJ',\n",
       " 'Locations_Affected_NM',\n",
       " 'Locations_Affected_NT',\n",
       " 'Locations_Affected_NY',\n",
       " 'Locations_Affected_OK',\n",
       " 'Locations_Affected_ON',\n",
       " 'Locations_Affected_OR',\n",
       " 'Locations_Affected_PN',\n",
       " 'Locations_Affected_QC',\n",
       " 'Locations_Affected_SC',\n",
       " 'Locations_Affected_SK',\n",
       " 'Locations_Affected_TN',\n",
       " 'Locations_Affected_TX',\n",
       " 'Locations_Affected_UT',\n",
       " 'Locations_Affected_Utah',\n",
       " 'Locations_Affected_VN',\n",
       " 'Locations_Affected_WA',\n",
       " 'Locations_Affected_WC',\n",
       " 'Locations_Affected_WY',\n",
       " 'Locations_Affected_YT',\n",
       " 'Type_Of_Location_Arctic',\n",
       " 'Type_Of_Location_Coastal',\n",
       " 'Type_Of_Location_Coastal Forest',\n",
       " 'Type_Of_Location_Coastal Hills',\n",
       " 'Type_Of_Location_Coastal Lowland',\n",
       " 'Type_Of_Location_Coastal Mountain',\n",
       " 'Type_Of_Location_Desert',\n",
       " 'Type_Of_Location_Flat',\n",
       " 'Type_Of_Location_Forest',\n",
       " 'Type_Of_Location_Grasslands',\n",
       " 'Type_Of_Location_Hills',\n",
       " 'Type_Of_Location_Mountains',\n",
       " 'Type_Of_Location_Plains',\n",
       " 'Type_Of_Location_Rainforest',\n",
       " 'Type_Of_Location_Swamp']"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Type Of Location\n",
    "indicator_new_loc = pd.get_dummies(df['Type Of Location'], prefix='Type_Of_Location')\n",
    "indicator_stats_new_loc = pd.get_dummies(num_stats_df['Type Of Location'], prefix='Type_Of_Location')\n",
    "# indicator, indicator_stats\n",
    "df = df.drop(['Type Of Location'], axis=1)\n",
    "df = df.join(indicator_new_loc)\n",
    "num_stats_df = num_stats_df.join(indicator_stats_new_loc)\n",
    "num_stats_df = num_stats_df.drop(['Type Of Location'], axis=1)\n",
    "#df.head(10), num_stats_df.head(10)\n",
    "df.columns.tolist()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(['Fire Name',\n",
       "  'Year',\n",
       "  'Temperature (F)',\n",
       "  'Dewpoint (F)',\n",
       "  'Humidity (%)',\n",
       "  'Wind Speed (mph)',\n",
       "  'Pressure (in)',\n",
       "  'Percipitation (in)',\n",
       "  'Condition',\n",
       "  'Y-Value',\n",
       "  'Season_Started_Fall',\n",
       "  'Season_Started_Spring',\n",
       "  'Season_Started_Summer',\n",
       "  'Season_Started_Winter',\n",
       "  'Locations_Affected_AB',\n",
       "  'Locations_Affected_AK',\n",
       "  'Locations_Affected_AL',\n",
       "  'Locations_Affected_AZ',\n",
       "  'Locations_Affected_BC',\n",
       "  'Locations_Affected_CA',\n",
       "  'Locations_Affected_CO',\n",
       "  'Locations_Affected_DC',\n",
       "  'Locations_Affected_DK',\n",
       "  'Locations_Affected_FL',\n",
       "  'Locations_Affected_ID',\n",
       "  'Locations_Affected_IL',\n",
       "  'Locations_Affected_Lyon',\n",
       "  'Locations_Affected_MA',\n",
       "  'Locations_Affected_MB',\n",
       "  'Locations_Affected_MI',\n",
       "  'Locations_Affected_MN',\n",
       "  'Locations_Affected_MS',\n",
       "  'Locations_Affected_MT',\n",
       "  'Locations_Affected_NC',\n",
       "  'Locations_Affected_NF',\n",
       "  'Locations_Affected_NJ',\n",
       "  'Locations_Affected_NM',\n",
       "  'Locations_Affected_NT',\n",
       "  'Locations_Affected_NY',\n",
       "  'Locations_Affected_OK',\n",
       "  'Locations_Affected_ON',\n",
       "  'Locations_Affected_OR',\n",
       "  'Locations_Affected_PN',\n",
       "  'Locations_Affected_QC',\n",
       "  'Locations_Affected_SC',\n",
       "  'Locations_Affected_SK',\n",
       "  'Locations_Affected_TN',\n",
       "  'Locations_Affected_TX',\n",
       "  'Locations_Affected_UT',\n",
       "  'Locations_Affected_Utah',\n",
       "  'Locations_Affected_VN',\n",
       "  'Locations_Affected_WA',\n",
       "  'Locations_Affected_WC',\n",
       "  'Locations_Affected_WY',\n",
       "  'Locations_Affected_YT',\n",
       "  'Type_Of_Location_Arctic',\n",
       "  'Type_Of_Location_Coastal',\n",
       "  'Type_Of_Location_Coastal Forest',\n",
       "  'Type_Of_Location_Coastal Hills',\n",
       "  'Type_Of_Location_Coastal Lowland',\n",
       "  'Type_Of_Location_Coastal Mountain',\n",
       "  'Type_Of_Location_Desert',\n",
       "  'Type_Of_Location_Flat',\n",
       "  'Type_Of_Location_Forest',\n",
       "  'Type_Of_Location_Grasslands',\n",
       "  'Type_Of_Location_Hills',\n",
       "  'Type_Of_Location_Mountains',\n",
       "  'Type_Of_Location_Plains',\n",
       "  'Type_Of_Location_Rainforest',\n",
       "  'Type_Of_Location_Swamp',\n",
       "  'Condition__',\n",
       "  'Condition__Cloudy',\n",
       "  'Condition__Cloudy / Windy',\n",
       "  'Condition__Drifting Snow',\n",
       "  'Condition__Fair',\n",
       "  'Condition__Fair / Windy',\n",
       "  'Condition__Fair Fair',\n",
       "  'Condition__Fog',\n",
       "  'Condition__Haze',\n",
       "  'Condition__Ice Crystals',\n",
       "  'Condition__Light Rain',\n",
       "  'Condition__Light Rain / Windy',\n",
       "  'Condition__Light Rain Shower',\n",
       "  'Condition__Light Rain with Thunder',\n",
       "  'Condition__Light Snow',\n",
       "  'Condition__Mist',\n",
       "  'Condition__Mostly Cloud',\n",
       "  'Condition__Mostly Cloudy',\n",
       "  'Condition__Mostly Cloudy / Windy',\n",
       "  'Condition__Mostly Coudy',\n",
       "  'Condition__N/A',\n",
       "  'Condition__Partly Cloudy',\n",
       "  'Condition__Partly Cloudy / Windy',\n",
       "  'Condition__Patches of Fog',\n",
       "  'Condition__Rain',\n",
       "  'Condition__Showers in the Vicinity',\n",
       "  'Condition__Smoke',\n",
       "  'Condition__Smoke / Windy',\n",
       "  'Condition__T-Storm',\n",
       "  'Condition__Thunder',\n",
       "  'Condition__Thunder in the Vicinity',\n",
       "  'Condition__Windy'],\n",
       " ['Fire Name',\n",
       "  'Year',\n",
       "  'Temperature (F)_min',\n",
       "  'Temperature (F)_avg',\n",
       "  'Temperature (F)_max',\n",
       "  'Dewpoint (F)_min',\n",
       "  'Dewpoint (F)_avg',\n",
       "  'Dewpoint (F)_max',\n",
       "  'Humidity (%)_min',\n",
       "  'Humidity (%)_avg',\n",
       "  'Humidity (%)_max',\n",
       "  'Wind Speed (mph)_min',\n",
       "  'Wind Speed (mph)_avg',\n",
       "  'Wind Speed (mph)_max',\n",
       "  'Pressure (in)_min',\n",
       "  'Pressure (in)_avg',\n",
       "  'Pressure (in)_max',\n",
       "  'Percipitation (in)_min',\n",
       "  'Percipitation (in)_avg',\n",
       "  'Percipitation (in)_max',\n",
       "  'Condition',\n",
       "  'Y-Value',\n",
       "  'Season_Started_Fall',\n",
       "  'Season_Started_Spring',\n",
       "  'Season_Started_Summer',\n",
       "  'Season_Started_Winter',\n",
       "  'Locations_Affected_AB',\n",
       "  'Locations_Affected_AK',\n",
       "  'Locations_Affected_AL',\n",
       "  'Locations_Affected_AZ',\n",
       "  'Locations_Affected_BC',\n",
       "  'Locations_Affected_CA',\n",
       "  'Locations_Affected_CO',\n",
       "  'Locations_Affected_DC',\n",
       "  'Locations_Affected_DK',\n",
       "  'Locations_Affected_FL',\n",
       "  'Locations_Affected_ID',\n",
       "  'Locations_Affected_IL',\n",
       "  'Locations_Affected_Lyon',\n",
       "  'Locations_Affected_MA',\n",
       "  'Locations_Affected_MB',\n",
       "  'Locations_Affected_MI',\n",
       "  'Locations_Affected_MN',\n",
       "  'Locations_Affected_MS',\n",
       "  'Locations_Affected_MT',\n",
       "  'Locations_Affected_NC',\n",
       "  'Locations_Affected_NF',\n",
       "  'Locations_Affected_NJ',\n",
       "  'Locations_Affected_NM',\n",
       "  'Locations_Affected_NT',\n",
       "  'Locations_Affected_NY',\n",
       "  'Locations_Affected_OK',\n",
       "  'Locations_Affected_ON',\n",
       "  'Locations_Affected_OR',\n",
       "  'Locations_Affected_PN',\n",
       "  'Locations_Affected_QC',\n",
       "  'Locations_Affected_SC',\n",
       "  'Locations_Affected_SK',\n",
       "  'Locations_Affected_TN',\n",
       "  'Locations_Affected_TX',\n",
       "  'Locations_Affected_UT',\n",
       "  'Locations_Affected_Utah',\n",
       "  'Locations_Affected_VN',\n",
       "  'Locations_Affected_WA',\n",
       "  'Locations_Affected_WC',\n",
       "  'Locations_Affected_WY',\n",
       "  'Locations_Affected_YT',\n",
       "  'Type_Of_Location_Arctic',\n",
       "  'Type_Of_Location_Coastal',\n",
       "  'Type_Of_Location_Coastal Forest',\n",
       "  'Type_Of_Location_Coastal Hills',\n",
       "  'Type_Of_Location_Coastal Lowland',\n",
       "  'Type_Of_Location_Coastal Mountain',\n",
       "  'Type_Of_Location_Desert',\n",
       "  'Type_Of_Location_Flat',\n",
       "  'Type_Of_Location_Forest',\n",
       "  'Type_Of_Location_Grasslands',\n",
       "  'Type_Of_Location_Hills',\n",
       "  'Type_Of_Location_Mountains',\n",
       "  'Type_Of_Location_Plains',\n",
       "  'Type_Of_Location_Rainforest',\n",
       "  'Type_Of_Location_Swamp',\n",
       "  'Condition__',\n",
       "  'Condition__Cloudy',\n",
       "  'Condition__Cloudy / Windy',\n",
       "  'Condition__Drifting Snow',\n",
       "  'Condition__Fair',\n",
       "  'Condition__Fair / Windy',\n",
       "  'Condition__Fair Fair',\n",
       "  'Condition__Fog',\n",
       "  'Condition__Haze',\n",
       "  'Condition__Ice Crystals',\n",
       "  'Condition__Light Rain',\n",
       "  'Condition__Light Rain / Windy',\n",
       "  'Condition__Light Rain Shower',\n",
       "  'Condition__Light Rain with Thunder',\n",
       "  'Condition__Light Snow',\n",
       "  'Condition__Mist',\n",
       "  'Condition__Mostly Cloud',\n",
       "  'Condition__Mostly Cloudy',\n",
       "  'Condition__Mostly Cloudy / Windy',\n",
       "  'Condition__Mostly Coudy',\n",
       "  'Condition__N/A',\n",
       "  'Condition__Partly Cloudy',\n",
       "  'Condition__Partly Cloudy / Windy',\n",
       "  'Condition__Patches of Fog',\n",
       "  'Condition__Rain',\n",
       "  'Condition__Showers in the Vicinity',\n",
       "  'Condition__Smoke',\n",
       "  'Condition__Smoke / Windy',\n",
       "  'Condition__T-Storm',\n",
       "  'Condition__Thunder',\n",
       "  'Condition__Thunder in the Vicinity',\n",
       "  'Condition__Windy'])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Conditions\n",
    "df_cur = pd.get_dummies(df['Condition'].apply(pd.Series).stack(), prefix='Condition_').groupby(level=0).sum()\n",
    "num_stats_df_cr = pd.get_dummies(num_stats_df['Condition'].apply(pd.Series).stack(), prefix='Condition_').groupby(level=0).sum()\n",
    "df = pd.concat([df, df_cur], axis=1)\n",
    "num_stats_df = pd.concat([num_stats_df, num_stats_df_cr], axis=1)\n",
    "df.columns.tolist(), num_stats_df.columns.tolist()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Feature Scaling"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We were going to feature scale for all of our data, but it lead to our SVM model to be too computationally expensive and lead to it running indefinitely, thus we used feature scaling on KNN and Logistic Regression, but not SVM. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# scaler = StandardScaler()\n",
    "\n",
    "# Features = num_stats_df.drop(columns=['Y-Value', 'Fire Name', 'Condition']).columns.tolist()\n",
    "# num_stats_df[Features] = scaler.fit_transform(num_stats_df[Features])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model Training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### KNN Without StandardScaling"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Scaling features can affect the performance of k-nearest neighbors (KNN) algorithms similarly to support vector machines (SVMs), although the impact may not be as pronounced. KNN relies on distance metrics to measure the similarity between data points, and when features are on different scales, those with larger magnitudes may dominate the distance calculation, leading to biased results. Feature scaling ensures that all features contribute equally to distance computations, helping to mitigate this bias.\n",
    "\n",
    "So we will doing a KNN model with standard scaling and one without to see the performance difference.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ACC:  0.8730163934426229\n",
      "ACC:  0.8192459016393441\n",
      "ACC:  0.8062622950819673\n",
      "ACC:  0.7880655737704919\n",
      "ACC:  0.7918688524590164\n",
      "ACC:  0.7867540983606558\n",
      "ACC:  0.7824918032786886\n",
      "ACC:  0.7752786885245903\n",
      "ACC:  0.7807213114754099\n",
      "Best K:  1\n"
     ]
    }
   ],
   "source": [
    "# Initialize lists to store mean accuracy for each K\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "mean_accuracies = []\n",
    "num_stats_df.columns.tolist()\n",
    "column_types = num_stats_df.dtypes\n",
    "k_values = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
    "\n",
    "# Perform bootstrapping and cross-validation for each K\n",
    "for k in k_values:\n",
    "    accuracies = []\n",
    "    for _ in range(100):  # Perform bootstrapping with replacement 100 times\n",
    "        # Generate random indices for bootstrapping\n",
    "        target_var = 'Y-Value'\n",
    "        num_stats_df.columns.tolist()\n",
    "        \n",
    "        # Determining Train Test Indices with Bootstrap\n",
    "        df_bootstrapped = num_stats_df.sample(n=len(num_stats_df), replace=True)\n",
    "        X = df_bootstrapped.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "        y = df_bootstrapped[target_var]\n",
    "        \n",
    "        # Create KNN classifier with current K\n",
    "        knn = KNeighborsClassifier(n_neighbors=k)\n",
    "        \n",
    "        # Perform cross-validation\n",
    "        scores = cross_val_score(knn, X, y, cv=5)\n",
    "        \n",
    "        # Calculate mean accuracy and store\n",
    "        accuracies.append(scores.mean())\n",
    "    \n",
    "    # Calculate mean accuracy across bootstraps for current K\n",
    "    mean_accuracies.append(np.mean(accuracies))\n",
    "\n",
    "# Find the best K based on mean accuracy\n",
    "for acc in mean_accuracies:\n",
    "    print(\"ACC: \", acc)\n",
    "best_k = k_values[np.argmax(mean_accuracies)]\n",
    "print(\"Best K: \", best_k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE of KNN:  0.2459016393442623\n",
      "The accuracy of KNN W/O Scaling model is  0.7540983606557377\n",
      "Precision: 0.8076923076923077\n",
      "Recall: 0.6774193548387096\n",
      "Accuracy: 0.7540983606557377\n",
      "F1: 0.7368421052631579\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.71      0.83      0.77        30\n",
      "           1       0.81      0.68      0.74        31\n",
      "\n",
      "    accuracy                           0.75        61\n",
      "   macro avg       0.76      0.76      0.75        61\n",
      "weighted avg       0.76      0.75      0.75        61\n",
      "\n"
     ]
    },
    {
     "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>Truth</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Predicted</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>25</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10</td>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Truth       0   1\n",
       "Predicted        \n",
       "0          25   5\n",
       "1          10  21"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "from ISLP import confusion_table\n",
    "from ISLP.models import contrast\n",
    "from sklearn import metrics\n",
    "\n",
    "target_var = 'Y-Value'\n",
    "\n",
    "# Determining Train Test Indices\n",
    "X = num_stats_df.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "y = num_stats_df[target_var]\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "\n",
    "# Create KNN classifier with current K\n",
    "knn = KNeighborsClassifier(n_neighbors=best_k)\n",
    "\n",
    "knn1_pred = knn.fit(X_train, y_train).predict(X_test)\n",
    "np.mean(y_test != knn1_pred), np.mean(y_test != \"No\")\n",
    "print('MSE of KNN: ', metrics.mean_squared_error(y_test, knn1_pred))\n",
    "\n",
    "# Calculate mean accuracy and store\n",
    "acc = metrics.accuracy_score(y_test,knn1_pred)\n",
    "print('The accuracy of KNN W/O Scaling model is ', acc)\n",
    "\n",
    "print('Precision:', metrics.precision_score(y_test, knn1_pred))\n",
    "print('Recall:', metrics.recall_score(y_test, knn1_pred))\n",
    "print('Accuracy:', metrics.accuracy_score(y_test, knn1_pred))\n",
    "print('F1:', metrics.f1_score(y_test, knn1_pred))\n",
    "print(metrics.classification_report(y_test, knn1_pred))\n",
    "confusion_table(y_test, knn1_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### KNN With Scaling"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will use bootstrapping and cross validation several times to find the overall best K-neighbours for our model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ACC:  0.8545573770491803\n",
      "ACC:  0.7868852459016391\n",
      "ACC:  0.7706557377049178\n",
      "ACC:  0.7448196721311474\n",
      "ACC:  0.75072131147541\n",
      "ACC:  0.7359016393442623\n",
      "ACC:  0.7292459016393441\n",
      "ACC:  0.7353114754098362\n",
      "ACC:  0.7234754098360656\n",
      "Best K:  1\n"
     ]
    }
   ],
   "source": [
    "# Initialize lists to store mean accuracy for each K\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "mean_accuracies = []\n",
    "num_stats_df.columns.tolist()\n",
    "column_types = num_stats_df.dtypes\n",
    "scaler = StandardScaler()\n",
    "k_values = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
    "\n",
    "# Perform bootstrapping and cross-validation for each K\n",
    "for k in k_values:\n",
    "    accuracies = []\n",
    "    for _ in range(100):  # Perform bootstrapping with replacement 100 times\n",
    "        # Generate random indices for bootstrapping\n",
    "        target_var = 'Y-Value'\n",
    "        num_stats_df.columns.tolist()\n",
    "        \n",
    "        # Determining Train Test Indices with Bootstrap\n",
    "        df_bootstrapped = num_stats_df.sample(n=len(num_stats_df), replace=True)\n",
    "        X = df_bootstrapped.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "        y = df_bootstrapped[target_var]\n",
    "        X_scaled = scaler.fit_transform(X)\n",
    "        \n",
    "        # Create KNN classifier with current K\n",
    "        knn_scaled = KNeighborsClassifier(n_neighbors=k)\n",
    "        \n",
    "        # Perform cross-validation\n",
    "        scores = cross_val_score(knn_scaled, X_scaled, y, cv=5)\n",
    "        \n",
    "        # Calculate mean accuracy and store\n",
    "        accuracies.append(scores.mean())\n",
    "    \n",
    "    # Calculate mean accuracy across bootstraps for current K\n",
    "    mean_accuracies.append(np.mean(accuracies))\n",
    "\n",
    "# Find the best K based on mean accuracy\n",
    "for acc in mean_accuracies:\n",
    "    print(\"ACC: \", acc)\n",
    "best_k_scaled = k_values[np.argmax(mean_accuracies)]\n",
    "print(\"Best K: \", best_k_scaled)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Having found our best K-neighbours from above, we will now fit it against our actual data and generate stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE of KNN:  0.29508196721311475\n",
      "The accuracy of KNN model is  0.7049180327868853\n",
      "Precision: 0.696969696969697\n",
      "Recall: 0.7419354838709677\n",
      "Accuracy: 0.7049180327868853\n",
      "F1: 0.71875\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.71      0.67      0.69        30\n",
      "           1       0.70      0.74      0.72        31\n",
      "\n",
      "    accuracy                           0.70        61\n",
      "   macro avg       0.71      0.70      0.70        61\n",
      "weighted avg       0.71      0.70      0.70        61\n",
      "\n"
     ]
    },
    {
     "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>Truth</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Predicted</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Truth       0   1\n",
       "Predicted        \n",
       "0          20  10\n",
       "1           8  23"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "from ISLP import confusion_table\n",
    "from ISLP.models import contrast\n",
    "from sklearn import metrics\n",
    "\n",
    "target_var = 'Y-Value'\n",
    "scaler = StandardScaler()\n",
    "\n",
    "# Determining Train Test Indices\n",
    "X = num_stats_df.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "y = num_stats_df[target_var]\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_test_scaled = scaler.transform(X_test)\n",
    "\n",
    "# Create KNN classifier with current K\n",
    "knn_scaled = KNeighborsClassifier(n_neighbors=best_k_scaled)\n",
    "\n",
    "knn1_pred_scaled = knn_scaled.fit(X_train_scaled, y_train).predict(X_test_scaled)\n",
    "np.mean(y_test != knn1_pred_scaled), np.mean(y_test != \"No\")\n",
    "print('MSE of KNN: ', metrics.mean_squared_error(y_test, knn1_pred_scaled))\n",
    "\n",
    "# Calculate mean accuracy and store\n",
    "acc = metrics.accuracy_score(y_test,knn1_pred_scaled)\n",
    "print('The accuracy of KNN model is ', acc)\n",
    "\n",
    "print('Precision:', metrics.precision_score(y_test, knn1_pred_scaled))\n",
    "print('Recall:', metrics.recall_score(y_test, knn1_pred_scaled))\n",
    "print('Accuracy:', metrics.accuracy_score(y_test, knn1_pred_scaled))\n",
    "print('F1:', metrics.f1_score(y_test, knn1_pred_scaled))\n",
    "print(metrics.classification_report(y_test, knn1_pred_scaled))\n",
    "confusion_table(y_test, knn1_pred_scaled)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will use bootstrapping and MSE several times to find the overall best threshold for our model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lowest MSE:  0.1598032786885246\n",
      "Best threshold for MSE: 0.5\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn import metrics \n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# Initialize lists to store mean squared error and corresponding thresholds\n",
    "mean_mse = []\n",
    "best_threshold = None\n",
    "min_mse = float('inf')\n",
    "scaler = StandardScaler()\n",
    "target_var = 'Y-Value'\n",
    "\n",
    "thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]\n",
    "\n",
    "# Perform bootstrapping and cross-validation\n",
    "for threshold in thresholds:\n",
    "    mse_values = []\n",
    "    for _ in range(1000): \n",
    "        df_bootstrapped = num_stats_df.sample(n=len(num_stats_df), replace=True)\n",
    "        X = df_bootstrapped.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "        y = df_bootstrapped[target_var]\n",
    "\n",
    "        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "        X_train_scaled = scaler.fit_transform(X_train)\n",
    "        X_test_scaled = scaler.transform(X_test)\n",
    "        \n",
    "        # Fit the logistic regression model\n",
    "        model_logistic = LogisticRegression(max_iter=1000)\n",
    "        model_logistic.fit(X_train_scaled, y_train)\n",
    "        \n",
    "        # Predict probability\n",
    "        probabilities = model_logistic.predict_proba(X_test_scaled)[:, 1]\n",
    "        \n",
    "        # Assign Prediction based on threshold\n",
    "        prediction = (probabilities >= threshold).astype(int)\n",
    "        \n",
    "        # Calculate MSE\n",
    "        mse = metrics.mean_squared_error(y_test, prediction)\n",
    "        mse_values.append(mse)\n",
    "    \n",
    "    # Calculate mean MSE for the current threshold\n",
    "    mean_mse_val = np.mean(mse_values)\n",
    "    mean_mse.append((mean_mse_val, threshold))  # Store MSE along with the threshold\n",
    "    \n",
    "    # Check if current MSE is the lowest\n",
    "    if mean_mse_val < min_mse:\n",
    "        min_mse = mean_mse_val\n",
    "        best_threshold = threshold\n",
    "\n",
    "# Print the best threshold for MSE\n",
    "print(\"Lowest MSE: \", min_mse)\n",
    "print(\"Best threshold for MSE:\", best_threshold)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Having found our best threshold from above, we will now fit it against our actual data and generate stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE of logistic regression:  0.16393442622950818\n",
      "Precision: 0.8620689655172413\n",
      "Recall: 0.8064516129032258\n",
      "Accuracy: 0.8360655737704918\n",
      "F1: 0.8333333333333334\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.81      0.87      0.84        30\n",
      "           1       0.86      0.81      0.83        31\n",
      "\n",
      "    accuracy                           0.84        61\n",
      "   macro avg       0.84      0.84      0.84        61\n",
      "weighted avg       0.84      0.84      0.84        61\n",
      "\n"
     ]
    },
    {
     "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>Truth</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Predicted</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>26</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Truth       0   1\n",
       "Predicted        \n",
       "0          26   4\n",
       "1           6  25"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn import metrics \n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "target_var = 'Y-Value'\n",
    "X = num_stats_df.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "y = num_stats_df[target_var]\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_test_scaled = scaler.transform(X_test)\n",
    "\n",
    "# Fit the logistic regression model\n",
    "model = LogisticRegression(max_iter=1000)\n",
    "model.fit(X_train_scaled, y_train)\n",
    "\n",
    "# Predict probabilities\n",
    "probabilities = model.predict_proba(X_test_scaled)[:, 1]\n",
    "\n",
    "# Assign predictions based on the specified threshold\n",
    "prediction = (probabilities >= best_threshold).astype(int)\n",
    "\n",
    "# Calculate MSE\n",
    "mse = metrics.mean_squared_error(prediction, y_test)\n",
    "print('MSE of logistic regression: ', mse)\n",
    "\n",
    "# Print evaluation metrics\n",
    "print('Precision:', metrics.precision_score(y_test, prediction))\n",
    "print('Recall:', metrics.recall_score(y_test, prediction))\n",
    "print('Accuracy:', metrics.accuracy_score(y_test, prediction))\n",
    "print('F1:', metrics.f1_score(y_test, prediction))\n",
    "print(metrics.classification_report(y_test, prediction))\n",
    "confusion_table(y_test, prediction)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Support Vector Machines\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will use bootstrapping and MSE several times to find the overall best kernel and its corresponding hyperparameters for our model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best SVM parameters: {'kernel': 'rbf', 'C': 10, 'gamma': 0.001}\n",
      "Best MSE: 0.1278688524590164\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import StratifiedKFold, train_test_split\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.metrics import accuracy_score\n",
    "import numpy as np\n",
    "\n",
    "target_var = 'Y-Value'\n",
    "best_mse = float('inf')\n",
    "best_params = {}\n",
    "\n",
    "# Linear SVC\n",
    "for C in [0.001,0.01,0.1,1,5,10,100]:\n",
    "    mses = []\n",
    "    settings = {'kernel': 'linear', 'C': C}\n",
    "    for _ in range(10):\n",
    "        df_bootstrapped = num_stats_df.sample(n=len(num_stats_df), replace=True)\n",
    "        X = df_bootstrapped.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "        y = df_bootstrapped[target_var]\n",
    "        \n",
    "        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "        \n",
    "        svm_lin = SVC(kernel='linear', C=C)\n",
    "        svm_lin.fit(X_train, y_train)\n",
    "        lin_pred = svm_lin.predict(X_test)\n",
    "        mse = metrics.mean_squared_error(y_test, lin_pred)\n",
    "        mses.append(mse)\n",
    "    avg_score = np.mean(mses)\n",
    "    if avg_score < best_mse:\n",
    "        best_mse = avg_score\n",
    "        best_params = settings.copy()\n",
    "\n",
    "# Poly SVC\n",
    "for C in [0.001,0.01,0.1,1,5,10,100]:\n",
    "    for d in range(len(num_stats_df.columns)):\n",
    "        mses = []\n",
    "        settings = {'kernel': 'poly', 'C': C, 'degree': d}\n",
    "        for _ in range(10):\n",
    "            df_bootstrapped = num_stats_df.sample(n=len(num_stats_df), replace=True)\n",
    "            X = df_bootstrapped.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "            y = df_bootstrapped[target_var]\n",
    "            \n",
    "            X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "        \n",
    "            svm_poly = SVC(kernel='poly', C=C, degree=d)\n",
    "            svm_poly.fit(X_train, y_train)\n",
    "            poly_pred = svm_poly.predict(X_test)\n",
    "            mse = metrics.mean_squared_error(y_test, poly_pred)\n",
    "            mses.append(mse)\n",
    "        avg_score = np.mean(mses)\n",
    "        if avg_score < best_mse:\n",
    "            best_mse = avg_score\n",
    "            best_params = settings.copy()\n",
    "\n",
    "# RBF SVC\n",
    "for C in [0.001,0.01,0.1,1,5,10,100]:\n",
    "    for g in [0.001, 0.01, 0.1, 1, 10, 100, 1000]:\n",
    "        mses = []\n",
    "        settings = {'kernel': 'rbf', 'C': C, 'gamma': g}\n",
    "        for _ in range(10):\n",
    "            df_bootstrapped = num_stats_df.sample(n=len(num_stats_df), replace=True)\n",
    "            X = df_bootstrapped.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "            y = df_bootstrapped[target_var]\n",
    "            \n",
    "            X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "            \n",
    "            svm_rbf = SVC(kernel='rbf', C=C, gamma=g)\n",
    "            svm_rbf.fit(X_train, y_train)\n",
    "            rbf_pred = svm_rbf.predict(X_test)\n",
    "            mse = metrics.mean_squared_error(y_test, rbf_pred)\n",
    "            mses.append(mse)\n",
    "        avg_score = np.mean(mses)\n",
    "        if avg_score < best_mse:\n",
    "            best_mse = avg_score\n",
    "            best_params = settings.copy()\n",
    "\n",
    "print(\"Best SVM parameters:\", best_params)\n",
    "print(\"Best MSE:\", best_mse)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Having found our best kernel and its corresponding hyperparameters from above, we will now fit it against our actual data and generate stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE of svm regression:  0.21311475409836064\n",
      "The accuracy of svm model is  0.7868852459016393\n",
      "Precision: 0.8461538461538461\n",
      "Recall: 0.7096774193548387\n",
      "Accuracy: 0.7868852459016393\n",
      "F1: 0.7719298245614035\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.74      0.87      0.80        30\n",
      "           1       0.85      0.71      0.77        31\n",
      "\n",
      "    accuracy                           0.79        61\n",
      "   macro avg       0.79      0.79      0.79        61\n",
      "weighted avg       0.80      0.79      0.79        61\n",
      "\n"
     ]
    },
    {
     "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>Truth</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Predicted</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>26</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>9</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Truth       0   1\n",
       "Predicted        \n",
       "0          26   4\n",
       "1           9  22"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Using our best Accuracy score for SVM, we will build out the SVM with our non-bootstrapped data\n",
    "target_var = 'Y-Value'\n",
    "X = num_stats_df.drop(columns=['Y-Value', 'Fire Name', 'Condition'])\n",
    "y = num_stats_df[target_var]\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=101)\n",
    "\n",
    "# Fit the model\n",
    "model_svm = SVC(kernel='rbf', C=best_params['C'], gamma=best_params['gamma'], probability=True)\n",
    "model_svm.fit(X_train, y_train)\n",
    "predict_svm = model_svm.predict(X_test)\n",
    "\n",
    "mse = metrics.mean_squared_error(y_test, predict_svm)\n",
    "print('MSE of svm regression: ', mse)\n",
    "\n",
    "# Calculate accuracy\n",
    "acc = metrics.accuracy_score(y_test, predict_svm)\n",
    "print('The accuracy of svm model is ', acc)\n",
    "\n",
    "print('Precision:', metrics.precision_score(y_test, predict_svm))\n",
    "print('Recall:', metrics.recall_score(y_test, predict_svm))\n",
    "print('Accuracy:', metrics.accuracy_score(y_test, predict_svm))\n",
    "print('F1:', metrics.f1_score(y_test, predict_svm))\n",
    "print(metrics.classification_report(y_test, predict_svm))\n",
    "confusion_table(y_test, predict_svm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data Visualization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Confusion matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "KNN\n",
      "KNN SCALED\n",
      "Logistic\n",
      "SVM\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x7f5512365b10>"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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6t7ftWtXj3HxTz75RCUlJUpISPC4TlVVlXbu3KkjR45o3759Ht9gj4qK0qWXXnpKe/2koqIiRUZGqnfv3l7HXVJSomPHjuk3v/mNx/bq6mr97Gc/kyRt3779lG/B9+zZ0+t7nPTOO+9o9uzZ2rlzpyoqKnTixAklJiZ6HJORkaGWLVt63McwDBUXFyshIUE7d+7UHXfcobvuust9zIkTJ5SUlGQ5HgDWkcgRtvr06aO5c+cqOjpaaWlpiory/HWPi4vzWK+oqFD37t311ltvnXKt8847r04xxMbGWj6noqJCkvThhx96JFCpdtzfXzZs2KChQ4dq2rRp6tevn5KSkvT222/rmWeesRzryy+/fMofFpGRkX6LFcCZkcgRtuLi4tS+fXuvj//5z3+ud955Ry1atDilKj3p/PPP16ZNm9SrVy9JtZXnli1b9POf//y0x3ft2lWGYWjNmjXKzs4+Zf/JjoDL5XJv69y5s5xOp3bv3n3GSr5Tp07uiXsnbdy48dw/5H9Zv369WrdurUceecS97auvvjrluN27d2vv3r1KS0tz3yciIkIdOnRQSkqK0tLS9OWXX2ro0KGW7g/AP5jsBvxo6NChat68uQYNGqS1a9eqtLRUq1ev1ujRo/X1119Lku6//349/vjjWrx4sXbs2KH77rvvrM+At2nTRjk5Obr99tu1ePFi9zXfffddSVLr1q3lcDi0bNkyffPNN6qoqFBCQoIefPBBjR07Vq+//rp27typrVu3as6cOe4JZPfcc4+++OILjRs3TsXFxVq4cKEKCgos/bwXXnihdu/erbfffls7d+7U7NmzTztxLyYmRjk5Ofrkk0+0du1ajR49WjfeeKNSU1MlSdOmTVNeXp5mz56tzz//XP/61780f/58Pfvss5biAVA3JHLgR40bN1ZhYaEyMjI0ZMgQderUSXfccYeqqqrcFfoDDzygYcOGKScnRz179lRCQoKuu+66s1537ty5uuGGG3TfffepY8eOuuuuu1RZWSlJatmypaZNm6YJEyYoJSVFI0eOlCRNnz5dkyZNUl5enjp16qSrr75aH374odq2bSupdtz6vffe0+LFi5WZmal58+bpscces/TzDhw4UGPHjtXIkSPVrVs3rV+/XpMmTTrluPbt22vIkCG65ppr1LdvX11yySUej5fdeeedeuWVVzR//nx17dpVvXv3VkFBgTtWAPXLYZ5plg4AAAh6VOQAAIQwEjkAACGMRA4AQAgjkQMAEMJI5AAAhDASOQAAIYxEDgBACCORAwAQwkjkAACEMBI5AAAhjEQOAEAI+/84T/1dapeZZAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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rsbz+/fvL5vNpvT0dMXGxlY7frHyYLVa7W19+/aVv7+/8vLyaq0YXH311fbFixft3bv38l/yJ3bv3q2uXbvqmWeesbcdPXq02nl5eXk6fvy4IiIi7J/j4+Oj3r17KzQ0VBEREfr66681YcIEpz4fgPew4A/40YQJE9ShQweNGTNGO3fuVE5OjrZv365HHnlEx44dkyQ9+uij+v3vf69Nmzbp8OHD+t3vfnfJe/S7deumhIQE3X///dq0aZP9mu+8844kqWvXrrJYLNqyZYtOnjypkpISBQUFaebMmXrsscf05ptvKjs7WwcPHtSf/vQn+yK6Bx98UEeOHNGsWbOUmZmpdevWKSUlxanve9VVVykvL0/r169Xdna2li1bVuPixYCAACUkJOif//yndu7cqUceeUR33323wsLCJEkLFixQcnKyli1bpv/85z/68ssvtWbNGr388stOxQOg4ZD8gR+1atVKO3bsUJcuXTRu3DhdffXVmjJlisrKyuyVgMcff1z/9V//pYSEBMXExCgoKEh33nnnJa+7cuVK3XXXXfrd736nPn36aOrUqSotLZUkXXnllVqwYIGeeuophYaGKjExUZK0aNEizZkzR8nJybr66qs1atQoffjhh+revbukC/Pw7733njZt2qSBAwdq1apVev755536vnfccYcee+wxJSYmatCgQdq9e7fmzJlT7byoqCiNGzdOv/zlLzVy5EgNGDDA4Va+Bx54QK+//rrWrFmj/v3767bbblNKSoo9VgCNj8WobaUSAABolhj5AwBgMiR/AABMhuQPAIDJkPwBADAZkj8AACZD8gcAwGRI/gAAmAzJHwAAkyH5AwBgMiR/AABMhuQPAIDJ/P9t2fyRX+QVBwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matrix_knn = metrics.confusion_matrix(y_test, knn1_pred)\n",
    "\n",
    "matrix_knn_scaled = metrics.confusion_matrix(y_test, knn1_pred_scaled)\n",
    "\n",
    "matrix_log = metrics.confusion_matrix(y_test, prediction)\n",
    "\n",
    "matrix_svm = metrics.confusion_matrix(y_test, predict_svm)\n",
    "\n",
    "print(\"KNN\")\n",
    "disp_knn = metrics.ConfusionMatrixDisplay(confusion_matrix=matrix_knn)\n",
    "disp_knn.plot()\n",
    "\n",
    "print(\"KNN SCALED\")\n",
    "disp_knn = metrics.ConfusionMatrixDisplay(confusion_matrix=matrix_knn_scaled)\n",
    "disp_knn.plot()\n",
    "\n",
    "print(\"Logistic\")\n",
    "disp_log = metrics.ConfusionMatrixDisplay(confusion_matrix=matrix_log)\n",
    "disp_log.plot()\n",
    "\n",
    "print(\"SVM\")\n",
    "disp_svm = metrics.ConfusionMatrixDisplay(confusion_matrix=matrix_svm)\n",
    "disp_svm.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "KNN Precision: 0.8076923076923077\n",
      "KNN Recall: 0.6774193548387096\n",
      "KNN Accuracy: 0.7540983606557377\n",
      "KNN F1: 0.7368421052631579\n",
      "\n",
      "KNN Scaled Precision: 0.696969696969697\n",
      "KNN Scaled Recall: 0.7419354838709677\n",
      "KNN Scaled Accuracy: 0.7049180327868853\n",
      "KNN Scaled F1: 0.71875\n",
      "\n",
      "LOG Precision: 0.8620689655172413\n",
      "LOG Recall: 0.8064516129032258\n",
      "LOG Accuracy: 0.8360655737704918\n",
      "LOG F1: 0.8333333333333334\n",
      "\n",
      "SVM Precision: 0.8461538461538461\n",
      "SVM Recall: 0.7096774193548387\n",
      "SVM Accuracy: 0.7868852459016393\n",
      "SVM F1: 0.7719298245614035\n"
     ]
    }
   ],
   "source": [
    "print('KNN Precision:', metrics.precision_score(y_test, knn1_pred))\n",
    "print('KNN Recall:', metrics.recall_score(y_test, knn1_pred))\n",
    "print('KNN Accuracy:', metrics.accuracy_score(y_test, knn1_pred))\n",
    "print('KNN F1:', metrics.f1_score(y_test, knn1_pred))\n",
    "print('')\n",
    "print('KNN Scaled Precision:', metrics.precision_score(y_test, knn1_pred_scaled))\n",
    "print('KNN Scaled Recall:', metrics.recall_score(y_test, knn1_pred_scaled))\n",
    "print('KNN Scaled Accuracy:', metrics.accuracy_score(y_test, knn1_pred_scaled))\n",
    "print('KNN Scaled F1:', metrics.f1_score(y_test, knn1_pred_scaled))\n",
    "print('')\n",
    "print('LOG Precision:', metrics.precision_score(y_test, prediction))\n",
    "print('LOG Recall:', metrics.recall_score(y_test, prediction))\n",
    "print('LOG Accuracy:', metrics.accuracy_score(y_test, prediction))\n",
    "print('LOG F1:', metrics.f1_score(y_test, prediction))\n",
    "print('')\n",
    "print('SVM Precision:', metrics.precision_score(y_test, predict_svm))\n",
    "print('SVM Recall:', metrics.recall_score(y_test, predict_svm))\n",
    "print('SVM Accuracy:', metrics.accuracy_score(y_test, predict_svm))\n",
    "print('SVM F1:', metrics.f1_score(y_test, predict_svm))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### P-value analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(f_classif) Most significant features: ['Temperature (F)_min' 'Temperature (F)_avg' 'Temperature (F)_max'\n",
      " 'Humidity (%)_min' 'Humidity (%)_avg']\n",
      "Temperature (F)_max: 3.534571252453644e-22\n",
      "Temperature (F)_avg: 2.022333165555587e-19\n",
      "Humidity (%)_min: 1.377447265595099e-16\n",
      "Humidity (%)_avg: 4.278299017511215e-15\n",
      "Temperature (F)_min: 1.5785303903883146e-11\n",
      "Humidity (%)_max: 7.985549081210641e-07\n",
      "Locations_Affected_CA: 1.366717213722277e-05\n",
      "Condition__Fair: 2.0042056317093447e-05\n",
      "Season_Started_Summer: 5.152741105581222e-05\n",
      "Season_Started_Winter: 0.0002458184579612514\n",
      "Dewpoint (F)_max: 0.0002871661878636925\n",
      "Condition__Cloudy: 0.0003126861462529414\n",
      "Type_Of_Location_Arctic: 0.0005531254069897448\n",
      "Locations_Affected_ON: 0.0008640711504199636\n",
      "Dewpoint (F)_avg: 0.001703512407733391\n",
      "Type_Of_Location_Flat: 0.0034757913453155077\n",
      "Locations_Affected_CO: 0.004703797613177441\n",
      "Locations_Affected_NT: 0.00476712353220026\n",
      "Condition__Light Rain: 0.012941899749140024\n",
      "Condition__Mist: 0.019229408747062412\n"
     ]
    }
   ],
   "source": [
    "# Import the packages\n",
    "from sklearn.feature_selection import SelectKBest\n",
    "from sklearn.feature_selection import f_classif\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "# Initiate the SelectKBest model\n",
    "kbest_fc = SelectKBest(score_func=f_classif, k=5)\n",
    "\n",
    "# Fit the model to all data\n",
    "kbest_new = kbest_fc.fit(X, y)\n",
    "\n",
    "# Check the most significant features\n",
    "print('(f_classif) Most significant features: ' + str(kbest_new.get_feature_names_out()))\n",
    "sorted_pvalues = list(zip(X.columns, kbest_new.pvalues_))\n",
    "sorted_pvalues.sort(key=lambda tup: tup[1])\n",
    "\n",
    "# Print 20 most significant values\n",
    "for column, pvalue in sorted_pvalues[:20]:\n",
    "    print(f'{column}: {pvalue}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ROC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sklearn.metrics._plot.roc_curve.RocCurveDisplay at 0x7f553391fc10>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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t7Ozo7CwMKXbDhs2jL766iuFZadPnyYzMzPKyMhQuk3B/d+7d49q1qxJTZs2JSIiDw8PmjlzpsI27733Ho0cOZKIiL799ltq3749yWQypfsHQLt27SIioocPHxIAunbtmsI6Badp6tGjB33xxRfy56tXryYPDw+SSqVERPThhx/SrFmzFPbx+++/k7u7u9IYiHLntTMzMyNbW1uytraWT3OzaNGiIrchIho1ahR99tlnRcaad2x/f3+FzyArK4tEIhEdOXKk2P0zRkTEY4DMqLVr1w4rV66UP7e1tQWQezY0e/Zs3L17F6mpqcjJyUFmZibS09NhY2NTaD9jxozBl19+id9//11+Ga9atWoAci+P3rhxA1u2bJGvT0SQyWR4+PAhateurTS2lJQUVKhQATKZDJmZmXj//fexbt06pKam4smTJ2jVqpXC+q1atcL169cB5F6+7NixI/z9/dG5c2d8/PHH6NSpU5k+qwEDBmD48OH47bffYGVlhS1btqBv377ymcmvX7+Os2fPKpzxSaXSYj83APD398fevXuRmZmJzZs3IyoqCt9++63COitWrEBoaCgSExORkZEBiUSCgICAYuO9fv06YmNjYWdnp7A8MzMTDx48KMUnwEwNJ0Bm1GxtbVG9enWFZfHx8fj444/x9ddfY+bMmXBycsKZM2cwbNgwSCQSpV/kP//8M/r3748DBw7g0KFDCAkJQXh4OD755BO8e/cO//vf/zB69OhC21WtWrXI2Ozs7BAZGQkzMzO4u7tDJBIBAFJTU0t8X40bN8bDhw9x6NAhHDt2DL1790aHDh2wY8eOErctSrdu3UBEOHDgAN577z2cPn0a//d//yd//d27d/jll1/w6aefFtrW2tq6yP0KhUL538GcOXPQtWtX/PLLL5g+fToAIDw8HGPHjsXChQvRokUL2NnZYf78+bh48WKx8b579w5NmjRR+MUjj74UOjH9xgmQmZyrV69CJpNh4cKF8rObvPGm4tSsWRM1a9bEDz/8gH79+mHDhg345JNP0LhxY0RHRxdKtCUxMzNTuo29vT08PDxw9uxZtGnTRr787NmzCAwMVFivT58+6NOnDz7//HN07twZycnJcHJyUthf3nibVCotNh5ra2t8+umn2LJlC2JjY+Hv74/GjRvLX2/cuDFiYmLUfp8FTZkyBe3bt8fXX38tf58tW7bEyJEj5esUPIMTCoWF4m/cuDG2bdsGFxcX2NvblykmZpq4CIaZnOrVqyM7OxvLli1DXFwcfv/9d6xatarI9TMyMvDNN9/g5MmTSEhIwNmzZ3H58mX5pc3x48fj3Llz+OabbxAVFYX79+9jz549ahfB5PfTTz9h7ty52LZtG2JiYjBhwgRERUXhu+++AwAsWrQIf/zxB+7evYt79+7hzz//hJubm9Kb911cXCASiXD48GE8e/YMKSkpRR53wIABOHDgAEJDQ+XFL3mmTZuGTZs24ZdffsHt27dx584dhIeHY8qUKWq9txYtWqBBgwaYNWsWAKBGjRq4cuUKjhw5gnv37mHq1Km4fPmywjY+Pj64ceMGYmJi8PLlS2RnZ2PAgAFwdnZGjx49cPr0aTx8+BAnT57E6NGj8ejRI7ViYiZK14OQjGmLssKJPIsWLSJ3d3cSiUQUFBREmzZtIgD0+vVrIlIsUsnKyqK+ffuSl5cXCYVC8vDwoG+++UahwOXSpUvUsWNHqlChAtna2lKDBg0KFbHkV7AIpiCpVEo///wzeXp6kqWlJTVs2JAOHTokf33NmjUUEBBAtra2ZG9vTx9++CFFRkbKX0e+IhgiorVr15KXlxeZmZlRmzZtivx8pFIpubu7EwB68OBBobgOHz5MLVu2JJFIRPb29hQYGEhr1qwp8n2EhIRQw4YNCy3/448/yMrKihITEykzM5OGDBlCDg4O5OjoSF9//TVNmDBBYbvnz5/LP18AdOLECSIievr0KQ0ePJicnZ3JysqK/Pz8aPjw4ZSSklJkTIzlERAR6TYFM8YYY+WPL4EyxhgzSZwAGWOMmSROgIwxxkwSJ0DGGGMmiRMgY4wxk8QJkDHGmEniBMgYY8wkcQJkjDFmkjgBMsYYM0mcABljjJkkToCMMcZM0v8DG4xhfsxwhXsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, probabilities) \n",
    "roc_auc = metrics.auc(fpr, tpr)\n",
    "display1 = metrics.RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=roc_auc, \n",
    "estimator_name='logistic regression')\n",
    "plt1 = display1.plot()\n",
    "\n",
    "pp = knn.predict_proba(X_test)\n",
    "fpr_pp, tpr_knn, thresholds = metrics.roc_curve(y_test, pp[:, 1]) \n",
    "roc_auc_pp = metrics.auc(fpr_pp, tpr_knn)\n",
    "display = metrics.RocCurveDisplay(fpr=fpr_pp, tpr=tpr_knn, roc_auc=roc_auc_pp, \n",
    "estimator_name='KNN')\n",
    "plt2 = display.plot(ax=plt1.ax_)\n",
    "\n",
    "pp_scaled = knn_scaled.predict_proba(X_test)\n",
    "fpr_pp_scaled, tpr_knn_scaled, thresholds = metrics.roc_curve(y_test, pp_scaled[:, 1]) \n",
    "roc_auc_pp_scaled = metrics.auc(fpr_pp_scaled, tpr_knn_scaled)\n",
    "display_scaled = metrics.RocCurveDisplay(fpr=fpr_pp_scaled, tpr=tpr_knn_scaled, roc_auc=roc_auc_pp_scaled, \n",
    "estimator_name='KNN Scaled')\n",
    "plt2_scaled = display_scaled.plot(ax=plt2.ax_)\n",
    "\n",
    "probabilities_svm = model_svm.predict_proba(X_test)[:, 1]\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, probabilities_svm) \n",
    "roc_auc = metrics.auc(fpr, tpr)\n",
    "display2 = metrics.RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=roc_auc, \n",
    "estimator_name='SVM')\n",
    "display2.plot(ax=plt2_scaled.ax_, plot_chance_level=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We used confusion matrices to compare the results from our KNN, SVM, and Logistic regression models.  Our confusion matrices show that logistic regression has the best metrics with 86% precision, 80% recall, 84% accuracy, and an 83% F1 score. Our KNN model has the lowest of these metrics with 81% precision, 68% recall, 75% accuracy, and a 74% F1 score. Our SVM model, while still producing good metrics, performed slightly better than the KNN model but not as good as the Logistic Regression model. Our SVM model had a precision of 79%, 71% recall, 75% accuracy, and a 75% F1 score. Of our 3 models, logistic regression proved to be the best fit.  \n",
    "\n",
    "The results from our Confusion matrices directly translate to the ROC curves that we have here. We begin with our KNN model has the least steep ROC curve which means that this model does not achieve a high TP rate while keeping a low FP rate. Our KNN model has the lowest of precision, recall, accuracy and F1. These results allow us to safely conclude that the KNN model is not the best model for our purposes.\n",
    "Doing slightly better, we have the Support Vector Machine model. The TP and FP rates of the SVM and Logistic regression are similar and quite steep in the beginning, but SVM has slight less steepness in comparison to Logistic regression in the long run. Similar to the precision, recall, accuracy and F1 scores mentioned above, we can see that the SVM model is our middle-ground and performs well, but has precision in between the KNN model and the logistic regression model.\n",
    "\n",
    "Lastly, we have our best model, the Logistic Regression model. We want a model where the TP rate is as large as possible compared to the FP rate, and this is achieved by our logistic regression model.The ideal model is represented by the point on the curve that is as far as possible from a straight line at  y=x. This is because  y=x represents a model that always makes an equal number of correct and wrong classifications, no matter what the threshold value is. This is exhibited by our Logistic Regression model, and supported by its stats from the confusion matrices, which makes it the clear best choice for our model.\n",
    "\n",
    "\n",
    "Logistic regression’s success may stem from the linear relationship between the predictor variables, and the outcome’s log odds. . In contrast, since KNN and SVM don’t make assumptions about the underlying data distribution, they aren’t optimal if we have relationships that are nonlinear. \n",
    "\n",
    "Another reason that logistic regression is preferred, is because it assumes observations are independent.  Since our dataset meets this assumption, , logistic regression can provide reliable estimates. KNN, on the other hand, relies on the similarity of observations and may perform suboptimally if the assumption of independence is violated. SVM can handle some degree of dependence among observations but may still be affected if the data exhibit strong dependencies.\n",
    "\n",
    "Logistic regression makes it easy to interpret results by estimating the probability of the outcome, given the predictors. Due to its ease of interpretation, logistic regression is a preferred choice, since it’s important for us to understand the factors driving wildfire formation. . \n",
    "\n",
    "\n",
    "We’ll use p-values, and examine the values generated by our notebook: \n",
    "\n",
    "The 6 most significant factors directly relate to temperature and humidity. This intuitively makes sense, since hotter and drier conditions often result in more flammability, due to added “fuel” in the fire triangle. Colder conditions make it harder for wildfires to sustain themselves, due to the absence of “heat” in the fire triangle.\n",
    "\n",
    "Next, location is a significant factor. Notably, whether the location of origin is in California or Ontario. We can likely attribute this to our dataset - most data points in California correspond to real wildfires, whereas most Ontario points correspond to non-fires. A majority of significant historical wildfires originate in California. Ontario likely had more selection bias during the stage of randomly picking non-fire points. \n",
    "\n",
    "Season is roughly equal to location when looking at wildfire significance. Our model believes that wildfires are most likely to occur when it’s “not winter”, instead of specifically “being summer.”\n",
    "\n",
    "The remaining significant factors are still small in p-value, but are still orders of magnitude larger than our previously mentioned points. The remaining significant factors are: \n",
    "\n",
    "Location being Colorado\n",
    "\n",
    "Location being Northwest Territories\n",
    "\n",
    "Season being Summer\n",
    "\n",
    "Location being Florida\n",
    "\n",
    "And finally Windspeed\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.10.13"
  },
  "vscode": {
   "interpreter": {
    "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}