{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e256a2ec",
   "metadata": {},
   "source": [
    "## GEE SmileCart model training and performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e9e983e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append(\"../src\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9655065a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import ee\n",
    "import pandas as pd\n",
    "import geopandas\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import geemap.eefolium as geemap\n",
    "from geemap import geopandas_to_ee, ee_to_geopandas\n",
    "\n",
    "from plot_utils import plot_inference\n",
    "from inf_utils import get_model_prediction\n",
    "from sklearn.metrics import ConfusionMatrixDisplay\n",
    "from sklearn.metrics import classification_report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "943f6748",
   "metadata": {},
   "source": [
    "### Initialize Earth Engine"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c8110fae",
   "metadata": {},
   "outputs": [],
   "source": [
    "ee.Initialize()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f811ccca",
   "metadata": {},
   "source": [
    "### Read training and test data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8c476574",
   "metadata": {},
   "outputs": [],
   "source": [
    "bucket = \"sagemaker-gis\"\n",
    "train_data_path = \"LANDSAT_LC08_C01_T1_SR/Year2013/train_with_coord.csv\"\n",
    "test_data_path = \"LANDSAT_LC08_C01_T1_SR/Year2013/test_with_coord.csv\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aad7b1fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "total_train_set_gdf = pd.read_csv(f\"s3://{bucket}/{train_data_path}\")\n",
    "total_test_set_gdf = pd.read_csv(f\"s3://{bucket}/{test_data_path}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7a5a2f1a",
   "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>B1</th>\n",
       "      <th>B2</th>\n",
       "      <th>B3</th>\n",
       "      <th>B4</th>\n",
       "      <th>B5</th>\n",
       "      <th>B6</th>\n",
       "      <th>B7</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>297</td>\n",
       "      <td>324</td>\n",
       "      <td>627</td>\n",
       "      <td>417</td>\n",
       "      <td>3964</td>\n",
       "      <td>1891</td>\n",
       "      <td>863</td>\n",
       "      <td>-50.019239</td>\n",
       "      <td>1.340130</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>185</td>\n",
       "      <td>241</td>\n",
       "      <td>423</td>\n",
       "      <td>371</td>\n",
       "      <td>1031</td>\n",
       "      <td>631</td>\n",
       "      <td>357</td>\n",
       "      <td>-49.876127</td>\n",
       "      <td>1.364031</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>174</td>\n",
       "      <td>225</td>\n",
       "      <td>515</td>\n",
       "      <td>357</td>\n",
       "      <td>3324</td>\n",
       "      <td>1525</td>\n",
       "      <td>682</td>\n",
       "      <td>-50.335638</td>\n",
       "      <td>1.071863</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>262</td>\n",
       "      <td>291</td>\n",
       "      <td>620</td>\n",
       "      <td>358</td>\n",
       "      <td>4443</td>\n",
       "      <td>1650</td>\n",
       "      <td>614</td>\n",
       "      <td>-50.190953</td>\n",
       "      <td>0.920134</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>262</td>\n",
       "      <td>282</td>\n",
       "      <td>513</td>\n",
       "      <td>351</td>\n",
       "      <td>3581</td>\n",
       "      <td>1474</td>\n",
       "      <td>589</td>\n",
       "      <td>-50.089891</td>\n",
       "      <td>0.778759</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    B1   B2   B3   B4    B5    B6   B7          x         y  label\n",
       "0  297  324  627  417  3964  1891  863 -50.019239  1.340130      0\n",
       "1  185  241  423  371  1031   631  357 -49.876127  1.364031      1\n",
       "2  174  225  515  357  3324  1525  682 -50.335638  1.071863      0\n",
       "3  262  291  620  358  4443  1650  614 -50.190953  0.920134      1\n",
       "4  262  282  513  351  3581  1474  589 -50.089891  0.778759      1"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_train_set_gdf.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "17a15133",
   "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>B1</th>\n",
       "      <th>B2</th>\n",
       "      <th>B3</th>\n",
       "      <th>B4</th>\n",
       "      <th>B5</th>\n",
       "      <th>B6</th>\n",
       "      <th>B7</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>48</td>\n",
       "      <td>96</td>\n",
       "      <td>244</td>\n",
       "      <td>175</td>\n",
       "      <td>1236</td>\n",
       "      <td>716</td>\n",
       "      <td>323</td>\n",
       "      <td>-76.727911</td>\n",
       "      <td>21.040621</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>369</td>\n",
       "      <td>300</td>\n",
       "      <td>145</td>\n",
       "      <td>89</td>\n",
       "      <td>80</td>\n",
       "      <td>77</td>\n",
       "      <td>58</td>\n",
       "      <td>-76.718213</td>\n",
       "      <td>19.562783</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>351</td>\n",
       "      <td>544</td>\n",
       "      <td>1045</td>\n",
       "      <td>1060</td>\n",
       "      <td>4169</td>\n",
       "      <td>3575</td>\n",
       "      <td>2022</td>\n",
       "      <td>-77.017011</td>\n",
       "      <td>21.056080</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>425</td>\n",
       "      <td>327</td>\n",
       "      <td>124</td>\n",
       "      <td>57</td>\n",
       "      <td>35</td>\n",
       "      <td>30</td>\n",
       "      <td>23</td>\n",
       "      <td>-77.687412</td>\n",
       "      <td>19.686923</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>130</td>\n",
       "      <td>173</td>\n",
       "      <td>356</td>\n",
       "      <td>240</td>\n",
       "      <td>2616</td>\n",
       "      <td>1295</td>\n",
       "      <td>520</td>\n",
       "      <td>-77.560585</td>\n",
       "      <td>19.871735</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    B1   B2    B3    B4    B5    B6    B7          x          y  label\n",
       "0   48   96   244   175  1236   716   323 -76.727911  21.040621      0\n",
       "1  369  300   145    89    80    77    58 -76.718213  19.562783      0\n",
       "2  351  544  1045  1060  4169  3575  2022 -77.017011  21.056080      0\n",
       "3  425  327   124    57    35    30    23 -77.687412  19.686923      0\n",
       "4  130  173   356   240  2616  1295   520 -77.560585  19.871735      0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_test_set_gdf.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "893d4e38",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((27254, 10), (5566, 10))"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_train_set_gdf.shape, total_test_set_gdf.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4fed8b7",
   "metadata": {},
   "source": [
    "### Convert pandas dataframe to geopandas dataframe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "236a9929",
   "metadata": {},
   "outputs": [],
   "source": [
    "geom = geopandas.points_from_xy(total_train_set_gdf.x, total_train_set_gdf.y)\n",
    "total_train_set_gdf = geopandas.GeoDataFrame(total_train_set_gdf, geometry=geom)\n",
    "\n",
    "geom = geopandas.points_from_xy(total_test_set_gdf.x, total_test_set_gdf.y)\n",
    "total_test_set_gdf = geopandas.GeoDataFrame(total_test_set_gdf, geometry=geom)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c979732c",
   "metadata": {},
   "source": [
    "### Select a subset of points\n",
    "These are restrictions imposed by smileCart."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "519b5ce1",
   "metadata": {},
   "outputs": [],
   "source": [
    "n_train = 20000\n",
    "n_test = 5000 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2d77400",
   "metadata": {},
   "source": [
    "### Convert geopandas dataframe to EE feature collection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "bfd502eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_set_pts = geopandas_to_ee(total_train_set_gdf[:n_train])\n",
    "test_set_pts = geopandas_to_ee(total_test_set_gdf[:n_test])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2950a3c",
   "metadata": {},
   "source": [
    "### Train classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "be973f11",
   "metadata": {},
   "outputs": [],
   "source": [
    "bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7']\n",
    "label = 'label'\n",
    "\n",
    "classifier = ee.Classifier.smileCart().train(train_set_pts, label, bands)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "73f7a356",
   "metadata": {},
   "source": [
    "### Generate inference"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7060b352",
   "metadata": {},
   "outputs": [],
   "source": [
    "result_featurecollection = test_set_pts.select(bands).classify(classifier)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57c02410",
   "metadata": {},
   "source": [
    "### Plot confusion matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7c507393",
   "metadata": {},
   "outputs": [],
   "source": [
    "prediction_gdf = ee_to_geopandas(result_featurecollection)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "8a316fe6",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_true = total_test_set_gdf.loc[:n_test-1, \"label\"]\n",
    "y_pred = prediction_gdf[\"classification\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6ce8d0c9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAS8AAAEGCAYAAAA0fRMmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAYB0lEQVR4nO3deZhU1Z3G8e8LDQoIDQoooAgaBRUFwQgIKq5xSxxXEqOJjhPXiWaMkmjc4iQZAkkkhjhE0YGMywgKxg1cUBBFQECibGpc0AAqKJtoXLp/80fdhgZ7qTZUlwfez/PUw13OvfW7dfXl3FN1L4oIzMxS06DYBZiZfRkOLzNLksPLzJLk8DKzJDm8zCxJJcUuIGUqaRJq3LzYZVgd7L9Xx2KXYHWwePGbrFixQlWtc3j9E9S4Odt0Ob3YZVgdPDtjeLFLsDro1/uAatf5stHMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTw2ooc0XcvZt57DbPHXcePvn/UF9bvslMr7r/5hzxz15U8OOJS2rdtuX7dt4/vzaz7rmXWfdfy7eN712PVW7cnpi3g66fcQM+TrufGUY99Yf2zc/7GoWcOpnWfS/jLpBc2Wnf3Q9PpdfLP6XXyz7n7oen1VXK92aLCS1JLSRdVmh8g6aFi1vRV0aCBGDrodE679Gb6nP4LTjm6F10677RRmxsuPYn/e3gm/c/4L4aMnMC1F38LgJYtmvKTHxzLkef8hiPOHspPfnAspc2bFOMwtiplZeVcMWQMY39/EdPHXM19j81m0evLNmqzy06t+ON1Z3HqNw7YaPnK1ev49a0TeOJ/LmfSqCv49a0TWLXmo/osv+C2qPACWgIX1dYoX5JKNte+iq3XPp14/e0VLF7yPp99Xsa4x+dw3KH7bdSmy27tmDrrZQCmznqFYw/ZF4Aj+uzF5BmLWLXmI1av/ZjJMxZxZN+96/0Ytjaz57/Jbru0ptPOrWncqISTj+rJI1Ne3KhNx/Y70G2PDjSQNlo+afpCBvTuSqvSZrRs0ZQBvbvyxHML6rP8gks6vCRdJmle9voRMBjYXdJcSUOzZttJulfSIkl3SrmzLKmXpCmSZkt6VFK7bPlkScMkzQIuLcqBFUC7NqUseXfl+vml766kXZvSjdrMf2UJJxzWA4ATDutOi+2a0Kq0Ge3atuTvlbZd8t4q2lW6pLTCWLZ8NR12bLV+vv2OrVi2fHV+2763ip0rbduhbUuWvbdqc5dYVMn2LCT1As4BegMCZgBnAt0iokfWZgCwP7APsBR4FugnaQbwB+DEiFguaSDwS+Bfs903joiN++Eb3vc84DwAGm1XgCMrnmt+P54hg07jjBN6M+2Fv7Hk3ZWUlZUXuyyzKiUbXkB/YHxErAOQNA44uIp2MyPi71mbuUAnYBXQDXg864g1BCoPJtxT3ZtGxC3ALQANmraNf/IY6k0+f4u/s2I13xs0EoBmTRrzzcN6sObDj1n23ir699pjfbsObVvyzOxX66fwrVg+veVqt93kHC3Z5BxuCZK+bMzTJ5Wmy8gFtoD5EdEje+0bEUdXareuXiusB3MWLGb3jm3o2H4HGpU05OSjejLh6Y3HT7YvbUYW5vzH2d/gzgdz31BNmr6Qw3p3pbR5E0qbN+Gw3l2ZNH1hvR/D1qbn3rvy2lvLWbxkBZ9+9jnjHp/DsYfsV/uG5MYpn8rGKVet+YinZiziiD57Fbji+pVyz2sqMErSYHJhdBLwfeDHeWz7MtBGUt+IeE5SI2DPiJhfuHKLq6ysnEFDxnDfTRfTsKG484HpLHr9Ha48/3jmLnyLCU+/RP9ee3Dtxd8iAqa98DeuGDIGgFVrPmLobRN5cvQgAIbcNnGL++bqq6ikpCFDBp3OKZf8kbKy4Lvf6sNeu7fjVyMeosdeHTnu0P2YM38xZw26lVVrPmLiMy8x+E8P89yYq2lV2owrzj2Gw78/BIBB5x5Dq9JmRT6izUsRyVz5fIGky9gwTjUyIoZJugvYD5gAPAxcHhEnZO2HA7MiYpSkHsBNQCm5EB8WEbdKmpxtM6u292/QtG1s0+X0zX1YVkArnx9e7BKsDvr1PoDZs2epqnVJh1exObzS4/BKS03htTWMeZnZFsjhZWZJcniZWZIcXmaWJIeXmSXJ4WVmSXJ4mVmSHF5mliSHl5klyeFlZklyeJlZkhxeZpYkh5eZJcnhZWZJcniZWZIcXmaWJIeXmSXJ4WVmSXJ4mVmSHF5mliSHl5klyeFlZklyeJlZkhxeZpYkh5eZJcnhZWZJKqluhaQ/AFHd+oi4pCAVmZnlodrwAmbVWxVmZnVUbXhFxOjK85KaRsRHhS/JzKx2tY55SeoraQGwKJvvLunmgldmZlaDfAbshwHfAN4HiIi/AocUsCYzs1rl9W1jRLy9yaKyAtRiZpa3mgbsK7wt6SAgJDUCLgUWFrYsM7Oa5dPzugC4GOgALAV6ZPNmZkVTa88rIlYA362HWszM8pbPt427SXpQ0nJJ70n6i6Td6qM4M7Pq5HPZeBcwBmgHtAfGAncXsigzs9rkE15NI+J/I+Lz7HUHsG2hCzMzq0lN9zZun01OkPRT4P/I3es4EHikHmozM6tWTQP2s8mFlbL58yutC+DKQhVlZlabmu5t7FyfhZiZ1UU+P1JFUjdgbyqNdUXEnwtVlJlZbWoNL0nXAQPIhdcjwLHAM4DDy8yKJp9vG08FjgDeiYhzgO5AaUGrMjOrRT7h9XFElAOfS2oBvAfsUtiyzMxqls+Y1yxJLYFbyX0D+SHwXCGLMjOrTT73Nl6UTY6QNBFoEREvFrYsM7Oa1fQj1Z41rYuIOYUpycysdjX1vH5bw7oADt/MtSRnv6678OTUYcUuw+qg1WHXFrsEq4NPXlla7bqafqR6WEGqMTPbDPyPzppZkhxeZpYkh5eZJSmfJ6lK0pmSrs3mO0o6sPClmZlVL5+e181AX+A72fxa4I8Fq8jMLA/5/MK+d0T0lPQCQESslNS4wHWZmdUon57XZ5IakvttF5LaAOUFrcrMrBb5hNdNwHigraRfknsczq8KWpWZWS3yubfxTkmzyT0WR8C/RIT/xWwzK6p8HkbYEfgIeLDysoh4q5CFmZnVJJ8B+4fZ8A9xbAt0Bl4G9ilgXWZmNcrnsnHfyvPZ0yYuqqa5mVm9qPMv7LNH4fQuQC1mZnnLZ8zrskqzDYCeQPXPqTAzqwf5jHk1rzT9ObkxsPsKU46ZWX5qDK/sx6nNI+LyeqrHzCwv1Y55SSqJiDKgXz3WY2aWl5p6XjPJjW/NlfQAMBZYV7EyIsYVuDYzs2rlM+a1LfA+uWfWV/zeKwCHl5kVTU3h1Tb7pnEeG0KrQhS0KjOzWtQUXg2B7dg4tCo4vMysqGoKr2URcUO9VWJmVgc1/cK+qh6XmdlXQk3hdUS9VWFmVkfVhldEfFCfhZiZ1YX/6TMzS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8tiJPTV/Iwd/5Jf0G/oLh//vEF9ZPn/sa3/jX39Dx0Mt46Km5X1i/dt0/6HXSdfzsd/fWQ7UGcMTXv8bM0Zcw+45L+dF3Dv7C+p3blvLA785hyi0X8szIiziq9x7r1+2z2448OvwHTPuff+fZ2y5mm0Yl9Vl6wW1ZR2PVKisr52e/u5e7b7yQdm1bcty//Y6j+3djz847rW/TYceW3HjVGYy4+8kq9zH01kfo0333+ip5q9eggRh66QmcdMVoli5fw5MjzmfCtEW8vHj5+jY/PutQ7p88j9sfeJ4uu7ZhzOAz6f6dG2nYoAF/uuoULviv+5j32ru0atGEz8rKing0m98W2fOS5FDexAsLF9Np59bs2qE1jRuVcOKR+/PoMy9t1GaXdjuw99fa06CBvrD9i4veZvnKtRxyYJf6Knmr16vrzry+9AMWL1vJZ5+XMe7JlziuX9eNG0XQvOk2ALRoti3vrFgLwOFf3535r7/LvNfeBWDlmo8pL496rb/QChZekjpJWiRplKRXJN0p6UhJz0p6VdKB2es5SS9ImiapS7bt2ZLGSZqYtR1Sab/nZvubKelWScOz5aMkjZA0AxgiqYek6ZJelDReUitJXSXN3KTGl7LpXpKmSJot6VFJ7Qr12RTDO8tX075tq/Xz7dq05J3lq/Patry8nBuG3881F59YqPKsCu1aN2fJexvO0dLla2jXusVGbQaPeorTj+rOvDE/ZszgMxn0h4cB2H3n1kQE9w75HpP/dAGXfLt/vdZeHwrd8/oa8Fuga/Y6A+gPXA5cBSwCDo6I/YFrgV9V2rYHMBDYFxgoaRdJ7YFrgD5Av2yfle0MHBQRlwF/Bn4SEfsBLwHXRcQioLGkzln7gcA9khoBfwBOjYhewO3AL6s6IEnnSZoladb7K1Z8yY8lLaPHP8vhffemfduWxS7FNnHKEftx18QX6Hb6bzn9p3cw4spTkERJwwb02XdXzvvFvRx7yW0c338vDum5W7HL3awKfXn1RkRU9GzmA5MiIrLeTiegFBgtaQ8ggEaVtp0UEauzbRcAuwKtgSkR8UG2fCywZ6VtxkZEmaRSoGVETMmWjwbGZtNjyIXW4OzPgUAXoBvwuCSAhsCyqg4oIm4BbgHo0bNXMv3wndqUsvS9levnly1fxU5tSvPadva8N5nx19cYPf4Z1n38KZ999jnNmmzDVRd+s1DlGrBsxVo6tN1wjtq3acGyFWs2anPmcT05bdCfAXh+wdts27iEHUqbsnT5aqa9+CYfrPkIgMdnvEL3Pdrx9JzX6+8ACqzQPa9PKk2XV5ovJxec/wk8FRHdgG8C21azbRn5Be26PNrcA5wuaU8gIuJVQMD8iOiRvfaNiKPz2FcyenTtyBtvr+Ctpe/z6Wef85cnXuDoft3y2nb4dWfx/LjrmXHvdVxz8bc49ZivO7jqwZxFS9i9w/Z03KkljUoacvLh+zJh2qKN2ix5d/X6HtWeHVuzTeMSVqxax6Tn/8benXekyTaNaNigAf26d9pooH9LUOyB7VJgSTZ9dh7tnweGSWoFrAVOIXdJuJGIWC1ppaSDI2IqcBYwJVv3mqQycpef92SbvAy0kdQ3Ip7LLiP3jIj5/8SxfaWUlDTkF5edwhmXjaC8vJyBx/emy27tGDryEbp37cjR/bsxd+FbnHvVbaxe+zGPPzuf3942kafu+GmxS99qlZWXM+imh7lvyPdo2KABd06Yw6I3l3PlOYcz9+UlTJj2Mlf/90R+f/mJXHTaQUQEF/96PACrP/wHN4+dxqQR50MEj894lcemv1LkI9q8FFGYKx9JnYCHsl4VkkZl8/dWrAN+QO6Sbh3wMHBmRHSSdDZwQET8e7btQ8BvImKypPOAK4APyI2Z/T0iflZ5/9k2PYARQFPgdeCciFiZrbscGAp0jog3K7W/iVyglgDDIuLWmo6xR89e8eTUGf/U52T1q8MxNxS7BKuDT+aOpHzt0i9+/U0Bw6tQJG0XER9mP4cYD9weEeOLUYvDKz0Or7TUFF4p/s7reklzgXnAG8D9Ra3GzIqi2GNedRYRlxe7BjMrvhR7XmZmDi8zS5PDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJLk8DKzJDm8zCxJDi8zS5LDy8yS5PAysyQ5vMwsSQ4vM0uSw8vMkuTwMrMkObzMLEkOLzNLksPLzJKkiCh2DcmStBxYXOw6CqA1sKLYRVidbKnnbNeIaFPVCoeXfYGkWRFxQLHrsPxtjefMl41mliSHl5klyeFlVbml2AVYnW1158xjXmaWJPe8zCxJDi8zS5LDayskqaWkiyrND5D0UDFrMqsrh9fWqSVwUW2N8iWpZHPtyzavLfncOLy2ApIukzQve/0IGAzsLmmupKFZs+0k3StpkaQ7JSnbtpekKZJmS3pUUrts+WRJwyTNAi4tyoElQlKn7HMdJemV7PM9UtKzkl6VdGD2ek7SC5KmSeqSbXu2pHGSJmZth1Ta77nZ/mZKulXS8Gz5KEkjJM0AhkjqIWm6pBcljZfUSlJXSTM3qfGlbLrKc/6VExF+bcEvoBfwEtAM2A6YD+wPzKvUZgCwGtiZ3F9ozwH9gUbANKBN1m4gcHs2PRm4udjHl8IL6AR8Duybfb6zgdsBAScC9wMtgJKs/ZHAfdn02cDrQCmwLbnb0XYB2gNvAttn52kqMDzbZhTwENAwm38RODSbvgEYlk3PBTpn0z8Brq7pnH/VXltsl9LW6w+Mj4h1AJLGAQdX0W5mRPw9azOX3P9wq4BuwONZR6whsKzSNvcUqugt0BsRUdGzmQ9MiojIejudyIXTaEl7AEEuRCpMiojV2bYLgF3J3cs4JSI+yJaPBfastM3YiCiTVAq0jIgp2fLRwNhsegy5cBqc/TkQ6ELN5/wrw+FlFT6pNF1G7r8NAfMjom8126wreFVbjsqfb3ml+XJyn/V/Ak9FxEmSOpHr2Va1bcW5qU0+5+YeYGz2F1pExKuS9qXmc/6V4TGvLd9U4F8kNZXUDDgJeBZonse2LwNtJPUFkNRI0j6FK3WrVgosyabPzqP988Ch2fhVCXBKVY2yHttKSRW97bOAKdm618iF4TVs6EUnc87d89rCRcQcSaOAisHZkRExOxssngdMAB6uZttPJZ0K3JRdfpQAw8iNm9nmNYTcZePVVHM+KouIJZJ+Re68fgAsIjduWZXvAyMkNSU3fnZOpXX3AEOBztl+kznnvj3ILFGStouID7Oe13hyA+vji11XffFlo1m6rs++XJkHvEHuW8uthnteZpYk97zMLEkOLzNLksPLzJLk8LKCkVSW3T85T9LY7Kv6L7uvUdlX+EgaKWnvGtoOkHTQl3iPNyW1znf5Jm0+rON7XS/p8rrWaBs4vKyQPo6IHhHRDfgUuKDyyi/7xIOI+LeIWFBDkwFAncPL0uLwsvoyFfha1iuaKukBYIGkhpKGSno+e+rB+QDKGS7pZUlPAG0rdpQ90eKAbPoYSXMk/VXSpOzWmguA/8h6fQdLaiPpvuw9npfUL9t2B0mPSZovaSS526FqJOn+7GkL8yWdt8m6G7PlkyS1yZbtrtwTIWZnx911s3ya5qdK+FW4F/Bh9mcJ8BfgQnK9onVseJrBecDV2fQ2wCxyv/Y+GXic3I3B7cndJH5q1m4ycADQBni70r62z/68Hri8Uh13Af2z6Y7Awmz6JuDabPp4cjdEt67iON6sWF7pPZqQ+33VDtl8AN/Npq9lwxMeJgF7ZNO9gSerqtGvur98e5AVUpPsR5SQ63ndRu5ybmZEvJEtPxrYr2I8i9w9fnsAhwB3R0QZsFTSk1Xsvw/wdMW+InvCQhWOBPbOnpIA0ELSdtl7nJxt+7CklXkc0yWSTsqmd8lqfZ/cDdYV9wfeAYzL3uMgcjc/V2y/TR7vYXlweFkhfRwRPSovyP4nrvzEAwE/jIhHN2l33GasowHQJyL+UUUteZM0gFwQ9o2IjyRNJveMrapE9r6rNv0MbPPwmJcV26PAhZIaAUjaM3v6xdPAwGxMrB1wWBXbTgcOkdQ523b7bPlaNn5qxmPADytmJPXIJp8GzsiWHQu0qqXWUmBlFlxdyfX8KjQAKnqPZwDPRMQa4A1Jp2XvIUnda3kPy5PDy4ptJLAAmJM95eJP5K4IxgOvZuv+TO7prhuJiOXkxszGSforGy7bHgROqhiwBy4BDsi+EFjAhm89f04u/OaTu3x8q5ZaJwIlkhaSe4Df9Err1gEHZsdwOLknlgJ8Fzg3q28+uSen2mbgexvNLEnueZlZkhxeZpYkh5eZJcnhZWZJcniZWZIcXmaWJIeXmSXp/wElmzh/32UCRQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ConfusionMatrixDisplay.from_predictions(y_true, y_pred, \n",
    "                                        normalize=\"true\", \n",
    "                                        values_format=\".2f\",\n",
    "                                        display_labels=[\"other\", \"mangrove\"],\n",
    "                                        colorbar=False,\n",
    "                                        cmap = plt.get_cmap('Blues'));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cc3bac0a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "conda_gis",
   "language": "python",
   "name": "conda_gis"
  },
  "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.8.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}