{ "cells": [ { "cell_type": "markdown", "id": "1815129a-b144-410a-a2a6-bb656d157fdc", "metadata": {}, "source": [ "# Predicting Algerian Forest Fires" ] }, { "cell_type": "markdown", "id": "2bf8a451-0709-4f6d-9ba5-c4d81700e725", "metadata": { "tags": [] }, "source": [ "# Models" ] }, { "cell_type": "markdown", "id": "82f4257d-fc40-4364-8069-827861b801b8", "metadata": {}, "source": [ "We build a random forest model and a logistic regression model to predict the occurence forest fires. We then compare the results." ] }, { "cell_type": "code", "execution_count": 7, "id": "da7df336-cb31-4f08-908d-2c4f52a35c13", "metadata": {}, "outputs": [], "source": [ "import os\n", "import joblib\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import dataframe_image as dfi\n", "\n", "from tools import utils\n", "\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.metrics import precision_score\n", "from sklearn.metrics import accuracy_score\n", "from sklearn.metrics import recall_score\n", "from sklearn.metrics import plot_roc_curve\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.model_selection import GridSearchCV\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 8, "id": "ce840840-c115-40a1-a9b6-788123bba6a7", "metadata": {}, "outputs": [], "source": [ "# Load and further clean data\n", "data = pd.read_csv(\"data/Algerian_forest_fires_dataset_CLEANED.csv\")" ] }, { "cell_type": "markdown", "id": "ce79358a-f413-4a8c-aa81-042fb65148f8", "metadata": {}, "source": [ "# Random Forest Model\n", "\n", "## Intro\n", "\n", "Given the size of the dataset ($243 \\times 15$), building a random forest would probably be an overkill. Nontheless, we are just curious how the performance would differ when compared to the Logistic Regression model.\n", "\n", "Because random forest is based on bootstrap aggregating decision trees, we don't need to check any statistical features on our data since we are not making any mathematical assumptions. The only thing that need to be done further on the data is to encode all the categorical variables. The Random Forest Classifier in sklearn cannot recognize string typed categorical variables in default, thus we need to encode them into ${0,1}$ integers." ] }, { "cell_type": "markdown", "id": "71f7e4d4-0421-4717-8e3a-f7bf681e86bb", "metadata": {}, "source": [ "## Process Data\n", "\n", "Given that our dataset is small, we decided to reserve $1/3$ of the data as testing. We don't want to reserve too much, otherwise random forest might perform badly on a very small traning dataset. This is because bootstrap sampling on small datasets might result in many repeated samples." ] }, { "cell_type": "code", "execution_count": 9, "id": "a744a535-48de-47d5-bf65-cfb3b35384b6", "metadata": {}, "outputs": [], "source": [ "# Process data into data matrix and output vector\n", "X_rf, y_rf = utils.preprocess_data(data, [\"Classes\"])\n", "\n", "# Train test split: 1/3 test, 2/3 train\n", "X_train_rf, X_test_rf, y_train_rf, y_test_rf = train_test_split(X_rf, y_rf, test_size=0.33, random_state=42)" ] }, { "cell_type": "code", "execution_count": 10, "id": "6009683f-e45b-491f-bea6-d2835061354d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daymonthyearTemperatureRHWsRainFFMCDMCDCISIBUIFWIRegion
22614920122881150.084.612.641.54.314.35.71
655820123465130.086.811.129.75.211.56.10
16818720123368150.086.123.951.65.223.99.11
20625820123440180.092.156.3157.514.359.531.11
14423620123359160.874.27.08.31.66.70.81
\n", "
" ], "text/plain": [ " day month year Temperature RH Ws Rain FFMC DMC DC ISI \\\n", "226 14 9 2012 28 81 15 0.0 84.6 12.6 41.5 4.3 \n", "65 5 8 2012 34 65 13 0.0 86.8 11.1 29.7 5.2 \n", "168 18 7 2012 33 68 15 0.0 86.1 23.9 51.6 5.2 \n", "206 25 8 2012 34 40 18 0.0 92.1 56.3 157.5 14.3 \n", "144 23 6 2012 33 59 16 0.8 74.2 7.0 8.3 1.6 \n", "\n", " BUI FWI Region \n", "226 14.3 5.7 1 \n", "65 11.5 6.1 0 \n", "168 23.9 9.1 1 \n", "206 59.5 31.1 1 \n", "144 6.7 0.8 1 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display data frame\n", "X_train_rf.head()" ] }, { "cell_type": "markdown", "id": "6642a816-d997-4287-8ace-068fd560b0a9", "metadata": {}, "source": [ "## Hyperparameter Tuning\n", "\n", "Perform Grid Search Cross Validation on the random forest model. The algorithm search through different values for hyperparameters and perform cross validation on each combination. Given the small dataset, I decided to search through the number of trees between the range $[1,100]$ and the maximum depth between $[1,5]$. The algorithm will perform $10$-Fold corss validation on each combination of hyperparameters." ] }, { "cell_type": "code", "execution_count": 11, "id": "bbf00644-7525-4983-a6c0-a961f0f8fdb1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Successfully loaded pre-trained model.\n" ] } ], "source": [ "# Grid search cross validation\n", "if not os.path.exists(\"models/random_forest_gridcv.pkl\"):\n", " # Define param_grid\n", " param_grid = {\"n_estimators\": (10 ** np.linspace(0, 2, 40)).astype(int),\n", " \"max_depth\": [1, 2, 3, 4, 5]}\n", " # Define random forest model\n", " rf_model = RandomForestClassifier(random_state=42)\n", " # Grid search cross validation\n", " grid = GridSearchCV(rf_model, param_grid, scoring=\"recall\", cv=10)\n", " grid.fit(X_train_rf, y_train_rf)\n", " # Print best result\n", " print(grid.best_params_, grid.best_score_)\n", "\n", " # Save grid search model\n", " joblib.dump(grid, 'models/random_forest_gridcv.pkl')\n", "else:\n", " grid = joblib.load(\"models/random_forest_gridcv.pkl\")\n", " print(\"Successfully loaded pre-trained model.\")" ] }, { "cell_type": "markdown", "id": "c48d46fc-4269-4f62-8bc5-da4bb1652a43", "metadata": {}, "source": [ "### Selecting the Metric for Evaluation\n", "\n", "I chose to evaluate on the **recall** (or **true positive rate**) for each model during cross validation. This is because, as a model predicting forest fires, we really don't want to predict no fire when there is actually fire. Therefore, we want to penalize **false negatives** (predicting no fire wrongly). Recall does exactly this job." ] }, { "cell_type": "code", "execution_count": 12, "id": "58346083-6da5-46fa-985f-5d74ece388e4", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot CV results\n", "cv_results = pd.DataFrame(grid.cv_results_)\n", "\n", "fig, axs = plt.subplots(1, 2, figsize=(12,4))\n", "sns.lineplot(\"param_n_estimators\", \"mean_test_score\", data=cv_results, ax = axs[0])\n", "sns.lineplot(\"param_n_estimators\", \"mean_test_score\", data=cv_results, hue = \"param_max_depth\", ax = axs[1])\n", "plt.suptitle(\"Random Forest Hyperparameter Tuning\")\n", "for ax in axs:\n", " ax.set(xlabel=\"Number of Trees\", ylabel=\"Mean Cross Validation Score (Recall)\", ylim=(0.93, 0.99))\n", "axs[1].legend(title=\"Max Tree Depth\")\n", "\n", "plt.savefig(\"figures/figure_5.png\")" ] }, { "cell_type": "markdown", "id": "853ab242-8d14-4c8f-88d2-20048dc9a7cc", "metadata": {}, "source": [ "### Interpretating the Result\n", "\n", "The figures above display the results of cross validation. Observing the left figure we see that the cross validated recall (true positive rate) stablizes when there are more than $35$ trees being grown. On the right figure, we see that the tree with maximum depth of one is actually the best performing model overall. We can observe that when the number of trees is larger than $35$, the tree with depth one is consistently performing the best. Thus, based on the cross validation result, the best performing model have $38$ trees with maximum depth of $1$." ] }, { "cell_type": "code", "execution_count": 13, "id": "91ff7638-fbdb-4e3c-87f2-72b91189937f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['models/random_forest.pkl']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Save best random forest\n", "final_model_rf = RandomForestClassifier(n_estimators=38, max_depth=1, random_state=42)\n", "final_model_rf.fit(X_train_rf, y_train_rf)\n", "joblib.dump(final_model_rf, 'models/random_forest.pkl')" ] }, { "cell_type": "markdown", "id": "87d4747d-aa55-415d-90ea-2b53b1746c61", "metadata": {}, "source": [ "## Evaluating the Model\n", "\n", "We evaluate the performance of the model by looking at the confusion matrix and printing the following metrics: the accuracy, the precision, and the recall." ] }, { "cell_type": "code", "execution_count": 14, "id": "89d863de-b56d-44c7-a26b-e7e9feb021b6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 1.0\n", "Precision: 1.0\n", "Recall: 1.0\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Output confusion matrix with test results \n", "y_predict_rf = final_model_rf.predict(X_test_rf)\n", "figure = utils.evaluate_model(y_predict_rf, y_test_rf)" ] }, { "cell_type": "code", "execution_count": 15, "id": "e4f37620-3bbd-4885-99ce-7e826998604c", "metadata": {}, "outputs": [], "source": [ "figure.savefig(\"figures/figure_6.png\")" ] }, { "cell_type": "markdown", "id": "143e7bf6-5768-4851-80e6-705fa7f8434d", "metadata": { "tags": [] }, "source": [ "## Further Exploration\n", "\n", "By looking into our final random forest model, we see that 'day', 'month', 'year', 'RH', 'Ws', and 'Region' are never being used as a condition to perform a split. We can also see that the most important feature that the random forest based on is tne 'ISI' (Initial Spread Index). " ] }, { "cell_type": "code", "execution_count": 16, "id": "bd5054eb-1c99-407c-bab5-580a757da000", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['day', 'month', 'year', 'RH', 'Ws', 'Region'], dtype='object')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Features never used:\n", "X_train_rf.columns[final_model_rf.feature_importances_ == 0]" ] }, { "cell_type": "code", "execution_count": 17, "id": "b7a5c60c-5db6-4fd5-bfc5-728ce7c320ca", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'ISI'" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Most important feature\n", "X_train_rf.columns[np.argmax(final_model_rf.feature_importances_)]" ] }, { "cell_type": "markdown", "id": "75c59ec1-b807-4e95-b28c-abe036befc6b", "metadata": { "tags": [] }, "source": [ "# Logistic Regression" ] }, { "cell_type": "markdown", "id": "9acab346-ff10-40f5-9e24-7eecad54b1af", "metadata": {}, "source": [ "## Data Preprocessing" ] }, { "cell_type": "markdown", "id": "844d6a3e-c3ce-41a1-98c7-ed57310f1358", "metadata": {}, "source": [ "We first examine the correlation matrix of the weather metrics in our dataset. We find that DMC, DC, and BUI and highly correlated with one another. To avoid multicollinearity, we remove DC and BUI from our feature set. We choose to use DMC becuase it is the least correlated with the remaining features." ] }, { "cell_type": "code", "execution_count": 18, "id": "fbc54b17-032f-4f11-b42c-7dd89cee2dc4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yearTemperatureRHWsRainFFMCDMCDCISIBUIFWI
yearNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
TemperatureNaN1.000000-0.651400-0.284510-0.3264920.6765680.4856870.3762840.6038710.4597890.566670
RHNaN-0.6514001.0000000.2440480.222356-0.644873-0.408519-0.226941-0.686667-0.353841-0.580957
WsNaN-0.2845100.2440481.0000000.171506-0.166548-0.0007210.0791350.0085320.0314380.032368
RainNaN-0.3264920.2223560.1715061.000000-0.543906-0.288773-0.298023-0.347484-0.299852-0.324422
FFMCNaN0.676568-0.644873-0.166548-0.5439061.0000000.6036080.5073970.7400070.5920110.691132
DMCNaN0.485687-0.408519-0.000721-0.2887730.6036081.0000000.8759250.6804540.9822480.875864
DCNaN0.376284-0.2269410.079135-0.2980230.5073970.8759251.0000000.5086430.9419880.739521
ISINaN0.603871-0.6866670.008532-0.3474840.7400070.6804540.5086431.0000000.6440930.922895
BUINaN0.459789-0.3538410.031438-0.2998520.5920110.9822480.9419880.6440931.0000000.857973
FWINaN0.566670-0.5809570.032368-0.3244220.6911320.8758640.7395210.9228950.8579731.000000
\n", "
" ], "text/plain": [ " year Temperature RH Ws Rain FFMC \\\n", "year NaN NaN NaN NaN NaN NaN \n", "Temperature NaN 1.000000 -0.651400 -0.284510 -0.326492 0.676568 \n", "RH NaN -0.651400 1.000000 0.244048 0.222356 -0.644873 \n", "Ws NaN -0.284510 0.244048 1.000000 0.171506 -0.166548 \n", "Rain NaN -0.326492 0.222356 0.171506 1.000000 -0.543906 \n", "FFMC NaN 0.676568 -0.644873 -0.166548 -0.543906 1.000000 \n", "DMC NaN 0.485687 -0.408519 -0.000721 -0.288773 0.603608 \n", "DC NaN 0.376284 -0.226941 0.079135 -0.298023 0.507397 \n", "ISI NaN 0.603871 -0.686667 0.008532 -0.347484 0.740007 \n", "BUI NaN 0.459789 -0.353841 0.031438 -0.299852 0.592011 \n", "FWI NaN 0.566670 -0.580957 0.032368 -0.324422 0.691132 \n", "\n", " DMC DC ISI BUI FWI \n", "year NaN NaN NaN NaN NaN \n", "Temperature 0.485687 0.376284 0.603871 0.459789 0.566670 \n", "RH -0.408519 -0.226941 -0.686667 -0.353841 -0.580957 \n", "Ws -0.000721 0.079135 0.008532 0.031438 0.032368 \n", "Rain -0.288773 -0.298023 -0.347484 -0.299852 -0.324422 \n", "FFMC 0.603608 0.507397 0.740007 0.592011 0.691132 \n", "DMC 1.000000 0.875925 0.680454 0.982248 0.875864 \n", "DC 0.875925 1.000000 0.508643 0.941988 0.739521 \n", "ISI 0.680454 0.508643 1.000000 0.644093 0.922895 \n", "BUI 0.982248 0.941988 0.644093 1.000000 0.857973 \n", "FWI 0.875864 0.739521 0.922895 0.857973 1.000000 " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Examine correlation matrix for multicollinearity\n", "data.iloc[:, 3:-2].corr()" ] }, { "cell_type": "markdown", "id": "8a7eda74-a2a2-4734-b11b-392b77f86daf", "metadata": {}, "source": [ "We preprocess the data by removing the 'year' column because there is only one value for the entire dataset. We also remove the DC and BUI columns. We encode 'Regions' in the feature matrix and 'Classes' in the y vector to binary representations. Lastly, we normalize the weather metrics in the feature matrix. " ] }, { "cell_type": "code", "execution_count": 19, "id": "75681e8f-f52b-414f-809e-fa868f156217", "metadata": {}, "outputs": [], "source": [ "# Process data into data matrix and output vector\n", "X_lr, y_lr = utils.preprocess_data(data, ['Classes', 'year', 'DC', 'BUI'])\n", "\n", "# Normalize input columns\n", "utils.normalize(X_lr, ['Temperature', 'RH', 'Ws', 'Rain', 'FFMC', 'DMC', 'ISI', 'FWI'])\n", "\n", "# Train test split: 1/3 test, 2/3 train\n", "X_train_lr, X_test_lr, y_train_lr, y_test_lr = train_test_split(X_lr, y_lr, test_size=0.33, random_state=42)" ] }, { "cell_type": "markdown", "id": "684450c6-711f-45c3-aad1-1efd465ad0e0", "metadata": {}, "source": [ "## Modeling" ] }, { "cell_type": "code", "execution_count": 20, "id": "4d87f4a6-d8aa-4828-bd9f-7051d328a977", "metadata": {}, "outputs": [], "source": [ "# Create and fit logistic regression model with l2 penalty \n", "clf = LogisticRegression(penalty='l2', random_state=42).fit(X_train_lr, y_train_lr)" ] }, { "cell_type": "markdown", "id": "69f5f717-ed1f-4242-a191-b1b89ca4c951", "metadata": {}, "source": [ "### Predictions and Metrics" ] }, { "cell_type": "markdown", "id": "b077b038-bc99-4eb8-b274-f4ccd90c84dd", "metadata": {}, "source": [ "We use our trained model to predict on the test set and display the confusion matrix. We calculate accuracy, precision, and recall for out model. It looks like our model does well!" ] }, { "cell_type": "code", "execution_count": 21, "id": "292e2043-9cd5-450b-bf91-e5f1a499d693", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.9629629629629629\n", "Precision: 0.9583333333333334\n", "Recall: 0.9787234042553191\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Output confusion matrix on test results\n", "\n", "y_predict_lr = clf.predict(X_test_lr)\n", "figure = utils.evaluate_model(y_predict_lr, y_test_lr)" ] }, { "cell_type": "code", "execution_count": 22, "id": "03209fa8-ec64-4d41-92dd-cbefbefd1ade", "metadata": {}, "outputs": [], "source": [ "figure.savefig('figures/figure_7.png')" ] }, { "cell_type": "markdown", "id": "e8337c04-b23f-40af-ba23-f13c286bcd2f", "metadata": {}, "source": [ "To better evaluate our model, we examine the ROC curve. The area under the curve is close to 1, which is desired. " ] }, { "cell_type": "code", "execution_count": 23, "id": "2259536c-e9b3-4967-9ac3-6c2d186822f3", "metadata": {}, "outputs": [ { "data": { "image/png": "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M9h3331p2LAhDzzwQNZ0s2fPpmfPnuyyyy4MGzYMs1AF+/nnnzNkyBB22WUXDjzwQBYvXgzA8uXLGTBgwFbFlqpajc4552pWSUkJY8aMyTo9PSPIlb7ctGnTmDNnDv369eMXv/jFVsdpZpudXKtr6NChnHXWWVu9HIAbb7yR73//+xXDmzZtYtKkSXTq1IkZM2YkWoaZMXjwYPr168ebb77J/Pnz+dWvfsX//ve/rYqtc+fO3HHHHZx22mmVpvvhD3/IuHHjWLhwIQsXLmTq1KkA3H777bRq1YpFixZx6aWXcuWVVwLQtm1b2rVrx3/+85+tiq9c0vcInPvKu+7Recx/75MaXWaP9tsz4jtV73ajtLSUoUOHsnbtWrp3786ECRNo1aoVM2fO5LzzzqNZs2b06dOHf/zjH8ydO5fp06czatQopkyZwtNPP80ll1wChPLeGTNmMHz4cF577TV69+7N2WefzT777FORfs2aNVx88cXMmjULSYwYMYITTzxxs3gOPvjgioxj+fLlDB06lHffDf1KjR49mkMPPZTly5dz2mmnsWLFCvbff3+mTp3K7NmzWbNmDQMHDuSII47g+eef5+GHH+b+++/n/vvv5/PPP2fw4MFcd911fPrpp5x88smUlZWxceNGfvaznzFkyBCGDx/O5MmTadiwIUceeSSjRo1i5MiRNG/enMsvvzzrvurXrx8HHngg06ZN4+OPP+b222+nb9++W+zrBx98cLNMbtq0aey1114MGTKEiRMn0q9fv5zHa9q0aTRq1IihQ4dWjOvdu3dVD/sWunbtCsA222S/5l62bBmffPIJBx98MABnnXUWDz/8MAMHDuSRRx5h5MiRAJx00klcdNFFmBmSOP7447n33ns59NBDtzpOvyNwLg/OOussfvOb3zBnzhx69uzJddddB8C5557L2LFjef7552nQoEHGeUeNGsXNN99MaWkpzzzzDE2bNuWGG26gb9++lJaWcumll26W/uc//zktW7bk1VdfZc6cOfTv33+LZU6dOpXjjz8eCMUml156KTNnzuTBBx/k/PPPB+C6666jf//+vPTSSwwePLgiowBYsGABZ511Fi+//DILFixg4cKFvPjii5SWljJ79mxmzJjB1KlTad++Pa+88gpz585lwIABrFy5kkmTJjFv3jzmzJnDNddck3hfAWzYsIEXX3yR0aNHbza+3Ntvv02rVq3YdtttK8ZNnDiRU089lcGDBzNlyhTWr1+f7TBVmDt3Lvvtt1/OdAB9+/ald+/eW/w99dRTieZPt3TpUjp27Fgx3LFjR5YuXVoxrVOnTgA0bNiQli1bsmLFCiDcFT7zzDPVWmc6vyNw9UZ1rtzzYdWqVXz88cccfvjhAJx99tl897vf5eOPP2b16tUccsghAJx22mlMmTJli/kPPfRQLrvsMk4//XROOOGEzU4SmTz11FPcd999FcOtWrWq+HzEEUfwv//9j5122qniqvmpp55i/vz5FWk++eQTVq9ezbPPPsukSZMAGDBgwGbL6dKlCwcddBAATz75JE8++ST77LMPAGvWrGHhwoX07duXyy+/nCuvvJJjjjmGvn37smHDBpo0acL555/P0UcfvUVZfrZ9Ve6EE04AYL/99qsoH0+1bNky2rZtWzH8xRdf8Pjjj/OHP/yBFi1acOCBB/Lkk09y9NFHZ32apqpP2dTUybdceX1AqvKYKpu200478d5779VIDHm9I5A0QNICSYskDc8wXZLGxOlzYs9nztVLmX7UmQwfPpzx48fz2WefcdBBB/H666/nXG62k9m0adN455132HPPPbn22muBUIb+/PPPU1paSmlpKUuXLqVFixaVxtesWbPN1nfVVVdVzL9o0SLOO+88dtttt4pKz6uuuorrr7+ehg0b8uKLL3LiiSfy8MMPV7mCs/xKv0GDBmzYsGGL6U2bNt3srfKpU6eyatUqevbsSdeuXXn22WeZOHEiAG3atOGjjz7abP7Vq1ezww47sOeeezJ79uxEMdX0HUHHjh0pKyurGC4rK6N9+/YV05YsWQKEu6NVq1bRunVrILxD07Rp02qtM13eMoLYfPXNwECgB3CqpB5pyQYCu8a/C4Bb8xWPc4XSsmVLWrVqVXHlePfdd3P44YfTqlUrWrRowQsvvACw2VV8qjfffJOePXty5ZVXUlJSwuuvv06LFi1YvXp1xvRHHnkkN910U8Vw+smuadOmjB49mrvuuouVK1dukb60tBSAPn36cP/99wPhqj99OeWOOuooJkyYwJo1a4BQfPHBBx/w3nvvsd1223HGGWdw+eWX89JLL7FmzRpWrVrFoEGDGD16dMW6cu2rpHbbbbfN7hQmTpzI+PHjWbx4MYsXL+btt9/mySefZO3atRx22GFMnjy5Yj8+9NBD9OrViwYNGtC/f38+//xzbrvttoplzZw5k6effnqLdT7zzDMVmWDq37e+9a3Ecadq165dxffCzLjrrrs47rjjADj22GO58847AXjggQfo379/Rab/xhtvsNdee1VrnenyWTR0ALDIzN4CkHQfcBwwPyXNccBdFi5FXpC0g6R2ZrYsj3E5V6PWrl27WfHNZZddxp133llRAbrzzjvzl7/8BQhPgXz/+9+nWbNm9OvXj5YtW26xvNGjRzNt2jQaNGhAjx49GDhwINtssw0NGzakV69enHPOORXFMgDXXHMNF154IXvttRcNGjRgxIgRFUUq5dq1a8epp57KzTffzJgxY7jwwgvZe++92bBhA4cddhhjx45lxIgRnHrqqfztb3/j8MMPrzhBlZ/wyx155JG89tprFZWbzZs355577mHRokVcccUVbLPNNjRq1Ihbb72V1atXc9xxx7Fu3TrMjD/84Q9bbG+2fZVEs2bN6N69O4sWLaJ9+/Y88cQT/PnPf95sep8+fXj00UcZMmQIF110EX369EESO+20E+PHjwdCccukSZP48Y9/zA033ECTJk3o2rUro0ePThxLJjNnzmTw4MF89NFHPProo4wYMYJ58+YBoTK6PGO89dZbOeecc/jss88YOHAgAwcOBOC8887jzDPPZJdddqF169abXTxMmzaNo48+eqviq2BmefkDTgLGpwyfCdyUlmYK0Cdl+F9ASYZlXQDMAmZ17tzZqmPk5Lk2cvLcas3rvrrmz59f2yFUyerVqys+//rXv7Zhw4bVYjSbW7duna1fv97MzJ577jnr1atX7QaU0EMPPWRXX311bYdRcH379rWVK1dmnJbpdwHMsizn63zeESRpqC5RY3ZmNg4YB1BSUlKtxu6+KhWJrrg99thj/PrXv2bDhg106dKFO+64o7ZDqvDuu+9y8skns2nTJho3brxZMclX2eDBgyuepCkWy5cv57LLLtusQn9r5DMjKAM6pQx3BNKruJOkca7eGDJkCEOGDKntMDLaddddefnll2s7jGopfwS2WLRt27biceCakM+nhmYCu0rqJqkxcAowOS3NZOCs+PTQQcAq8/oBV0WW8Gkc54pBdX4PebsjMLMNki4CniD0azDBzOZJGhqnjwUeBwYBi4C1wLn5isfVT02aNGHFihW0adPGWyF1Rc9ifwRN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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Show roc curve \n", "\n", "plot_roc_curve(clf, X_test_lr, y_test_lr);\n", "plt.title(\"ROC Curve and AUC for Logistic Regression Model\")\n", "plt.savefig('figures/figure_8.png')" ] }, { "cell_type": "markdown", "id": "8a9066b2-783c-4e19-a728-7d327a0ba813", "metadata": {}, "source": [ "### Interpreting the Result" ] }, { "cell_type": "markdown", "id": "12b8dc6a-8346-4b77-a105-85f50223f8e3", "metadata": {}, "source": [ "A simple logistic regression model achieves astounding accuracy on the test set. It is possible that the data is inherently well-conditioned and that Algerian forest fires have particularly distinct features that set them apart from regular weather conditions. It is unclear how the model will respond to forest fires in other locations. Further exploration can be done by applying our model to areas with similar climates and monitoring the model's variance. A question to ponder is: Are Algerian forest fires easier to predict than other forest fires?" ] }, { "cell_type": "markdown", "id": "0e8ee21e-3a0f-4952-b7be-a07769a52e5e", "metadata": {}, "source": [ "### Comparing the Results\n", "\n" ] }, { "cell_type": "markdown", "id": "d5686fd5-2f22-4044-b5cd-f6f803d7d873", "metadata": {}, "source": [ "Both models have impressive test accuracy, for reasons explored earlier. However we do see that the random forest slightly outperforms the logistic model, achieving perfect test accuarcy. Although the accuarcy is per haps unexpectedly high, its relative performance to the logistic model is not surprising considering that random forests are in general more powerful architectures than logistic regression. The removal of the DC and BUI variables for the logistic model should not impact performance, as these are calculated from other variables in the data.\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "35183fdc-0d0b-4ed9-9274-5a82b1dbb84b", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[0512/034422.837116:ERROR:bus.cc(397)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory\n", "[0512/034422.837281:ERROR:bus.cc(397)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory\n", "[0512/034422.841921:ERROR:zygote_host_impl_linux.cc(263)] Failed to adjust OOM score of renderer with pid 774: Permission denied (13)\n", "[0512/034422.846068:WARNING:bluez_dbus_manager.cc(248)] Floss manager not present, cannot set Floss enable/disable.\n", "[0512/034422.860251:ERROR:zygote_host_impl_linux.cc(263)] Failed to adjust OOM score of renderer with pid 776: Permission denied (13)\n", "[0512/034422.899603:ERROR:sandbox_linux.cc(377)] InitializeSandbox() called with multiple threads in process gpu-process.\n", "[0512/034423.171208:INFO:headless_shell.cc(659)] Written to file /tmp/tmphhhzpekv/temp.png.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelAccuracyPrecisionRecall
0Random Forest1.0000001.0000001.000000
1Logistic Regression0.9629630.9787230.958333
\n", "
" ], "text/plain": [ " Model Accuracy Precision Recall\n", "0 Random Forest 1.000000 1.000000 1.000000\n", "1 Logistic Regression 0.962963 0.978723 0.958333" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Compute accuracy, precision, and recall from both models and output in dataframe for comparison\n", "rf_accuracy = accuracy_score(y_test_rf, y_predict_rf)\n", "rf_precision = precision_score(y_test_rf, y_predict_rf)\n", "rf_recall = recall_score(y_test_rf, y_predict_rf)\n", "\n", "lr_accuracy = accuracy_score(y_test_lr, y_predict_lr)\n", "lr_precision = precision_score(y_test_lr, y_predict_lr)\n", "lr_recall = recall_score(y_test_lr, y_predict_lr)\n", "\n", "comparison = pd.DataFrame(data = {\"Model\": [\"Random Forest\", \"Logistic Regression\"], \"Accuracy\": [rf_accuracy, lr_accuracy],\n", " \"Precision\": [rf_precision, lr_precision], \"Recall\": [rf_recall, lr_recall]})\n", "\n", "# Save model comparison dataframe as image\n", "dfi.export(comparison, \"figures/figure_9.png\")\n", "\n", "comparison" ] }, { "cell_type": "markdown", "id": "53d6c081-2e23-4725-b56b-b63747ef5215", "metadata": {}, "source": [ "We can further examine the importances of each feature in prediction by looking at the coefficients from our logistic regression model. As seen below, the FFMC was the most powerful in prediction (we can compare directly since we normalized the data). This makes sense based on our EDA which showed that FFMC combines aspects of many of the other features and is therefore the most holistic predictor of fires. In fact, this means that an increase of 1 point in FFMC increases the odds of a forest fire by about 10%, which is quite considerable. Fire scientists can use FFMC as a north star metric in understanding fire probabilities. " ] }, { "cell_type": "code", "execution_count": 25, "id": "1a94d218-8425-472e-a6dd-e55944cadc27", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[0512/034423.487118:ERROR:bus.cc(397)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory\n", "[0512/034423.487275:ERROR:bus.cc(397)] Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory\n", "[0512/034423.489539:WARNING:bluez_dbus_manager.cc(248)] Floss manager not present, cannot set Floss enable/disable.\n", "[0512/034423.489694:ERROR:zygote_host_impl_linux.cc(263)] Failed to adjust OOM score of renderer with pid 838: Permission denied (13)\n", "[0512/034423.496253:ERROR:zygote_host_impl_linux.cc(263)] Failed to adjust OOM score of renderer with pid 840: Permission denied (13)\n", "[0512/034423.511189:ERROR:sandbox_linux.cc(377)] InitializeSandbox() called with multiple threads in process gpu-process.\n", "[0512/034423.734788:INFO:headless_shell.cc(659)] Written to file /tmp/tmpufj083nk/temp.png.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FeatureCoefficient
6FFMC2.315579
8ISI2.162191
9FWI1.837229
7DMC0.343307
5Rain0.216683
1month0.148903
10Region0.116011
2Temperature0.099857
3RH0.084562
4Ws0.031104
0day-0.001194
\n", "
" ], "text/plain": [ " Feature Coefficient\n", "6 FFMC 2.315579\n", "8 ISI 2.162191\n", "9 FWI 1.837229\n", "7 DMC 0.343307\n", "5 Rain 0.216683\n", "1 month 0.148903\n", "10 Region 0.116011\n", "2 Temperature 0.099857\n", "3 RH 0.084562\n", "4 Ws 0.031104\n", "0 day -0.001194" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display sorted coefficients for features in the logistic regression model\n", "feature_importances = pd.DataFrame(data = {\"Feature\": X_train_lr.columns, \"Coefficient\": clf.coef_[0]}).sort_values(\"Coefficient\", ascending = False)\n", "\n", "# Save feature importances dataframe as image\n", "dfi.export(feature_importances, \"figures/figure_10.png\")\n", "\n", "feature_importances" ] } ], "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.9.9" } }, "nbformat": 4, "nbformat_minor": 5 }