{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### TU257 - Lab4 - Demo - Naive Baye\n", "#### Introduction to simple Classification\n", "The examples in this notebook illustrate some of the simple steps needed for classification.\n", "\n", "It is important to remember all the things we have covered in the previous weeks, as all of those\n", "apply to every Classification problem.\n", "But firstly, we will start with some simiple examples.\n", "\n", "Work through the first example, examining every step/cell. Add addition annotations and descriptions where you can.\n", "\n", "For the second example, there are very few comments/annotations. The exercise for you is to add these." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# load the iris dataset\n", "from sklearn.datasets import load_iris\n", "iris = load_iris()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'data': array([[5.1, 3.5, 1.4, 0.2],\n", " [4.9, 3. , 1.4, 0.2],\n", " [4.7, 3.2, 1.3, 0.2],\n", " [4.6, 3.1, 1.5, 0.2],\n", " [5. , 3.6, 1.4, 0.2],\n", " [5.4, 3.9, 1.7, 0.4],\n", " [4.6, 3.4, 1.4, 0.3],\n", " [5. , 3.4, 1.5, 0.2],\n", " [4.4, 2.9, 1.4, 0.2],\n", " [4.9, 3.1, 1.5, 0.1],\n", " [5.4, 3.7, 1.5, 0.2],\n", " [4.8, 3.4, 1.6, 0.2],\n", " [4.8, 3. , 1.4, 0.1],\n", " [4.3, 3. , 1.1, 0.1],\n", " [5.8, 4. , 1.2, 0.2],\n", " [5.7, 4.4, 1.5, 0.4],\n", " [5.4, 3.9, 1.3, 0.4],\n", " [5.1, 3.5, 1.4, 0.3],\n", " [5.7, 3.8, 1.7, 0.3],\n", " [5.1, 3.8, 1.5, 0.3],\n", " [5.4, 3.4, 1.7, 0.2],\n", " [5.1, 3.7, 1.5, 0.4],\n", " [4.6, 3.6, 1. , 0.2],\n", " [5.1, 3.3, 1.7, 0.5],\n", " [4.8, 3.4, 1.9, 0.2],\n", " [5. , 3. , 1.6, 0.2],\n", " [5. , 3.4, 1.6, 0.4],\n", " [5.2, 3.5, 1.5, 0.2],\n", " [5.2, 3.4, 1.4, 0.2],\n", " [4.7, 3.2, 1.6, 0.2],\n", " [4.8, 3.1, 1.6, 0.2],\n", " [5.4, 3.4, 1.5, 0.4],\n", " [5.2, 4.1, 1.5, 0.1],\n", " [5.5, 4.2, 1.4, 0.2],\n", " [4.9, 3.1, 1.5, 0.2],\n", " [5. , 3.2, 1.2, 0.2],\n", " [5.5, 3.5, 1.3, 0.2],\n", " [4.9, 3.6, 1.4, 0.1],\n", " [4.4, 3. , 1.3, 0.2],\n", " [5.1, 3.4, 1.5, 0.2],\n", " [5. , 3.5, 1.3, 0.3],\n", " [4.5, 2.3, 1.3, 0.3],\n", " [4.4, 3.2, 1.3, 0.2],\n", " [5. , 3.5, 1.6, 0.6],\n", " [5.1, 3.8, 1.9, 0.4],\n", " [4.8, 3. , 1.4, 0.3],\n", " [5.1, 3.8, 1.6, 0.2],\n", " [4.6, 3.2, 1.4, 0.2],\n", " [5.3, 3.7, 1.5, 0.2],\n", " [5. , 3.3, 1.4, 0.2],\n", " [7. , 3.2, 4.7, 1.4],\n", " [6.4, 3.2, 4.5, 1.5],\n", " [6.9, 3.1, 4.9, 1.5],\n", " [5.5, 2.3, 4. , 1.3],\n", " [6.5, 2.8, 4.6, 1.5],\n", " [5.7, 2.8, 4.5, 1.3],\n", " [6.3, 3.3, 4.7, 1.6],\n", " [4.9, 2.4, 3.3, 1. ],\n", " [6.6, 2.9, 4.6, 1.3],\n", " [5.2, 2.7, 3.9, 1.4],\n", " [5. , 2. , 3.5, 1. ],\n", " [5.9, 3. , 4.2, 1.5],\n", " [6. , 2.2, 4. , 1. ],\n", " [6.1, 2.9, 4.7, 1.4],\n", " [5.6, 2.9, 3.6, 1.3],\n", " [6.7, 3.1, 4.4, 1.4],\n", " [5.6, 3. , 4.5, 1.5],\n", " [5.8, 2.7, 4.1, 1. ],\n", " [6.2, 2.2, 4.5, 1.5],\n", " [5.6, 2.5, 3.9, 1.1],\n", " [5.9, 3.2, 4.8, 1.8],\n", " [6.1, 2.8, 4. , 1.3],\n", " [6.3, 2.5, 4.9, 1.5],\n", " [6.1, 2.8, 4.7, 1.2],\n", " [6.4, 2.9, 4.3, 1.3],\n", " [6.6, 3. , 4.4, 1.4],\n", " [6.8, 2.8, 4.8, 1.4],\n", " [6.7, 3. , 5. , 1.7],\n", " [6. , 2.9, 4.5, 1.5],\n", " [5.7, 2.6, 3.5, 1. ],\n", " [5.5, 2.4, 3.8, 1.1],\n", " [5.5, 2.4, 3.7, 1. ],\n", " [5.8, 2.7, 3.9, 1.2],\n", " [6. , 2.7, 5.1, 1.6],\n", " [5.4, 3. , 4.5, 1.5],\n", " [6. , 3.4, 4.5, 1.6],\n", " [6.7, 3.1, 4.7, 1.5],\n", " [6.3, 2.3, 4.4, 1.3],\n", " [5.6, 3. , 4.1, 1.3],\n", " [5.5, 2.5, 4. , 1.3],\n", " [5.5, 2.6, 4.4, 1.2],\n", " [6.1, 3. , 4.6, 1.4],\n", " [5.8, 2.6, 4. , 1.2],\n", " [5. , 2.3, 3.3, 1. ],\n", " [5.6, 2.7, 4.2, 1.3],\n", " [5.7, 3. , 4.2, 1.2],\n", " [5.7, 2.9, 4.2, 1.3],\n", " [6.2, 2.9, 4.3, 1.3],\n", " [5.1, 2.5, 3. , 1.1],\n", " [5.7, 2.8, 4.1, 1.3],\n", " [6.3, 3.3, 6. , 2.5],\n", " [5.8, 2.7, 5.1, 1.9],\n", " [7.1, 3. , 5.9, 2.1],\n", " [6.3, 2.9, 5.6, 1.8],\n", " [6.5, 3. , 5.8, 2.2],\n", " [7.6, 3. , 6.6, 2.1],\n", " [4.9, 2.5, 4.5, 1.7],\n", " [7.3, 2.9, 6.3, 1.8],\n", " [6.7, 2.5, 5.8, 1.8],\n", " [7.2, 3.6, 6.1, 2.5],\n", " [6.5, 3.2, 5.1, 2. ],\n", " [6.4, 2.7, 5.3, 1.9],\n", " [6.8, 3. , 5.5, 2.1],\n", " [5.7, 2.5, 5. , 2. ],\n", " [5.8, 2.8, 5.1, 2.4],\n", " [6.4, 3.2, 5.3, 2.3],\n", " [6.5, 3. , 5.5, 1.8],\n", " [7.7, 3.8, 6.7, 2.2],\n", " [7.7, 2.6, 6.9, 2.3],\n", " [6. , 2.2, 5. , 1.5],\n", " [6.9, 3.2, 5.7, 2.3],\n", " [5.6, 2.8, 4.9, 2. ],\n", " [7.7, 2.8, 6.7, 2. ],\n", " [6.3, 2.7, 4.9, 1.8],\n", " [6.7, 3.3, 5.7, 2.1],\n", " [7.2, 3.2, 6. , 1.8],\n", " [6.2, 2.8, 4.8, 1.8],\n", " [6.1, 3. , 4.9, 1.8],\n", " [6.4, 2.8, 5.6, 2.1],\n", " [7.2, 3. , 5.8, 1.6],\n", " [7.4, 2.8, 6.1, 1.9],\n", " [7.9, 3.8, 6.4, 2. ],\n", " [6.4, 2.8, 5.6, 2.2],\n", " [6.3, 2.8, 5.1, 1.5],\n", " [6.1, 2.6, 5.6, 1.4],\n", " [7.7, 3. , 6.1, 2.3],\n", " [6.3, 3.4, 5.6, 2.4],\n", " [6.4, 3.1, 5.5, 1.8],\n", " [6. , 3. , 4.8, 1.8],\n", " [6.9, 3.1, 5.4, 2.1],\n", " [6.7, 3.1, 5.6, 2.4],\n", " [6.9, 3.1, 5.1, 2.3],\n", " [5.8, 2.7, 5.1, 1.9],\n", " [6.8, 3.2, 5.9, 2.3],\n", " [6.7, 3.3, 5.7, 2.5],\n", " [6.7, 3. , 5.2, 2.3],\n", " [6.3, 2.5, 5. , 1.9],\n", " [6.5, 3. , 5.2, 2. ],\n", " [6.2, 3.4, 5.4, 2.3],\n", " [5.9, 3. , 5.1, 1.8]]),\n", " 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]),\n", " 'frame': None,\n", " 'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='#sk-container-id-1 {\n", " /* Definition of color scheme common for light and dark mode */\n", " --sklearn-color-text: #000;\n", " --sklearn-color-text-muted: #666;\n", " --sklearn-color-line: gray;\n", " /* Definition of color scheme for unfitted estimators */\n", " --sklearn-color-unfitted-level-0: #fff5e6;\n", " --sklearn-color-unfitted-level-1: #f6e4d2;\n", " --sklearn-color-unfitted-level-2: #ffe0b3;\n", " --sklearn-color-unfitted-level-3: chocolate;\n", " /* Definition of color scheme for fitted estimators */\n", " --sklearn-color-fitted-level-0: #f0f8ff;\n", " --sklearn-color-fitted-level-1: #d4ebff;\n", " --sklearn-color-fitted-level-2: #b3dbfd;\n", " --sklearn-color-fitted-level-3: cornflowerblue;\n", "\n", " /* Specific color for light theme */\n", " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n", " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", " --sklearn-color-icon: #696969;\n", "\n", " @media (prefers-color-scheme: dark) {\n", " /* Redefinition of color scheme for dark theme */\n", " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n", " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", " --sklearn-color-icon: #878787;\n", " }\n", "}\n", "\n", "#sk-container-id-1 {\n", " color: var(--sklearn-color-text);\n", "}\n", "\n", "#sk-container-id-1 pre {\n", " padding: 0;\n", "}\n", "\n", "#sk-container-id-1 input.sk-hidden--visually {\n", " border: 0;\n", " clip: rect(1px 1px 1px 1px);\n", " clip: rect(1px, 1px, 1px, 1px);\n", " height: 1px;\n", " margin: -1px;\n", " overflow: hidden;\n", " padding: 0;\n", " position: absolute;\n", " width: 1px;\n", "}\n", "\n", "#sk-container-id-1 div.sk-dashed-wrapped {\n", " border: 1px dashed var(--sklearn-color-line);\n", " margin: 0 0.4em 0.5em 0.4em;\n", " box-sizing: border-box;\n", " padding-bottom: 0.4em;\n", " background-color: var(--sklearn-color-background);\n", "}\n", "\n", "#sk-container-id-1 div.sk-container {\n", " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", " but bootstrap.min.css set `[hidden] { display: none !important; }`\n", " so we also need the `!important` here to be able to override the\n", " default hidden behavior on the sphinx rendered scikit-learn.org.\n", " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", " display: inline-block !important;\n", " position: relative;\n", "}\n", "\n", "#sk-container-id-1 div.sk-text-repr-fallback {\n", " display: none;\n", "}\n", "\n", "div.sk-parallel-item,\n", "div.sk-serial,\n", "div.sk-item {\n", " /* draw centered vertical line to link estimators */\n", " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", " background-size: 2px 100%;\n", " background-repeat: no-repeat;\n", " background-position: center center;\n", "}\n", "\n", "/* Parallel-specific style estimator block */\n", "\n", "#sk-container-id-1 div.sk-parallel-item::after {\n", " content: \"\";\n", " width: 100%;\n", " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", " flex-grow: 1;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel {\n", " display: flex;\n", " align-items: stretch;\n", " justify-content: center;\n", " background-color: var(--sklearn-color-background);\n", " position: relative;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item {\n", " display: flex;\n", " flex-direction: column;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n", " align-self: flex-end;\n", " width: 50%;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n", " align-self: flex-start;\n", " width: 50%;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n", " width: 0;\n", "}\n", "\n", "/* Serial-specific style estimator block */\n", "\n", "#sk-container-id-1 div.sk-serial {\n", " display: flex;\n", " flex-direction: column;\n", " align-items: center;\n", " background-color: var(--sklearn-color-background);\n", " padding-right: 1em;\n", " padding-left: 1em;\n", "}\n", "\n", "\n", "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", "clickable and can be expanded/collapsed.\n", "- Pipeline and ColumnTransformer use this feature and define the default style\n", "- Estimators will overwrite some part of the style using the `sk-estimator` class\n", "*/\n", "\n", "/* Pipeline and ColumnTransformer style (default) */\n", "\n", "#sk-container-id-1 div.sk-toggleable {\n", " /* Default theme specific background. It is overwritten whether we have a\n", " specific estimator or a Pipeline/ColumnTransformer */\n", " background-color: var(--sklearn-color-background);\n", "}\n", "\n", "/* Toggleable label */\n", "#sk-container-id-1 label.sk-toggleable__label {\n", " cursor: pointer;\n", " display: flex;\n", " width: 100%;\n", " margin-bottom: 0;\n", " padding: 0.5em;\n", " box-sizing: border-box;\n", " text-align: center;\n", " align-items: start;\n", " justify-content: space-between;\n", " gap: 0.5em;\n", "}\n", "\n", "#sk-container-id-1 label.sk-toggleable__label .caption {\n", " font-size: 0.6rem;\n", " font-weight: lighter;\n", " color: var(--sklearn-color-text-muted);\n", "}\n", "\n", "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n", " /* Arrow on the left of the label */\n", " content: \"▸\";\n", " float: left;\n", " margin-right: 0.25em;\n", " color: var(--sklearn-color-icon);\n", "}\n", "\n", "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n", " color: var(--sklearn-color-text);\n", "}\n", "\n", "/* Toggleable content - dropdown */\n", "\n", "#sk-container-id-1 div.sk-toggleable__content {\n", " max-height: 0;\n", " max-width: 0;\n", " overflow: hidden;\n", " text-align: left;\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-toggleable__content.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-toggleable__content pre {\n", " margin: 0.2em;\n", " border-radius: 0.25em;\n", " color: var(--sklearn-color-text);\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", " /* Expand drop-down */\n", " max-height: 200px;\n", " max-width: 100%;\n", " overflow: auto;\n", "}\n", "\n", "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", " content: \"▾\";\n", "}\n", "\n", "/* Pipeline/ColumnTransformer-specific style */\n", "\n", "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Estimator-specific style */\n", "\n", "/* Colorize estimator box */\n", "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n", "#sk-container-id-1 div.sk-label label {\n", " /* The background is the default theme color */\n", " color: var(--sklearn-color-text-on-default-background);\n", "}\n", "\n", "/* On hover, darken the color of the background */\n", "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "/* Label box, darken color on hover, fitted */\n", "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Estimator label */\n", "\n", "#sk-container-id-1 div.sk-label label {\n", " font-family: monospace;\n", " font-weight: bold;\n", " display: inline-block;\n", " line-height: 1.2em;\n", "}\n", "\n", "#sk-container-id-1 div.sk-label-container {\n", " text-align: center;\n", "}\n", "\n", "/* Estimator-specific */\n", "#sk-container-id-1 div.sk-estimator {\n", " font-family: monospace;\n", " border: 1px dotted var(--sklearn-color-border-box);\n", " border-radius: 0.25em;\n", " box-sizing: border-box;\n", " margin-bottom: 0.5em;\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-estimator.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", "/* on hover */\n", "#sk-container-id-1 div.sk-estimator:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-estimator.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", "\n", "/* Common style for \"i\" and \"?\" */\n", "\n", ".sk-estimator-doc-link,\n", "a:link.sk-estimator-doc-link,\n", "a:visited.sk-estimator-doc-link {\n", " float: right;\n", " font-size: smaller;\n", " line-height: 1em;\n", " font-family: monospace;\n", " background-color: var(--sklearn-color-background);\n", " border-radius: 1em;\n", " height: 1em;\n", " width: 1em;\n", " text-decoration: none !important;\n", " margin-left: 0.5em;\n", " text-align: center;\n", " /* unfitted */\n", " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", " color: var(--sklearn-color-unfitted-level-1);\n", "}\n", "\n", ".sk-estimator-doc-link.fitted,\n", "a:link.sk-estimator-doc-link.fitted,\n", "a:visited.sk-estimator-doc-link.fitted {\n", " /* fitted */\n", " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", " color: var(--sklearn-color-fitted-level-1);\n", "}\n", "\n", "/* On hover */\n", "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", ".sk-estimator-doc-link:hover,\n", "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", ".sk-estimator-doc-link:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-3);\n", " color: var(--sklearn-color-background);\n", " text-decoration: none;\n", "}\n", "\n", "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", ".sk-estimator-doc-link.fitted:hover,\n", "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", ".sk-estimator-doc-link.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-3);\n", " color: var(--sklearn-color-background);\n", " text-decoration: none;\n", "}\n", "\n", "/* Span, style for the box shown on hovering the info icon */\n", ".sk-estimator-doc-link span {\n", " display: none;\n", " z-index: 9999;\n", " position: relative;\n", " font-weight: normal;\n", " right: .2ex;\n", " padding: .5ex;\n", " margin: .5ex;\n", " width: min-content;\n", " min-width: 20ex;\n", " max-width: 50ex;\n", " color: var(--sklearn-color-text);\n", " box-shadow: 2pt 2pt 4pt #999;\n", " /* unfitted */\n", " background: var(--sklearn-color-unfitted-level-0);\n", " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", "}\n", "\n", ".sk-estimator-doc-link.fitted span {\n", " /* fitted */\n", " background: var(--sklearn-color-fitted-level-0);\n", " border: var(--sklearn-color-fitted-level-3);\n", "}\n", "\n", ".sk-estimator-doc-link:hover span {\n", " display: block;\n", "}\n", "\n", "/* \"?\"-specific style due to the `` HTML tag */\n", "\n", "#sk-container-id-1 a.estimator_doc_link {\n", " float: right;\n", " font-size: 1rem;\n", " line-height: 1em;\n", " font-family: monospace;\n", " background-color: var(--sklearn-color-background);\n", " border-radius: 1rem;\n", " height: 1rem;\n", " width: 1rem;\n", " text-decoration: none;\n", " /* unfitted */\n", " color: var(--sklearn-color-unfitted-level-1);\n", " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", "}\n", "\n", "#sk-container-id-1 a.estimator_doc_link.fitted {\n", " /* fitted */\n", " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", " color: var(--sklearn-color-fitted-level-1);\n", "}\n", "\n", "/* On hover */\n", "#sk-container-id-1 a.estimator_doc_link:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-3);\n", " color: var(--sklearn-color-background);\n", " text-decoration: none;\n", "}\n", "\n", "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-3);\n", "}\n", "
GaussianNB()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "GaussianNB()" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#We are going to use Naive Bayes algorithm\n", "from sklearn.naive_bayes import GaussianNB\n", "\n", "#Define the model\n", "gnb = GaussianNB()\n", "#Train the model\n", "gnb.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "#Let's now make predictions on the testing set\n", "y_pred = gnb.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gaussian Naive Bayes model accuracy(in %): 95.0\n" ] } ], "source": [ "# comparing actual response values (y_test) with predicted response values (y_pred)\n", "from sklearn import metrics\n", "print(\"Gaussian Naive Bayes model accuracy(in %):\", metrics.accuracy_score(y_test, y_pred)*100)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "#This means the Naive Bayes model correctly predicted 95% of the Target values in the Test dataset" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 1, 0, 2, 2, 2, 0, 0, 2, 1, 0, 2, 1, 1, 0, 1, 1, 0, 0, 1, 1,\n", " 2, 0, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 2, 0, 1, 0, 1, 2, 2, 0, 1, 2,\n", " 1, 2, 0, 0, 0, 1, 0, 0, 2, 2, 2, 2, 2, 1, 2, 1])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 1, 0, 2, 1, 2, 0, 0, 2, 1, 0, 2, 1, 1, 0, 1, 1, 0, 0, 1, 1,\n", " 1, 0, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 2, 0, 1, 0, 1, 2, 2, 0, 2, 2,\n", " 1, 2, 0, 0, 0, 1, 0, 0, 2, 2, 2, 2, 2, 1, 2, 1])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_test" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "90" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(X_train)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "#Excercise: Compare the list of Target values with the Predicted values\n", "#(Hint) see code later in this notebook" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "#Play Tennis Dataset\n", "#See notes" ] }, { "cell_type": "code", "execution_count": 21, "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", "
dayoutlooktemphumiditywindplay
0D1SunnyHotHighWeakNo
1D2SunnyHotHighStrongNo
2D3OvercastHotHighWeakYes
3D4RainMildHighWeakYes
4D5RainCoolNormalWeakYes
5D6RainCoolNormalStrongNo
6D7OvercastCoolNormalStrongYes
7D8SunnyMildHighWeakNo
8D9SunnyCoolNormalWeakYes
9D10RainMildNormalWeakYes
10D11SunnyMildNormalStrongYes
11D12OvercastMildHighStrongYes
12D13OvercastHotNormalWeakYes
13D14RainMildHighStrongNo
\n", "
" ], "text/plain": [ " day outlook temp humidity wind play\n", "0 D1 Sunny Hot High Weak No\n", "1 D2 Sunny Hot High Strong No\n", "2 D3 Overcast Hot High Weak Yes\n", "3 D4 Rain Mild High Weak Yes\n", "4 D5 Rain Cool Normal Weak Yes\n", "5 D6 Rain Cool Normal Strong No\n", "6 D7 Overcast Cool Normal Strong Yes\n", "7 D8 Sunny Mild High Weak No\n", "8 D9 Sunny Cool Normal Weak Yes\n", "9 D10 Rain Mild Normal Weak Yes\n", "10 D11 Sunny Mild Normal Strong Yes\n", "11 D12 Overcast Mild High Strong Yes\n", "12 D13 Overcast Hot Normal Weak Yes\n", "13 D14 Rain Mild High Strong No" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "#Load in the dataset\n", "df = pd.read_csv('C:\\\\Users\\\\Rafael\\\\Documents\\\\DataScience\\\\Data Analitics\\\\week5\\\\play_tennis.csv')\n", "df.head(20)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(14, 6)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Number of row and features\n", "df.shape" ] }, { "cell_type": "code", "execution_count": 23, "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", "
dayoutlooktemphumiditywindplay
0021010
1621000
2701011
3812011
4910111
51010100
61100101
71222010
81320111
9112111
10222101
11302001
12401111
13512000
\n", "
" ], "text/plain": [ " day outlook temp humidity wind play\n", "0 0 2 1 0 1 0\n", "1 6 2 1 0 0 0\n", "2 7 0 1 0 1 1\n", "3 8 1 2 0 1 1\n", "4 9 1 0 1 1 1\n", "5 10 1 0 1 0 0\n", "6 11 0 0 1 0 1\n", "7 12 2 2 0 1 0\n", "8 13 2 0 1 1 1\n", "9 1 1 2 1 1 1\n", "10 2 2 2 1 0 1\n", "11 3 0 2 0 0 1\n", "12 4 0 1 1 1 1\n", "13 5 1 2 0 0 0" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Transform the data in Text form\n", "#Use Encoding to do this quickly\n", "from sklearn import preprocessing \n", "\n", "#Setup the Label Encoder\n", "le=preprocessing.LabelEncoder()\n", "#Loop through the columns\n", "for col in df.columns:\n", " #transform the column\n", " df[col]=le.fit_transform(df[col])\n", "\n", "#Display the updated dataframe\n", "df" ] }, { "cell_type": "code", "execution_count": 24, "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", "
dayoutlooktemphumiditywind
002101
162100
270101
381201
491011
\n", "
" ], "text/plain": [ " day outlook temp humidity wind\n", "0 0 2 1 0 1\n", "1 6 2 1 0 0\n", "2 7 0 1 0 1\n", "3 8 1 2 0 1\n", "4 9 1 0 1 1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#There are various ways to do the next step\n", "#Here we separate the descriptive features from the Target features\n", "X = df.drop('play', axis=1)\n", "\n", "#Create a new dataframe (Y) to only contain the Target attribute\n", "Y = df['play']\n", "X.head()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# use Stratified sampling to divide the data\n", "from sklearn.model_selection import StratifiedShuffleSplit\n", "\n", "#Setup the sampling and splitting the data\n", "split = StratifiedShuffleSplit(n_splits=10, test_size = 0.2, random_state=18)\n", "\n", "#Create the Train and Test datasets\n", "for train_index, test_index in split.split(X, Y):\n", " train_set = df.loc[train_index]\n", " test_set = df.loc[test_index]" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "#Exercise: Modify the above cell to replace X, Y in the split function with the dataframe subsets\n" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(11, 6)\n", "(3, 6)\n" ] } ], "source": [ "#display the sizes of the Train and Test datasets\n", "print(train_set.shape)\n", "print(test_set.shape)" ] }, { "cell_type": "code", "execution_count": 28, "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", "
dayoutlooktemphumiditywindplay
10222101
4910111
71222010
3812011
11302001
9112111
13512000
0021010
1621000
61100101
81320111
\n", "
" ], "text/plain": [ " day outlook temp humidity wind play\n", "10 2 2 2 1 0 1\n", "4 9 1 0 1 1 1\n", "7 12 2 2 0 1 0\n", "3 8 1 2 0 1 1\n", "11 3 0 2 0 0 1\n", "9 1 1 2 1 1 1\n", "13 5 1 2 0 0 0\n", "0 0 2 1 0 1 0\n", "1 6 2 1 0 0 0\n", "6 11 0 0 1 0 1\n", "8 13 2 0 1 1 1" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_set" ] }, { "cell_type": "code", "execution_count": 29, "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", "
dayoutlooktemphumiditywindplay
12401111
2701011
51010100
\n", "
" ], "text/plain": [ " day outlook temp humidity wind play\n", "12 4 0 1 1 1 1\n", "2 7 0 1 0 1 1\n", "5 10 1 0 1 0 0" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#This is a very small dataset\n", "test_set" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "play\n", "1 7\n", "0 4\n", "Name: count, dtype: int64" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_set['play'].value_counts()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "play\n", "1 2\n", "0 1\n", "Name: count, dtype: int64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_set['play'].value_counts()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "#Separate the datasets into X, Y\n", "X_train = train_set.drop('play', axis=1)\n", "X_test = test_set.drop('play', axis=1)\n", "Y_train = train_set['play']\n", "Y_test = test_set['play']" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "#Import Gaussian Naive Bayes model\n", "from sklearn.naive_bayes import GaussianNB\n", "\n", "#Create a Gaussian Classifier\n", "model = GaussianNB()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
GaussianNB()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "GaussianNB()" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Train (fit) the model using the training sets\n", "model.fit(X_train,Y_train)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "#Apply the model to the Test dataset to create the Predicted values\n", "predicted= model.predict(X_test) " ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 0, 1])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predicted" ] }, { "cell_type": "code", "execution_count": 37, "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", "
play01
row_0
001
111
\n", "
" ], "text/plain": [ "play 0 1\n", "row_0 \n", "0 0 1\n", "1 1 1" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Crosstab the columns to give a basic confusion matrix\n", "pd.crosstab(predicted, Y_test)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "#We can also get the prediction probabilities\n", "#These indicate how strong of a prediction the model made for each prediction\n", "#1=a very strong prediction\n", "#0=a very weak prediction\n", "Y_predict_prob = model.predict_proba(X_test)[:,1]" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1. , 0.1098402, 1. ])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y_predict_prob" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhsAAAHNCAYAAAC3qLkSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5QUlEQVR4nO3df3zP9f7/8fvb2GZ+TIyFmAkllGPkbCyHNCS1Tkek/IiKUn1YOlkqP6qzTufkV8zhZEmpdlLklGLpl1AxRKXIr4XNzMGQNtue3z+6eH97t41tvV6v9957367n8rpczvv5+vF8vOfseHg8f7xcxhgjAAAAm1TzdgAAAKBqI9kAAAC2ItkAAAC2ItkAAAC2ItkAAAC2ItkAAAC2ItkAAAC2ItkAAAC2ItkAAAC2ItmATzl9+rRmzJihnj17Kjw8XIGBgbrooosUHR2tJ554QhkZGV6LLT09XXFxcapXr55cLpdcLpf27dtne78ff/yxXC6XRowYYXtf5dWiRQv3z+K1114r9bovv/zSfZ3L5XIwwtJNmTJFLpdLixYt8nYogM8j2YDP+Pzzz9W6dWslJCToyy+/VPv27fWXv/xFMTEx2r17t5588km1adNGH3zwgeOxnTx5UjfeeKM++OADderUScOGDdPw4cNVu3Ztx2OprJYsWVLquVdeecXSvhYtWiSXy6UpU6ZY+lwAFVPd2wEAZbFt2zb16tVLZ86c0SOPPKLHH39ctWrVcp8vKirS8uXL9de//lUHDhxwPL6NGzfq0KFDGjp0qBYvXuxo31dffbV27Nih0NBQR/stjz/84Q9atWqVjhw5ooYNG3qcKygoUGpqqq644grt3r1beXl5XorS0/3336/BgwercePG3g4F8HlUNlDpGWN0xx136MyZM5oyZYqeeeYZj0RDkqpVq6Y///nPSk9PV+fOnR2P8VyC07JlS8f7DgkJ0eWXX16p/1K84447VFBQoP/85z/Fzq1evVrZ2dm64447vBBZ6cLCwnT55ZdX6iQO8BkGqOTee+89I8lccskl5uzZs+W+//Tp02batGmmXbt2Jjg42NStW9fExsaa1157rcTrIyIizLlfjX//+9+mQ4cOJjg42ISHh5t77rnHHDt2zH3t3r17jaQSj+HDhxtjjJk8ebKRZF588cUL9vdrn3/+uYmPjzfNmzc3gYGBJjw83HTp0sVMnDjRnDx50n3dRx995NHfr509e9bMnj3bdOrUydSqVcvUqlXLdOnSxSQnJ5uCgoJi1/fo0cNIMnv37jXLli0zXbt2NSEhIeaiiy4ygwcPNj/++GMpP+WSnftuu3fvNrVr1zZ//OMfi11z2223GZfLZfbt22eCgoJK/Fm888475s477zSXX365qVOnjgkJCTFXXnmlefrpp83PP/9c4nco6Tj3Z/Drn1lmZqYZNWqUadq0qQkICDAzZswwxpT85/buu+8aSebSSy/1+DMwxpiioiLTq1cvI8k8++yz5fo5AVUdwyio9N59911J0sCBA1W9evn+J3vy5En17NlT6enpatiwoW644QadPn1aH374odauXavPP/9cM2fOLPHev/71r5o1a5a6dOmivn37av369VqwYIF27NihTz75RC6XS7Vr19bw4cP1ww8/aN26dbrqqqvUsWNHSVL37t1/13e+8cYb5XK51K1bN8XExOjYsWPauXOnnnnmGY0ePfqC80EKCwt10003aeXKlapbt6569+4tSfrwww913333KS0tTUuXLlW1asULnMnJyXruuefUuXNn9e3bVxs3btTrr7+u9PR0ffXVV6pZs2a5vk9ISIji4+P1yiuvaPfu3br00ksl/TLh9+2331ZsbKwiIiJKvX/UqFE6ffq02rVrpw4dOig3N1dffvmlJk2apDVr1mj16tUKCAiQJPXt21cFBQXF/jwkqVWrVh7PPXLkiLp06aKCggJ1795dP//8s0JCQkqN4/rrr9fYsWM1d+5cPfjgg0pJSXGfe+655/Thhx+qZ8+eeuihh8r18wGqPG9nO8CFdOvWzUgyL7/8crnvvf/++40k07t3b49/ie7YscM0atTISDLvvvuuxz3n/jXeuHFjs2XLFnf7kSNHTKtWrYwks2bNGo97XnzxRSPJTJ48uVgMFals9OjRw7hcLrNp06Zi13/xxRcmNzfX/bm0ysY///lPI8l06NDBHD582N1+6NAhc9lllxlJZu7cucX6lWRq1arl8R1Pnz5tYmJijCSzcOHCEr/H+b5bZmamef/9940kM3XqVPf5xYsXG0lm/vz5xhhTamVj2bJl5tSpUx5tubm55oYbbjCSzEsvveRx7nx/Hsb8/5+ZJHPzzTebM2fOFLumtD+3n376ybRt29ZIMm+++aYxxpitW7eawMBAU69e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5syZo7Fjx7qvTUhI0MyZMxUdHa0HHnhAx48f19/+9jc1adLk9/2QAVQuBoAtPvroIyPJPP744+bIkSMmOzvbfPXVV+auu+4ykkyXLl2MMcZEREQYSSYlJaXYM6688krTpk0bk5ub69H+1ltvGUnmxRdfdLdFR0ebgIAAs337dndbYWGhGTBggJFkhg8f7vGM37b9+OOPJjAw0FxxxRXmxIkTxWIpLCws9d5zNm3aZCSZiRMnFjt30003mTp16ri/y3fffWdcLpfp3r27yc/Pd1+3b98+ExISYiSZjz76qNhzAPgehlEAmz355JNq2LChGjVqpKuuukoLFy5Uv379PFZzNGjQQMOHD/e4b/v27dq2bZsGDx6svLw85eTkuI/u3burVq1aWr16tSQpOztbGzZs0A033KD27du7n1GtWjVNnDixTHG+8cYbys/P1+OPP666desWO1+t2oX/7+LVV1+VJA0bNswj3pycHN144406efKkNmzYIElasWKFjDF66KGH3NUZSYqIiNDtt99eppgB+AaGUQCbjRo1SoMHD5bL5VJISIjatGmjBg0aeFzTsmXLYn+Z79ixQ5I0bdo0TZs2rcRnHz58WJK0Z88eSVLbtm2LXXPFFVeUKc5du3ZJkq666qoyXV+SczGfr89zMe/evVvS74sZgG8g2QBs1qpVK/Xu3fu814SEhBRrM8ZIksaNG6f+/fuXeN9FF13k8fnc5M0LtZXkXH+/x7lnrFy50qNa8Wvt2rXz+FzW+AD4LpINoJJq06aNpF+GLy6UrFx66aWSpG+//bbYuW+++aZM/V122WWSpK1bt5ZYbSiLNm3a6P3339cll1zisaKmJL+O+dx3Paek7wHAdzFnA6ikOnbsqA4dOmjBggXu1Su/VlBQoP/973+SpIYNGyomJkbvvPOOvv76a/c1RUVFeuaZZ8rU31/+8hcFBgbqqaeeUm5ubrHzv6581K5dW8eOHSt2zbn9RB599FEVFBQUO5+dne3+7zfeeKNcLpeee+45nT171t2+f/9+LVmypEwxA/ANVDaASsrlcmnx4sXq1auXOnbsqJEjR6pdu3b66aef9MMPP+itt95SUlKSe6+M6dOn609/+pOuueYa3X///WrYsKGWL1+u48ePl6m/Sy65RDNnztTYsWPVoUMHDRs2TBERETp48KDefvttpaSkqGPHjpKkrl276oMPPtA//vEPNWvWTLVq1dKAAQPUpUsXTZ06VZMnT1bHjh116623qkmTJsrMzFR6erpWrlyp/Px8Sb9UUsaNG6cZM2aoR48eGjRokE6cOKF58+bp8ssv1+bNm234qQLwCq+uhQGqsHNLX5OSks57XUREhOnRo0ep5/ft22dGjx5tIiIiTI0aNUz9+vVNp06dzMSJE01GRobHtevXrzexsbEmODjY1K9f3wwdOtRkZ2eXaenrOatWrTK9e/c2devWNUFBQSYyMtLcddddJicnx33Nd999Z3r16mVq165tJJmIiAiPZ7zzzjsmLi7OXHTRRSYwMNBccsklpm/fviY5OdnjuqKiIvPss8+ayMhIExgYaFq3bm1mzZplXnzxRZa+AlWIyxgLZoUBAACUgjkbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAViQbAADAVv8P9fge7mIoMq4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "from sklearn.metrics import confusion_matrix\n", "import matplotlib.pyplot as plt\n", "\n", "# passing actual and predicted values\n", "cm = confusion_matrix(Y_test, predicted)\n", "\n", "# true write data values in each cell of the matrix\n", "sns.heatmap(cm, annot=True)\n", "plt.title('Confusion Matrix', fontsize = 15) \n", "plt.xlabel('Predicted', fontsize = 13) \n", "plt.ylabel('Acuals', fontsize = 13) \n", "\n", "plt.show()\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.12.9" } }, "nbformat": 4, "nbformat_minor": 4 }