Praktikum-Machine-Learning/ML0101EN_Clas_SVM_cancer.ipynb

1781 lines
124 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "Q0LJh3iniLjH"
},
"source": [
"<p style=\"text-align:center\">\n",
" <a href=\"https://skills.network\" target=\"_blank\">\n",
" <img src=\"https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/assets/logos/SN_web_lightmode.png\" width=\"200\" alt=\"Skills Network Logo\">\n",
" </a>\n",
"</p>\n",
"\n",
"\n",
"# SVM (Support Vector Machines)\n",
"\n",
"\n",
"Estimated time needed: **15** minutes\n",
" \n",
"\n",
"## Objectives\n",
"\n",
"After completing this lab you will be able to:\n",
"\n",
"* Use scikit-learn to Support Vector Machine to classify\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uHxznhXeiLjK"
},
"source": [
"In this notebook, you will use SVM (Support Vector Machines) to build and train a model using human cell records, and classify cells to whether the samples are benign or malignant.\n",
"\n",
"SVM works by mapping data to a high-dimensional feature space so that data points can be categorized, even when the data are not otherwise linearly separable. A separator between the categories is found, then the data is transformed in such a way that the separator could be drawn as a hyperplane. Following this, characteristics of new data can be used to predict the group to which a new record should belong.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zyp9_oqyiLjL"
},
"source": [
"<h1>Table of contents</h1>\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
" <ol>\n",
" <li><a href=\"#load_dataset\">Load the Cancer data</a></li>\n",
" <li><a href=\"#modeling\">Modeling</a></li>\n",
" <li><a href=\"#evaluation\">Evaluation</a></li>\n",
" <li><a href=\"#practice\">Practice</a></li>\n",
" </ol>\n",
"</div>\n",
"<br>\n",
"<hr>\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "EWFkcQeyiLjL",
"outputId": "a441af4a-0d56-407b-edeb-78d344cd124f"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.12/dist-packages (1.6.1)\n",
"Requirement already satisfied: numpy>=1.19.5 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (2.0.2)\n",
"Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.16.3)\n",
"Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.5.2)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (3.6.0)\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (3.10.0)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.3.3)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (4.60.1)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.4.9)\n",
"Requirement already satisfied: numpy>=1.23 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (2.0.2)\n",
"Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (25.0)\n",
"Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (11.3.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (3.2.5)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (2.9.0.post0)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n",
"Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (2.2.2)\n",
"Requirement already satisfied: numpy>=1.26.0 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.0.2)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (2.0.2)\n"
]
}
],
"source": [
"!pip install scikit-learn\n",
"!pip install matplotlib\n",
"!pip install pandas\n",
"!pip install numpy\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "qZ0GUy5PiLjN"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import pylab as pl\n",
"import numpy as np\n",
"import scipy.optimize as opt\n",
"from sklearn import preprocessing\n",
"from sklearn.model_selection import train_test_split\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BpKIVFWoiLjO"
},
"source": [
"<h2 id=\"load_dataset\">Load the Cancer data</h2>\n",
"The example is based on a dataset that is publicly available from the UCI Machine Learning Repository (Asuncion and Newman, 2007)[http://mlearn.ics.uci.edu/MLRepository.html]. The dataset consists of several hundred human cell sample records, each of which contains the values of a set of cell characteristics. The fields in each record are:\n",
"\n",
"|Field name|Description|\n",
"|--- |--- |\n",
"|ID|Clump thickness|\n",
"|Clump|Clump thickness|\n",
"|UnifSize|Uniformity of cell size|\n",
"|UnifShape|Uniformity of cell shape|\n",
"|MargAdh|Marginal adhesion|\n",
"|SingEpiSize|Single epithelial cell size|\n",
"|BareNuc|Bare nuclei|\n",
"|BlandChrom|Bland chromatin|\n",
"|NormNucl|Normal nucleoli|\n",
"|Mit|Mitoses|\n",
"|Class|Benign or malignant|\n",
"\n",
"<br>\n",
"<br>\n",
"\n",
"For the purposes of this example, we're using a dataset that has a relatively small number of predictors in each record. To download the data, we will use `!wget` to download it from IBM Object Storage. \n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "yIiwprs1iLjP",
"outputId": "44c5fe3c-c6b3-4663-8403-ec7ef0cfee13"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"--2025-11-18 05:59:58-- https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%203/data/cell_samples.csv\n",
"Resolving cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)... 198.23.119.245\n",
"Connecting to cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)|198.23.119.245|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 19975 (20K) [text/csv]\n",
"Saving to: cell_samples.csv\n",
"\n",
"cell_samples.csv 100%[===================>] 19.51K --.-KB/s in 0s \n",
"\n",
"2025-11-18 06:00:00 (237 MB/s) - cell_samples.csv saved [19975/19975]\n",
"\n"
]
}
],
"source": [
"#Click here and press Shift+Enter\n",
"!wget -O cell_samples.csv https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%203/data/cell_samples.csv"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ok_2aoKaiLjP"
},
"source": [
"## Load Data From CSV File \n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "fmQbuIIziLjQ",
"outputId": "d2cd1e01-e73a-4e2e-988e-bbc70fea4829"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" ID Clump UnifSize UnifShape MargAdh SingEpiSize BareNuc \\\n",
"0 1000025 5 1 1 1 2 1 \n",
"1 1002945 5 4 4 5 7 10 \n",
"2 1015425 3 1 1 1 2 2 \n",
"3 1016277 6 8 8 1 3 4 \n",
"4 1017023 4 1 1 3 2 1 \n",
"\n",
" BlandChrom NormNucl Mit Class \n",
"0 3 1 1 2 \n",
"1 3 2 1 2 \n",
"2 3 1 1 2 \n",
"3 3 7 1 2 \n",
"4 3 1 1 2 "
],
"text/html": [
"\n",
" <div id=\"df-54aba7ad-e33a-4f15-ae3b-7b3bc352b58d\" class=\"colab-df-container\">\n",
" <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>ID</th>\n",
" <th>Clump</th>\n",
" <th>UnifSize</th>\n",
" <th>UnifShape</th>\n",
" <th>MargAdh</th>\n",
" <th>SingEpiSize</th>\n",
" <th>BareNuc</th>\n",
" <th>BlandChrom</th>\n",
" <th>NormNucl</th>\n",
" <th>Mit</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1000025</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1002945</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>7</td>\n",
" <td>10</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1015425</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1016277</td>\n",
" <td>6</td>\n",
" <td>8</td>\n",
" <td>8</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1017023</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-54aba7ad-e33a-4f15-ae3b-7b3bc352b58d')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-54aba7ad-e33a-4f15-ae3b-7b3bc352b58d button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-54aba7ad-e33a-4f15-ae3b-7b3bc352b58d');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
" <div id=\"df-101b599f-931f-46e5-81c6-a393b746be1d\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-101b599f-931f-46e5-81c6-a393b746be1d')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-101b599f-931f-46e5-81c6-a393b746be1d button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
" </div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "cell_df",
"summary": "{\n \"name\": \"cell_df\",\n \"rows\": 699,\n \"fields\": [\n {\n \"column\": \"ID\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 617095,\n \"min\": 61634,\n \"max\": 13454352,\n \"num_unique_values\": 645,\n \"samples\": [\n 1371920,\n 1277792,\n 1311108\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Clump\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 10,\n \"samples\": [\n 10,\n 3,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"UnifSize\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 10,\n \"samples\": [\n 6,\n 4,\n 3\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"UnifShape\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 10,\n \"samples\": [\n 7,\n 4,\n 3\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"MargAdh\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 10,\n \"samples\": [\n 9,\n 5,\n 4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"SingEpiSize\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 10,\n \"samples\": [\n 10,\n 7,\n 4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BareNuc\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 11,\n \"samples\": [\n \"9\",\n \"1\",\n \"8\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BlandChrom\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 10,\n \"samples\": [\n 6,\n 9,\n 5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"NormNucl\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 10,\n \"samples\": [\n 9,\n 2,\n 3\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Mit\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 10,\n \"num_unique_values\": 9,\n \"samples\": [\n 8,\n 5,\n 7\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Class\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 2,\n \"max\": 4,\n \"num_unique_values\": 2,\n \"samples\": [\n 4,\n 2\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 4
}
],
"source": [
"cell_df = pd.read_csv(\"cell_samples.csv\")\n",
"cell_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ysv8ipifiLjQ"
},
"source": [
"The ID field contains the patient identifiers. The characteristics of the cell samples from each patient are contained in fields Clump to Mit. The values are graded from 1 to 10, with 1 being the closest to benign.\n",
"\n",
"The Class field contains the diagnosis, as confirmed by separate medical procedures, as to whether the samples are benign (value = 2) or malignant (value = 4).\n",
"\n",
"Let's look at the distribution of the classes based on Clump thickness and Uniformity of cell size:\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 449
},
"id": "PrPy8UMLiLjR",
"outputId": "7f6d3e20-4d7f-464e-b27e-5c83ecc36baa"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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xw7dd999SkxM1EUXXWR3NABAB0WRQbMdPnxY999/v7Zs2aLIyEiNHDlSL730Ur1PGAEAECwUGTRbenq60tPT7Y4BAIAPJ/sCAABjUWQAAICxKDIAAMBYFBkAAGAsigwAADAWRcZQo0eP1vTp09v1OSZNmhQyP9AJAEBD+Pg1Tujpp5+Ww7/4GQBgOIoMTig6OtruCAAANIpDSwFTIGmFpMKgPeORI0c0ZcoURUdHq2fPnpo9e7ZvD8qhQ4d077336tRTT1X37t2VkpKiDz74wHffpUuXKiYmRh6PR4MHD9bJJ5+scePGaceOHb7bHH9oac+ePZo4caK6d++uvn376ve//329Q1yJiYl65JFHdMsttygyMlL9+vXT4sWL2/t/BQCgg6LItFmFpHGSzpB0maSBR69XtvszL1u2TOHh4Vq3bp2efvppPfnkk3ruueckSVOmTFFubq6WL1+uL774Qtddd53GjRunwsJ/F639+/friSee0AsvvKAPP/xQW7du1b333nvC55sxY4bWrl2rt99+W9nZ2froo4+0YcOGerebP3++hg8fro0bN+rOO+/UHXfcoc2bNwf+fwAAAJbDVVVVWZKsqqqqenMHDhywvv76a+vAgQNteIZ0y7LCLMvSMZewo+Pt5+KLL7YGDx5s1dTU+MZ+85vfWIMHD7bKysqssLAw67vvvvO7z5gxY6xZs2ZZlmVZS5YssSRZRUVFvvmFCxdavXv39l2/6aabrCuvvNKyLMuqrq62OnXqZL366qu++d27d1vdunWzpk2b5hvr37+/deONN/qu19TUWL169bIWLVoUkOVuicCsXwCAHRrbfh+Lc2TapECSp4Fx79HxQknJ7fbsF154oVwul+96amqq5s+fry+//FJer1cDBw70u/2hQ4cUFxfnu96tWzcNGDDAd71v377atWtXg8+1ZcsWHT58WBdccIFvLDo6WmeccUa92w4dOtT33y6XS3369Dnh4wIA0BYUmTYpbmK+SO1ZZE5k7969CgsL02effaawsDC/uZNPPtn338f/arXL5QrIp5Qaetyampo2Py4AAMejyLTJgCbmk9r12fPy8vyuf/rpp0pOTtawYcPk9Xq1a9cu/fjHPw7Ic51++unq1KmT8vPz1a9fP0lSVVWVCgoKdNFFFwXkOQAAaClO9m2TgZLSJYUdNx52dLx998Zs3bpV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LlzY4Pzjjz+uBQsW6M9//rPy8vLUvXt3paen6+DBg+2ejY9fQ5L0r3/9S7169dKaNWt00UUX2R2nw9q7d6/OO+88/elPf9LcuXN17rnn6qmnnrI7Voc0c+ZMrV27Vh999JHdUSApIyNDvXv31l/+8hff2M9+9jN17dpVL774oo3JOh6Xy6U33nhDV111laTavTHx8fG65557dO+990qSqqqq1Lt3by1dulQ33HBDu+Zhjwwk1b7oJKlHjx42J+nYJk+erPHjxystLc3uKB3e22+/reHDh+u6665Tr169NGzYMD377LN2x+qwRo4cqVWrVqmgoECS9Pnnn+vjjz/WpZdeanMylJSUaOfOnX5/t6Kjo5WSkqLc3Nx2f37H/2gkmlZTU6Pp06dr1KhROuuss+yO02EtX75cGzZsUH5+vt1RIGnLli1atGiRZsyYofvvv1/5+fmaOnWqOnfurJtuusnueB3OzJkzVV1drUGDBiksLExer1cPP/ywJk6caHe0Dm/nzp2SpN69e/uN9+7d2zfXnigy0OTJk/XVV1/p448/tjtKh7Vt2zZNmzZN2dnZioiIsDsOVFvwhw8frkceeUSSNGzYMH311Vf685//TJGxwSuvvKKXXnpJL7/8soYMGaJNmzZp+vTpio+PZ310cBxa6uCmTJmid955R6tXr9Zpp51md5wO67PPPtOuXbt03nnnKTw8XOHh4VqzZo0WLFig8PBweb1euyN2OH379tWZZ57pNzZ48GBt3brVpkQd269//WvNnDlTN9xwg84++2z94he/0N1336158+bZHa3D69OnjyTp+++/9xv//vvvfXPtiSLTQVmWpSlTpuiNN97Q+++/L7fbbXekDm3MmDH68ssvtWnTJt9l+PDhmjhxojZt2qSwsDC7I3Y4o0aNqveVBAUFBerfv79NiTq2/fv366ST/DdZYWFhqqmpsSkR6rjdbvXp00erVq3yjVVXVysvL0+pqant/vwcWuqgJk+erJdffllvvfWWIiMjfccxo6Oj1bVrV5vTdTyRkZH1zk/q3r274uLiOG/JJnfffbdGjhypRx55RNdff73WrVunxYsXa/HixXZH65Auv/xyPfzww+rXr5+GDBmijRs36sknn9Qtt9xid7QOYe/evSoqKvJdLykp0aZNm9SjRw/169dP06dP19y5c5WcnCy3263Zs2crPj7e98mmdmWhQ5LU4GXJkiV2R8NRF198sTVt2jS7Y3Ro//M//2OdddZZVpcuXaxBgwZZixcvtjtSh1VdXW1NmzbN6tevnxUREWGdfvrp1n/+539ahw4dsjtah7B69eoGtxk33XSTZVmWVVNTY82ePdvq3bu31aVLF2vMmDHW5s2bg5KN75EBAADG4hwZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxKDIAAMBYFBkAIcXlcunNN9+0OwYAQ1BkAATVzp07ddddd+n0009Xly5dlJCQoMsvv9zvB+cAoLn40UgAQVNaWqpRo0YpJiZGv/vd73T22Wfr8OHD8ng8mjx5sr799lu7IwIwDHtkAATNnXfeKZfLpXXr1ulnP/uZBg4cqCFDhmjGjBn69NNP693+gw8+kMvl0u7du31jmzZtksvlUmlpqSRp6dKliomJ0TvvvKMzzjhD3bp107XXXqv9+/dr2bJlSkxMVGxsrKZOnSqv1+t7nMTERD300EOaMGGCunfvrlNPPVULFy5s7/8FAAKMIgMgKCoqKrRy5UpNnjxZ3bt3rzcfExPT6sfev3+/FixYoOXLl2vlypX64IMPdPXVV+u9997Te++9pxdeeEHPPPOMXnvtNb/7/e53v9M555yjjRs3aubMmZo2bZqys7NbnQNA8HFoCUBQFBUVybIsDRo0KOCPffjwYS1atEgDBgyQJF177bV64YUX9P333+vkk0/WmWeeqZ/85CdavXq1fv7zn/vuN2rUKM2cOVOSNHDgQK1du1a///3vNXbs2IBnBNA+2CMDICgsy2q3x+7WrZuvxEhS7969lZiYqJNPPtlvbNeuXX73S01NrXf9m2++abecAAKPIgMgKJKTk+VyuVp0Qu9JJ9X+iTq2BB0+fLje7Tp16uR33eVyNThWU1PTksgADECRARAUPXr0UHp6uhYuXKh9+/bVmz/2hN46p5xyiiRpx44dvrFNmzYFLNPxJxh/+umnGjx4cMAeH0D7o8gACJqFCxfK6/Xqggsu0N///ncVFhbqm2++0YIFC+od5pGkpKQkJSQk6L//+79VWFiod999V/Pnzw9YnrVr1+rxxx9XQUGBFi5cqFdffVXTpk0L2OMDaH8UGQBBc/rpp2vDhg36yU9+onvuuUdnnXWWxo4dq1WrVmnRokX1bt+pUydlZWXp22+/1dChQ/XYY49p7ty5Actzzz33aP369Ro2bJjmzp2rJ598Uunp6QF7fADtz2W15xl4ABCiEhMTNX36dE2fPt3uKADagD0yAADAWBQZAABgLA4tAQAAY7FHBgAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSgyAADAWBQZAABgLIoMAAAw1v8HllQG/SRRQtUAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
],
"source": [
"ax = cell_df[cell_df['Class'] == 4][0:50].plot(kind='scatter', x='Clump', y='UnifSize', color='DarkBlue', label='malignant');\n",
"cell_df[cell_df['Class'] == 2][0:50].plot(kind='scatter', x='Clump', y='UnifSize', color='Yellow', label='benign', ax=ax);\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QCX-uTE_iLjR"
},
"source": [
"## Data pre-processing and selection\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-S6hls_tiLjR"
},
"source": [
"Let's first look at columns data types:\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 429
},
"id": "fgtPKAxRiLjR",
"outputId": "78a1d31f-8380-4521-e84e-c498dd8ae329"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"ID int64\n",
"Clump int64\n",
"UnifSize int64\n",
"UnifShape int64\n",
"MargAdh int64\n",
"SingEpiSize int64\n",
"BareNuc object\n",
"BlandChrom int64\n",
"NormNucl int64\n",
"Mit int64\n",
"Class int64\n",
"dtype: object"
],
"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>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>ID</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Clump</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UnifSize</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UnifShape</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MargAdh</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SingEpiSize</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BareNuc</th>\n",
" <td>object</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BlandChrom</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NormNucl</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Mit</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Class</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> object</label>"
]
},
"metadata": {},
"execution_count": 6
}
],
"source": [
"cell_df.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EK1AN26PiLjS"
},
"source": [
"It looks like the __BareNuc__ column includes some values that are not numerical. We can drop those rows:\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 429
},
"id": "prgg_vapiLjS",
"outputId": "cb54b37f-ee7d-4768-b4c3-254cc62bebb6"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"ID int64\n",
"Clump int64\n",
"UnifSize int64\n",
"UnifShape int64\n",
"MargAdh int64\n",
"SingEpiSize int64\n",
"BareNuc int64\n",
"BlandChrom int64\n",
"NormNucl int64\n",
"Mit int64\n",
"Class int64\n",
"dtype: object"
],
"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>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>ID</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Clump</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UnifSize</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UnifShape</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MargAdh</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SingEpiSize</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BareNuc</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BlandChrom</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NormNucl</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Mit</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Class</th>\n",
" <td>int64</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> object</label>"
]
},
"metadata": {},
"execution_count": 7
}
],
"source": [
"cell_df = cell_df[pd.to_numeric(cell_df['BareNuc'], errors='coerce').notnull()]\n",
"cell_df['BareNuc'] = cell_df['BareNuc'].astype('int')\n",
"cell_df.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "YMHb8im9iLjS",
"outputId": "95e85bd4-4574-404b-ba41-b388441beb2c"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 5, 1, 1, 1, 2, 1, 3, 1, 1],\n",
" [ 5, 4, 4, 5, 7, 10, 3, 2, 1],\n",
" [ 3, 1, 1, 1, 2, 2, 3, 1, 1],\n",
" [ 6, 8, 8, 1, 3, 4, 3, 7, 1],\n",
" [ 4, 1, 1, 3, 2, 1, 3, 1, 1]])"
]
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"feature_df = cell_df[['Clump', 'UnifSize', 'UnifShape', 'MargAdh', 'SingEpiSize', 'BareNuc', 'BlandChrom', 'NormNucl', 'Mit']]\n",
"X = np.asarray(feature_df)\n",
"X[0:5]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GDAmOyp5iLjS"
},
"source": [
"We want the model to predict the value of Class (that is, benign (=2) or malignant (=4)).\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "macQc0KsiLjS",
"outputId": "0d1a3d92-36a3-4452-d67d-77704cc279d2"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([2, 2, 2, 2, 2])"
]
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"y = np.asarray(cell_df['Class'])\n",
"y [0:5]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YO2RB4nUiLjS"
},
"source": [
"## Train/Test dataset\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "f79VP4FyiLjS"
},
"source": [
"We split our dataset into train and test set:\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Dwx61nHriLjT",
"outputId": "512dfc84-5256-4847-edf5-e3e286177484"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Train set: (546, 9) (546,)\n",
"Test set: (137, 9) (137,)\n"
]
}
],
"source": [
"X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)\n",
"print ('Train set:', X_train.shape, y_train.shape)\n",
"print ('Test set:', X_test.shape, y_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nZbjmCHPiLjT"
},
"source": [
"<h2 id=\"modeling\">Modeling (SVM with Scikit-learn)</h2>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VflO-DdUiLjT"
},
"source": [
"The SVM algorithm offers a choice of kernel functions for performing its processing. Basically, mapping data into a higher dimensional space is called kernelling. The mathematical function used for the transformation is known as the kernel function, and can be of different types, such as:\n",
"\n",
" 1.Linear\n",
" 2.Polynomial\n",
" 3.Radial basis function (RBF)\n",
" 4.Sigmoid\n",
"Each of these functions has its characteristics, its pros and cons, and its equation, but as there's no easy way of knowing which function performs best with any given dataset. We usually choose different functions in turn and compare the results. Let's just use the default, RBF (Radial Basis Function) for this lab.\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 80
},
"id": "B4-4HmFniLjT",
"outputId": "6e93ce98-4dd6-4a88-c21c-91e2be885b32"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"SVC()"
],
"text/html": [
"<style>#sk-container-id-1 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: #000;\n",
" --sklearn-color-text-muted: #666;\n",
" --sklearn-color-line: gray;\n",
" /* Definition of color scheme for unfitted estimators */\n",
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
" --sklearn-color-unfitted-level-3: chocolate;\n",
" /* Definition of color scheme for fitted estimators */\n",
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
" --sklearn-color-fitted-level-1: #d4ebff;\n",
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
"\n",
" /* Specific color for light theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
" --sklearn-color-icon: #696969;\n",
"\n",
" @media (prefers-color-scheme: dark) {\n",
" /* Redefinition of color scheme for dark theme */\n",
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
" --sklearn-color-icon: #878787;\n",
" }\n",
"}\n",
"\n",
"#sk-container-id-1 {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"#sk-container-id-1 pre {\n",
" padding: 0;\n",
"}\n",
"\n",
"#sk-container-id-1 input.sk-hidden--visually {\n",
" border: 0;\n",
" clip: rect(1px 1px 1px 1px);\n",
" clip: rect(1px, 1px, 1px, 1px);\n",
" height: 1px;\n",
" margin: -1px;\n",
" overflow: hidden;\n",
" padding: 0;\n",
" position: absolute;\n",
" width: 1px;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-dashed-wrapped {\n",
" border: 1px dashed var(--sklearn-color-line);\n",
" margin: 0 0.4em 0.5em 0.4em;\n",
" box-sizing: border-box;\n",
" padding-bottom: 0.4em;\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-container {\n",
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
" so we also need the `!important` here to be able to override the\n",
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
" display: inline-block !important;\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-text-repr-fallback {\n",
" display: none;\n",
"}\n",
"\n",
"div.sk-parallel-item,\n",
"div.sk-serial,\n",
"div.sk-item {\n",
" /* draw centered vertical line to link estimators */\n",
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
" background-size: 2px 100%;\n",
" background-repeat: no-repeat;\n",
" background-position: center center;\n",
"}\n",
"\n",
"/* Parallel-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item::after {\n",
" content: \"\";\n",
" width: 100%;\n",
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
" flex-grow: 1;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel {\n",
" display: flex;\n",
" align-items: stretch;\n",
" justify-content: center;\n",
" background-color: var(--sklearn-color-background);\n",
" position: relative;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item {\n",
" display: flex;\n",
" flex-direction: column;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
" align-self: flex-end;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
" align-self: flex-start;\n",
" width: 50%;\n",
"}\n",
"\n",
"#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
" width: 0;\n",
"}\n",
"\n",
"/* Serial-specific style estimator block */\n",
"\n",
"#sk-container-id-1 div.sk-serial {\n",
" display: flex;\n",
" flex-direction: column;\n",
" align-items: center;\n",
" background-color: var(--sklearn-color-background);\n",
" padding-right: 1em;\n",
" padding-left: 1em;\n",
"}\n",
"\n",
"\n",
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
"clickable and can be expanded/collapsed.\n",
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
"*/\n",
"\n",
"/* Pipeline and ColumnTransformer style (default) */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable {\n",
" /* Default theme specific background. It is overwritten whether we have a\n",
" specific estimator or a Pipeline/ColumnTransformer */\n",
" background-color: var(--sklearn-color-background);\n",
"}\n",
"\n",
"/* Toggleable label */\n",
"#sk-container-id-1 label.sk-toggleable__label {\n",
" cursor: pointer;\n",
" display: flex;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
" align-items: start;\n",
" justify-content: space-between;\n",
" gap: 0.5em;\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label .caption {\n",
" font-size: 0.6rem;\n",
" font-weight: lighter;\n",
" color: var(--sklearn-color-text-muted);\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
" /* Arrow on the left of the label */\n",
" content: \"▸\";\n",
" float: left;\n",
" margin-right: 0.25em;\n",
" color: var(--sklearn-color-icon);\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
" color: var(--sklearn-color-text);\n",
"}\n",
"\n",
"/* Toggleable content - dropdown */\n",
"\n",
"#sk-container-id-1 div.sk-toggleable__content {\n",
" 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 `<a>` HTML tag */\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link {\n",
" float: right;\n",
" font-size: 1rem;\n",
" line-height: 1em;\n",
" font-family: monospace;\n",
" background-color: var(--sklearn-color-background);\n",
" border-radius: 1rem;\n",
" height: 1rem;\n",
" width: 1rem;\n",
" text-decoration: none;\n",
" /* unfitted */\n",
" color: var(--sklearn-color-unfitted-level-1);\n",
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted {\n",
" /* fitted */\n",
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
" color: var(--sklearn-color-fitted-level-1);\n",
"}\n",
"\n",
"/* On hover */\n",
"#sk-container-id-1 a.estimator_doc_link:hover {\n",
" /* unfitted */\n",
" background-color: var(--sklearn-color-unfitted-level-3);\n",
" color: var(--sklearn-color-background);\n",
" text-decoration: none;\n",
"}\n",
"\n",
"#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
" /* fitted */\n",
" background-color: var(--sklearn-color-fitted-level-3);\n",
"}\n",
"</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>SVC()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>SVC</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>SVC()</pre></div> </div></div></div></div>"
]
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"from sklearn import svm\n",
"clf = svm.SVC(kernel='rbf')\n",
"clf.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Dc63xDhriLjT"
},
"source": [
"After being fitted, the model can then be used to predict new values:\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "n62lfupQiLjU",
"outputId": "c9b64a33-1051-4d19-872b-48c8140aa217"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([2, 4, 2, 4, 2])"
]
},
"metadata": {},
"execution_count": 12
}
],
"source": [
"yhat = clf.predict(X_test)\n",
"yhat [0:5]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "s1mM8IptiLjU"
},
"source": [
"<h2 id=\"evaluation\">Evaluation</h2>\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"id": "ZMFFyAWqiLjU"
},
"outputs": [],
"source": [
"from sklearn.metrics import classification_report, confusion_matrix\n",
"import itertools"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"id": "xBjiifoZiLjU"
},
"outputs": [],
"source": [
"def plot_confusion_matrix(cm, classes,\n",
" normalize=False,\n",
" title='Confusion matrix',\n",
" cmap=plt.cm.Blues):\n",
" \"\"\"\n",
" This function prints and plots the confusion matrix.\n",
" Normalization can be applied by setting `normalize=True`.\n",
" \"\"\"\n",
" if normalize:\n",
" cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
" print(\"Normalized confusion matrix\")\n",
" else:\n",
" print('Confusion matrix, without normalization')\n",
"\n",
" print(cm)\n",
"\n",
" plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
" plt.title(title)\n",
" plt.colorbar()\n",
" tick_marks = np.arange(len(classes))\n",
" plt.xticks(tick_marks, classes, rotation=45)\n",
" plt.yticks(tick_marks, classes)\n",
"\n",
" fmt = '.2f' if normalize else 'd'\n",
" thresh = cm.max() / 2.\n",
" for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
" plt.text(j, i, format(cm[i, j], fmt),\n",
" horizontalalignment=\"center\",\n",
" color=\"white\" if cm[i, j] > thresh else \"black\")\n",
"\n",
" plt.tight_layout()\n",
" plt.ylabel('True label')\n",
" plt.xlabel('Predicted label')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 714
},
"id": "Kqbr_-OjiLjU",
"outputId": "d8b8b3e2-1efc-4474-d954-0c478ca087ee"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n",
"\n",
" 2 1.00 0.94 0.97 90\n",
" 4 0.90 1.00 0.95 47\n",
"\n",
" accuracy 0.96 137\n",
" macro avg 0.95 0.97 0.96 137\n",
"weighted avg 0.97 0.96 0.96 137\n",
"\n",
"Confusion matrix, without normalization\n",
"[[85 5]\n",
" [ 0 47]]\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
],
"image/png": "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ITAwkJEjR3Lq1CmzROX111/n/PnzzJkzh+vXr5M7d25q1KjBkCFDTMWpj1KnTh3WrVvHoEGDGDhwII6OjtSoUYPRo0dbXHj6JE2cOBF7e3sWLVpEbGwsVatWNa0B8zAfHx9mzJjByJEj6dixI4mJiWzevNmiROXSpUv07NmTRo0aERwcbGpv3bo1P/zwA3369KFBgwZW9fsjklH0rh8RERGxWqpREREREaulREVERESslhIVERERsVpKVERERMRqKVERERERq6VERURERKyW1lF5hiUlJXH58mVy5MiRoct8i4jIg3dD3b59G19fX+zsnvy4QGxsLPHx8enqw8nJCRcXlwyKKGMoUXmGXb58OcVbYkVEJGNdvHjRtJrwkxIbG4trDi+4fzdd/fj4+HDu3DmrSlaUqDzDcuTIAYBTiWAM9k5ZHI1I6pxcNyqrQxBJldu3oylbLND0s/ZJio+Ph/t3cS7ZAdL68zwxnqvH5xIfH69ERaxD8nSPwd5JiYo8NXK4u2d1CCIWydSpdQcnDPbOaTrVaKUVACqmFREREaulERURERFbYbB7sKX1XCukREVERMRWGAwPtrSea4WsM30SERERQSMqIiIitkNTPyIiImK1bHDqR4mKiIiIzUjHiIqVVoNYZ1QiIiIiaERFRETEdmjqR0RERKyWimlFRETEatngiIp1pk8iIiIiaERFRETEdtjg1I91RiUiIiKWS576SetmgcTERAYMGEBgYCCurq4UKlSIYcOGYTQaTccYjUYGDhxIvnz5cHV1pU6dOpw6dcqi6yhRERERsRXJIypp3SwwevRopk+fzpQpUzh58iSjR49mzJgxTJ482XTMmDFjmDRpEjNmzGDPnj1ky5aNevXqERsbm+rraOpHRERELLZz504aN27Ma6+9BkCBAgX49ttv2bt3L/BgNGXChAl89tlnNG7cGIAFCxbg7e3NypUradGiRaquoxEVERERW2EwpGNE5cHUT3R0tNkWFxf3yEu9+OKLhIaG8vvvvwNw+PBhtm/fToMGDQA4d+4cV69epU6dOqZzPDw8qFy5Mrt27Ur1LWlERURExFbYGR5saT0X8PPzM2seNGgQgwcPTnF4v379iI6OplixYtjb25OYmMjw4cNp3bo1AFevXgXA29vb7Dxvb2/TvtRQoiIiImIrMuCpn4sXL+Lu7m5qdnZ2fuTh3333HYsWLWLx4sWULFmSQ4cO0aNHD3x9fQkODk5bDI+gREVERERM3N3dzRKVx/n444/p16+fqdakdOnSXLhwgZEjRxIcHIyPjw8AkZGR5MuXz3ReZGQk5cqVS3U8qlERERGxFZn4ePLdu3exszNPI+zt7UlKSgIgMDAQHx8fQkNDTfujo6PZs2cPVapUSfV1NKIiIiJiKzJxwbdGjRoxfPhw/P39KVmyJL/++ivjxo3jnXfeedCdwUCPHj34/PPPKVKkCIGBgQwYMABfX1+aNGmS6usoUREREbEVmfiun8mTJzNgwAA++OADrl27hq+vL++99x4DBw40HdOnTx/u3LnDu+++y61bt6hWrRrr1q3DxcUl9WEZH15CTp4p0dHReHh44Fy6MwZ7p6wORyRVLm6bkNUhiKTK7ehoCj7nRVRUVKpqPtLD9PO85mAMDqlPAh5mvB9L3JbBmRKvJTSiIiIiYits8F0/SlRERERsRSZO/WQWJSoiIiK2wgZHVKwzKhERERE0oiIiImI7NPUjIiIi1isdUz9WOslinVGJiIiIoBEVERER26GpHxEREbFaBkM6nvpRoiIiIiJPkh5PFhEREck8GlERERGxFapREREREatlg1M/SlRERERshQ2OqFhn+iQiIiKCRlRERERsh6Z+RERExGrZ4NSPEhUREREbYTAYMNhYomKd4zwiIiIiaERFRETEZtjiiIoSFREREVth+P8tredaISUqIiIiNsIWR1RUoyIiIiJWSyMqIiIiNsIWR1SUqIiIiNgIJSoiIiJitWwxUVGNioiIiFgtjaiIiIjYCj2eLCIiItbKFqd+lKiIiIjYiAfvJExropKxsWQU1aiIiIiIxQoUKGAawXl4CwkJASA2NpaQkBC8vLzInj07zZo1IzIy0uLrKFERERGxEQZSJg6p3iwcUtm3bx9XrlwxbRs2bADgrbfeAqBnz56sWrWKZcuWERYWxuXLl2natKnF96SpHxERERuRmTUqefLkMfs8atQoChUqRI0aNYiKimL27NksXryY2rVrAzB37lyKFy/O7t27eeGFF1J9HY2oiIiIiEl0dLTZFhcX95/nxMfH88033/DOO+9gMBg4cOAACQkJ1KlTx3RMsWLF8Pf3Z9euXRbFo0RFRETEVhjSuQF+fn54eHiYtpEjR/7nZVeuXMmtW7do3749AFevXsXJ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zx6Lp37++TIho9HIlStX2L9/vxZ8ExERyUJZXaPyJFicqHh4eJh9trOzIygoiKFDh/LKK69kWGAiIiJiGcP//5fWc62RRYlKYmIiHTp0oHTp0mZvSBQREZGsZ4sjKhbVqNjb2/PKK6/oLckiIiKSKSwupi1VqhRnz559ErGIiIhIOiSPqKR1s0YWJyqff/45vXv3ZvXq1Vy5coXo6GizTURERLKGwWBI12aNUl2jMnToUD766CNeffVVAF5//XWzmzIajRgMBhITEzM+ShEREXkmpTpRGTJkCF26dGHz5s1PMh4RERFJI1sspk11omI0GgGoUaPGEwtGRERE0i4z356cWSx6PNla569ERETkwXt+0vqun7Se96RZlKgULVr0P5OVmzdvpisgERERkWQWJSpDhgxJsTKtiIiIWIdnukYFoEWLFuTNm/dJxSIiIiLpkZ63ID/tiYrqU0RERKybHQbs0phxpPW8Jy3VC74lP/UjIiIikllSPaKSlJT0JOMQERGRdHrmH08WERER6/XMF9OKiIiI9bLFdVQsfimhiIiISGbRiIqIiIiNUI2KiIiIWC070jH1Y6WPJytRERERsRG2OKKiGhURERGxWhpRERERsRF2pH0EwlpHLpSoiIiI2AiDwZDmV95Y66tylKiIiIjYCANpf7egdaYp1jvSIyIiIlZs+vTplClTBnd3d9zd3alSpQo///yzaX9sbCwhISF4eXmRPXt2mjVrRmRkpMXXUaIiIiJiI5JXpk3rZon8+fMzatQoDhw4wP79+6lduzaNGzfm+PHjAPTs2ZNVq1axbNkywsLCuHz5Mk2bNrX4njT1IyIiYkMyawqnUaNGZp+HDx/O9OnT2b17N/nz52f27NksXryY2rVrAzB37lyKFy/O7t27eeGFF1J9HY2oiIiI2IjkdVTSugFER0ebbXFxcf953cTERJYsWcKdO3eoUqUKBw4cICEhgTp16piOKVasGP7+/uzatcuie1KiIiIiIiZ+fn54eHiYtpEjRz722KNHj5I9e3acnZ3p0qULK1asoESJEly9ehUnJyc8PT3Njvf29ubq1asWxaOpHxERERuREY8nX7x4EXd3d1O7s7PzY88JCgri0KFDREVF8f333xMcHExYWFiarv84SlRERERsREYs+Jb8FE9qODk5UbhwYQAqVKjAvn37mDhxIm+//Tbx8fHcunXLbFQlMjISHx+fNMUlIiIiT7nkEZW0bumVlJREXFwcFSpUwNHRkdDQUNO+8PBwIiIiqFKlikV9akRFRERELNa/f38aNGiAv78/t2/fZvHixWzZsoX169fj4eFBx44d6dWrF7ly5cLd3Z2uXbtSpUoVi574ASUqIiIiNiMzV6a9du0a7dq148qVK3h4eFCmTBnWr19P3bp1ARg/fjx2dnY0a9aMuLg46tWrx7Rp0yyOS4mKiIiIjcjMd/3Mnj37X/e7uLgwdepUpk6dmqZ4kqlGRURERKyWRlRERERsREY89WNtlKiIiIjYiMyc+sksSlRERERsRGYW02YWax3pEREREdGIioiIiK14+OWCaTnXGilRERERsRF2GLBL4yROWs970pSoiIiI2AhbHFFRjYqIiIhYLY2oiIiI2AjD//+X1nOtkRIVERERG2GLUz9KVERERGyEIR3FtNY6oqIaFREREbFaGlERERGxEZr6EREREaulREVERESsli0+9aMaFREREbFaGlERERGxEXaGB1taz7VGSlRERERshC1O/ShREclgM6ZNZfy4L4i8epXSZcoybsJk/lepUlaHJWKmUcm8tHzel59P/snC/X+QO5sTk5qWeOSxE8POsSciKpMjlLRQMa2I/Ktl3y2l78e9mDx1Bv+rVJkpkybw+mv1OHw8nLx582Z1eCIAFPRy5eWiXly4ec/UduNuPO8vO2Z2XO0iXjQsmZdDl29ndogiJiqmFclAkyaMo0PHzrRr34HiJUowedoMXN3cmD9vTlaHJgKAs4MdIdUCmLXrInfiE03tRiNExd432/7n78HuC7eIu5+UhRGLJQz8Pf1j+X/WSYmKSAaJj4/n14MHqP1yHVObnZ0dtWvXYe/uXVkYmcjfOlTKz69/RHPsasy/HheYy5UCudzYcvpGJkUmGSG5mDatmzVSoiKSQa5fv05iYiJ583qbtef19ubq1atZFJXI36oU8KRALleWHrzyn8fWLOzFpVuxnPrzbiZEJhkl7aMp1jumYjOJyvnz5zEYDBw6dAiALVu2YDAYuHXrVpbGZanw8HB8fHy4fTv1c8L9+vWja9euTzAqEXna5XJzpF3F55i6/QIJScZ/PdbR3sCLgTk1miJWIUsTlfbt22MwGOjSpUuKfSEhIRgMBtq3b5+mvl988UWuXLmCh4dHOqPMePPm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8/PDw8PDtI0cOfI/r5uUlESPHj2oWrWq6R/SV69excnJKcUipd4WvlbEYDQa/30tZRvWuXNnfvvtN7Zt25bVoZhMnTqVn376ifXr16f6nJ9//pmPPvqII0eO4OCQ+kGy6OhoPDw8iLwRpXoVeWq88+2hrA5BJFUS7sXw/XvViYp68j9jk3+ebzoUQfYcabtWzO1oapfz5+LFi2bxpmZE5f333+fnn39m+/bt5M+fH4DFixfToUMH4uLizI6tVKkStWrVYvTo0amKy2qmfjLDl19+Sd26dcmWLRs///wz8+fPZ9q0aVkdlpn33nuPW7ducfv27Ucuo/8od+7cYe7cuRYlKSIiYoMy4PlkSx+2+PDDD1m9ejVbt241JSkAPj4+xMfHc+vWLbNRlUgLXyvyTP3NtnfvXsaMGcPt27cpWLAgkyZNolOnTlkdlhkHBwc+/fRTi8558803n1A0IiLyNMnMYlqj0UjXrl1ZsWIFW7ZsITAw0Gx/hQoVcHR0JDQ01LQGWXh4OBEREVSpkvrXijxTicp3332X1SGIiIg8Mel5uaCl54WEhLB48WJ+/PFHcuTIYao78fDwwNXVFQ8PDzp27EivXr3IlSsX7u7udO3alSpVqqS6kBaesURFREREMkbyi3Br1qxp1j537lzTy3XHjx+PnZ0dzZo1Iy4ujnr16llccqFERURExEZk5hL6qXkWx8XFhalTp/7ru+r+ixIVERERW2GDL/tRoiIiImIjMrOYNrNY1YJvIiIiIg/TiIqIiIiNyMynfjKLEhUREREbYYMlKkpUREREbIYNZiqqURERERGrpREVERERG2GLT/0oUREREbERKqYVERERq2WDJSqqURERERHrpREVERERW2GDQypKVERERGyELRbTaupHRERErJZGVERERGyEnvoRERERq2WDJSpKVERERGyGDWYqqlERERERq6URFRERERthi0/9KFERERGxESqmFREREatlgyUqqlERERER66URFREREVthg0MqSlRERERshIppRURExHqlo5jWSvMU1aiIiIiI9dKIioiIiI2wwRIVJSoiIiI2wwYzFSUqIiIiNsIWi2lVoyIiIiJWS4mKiIiIjUheQj+tm6W2bt1Ko0aN8PX1xWAwsHLlSrP9RqORgQMHki9fPlxdXalTpw6nTp2y6BpKVERERGyEIZ2bpe7cuUPZ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FxdnOmfhwoXGoKAgY1JSkqktLi7O6Orqaly/fr3RaDQa8+XLZxwzZoxpf0JCgjF//vymaxmNRmONGjWM3bt3NxqNRmN4eLgRMG7YsOGRcW7evNkIGP/66y9TW2xsrNHNzc24c+dOs2M7duxobNmypdFoNBr79+9vLFGihNn+vn37pujrnwDjihUrHrv/iy++MFaoUMH0edCgQUZ7e3vjpUuXTG0///yz0c7OznjlyhWj0Wg0FipUyLh48WKzfoYNG2asUqWK0Wg0Gs+dO2cEjL/++utjrysif1ONisgzYvXq1WTPnp2EhASSkpJo1aoVgwcPNu0vXbq0WV3K4cOHOX36NDly5DDrJzY2ljNnzhAVFcWVK1eoXLmyaZ+DgwMVK1ZMMf2T7NChQ9jb21OjRo1Ux3369Gnu3r1L3bp1zdrj4+MpX748ACdPnjSLA6BKlSqpvkaypUuXMmnSJM6cOUNMTAz379/H3d3d7Bh/f3+ee+45s+skJSURHh5Ojhw5OHPmDB07dqRz586mY+7fv4+Hh4fF8YiIimlFnhm1atVi+vTpODk54evri4OD+R//bNmymX2OiYmhQoUKLFq0KEVfefLkSVMMrq6uFp8TExMDwJo1a8wSBHhQd5NRdu3aRevWrRkyZAj16tXDw8ODJUuWMHbsWItjnTlzZorEyd7ePsNiFXmWKFEReUZky5aNwoULp/r4559/nqVLl5I3b94UowrJ8uXLx549e3jppZeAByMHBw4c4Pnnn3/k8aVLlyYpKYmwsDDq1KmTYn/yiE5iYqKprUSJEjg7OxMREfHYkZjixYubCoOT7d69+79v8iE7d+4kICCATz/91NR24cKFFMdFRERw+fJlfH19Tdexs7MjKCgIb29vfH19OXv2LK1bt7bo+iLyaCqmFZFHat26Nblz56Zx48Zs27aNc+fOsWXLFrp168alS5cA6N69O6NGjWLlypX89ttvfPDBB/+6BkqBAgUIDg7mnXfeYeXKlaY+v/vuOwACAgIwGAysXr2aP//8k5iYGHLkyEHv3r3p2bMn8+fP58yZMxw8eJDJkyebClS7dOnCqVOn+PjjjwkPD2fx4sXMmzfPovstUqQIERERLFmyhDNnzjBp0qRHFga7uLgQHBzM4cOH2bZtG926daN58+b4+PgAMGTIEEaOHMmkSZP4/fffOXr0KHPnzmXcuHEWxSMiDyhREZFHcnNzY+vWrfj7+9O0aVOKFy9Ox44diY2NNY2wfPTRR7Rt25bg4GCqVKlCjhw5eOONN/613+nTp/Pmm2/ywQcfUKxYMTp37sydO3cAeO655xgyZAj9+vXD29ubDz/8EIBhw4YxYMAARo4cSfHixalfvz5r1qwhMDAQeFA38sMPP7By5UrKli3LjBkzGDFihEX3+/rrr9OzZ08+/PBDypUrx86dOxkwYECK4woXLkzTpk159dVXeeWVVyhTpozZ48edOnVi1qxZzJ07l9KlS1OjRg3mzZtnilVELGMwPq7qTURERCSLaURFRERErJYSFREREbFaSlRERETEailREREREaulREVERESslhIVERERsVpKVERERMRqKVERERERq6VERURERKyWEhURERGxWkpURERExGr9H2zovDUKkiJaAAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
],
"source": [
"# Compute confusion matrix\n",
"cnf_matrix = confusion_matrix(y_test, yhat, labels=[2,4])\n",
"np.set_printoptions(precision=2)\n",
"\n",
"print (classification_report(y_test, yhat))\n",
"\n",
"# Plot non-normalized confusion matrix\n",
"plt.figure()\n",
"plot_confusion_matrix(cnf_matrix, classes=['Benign(2)','Malignant(4)'],normalize= False, title='Confusion matrix')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MBVmyFAGiLjV"
},
"source": [
"You can also easily use the __f1_score__ from sklearn library:\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "AW5l8KRDiLjV",
"outputId": "a166b691-e392-4127-f94a-294372bc06fe"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.9639038982104676"
]
},
"metadata": {},
"execution_count": 16
}
],
"source": [
"from sklearn.metrics import f1_score\n",
"f1_score(y_test, yhat, average='weighted')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Kyoy1wkviLjV"
},
"source": [
"Let's try the jaccard index for accuracy:\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "HFONNoWViLjV",
"outputId": "954c24e8-8617-4808-a2fe-a2e37db815d8"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"np.float64(0.9444444444444444)"
]
},
"metadata": {},
"execution_count": 17
}
],
"source": [
"from sklearn.metrics import jaccard_score\n",
"jaccard_score(y_test, yhat,pos_label=2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9_QfkJqiiLjW"
},
"source": [
"<h2 id=\"practice\">Practice</h2>\n",
"Can you rebuild the model, but this time with a __linear__ kernel? You can use __kernel='linear'__ option, when you define the svm. How the accuracy changes with the new kernel function?\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MS4sFLYWiLjW",
"outputId": "15117a0e-5f79-4e8e-f0d5-9afc7a9e7ba9"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Avg F1-score: 0.9639\n",
"Jaccard score: 0.9444\n"
]
}
],
"source": [
"# write your code here\n",
"clf2 = svm.SVC(kernel='linear')\n",
"clf2.fit(X_train, y_train)\n",
"yhat2 = clf2.predict(X_test)\n",
"print(\"Avg F1-score: %.4f\" % f1_score(y_test, yhat2, average='weighted'))\n",
"print(\"Jaccard score: %.4f\" % jaccard_score(y_test, yhat2,pos_label=2))\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KYxbxvsIiLjW"
},
"source": [
"<details><summary>Click here for the solution</summary>\n",
"\n",
"```python\n",
"clf2 = svm.SVC(kernel='linear')\n",
"clf2.fit(X_train, y_train)\n",
"yhat2 = clf2.predict(X_test)\n",
"print(\"Avg F1-score: %.4f\" % f1_score(y_test, yhat2, average='weighted'))\n",
"print(\"Jaccard score: %.4f\" % jaccard_score(y_test, yhat2,pos_label=2))\n",
"\n",
"```\n",
"\n",
"</details>\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pYUYpzm1iLjW"
},
"source": [
"### Thank you for completing this lab!\n",
"\n",
"\n",
"## Author\n",
"\n",
"Saeed Aghabozorgi\n",
"\n",
"\n",
"### Other Contributors\n",
"\n",
"<a href=\"https://www.linkedin.com/in/joseph-s-50398b136/\" target=\"_blank\">Joseph Santarcangelo</a>\n",
"\n",
"## <h3 align=\"center\"> © IBM Corporation 2020. All rights reserved. <h3/>\n",
"\n",
"<!--\n",
"## Change Log\n",
"\n",
"\n",
"| Date (YYYY-MM-DD) | Version | Changed By | Change Description |\n",
"|---|---|---|---|\n",
"| 2021-01-21 | 2.2 | Lakshmi | Updated sklearn library |\n",
"| 2020-11-03 | 2.1 | Lakshmi | Updated URL of csv |\n",
"| 2020-08-27 | 2.0 | Lavanya | Moved lab to course repo in GitLab |\n",
"| | | | |\n",
"| | | | |\n",
"--!>\n",
"\n",
"\n"
]
}
],
"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.8"
},
"prev_pub_hash": "33c7dcfb268d8bbcaef711e72c89e89dc7bc1929452f1913b971040b140900c5",
"colab": {
"provenance": []
}
},
"nbformat": 4,
"nbformat_minor": 0
}