{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "YMiI5CDX5JZ0"
},
"source": [
"# 2. kNN for (Q)SPR modeling ⚛️\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dlaMhdbLXofj"
},
"source": [
"## Goals of this exercise 🌟"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YCWB0IvbXp4O"
},
"source": [
"* We will learn how to construct a simple SPR model using kNN\n",
"* We will learn the importance of data normalization (scaling)\n",
"* We will review the concepts of training and test split and cross-validation\n",
"* We will review some of the performance metrics for assesing classification models"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XI_fHNSEYck6"
},
"source": [
"## A quick reminder ✅"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8wst0cbF39zU"
},
"source": [
"Probably the simplest data-driven model that you can think of is k-nearest neighbours (kNN). It simply predicts future data as the average (or mode) of the \"k\" nearest neighbours of the queried point.\n",
"\n",
"As simple as this idea might be, it works relatively good in various applications. One of them is the generation of (quantitative) structure-property relationships ((Q)SPR) models {cite}`yuan2019developing, shen2003development`. Whether the word \"Quantitative\" is sometimes included or not depends on whether the model in question is a regression model or a classification model. Do you remember the difference?\n",
"\n",
"The key question in kNN is what do we consider a neighbour and what not? This indicates us that we need to define a sort of similarity or distance metric that allows us to distinguish neighbouring points from points that are far away. \n",
"\n",
"Common distance metrics use the different [mathematical norms](https://en.wikipedia.org/wiki/Norm_(mathematics)). For example, the Euclidean distance:\n",
"\n",
"$$\n",
" d(\\textbf{x}, \\textbf{x'}) = \\sqrt{\\sum_i^D (x_i - x'_i)^2}\n",
"$$\n",
"\n",
"```{figure} media/02_kNN/kNN.png\n",
":alt: kNN\n",
":width: 75%\n",
":align: center\n",
"\n",
"Among the k-nearest neighbours (k=5), the majority of points are red 1s. Therefore, the queried point (green x) will be labeled as \"red 1\". Image taken from {cite}`murphy2022probabilistic`. \n",
"```\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1sWnwvt_FjQa"
},
"source": [
"Let's exemplify the use of kNN by constructing a SPR model that predicts the whether a molecule is mutagenic or not. \n",
"\n",
"Mutagenicity is the property of substances to induce genetic mutation. It is one of the most important environmental, health and safety (EHS) properties to check when dealing with novel chemicals (e.g., drugs or solvents). In this case, we are going to use the data of mutagenicity on Salmonella typhimurium (Ames test). This dataset was collected by the [Istituto di Ricerche Farmacologiche Mario Negri](https://www.marionegri.it/), merging experimental data from a benchmark dataset\n",
"compiled by {cite}`hansen2009benchmark` from a collection of data made available\n",
"by the [Japan Health Ministry](https://www.nihs.go.jp/dgm/amesqsar.html) within their Ames (Q)SAR project."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "R9-iQHe-XZm6"
},
"source": [
"Let's fist import some libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "V3C3ZNc8XjsA"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sn\n",
"import numpy as np\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oWmicwjH5Ksm"
},
"source": [
"## Get data 📚\n",
"\n",
"We have previously computed some molecular descriptors that will serve as input to our model. However, this is also an important step to consider when facing a problem like this: what are the important inputs to model mutagenicity? how do we know if these pre-computed features are enough for modeling mutagenicity? can we generate relevant molecular features automatically? 🤔\n",
"\n",
"Ok, let's use [pandas](https://pandas.pydata.org/) to import the data as a DataFrame..."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 679
},
"id": "vn-yAIhU5ILt",
"outputId": "a468e405-9061-4763-8ece-0b8223d03486"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" Id \n",
" CAS \n",
" SMILES \n",
" Status \n",
" Experimental value \n",
" Predicted value \n",
" NumValenceElectrons \n",
" qed \n",
" TPSA \n",
" MolMR \n",
" BalabanJ \n",
" BertzCT \n",
" MolWt \n",
" MolLogP \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 1 \n",
" 100-00-5 \n",
" O=[N+]([O-])c1ccc(cc1)Cl \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.463602 \n",
" 43.14 \n",
" 38.1064 \n",
" 3.003401 \n",
" 244.429658 \n",
" 157.556 \n",
" 2.24820 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 100-01-6 \n",
" O=[N+]([O-])c1ccc(N)cc1 \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.359544 \n",
" 69.16 \n",
" 37.5088 \n",
" 3.003401 \n",
" 242.429658 \n",
" 138.126 \n",
" 1.17700 \n",
" \n",
" \n",
" 2 \n",
" 2 \n",
" 3 \n",
" 100-02-7 \n",
" O=[N+]([O-])c1ccc(O)cc1 \n",
" Training \n",
" 0 \n",
" 1 \n",
" 52 \n",
" 0.470728 \n",
" 63.37 \n",
" 34.7612 \n",
" 3.003401 \n",
" 241.674771 \n",
" 139.110 \n",
" 1.30040 \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" 4 \n",
" 100-11-8 \n",
" O=[N+]([O-])c1ccc(cc1)CBr \n",
" Training \n",
" 1 \n",
" 0 \n",
" 58 \n",
" 0.432586 \n",
" 43.14 \n",
" 45.7274 \n",
" 2.913802 \n",
" 257.648013 \n",
" 216.034 \n",
" 2.48970 \n",
" \n",
" \n",
" 4 \n",
" 4 \n",
" 5 \n",
" 100-12-9 \n",
" O=[N+]([O-])c1ccc(cc1)CC \n",
" Training \n",
" 0 \n",
" 0 \n",
" 58 \n",
" 0.479785 \n",
" 43.14 \n",
" 42.4744 \n",
" 2.913802 \n",
" 253.299498 \n",
" 151.165 \n",
" 2.15720 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 5759 \n",
" 5759 \n",
" 5767 \n",
" 20395-16-8 \n",
" O=C1N(C(=O)N(C(=O)N1CC=C)CC2OC2)CC=C \n",
" Training \n",
" 1 \n",
" 0 \n",
" 102 \n",
" 0.485090 \n",
" 78.53 \n",
" 69.3560 \n",
" 2.668492 \n",
" 627.435628 \n",
" 265.269 \n",
" -1.05750 \n",
" \n",
" \n",
" 5760 \n",
" 5760 \n",
" 5768 \n",
" 34718-47-3 \n",
" O=C(C(Br)(Br)Br)Cl \n",
" Training \n",
" 1 \n",
" 1 \n",
" 42 \n",
" 0.495987 \n",
" 17.07 \n",
" 40.3720 \n",
" 3.791118 \n",
" 85.425922 \n",
" 315.186 \n",
" 2.59030 \n",
" \n",
" \n",
" 5761 \n",
" 5761 \n",
" 5769 \n",
" 43204-63-3 \n",
" N(CCBr)CCBr \n",
" Training \n",
" 1 \n",
" 1 \n",
" 44 \n",
" 0.568556 \n",
" 12.03 \n",
" 40.4577 \n",
" 2.447473 \n",
" 28.870765 \n",
" 230.931 \n",
" 1.36580 \n",
" \n",
" \n",
" 5762 \n",
" 5762 \n",
" 5770 \n",
" 52583-35-4 \n",
" N#Cc2cc(cc(c2(N=Nc1ccc(cc1(NC(=O)C))N(CCOC)CCO... \n",
" Training \n",
" 1 \n",
" 1 \n",
" 184 \n",
" 0.264581 \n",
" 185.59 \n",
" 125.3525 \n",
" 2.552977 \n",
" 1169.342047 \n",
" 485.457 \n",
" 3.84768 \n",
" \n",
" \n",
" 5763 \n",
" 5763 \n",
" 5771 \n",
" 188021-38-7 \n",
" O(c1c(cc(cc1Br)C)C(C)(C)C)CC=C \n",
" Training \n",
" 1 \n",
" 0 \n",
" 88 \n",
" 0.735392 \n",
" 9.23 \n",
" 73.2710 \n",
" 3.263016 \n",
" 388.457194 \n",
" 283.209 \n",
" 4.61982 \n",
" \n",
" \n",
"
\n",
"
5764 rows × 15 columns
\n",
"
"
],
"text/plain": [
" Unnamed: 0 Id CAS \\\n",
"0 0 1 100-00-5 \n",
"1 1 2 100-01-6 \n",
"2 2 3 100-02-7 \n",
"3 3 4 100-11-8 \n",
"4 4 5 100-12-9 \n",
"... ... ... ... \n",
"5759 5759 5767 20395-16-8 \n",
"5760 5760 5768 34718-47-3 \n",
"5761 5761 5769 43204-63-3 \n",
"5762 5762 5770 52583-35-4 \n",
"5763 5763 5771 188021-38-7 \n",
"\n",
" SMILES Status \\\n",
"0 O=[N+]([O-])c1ccc(cc1)Cl Training \n",
"1 O=[N+]([O-])c1ccc(N)cc1 Training \n",
"2 O=[N+]([O-])c1ccc(O)cc1 Training \n",
"3 O=[N+]([O-])c1ccc(cc1)CBr Training \n",
"4 O=[N+]([O-])c1ccc(cc1)CC Training \n",
"... ... ... \n",
"5759 O=C1N(C(=O)N(C(=O)N1CC=C)CC2OC2)CC=C Training \n",
"5760 O=C(C(Br)(Br)Br)Cl Training \n",
"5761 N(CCBr)CCBr Training \n",
"5762 N#Cc2cc(cc(c2(N=Nc1ccc(cc1(NC(=O)C))N(CCOC)CCO... Training \n",
"5763 O(c1c(cc(cc1Br)C)C(C)(C)C)CC=C Training \n",
"\n",
" Experimental value Predicted value NumValenceElectrons qed \\\n",
"0 1 1 52 0.463602 \n",
"1 1 1 52 0.359544 \n",
"2 0 1 52 0.470728 \n",
"3 1 0 58 0.432586 \n",
"4 0 0 58 0.479785 \n",
"... ... ... ... ... \n",
"5759 1 0 102 0.485090 \n",
"5760 1 1 42 0.495987 \n",
"5761 1 1 44 0.568556 \n",
"5762 1 1 184 0.264581 \n",
"5763 1 0 88 0.735392 \n",
"\n",
" TPSA MolMR BalabanJ BertzCT MolWt MolLogP \n",
"0 43.14 38.1064 3.003401 244.429658 157.556 2.24820 \n",
"1 69.16 37.5088 3.003401 242.429658 138.126 1.17700 \n",
"2 63.37 34.7612 3.003401 241.674771 139.110 1.30040 \n",
"3 43.14 45.7274 2.913802 257.648013 216.034 2.48970 \n",
"4 43.14 42.4744 2.913802 253.299498 151.165 2.15720 \n",
"... ... ... ... ... ... ... \n",
"5759 78.53 69.3560 2.668492 627.435628 265.269 -1.05750 \n",
"5760 17.07 40.3720 3.791118 85.425922 315.186 2.59030 \n",
"5761 12.03 40.4577 2.447473 28.870765 230.931 1.36580 \n",
"5762 185.59 125.3525 2.552977 1169.342047 485.457 3.84768 \n",
"5763 9.23 73.2710 3.263016 388.457194 283.209 4.61982 \n",
"\n",
"[5764 rows x 15 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"if 'google.colab' in str(get_ipython()):\n",
" df = pd.read_csv(\"https://raw.githubusercontent.com/edgarsmdn/MLCE_book/main/references/mutagenicity_kNN.csv\")\n",
"else:\n",
" df = pd.read_csv(\"references/mutagenicity_kNN.csv\")\n",
"\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ttVnS2-dbxcy"
},
"source": [
"The library pandas has many useful functions for data analytics. For example, we can print the type of the data we have..."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "IyH-W0ty8-Oi",
"outputId": "7706cfa4-ad96-4a52-e546-7cc83c005161"
},
"outputs": [
{
"data": {
"text/plain": [
"Unnamed: 0 int64\n",
"Id int64\n",
"CAS object\n",
"SMILES object\n",
"Status object\n",
"Experimental value int64\n",
"Predicted value object\n",
"NumValenceElectrons int64\n",
"qed float64\n",
"TPSA float64\n",
"MolMR float64\n",
"BalabanJ float64\n",
"BertzCT float64\n",
"MolWt float64\n",
"MolLogP float64\n",
"dtype: object"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.dtypes "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v7PaIMXTcKxk"
},
"source": [
"And have a look at the first rows of our data to see how it looks like"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "GBvQkpwi6vCV",
"outputId": "bd1aca5e-5c9d-45fc-a399-bc7c54f482d9"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" Id \n",
" CAS \n",
" SMILES \n",
" Status \n",
" Experimental value \n",
" Predicted value \n",
" NumValenceElectrons \n",
" qed \n",
" TPSA \n",
" MolMR \n",
" BalabanJ \n",
" BertzCT \n",
" MolWt \n",
" MolLogP \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 1 \n",
" 100-00-5 \n",
" O=[N+]([O-])c1ccc(cc1)Cl \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.463602 \n",
" 43.14 \n",
" 38.1064 \n",
" 3.003401 \n",
" 244.429658 \n",
" 157.556 \n",
" 2.2482 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 100-01-6 \n",
" O=[N+]([O-])c1ccc(N)cc1 \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.359544 \n",
" 69.16 \n",
" 37.5088 \n",
" 3.003401 \n",
" 242.429658 \n",
" 138.126 \n",
" 1.1770 \n",
" \n",
" \n",
" 2 \n",
" 2 \n",
" 3 \n",
" 100-02-7 \n",
" O=[N+]([O-])c1ccc(O)cc1 \n",
" Training \n",
" 0 \n",
" 1 \n",
" 52 \n",
" 0.470728 \n",
" 63.37 \n",
" 34.7612 \n",
" 3.003401 \n",
" 241.674771 \n",
" 139.110 \n",
" 1.3004 \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" 4 \n",
" 100-11-8 \n",
" O=[N+]([O-])c1ccc(cc1)CBr \n",
" Training \n",
" 1 \n",
" 0 \n",
" 58 \n",
" 0.432586 \n",
" 43.14 \n",
" 45.7274 \n",
" 2.913802 \n",
" 257.648013 \n",
" 216.034 \n",
" 2.4897 \n",
" \n",
" \n",
" 4 \n",
" 4 \n",
" 5 \n",
" 100-12-9 \n",
" O=[N+]([O-])c1ccc(cc1)CC \n",
" Training \n",
" 0 \n",
" 0 \n",
" 58 \n",
" 0.479785 \n",
" 43.14 \n",
" 42.4744 \n",
" 2.913802 \n",
" 253.299498 \n",
" 151.165 \n",
" 2.1572 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 Id CAS SMILES Status \\\n",
"0 0 1 100-00-5 O=[N+]([O-])c1ccc(cc1)Cl Training \n",
"1 1 2 100-01-6 O=[N+]([O-])c1ccc(N)cc1 Training \n",
"2 2 3 100-02-7 O=[N+]([O-])c1ccc(O)cc1 Training \n",
"3 3 4 100-11-8 O=[N+]([O-])c1ccc(cc1)CBr Training \n",
"4 4 5 100-12-9 O=[N+]([O-])c1ccc(cc1)CC Training \n",
"\n",
" Experimental value Predicted value NumValenceElectrons qed TPSA \\\n",
"0 1 1 52 0.463602 43.14 \n",
"1 1 1 52 0.359544 69.16 \n",
"2 0 1 52 0.470728 63.37 \n",
"3 1 0 58 0.432586 43.14 \n",
"4 0 0 58 0.479785 43.14 \n",
"\n",
" MolMR BalabanJ BertzCT MolWt MolLogP \n",
"0 38.1064 3.003401 244.429658 157.556 2.2482 \n",
"1 37.5088 3.003401 242.429658 138.126 1.1770 \n",
"2 34.7612 3.003401 241.674771 139.110 1.3004 \n",
"3 45.7274 2.913802 257.648013 216.034 2.4897 \n",
"4 42.4744 2.913802 253.299498 151.165 2.1572 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Eb8STE1Gc1qN"
},
"source": [
"and access rows by index"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 175
},
"id": "F-vLO_KHeUEy",
"outputId": "8d1c9199-93b7-4f76-a0e0-fb035b7f9c56",
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" Id \n",
" CAS \n",
" SMILES \n",
" Status \n",
" Experimental value \n",
" Predicted value \n",
" NumValenceElectrons \n",
" qed \n",
" TPSA \n",
" MolMR \n",
" BalabanJ \n",
" BertzCT \n",
" MolWt \n",
" MolLogP \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 1 \n",
" 100-00-5 \n",
" O=[N+]([O-])c1ccc(cc1)Cl \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.463602 \n",
" 43.14 \n",
" 38.1064 \n",
" 3.003401 \n",
" 244.429658 \n",
" 157.556 \n",
" 2.2482 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 100-01-6 \n",
" O=[N+]([O-])c1ccc(N)cc1 \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.359544 \n",
" 69.16 \n",
" 37.5088 \n",
" 3.003401 \n",
" 242.429658 \n",
" 138.126 \n",
" 1.1770 \n",
" \n",
" \n",
" 2 \n",
" 2 \n",
" 3 \n",
" 100-02-7 \n",
" O=[N+]([O-])c1ccc(O)cc1 \n",
" Training \n",
" 0 \n",
" 1 \n",
" 52 \n",
" 0.470728 \n",
" 63.37 \n",
" 34.7612 \n",
" 3.003401 \n",
" 241.674771 \n",
" 139.110 \n",
" 1.3004 \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" 4 \n",
" 100-11-8 \n",
" O=[N+]([O-])c1ccc(cc1)CBr \n",
" Training \n",
" 1 \n",
" 0 \n",
" 58 \n",
" 0.432586 \n",
" 43.14 \n",
" 45.7274 \n",
" 2.913802 \n",
" 257.648013 \n",
" 216.034 \n",
" 2.4897 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 Id CAS SMILES Status \\\n",
"0 0 1 100-00-5 O=[N+]([O-])c1ccc(cc1)Cl Training \n",
"1 1 2 100-01-6 O=[N+]([O-])c1ccc(N)cc1 Training \n",
"2 2 3 100-02-7 O=[N+]([O-])c1ccc(O)cc1 Training \n",
"3 3 4 100-11-8 O=[N+]([O-])c1ccc(cc1)CBr Training \n",
"\n",
" Experimental value Predicted value NumValenceElectrons qed TPSA \\\n",
"0 1 1 52 0.463602 43.14 \n",
"1 1 1 52 0.359544 69.16 \n",
"2 0 1 52 0.470728 63.37 \n",
"3 1 0 58 0.432586 43.14 \n",
"\n",
" MolMR BalabanJ BertzCT MolWt MolLogP \n",
"0 38.1064 3.003401 244.429658 157.556 2.2482 \n",
"1 37.5088 3.003401 242.429658 138.126 1.1770 \n",
"2 34.7612 3.003401 241.674771 139.110 1.3004 \n",
"3 45.7274 2.913802 257.648013 216.034 2.4897 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first_rows = df.iloc[:4]\n",
"first_rows"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ejwwO7ETcTPw"
},
"source": [
"We can access columns in the DataFrame by the column's name"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4domchYBdi-f",
"outputId": "967c3ff1-4905-442a-be5e-2a84bb89c037"
},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 1\n",
"2 0\n",
"3 1\n",
"4 0\n",
" ..\n",
"5759 1\n",
"5760 1\n",
"5761 1\n",
"5762 1\n",
"5763 1\n",
"Name: Experimental value, Length: 5764, dtype: int64"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_experimental = df['Experimental value']\n",
"y_experimental"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ro4VEmtzei8w"
},
"source": [
"If we would like to get the subset of data that is labeled as mutagenic (i.e., 'Experimental value' equal to 1), we could do it like this"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 679
},
"id": "p_1NdUU2gVhn",
"outputId": "10082daf-42b4-4fa9-b260-3e2292777f0f"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" Id \n",
" CAS \n",
" SMILES \n",
" Status \n",
" Experimental value \n",
" Predicted value \n",
" NumValenceElectrons \n",
" qed \n",
" TPSA \n",
" MolMR \n",
" BalabanJ \n",
" BertzCT \n",
" MolWt \n",
" MolLogP \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 1 \n",
" 100-00-5 \n",
" O=[N+]([O-])c1ccc(cc1)Cl \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.463602 \n",
" 43.14 \n",
" 38.1064 \n",
" 3.003401 \n",
" 244.429658 \n",
" 157.556 \n",
" 2.24820 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 2 \n",
" 100-01-6 \n",
" O=[N+]([O-])c1ccc(N)cc1 \n",
" Training \n",
" 1 \n",
" 1 \n",
" 52 \n",
" 0.359544 \n",
" 69.16 \n",
" 37.5088 \n",
" 3.003401 \n",
" 242.429658 \n",
" 138.126 \n",
" 1.17700 \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" 4 \n",
" 100-11-8 \n",
" O=[N+]([O-])c1ccc(cc1)CBr \n",
" Training \n",
" 1 \n",
" 0 \n",
" 58 \n",
" 0.432586 \n",
" 43.14 \n",
" 45.7274 \n",
" 2.913802 \n",
" 257.648013 \n",
" 216.034 \n",
" 2.48970 \n",
" \n",
" \n",
" 6 \n",
" 6 \n",
" 7 \n",
" 100-13-0 \n",
" O=[N+]([O-])c1ccc(C=C)cc1 \n",
" Training \n",
" 1 \n",
" 0 \n",
" 56 \n",
" 0.477660 \n",
" 43.14 \n",
" 43.1874 \n",
" 3.000887 \n",
" 276.648462 \n",
" 149.149 \n",
" 2.23780 \n",
" \n",
" \n",
" 7 \n",
" 7 \n",
" 8 \n",
" 100-14-1 \n",
" O=[N+]([O-])c1ccc(cc1)CCl \n",
" Training \n",
" 1 \n",
" 1 \n",
" 58 \n",
" 0.389482 \n",
" 43.14 \n",
" 42.6534 \n",
" 2.913802 \n",
" 257.648013 \n",
" 171.583 \n",
" 2.33360 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 5759 \n",
" 5759 \n",
" 5767 \n",
" 20395-16-8 \n",
" O=C1N(C(=O)N(C(=O)N1CC=C)CC2OC2)CC=C \n",
" Training \n",
" 1 \n",
" 0 \n",
" 102 \n",
" 0.485090 \n",
" 78.53 \n",
" 69.3560 \n",
" 2.668492 \n",
" 627.435628 \n",
" 265.269 \n",
" -1.05750 \n",
" \n",
" \n",
" 5760 \n",
" 5760 \n",
" 5768 \n",
" 34718-47-3 \n",
" O=C(C(Br)(Br)Br)Cl \n",
" Training \n",
" 1 \n",
" 1 \n",
" 42 \n",
" 0.495987 \n",
" 17.07 \n",
" 40.3720 \n",
" 3.791118 \n",
" 85.425922 \n",
" 315.186 \n",
" 2.59030 \n",
" \n",
" \n",
" 5761 \n",
" 5761 \n",
" 5769 \n",
" 43204-63-3 \n",
" N(CCBr)CCBr \n",
" Training \n",
" 1 \n",
" 1 \n",
" 44 \n",
" 0.568556 \n",
" 12.03 \n",
" 40.4577 \n",
" 2.447473 \n",
" 28.870765 \n",
" 230.931 \n",
" 1.36580 \n",
" \n",
" \n",
" 5762 \n",
" 5762 \n",
" 5770 \n",
" 52583-35-4 \n",
" N#Cc2cc(cc(c2(N=Nc1ccc(cc1(NC(=O)C))N(CCOC)CCO... \n",
" Training \n",
" 1 \n",
" 1 \n",
" 184 \n",
" 0.264581 \n",
" 185.59 \n",
" 125.3525 \n",
" 2.552977 \n",
" 1169.342047 \n",
" 485.457 \n",
" 3.84768 \n",
" \n",
" \n",
" 5763 \n",
" 5763 \n",
" 5771 \n",
" 188021-38-7 \n",
" O(c1c(cc(cc1Br)C)C(C)(C)C)CC=C \n",
" Training \n",
" 1 \n",
" 0 \n",
" 88 \n",
" 0.735392 \n",
" 9.23 \n",
" 73.2710 \n",
" 3.263016 \n",
" 388.457194 \n",
" 283.209 \n",
" 4.61982 \n",
" \n",
" \n",
"
\n",
"
3251 rows × 15 columns
\n",
"
"
],
"text/plain": [
" Unnamed: 0 Id CAS \\\n",
"0 0 1 100-00-5 \n",
"1 1 2 100-01-6 \n",
"3 3 4 100-11-8 \n",
"6 6 7 100-13-0 \n",
"7 7 8 100-14-1 \n",
"... ... ... ... \n",
"5759 5759 5767 20395-16-8 \n",
"5760 5760 5768 34718-47-3 \n",
"5761 5761 5769 43204-63-3 \n",
"5762 5762 5770 52583-35-4 \n",
"5763 5763 5771 188021-38-7 \n",
"\n",
" SMILES Status \\\n",
"0 O=[N+]([O-])c1ccc(cc1)Cl Training \n",
"1 O=[N+]([O-])c1ccc(N)cc1 Training \n",
"3 O=[N+]([O-])c1ccc(cc1)CBr Training \n",
"6 O=[N+]([O-])c1ccc(C=C)cc1 Training \n",
"7 O=[N+]([O-])c1ccc(cc1)CCl Training \n",
"... ... ... \n",
"5759 O=C1N(C(=O)N(C(=O)N1CC=C)CC2OC2)CC=C Training \n",
"5760 O=C(C(Br)(Br)Br)Cl Training \n",
"5761 N(CCBr)CCBr Training \n",
"5762 N#Cc2cc(cc(c2(N=Nc1ccc(cc1(NC(=O)C))N(CCOC)CCO... Training \n",
"5763 O(c1c(cc(cc1Br)C)C(C)(C)C)CC=C Training \n",
"\n",
" Experimental value Predicted value NumValenceElectrons qed \\\n",
"0 1 1 52 0.463602 \n",
"1 1 1 52 0.359544 \n",
"3 1 0 58 0.432586 \n",
"6 1 0 56 0.477660 \n",
"7 1 1 58 0.389482 \n",
"... ... ... ... ... \n",
"5759 1 0 102 0.485090 \n",
"5760 1 1 42 0.495987 \n",
"5761 1 1 44 0.568556 \n",
"5762 1 1 184 0.264581 \n",
"5763 1 0 88 0.735392 \n",
"\n",
" TPSA MolMR BalabanJ BertzCT MolWt MolLogP \n",
"0 43.14 38.1064 3.003401 244.429658 157.556 2.24820 \n",
"1 69.16 37.5088 3.003401 242.429658 138.126 1.17700 \n",
"3 43.14 45.7274 2.913802 257.648013 216.034 2.48970 \n",
"6 43.14 43.1874 3.000887 276.648462 149.149 2.23780 \n",
"7 43.14 42.6534 2.913802 257.648013 171.583 2.33360 \n",
"... ... ... ... ... ... ... \n",
"5759 78.53 69.3560 2.668492 627.435628 265.269 -1.05750 \n",
"5760 17.07 40.3720 3.791118 85.425922 315.186 2.59030 \n",
"5761 12.03 40.4577 2.447473 28.870765 230.931 1.36580 \n",
"5762 185.59 125.3525 2.552977 1169.342047 485.457 3.84768 \n",
"5763 9.23 73.2710 3.263016 388.457194 283.209 4.61982 \n",
"\n",
"[3251 rows x 15 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mutagenic_data = df[df['Experimental value']==1]\n",
"mutagenic_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's have a look at the predictions by VEGA which we'll use to compare our results with:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 1\n",
"2 1\n",
"3 0\n",
"4 0\n",
" ..\n",
"5759 0\n",
"5760 1\n",
"5761 1\n",
"5762 1\n",
"5763 0\n",
"Name: Predicted value, Length: 5764, dtype: object"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Predicted value']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We notice the data type says `object` even though it should be all `0` and `1`. Let's try to find out why:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"3 0\n",
"1844 Non Predicted\n",
"Name: Predicted value, dtype: object"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Predicted value'].drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" Id \n",
" CAS \n",
" SMILES \n",
" Status \n",
" Experimental value \n",
" Predicted value \n",
" NumValenceElectrons \n",
" qed \n",
" TPSA \n",
" MolMR \n",
" BalabanJ \n",
" BertzCT \n",
" MolWt \n",
" MolLogP \n",
" \n",
" \n",
" \n",
" \n",
" 1844 \n",
" 1844 \n",
" 1846 \n",
" 16709-86-7 \n",
" C=C[Si](C)(C)CCl \n",
" Training \n",
" 0 \n",
" Non Predicted \n",
" 42 \n",
" 0.401439 \n",
" 0.00 \n",
" 38.399 \n",
" 3.575471 \n",
" 68.480406 \n",
" 134.682 \n",
" 2.19800 \n",
" \n",
" \n",
" 2194 \n",
" 2194 \n",
" 2197 \n",
" 2179-59-1 \n",
" C=CCSSCCC \n",
" Training \n",
" 0 \n",
" Non Predicted \n",
" 48 \n",
" 0.333839 \n",
" 0.00 \n",
" 45.404 \n",
" 2.616293 \n",
" 52.490225 \n",
" 148.296 \n",
" 2.96380 \n",
" \n",
" \n",
" 4118 \n",
" 4118 \n",
" 4125 \n",
" 624-92-0 \n",
" CSSC \n",
" Training \n",
" 0 \n",
" Non Predicted \n",
" 26 \n",
" 0.452840 \n",
" 0.00 \n",
" 27.030 \n",
" 1.974745 \n",
" 6.000000 \n",
" 94.204 \n",
" 1.62740 \n",
" \n",
" \n",
" 4180 \n",
" 4180 \n",
" 4187 \n",
" 6317-18-6 \n",
" N#CSCSC#N \n",
" Training \n",
" 0 \n",
" Non Predicted \n",
" 36 \n",
" 0.321595 \n",
" 47.58 \n",
" 31.275 \n",
" 2.768386 \n",
" 95.083765 \n",
" 130.197 \n",
" 1.37246 \n",
" \n",
" \n",
" 5633 \n",
" 5633 \n",
" 5641 \n",
" 7783-54-2 \n",
" FN(F)F \n",
" Training \n",
" 1 \n",
" Non Predicted \n",
" 26 \n",
" 0.383980 \n",
" 3.24 \n",
" 5.163 \n",
" 2.323790 \n",
" 8.000000 \n",
" 71.001 \n",
" 0.94190 \n",
" \n",
" \n",
" 5655 \n",
" 5655 \n",
" 5663 \n",
" 676-83-5 \n",
" CP(Cl)Cl \n",
" Training \n",
" 1 \n",
" Non Predicted \n",
" 26 \n",
" 0.426990 \n",
" 0.00 \n",
" 24.550 \n",
" 2.323790 \n",
" 10.754888 \n",
" 116.915 \n",
" 2.40570 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 Id CAS SMILES Status \\\n",
"1844 1844 1846 16709-86-7 C=C[Si](C)(C)CCl Training \n",
"2194 2194 2197 2179-59-1 C=CCSSCCC Training \n",
"4118 4118 4125 624-92-0 CSSC Training \n",
"4180 4180 4187 6317-18-6 N#CSCSC#N Training \n",
"5633 5633 5641 7783-54-2 FN(F)F Training \n",
"5655 5655 5663 676-83-5 CP(Cl)Cl Training \n",
"\n",
" Experimental value Predicted value NumValenceElectrons qed \\\n",
"1844 0 Non Predicted 42 0.401439 \n",
"2194 0 Non Predicted 48 0.333839 \n",
"4118 0 Non Predicted 26 0.452840 \n",
"4180 0 Non Predicted 36 0.321595 \n",
"5633 1 Non Predicted 26 0.383980 \n",
"5655 1 Non Predicted 26 0.426990 \n",
"\n",
" TPSA MolMR BalabanJ BertzCT MolWt MolLogP \n",
"1844 0.00 38.399 3.575471 68.480406 134.682 2.19800 \n",
"2194 0.00 45.404 2.616293 52.490225 148.296 2.96380 \n",
"4118 0.00 27.030 1.974745 6.000000 94.204 1.62740 \n",
"4180 47.58 31.275 2.768386 95.083765 130.197 1.37246 \n",
"5633 3.24 5.163 2.323790 8.000000 71.001 0.94190 \n",
"5655 0.00 24.550 2.323790 10.754888 116.915 2.40570 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[ (df['Predicted value'] != \"0\") & (df['Predicted value'] != \"1\") ]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For some inputs the VEGA model decides to output `non predicted`. As detailed in the documentation, it does this for particularly uncertain predictions. Let's remove these from the data set:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"non_predicted = df[ (df['Predicted value'] != \"0\") & (df['Predicted value'] != \"1\") ].index\n",
"df_clean = df.drop(non_predicted)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Si1CwO1Ol9-r"
},
"source": [
"Let's now collect all the input features of our dataset and remove the unnecessary ones:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 424
},
"id": "IahR4BJimCJ2",
"outputId": "d2e62d3c-e82e-4944-c496-8370a07c5a76"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" NumValenceElectrons \n",
" qed \n",
" TPSA \n",
" MolMR \n",
" BalabanJ \n",
" BertzCT \n",
" MolWt \n",
" MolLogP \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 52 \n",
" 0.463602 \n",
" 43.14 \n",
" 38.1064 \n",
" 3.003401 \n",
" 244.429658 \n",
" 157.556 \n",
" 2.24820 \n",
" \n",
" \n",
" 1 \n",
" 52 \n",
" 0.359544 \n",
" 69.16 \n",
" 37.5088 \n",
" 3.003401 \n",
" 242.429658 \n",
" 138.126 \n",
" 1.17700 \n",
" \n",
" \n",
" 2 \n",
" 52 \n",
" 0.470728 \n",
" 63.37 \n",
" 34.7612 \n",
" 3.003401 \n",
" 241.674771 \n",
" 139.110 \n",
" 1.30040 \n",
" \n",
" \n",
" 3 \n",
" 58 \n",
" 0.432586 \n",
" 43.14 \n",
" 45.7274 \n",
" 2.913802 \n",
" 257.648013 \n",
" 216.034 \n",
" 2.48970 \n",
" \n",
" \n",
" 4 \n",
" 58 \n",
" 0.479785 \n",
" 43.14 \n",
" 42.4744 \n",
" 2.913802 \n",
" 253.299498 \n",
" 151.165 \n",
" 2.15720 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 5759 \n",
" 102 \n",
" 0.485090 \n",
" 78.53 \n",
" 69.3560 \n",
" 2.668492 \n",
" 627.435628 \n",
" 265.269 \n",
" -1.05750 \n",
" \n",
" \n",
" 5760 \n",
" 42 \n",
" 0.495987 \n",
" 17.07 \n",
" 40.3720 \n",
" 3.791118 \n",
" 85.425922 \n",
" 315.186 \n",
" 2.59030 \n",
" \n",
" \n",
" 5761 \n",
" 44 \n",
" 0.568556 \n",
" 12.03 \n",
" 40.4577 \n",
" 2.447473 \n",
" 28.870765 \n",
" 230.931 \n",
" 1.36580 \n",
" \n",
" \n",
" 5762 \n",
" 184 \n",
" 0.264581 \n",
" 185.59 \n",
" 125.3525 \n",
" 2.552977 \n",
" 1169.342047 \n",
" 485.457 \n",
" 3.84768 \n",
" \n",
" \n",
" 5763 \n",
" 88 \n",
" 0.735392 \n",
" 9.23 \n",
" 73.2710 \n",
" 3.263016 \n",
" 388.457194 \n",
" 283.209 \n",
" 4.61982 \n",
" \n",
" \n",
"
\n",
"
5758 rows × 8 columns
\n",
"
"
],
"text/plain": [
" NumValenceElectrons qed TPSA MolMR BalabanJ BertzCT \\\n",
"0 52 0.463602 43.14 38.1064 3.003401 244.429658 \n",
"1 52 0.359544 69.16 37.5088 3.003401 242.429658 \n",
"2 52 0.470728 63.37 34.7612 3.003401 241.674771 \n",
"3 58 0.432586 43.14 45.7274 2.913802 257.648013 \n",
"4 58 0.479785 43.14 42.4744 2.913802 253.299498 \n",
"... ... ... ... ... ... ... \n",
"5759 102 0.485090 78.53 69.3560 2.668492 627.435628 \n",
"5760 42 0.495987 17.07 40.3720 3.791118 85.425922 \n",
"5761 44 0.568556 12.03 40.4577 2.447473 28.870765 \n",
"5762 184 0.264581 185.59 125.3525 2.552977 1169.342047 \n",
"5763 88 0.735392 9.23 73.2710 3.263016 388.457194 \n",
"\n",
" MolWt MolLogP \n",
"0 157.556 2.24820 \n",
"1 138.126 1.17700 \n",
"2 139.110 1.30040 \n",
"3 216.034 2.48970 \n",
"4 151.165 2.15720 \n",
"... ... ... \n",
"5759 265.269 -1.05750 \n",
"5760 315.186 2.59030 \n",
"5761 230.931 1.36580 \n",
"5762 485.457 3.84768 \n",
"5763 283.209 4.61982 \n",
"\n",
"[5758 rows x 8 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X = df_clean.drop(['Unnamed: 0', 'Id','CAS','SMILES','Status','Experimental value','Predicted value'],axis=1)\n",
"X"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ei-EOGnle97C"
},
"source": [
"### Exercise - manipulate a DataFrame ❗❗\n",
"\n",
"* How many molecules in our dataset have a `qed` less than 0.5?\n",
"* What is the molecule with the largest molecular weight `MolWt`?\n",
"* What is the average number of valance electrons `NumValenceElectrons` of the molecules in our dataset? "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"id": "DwAoulsggXUJ"
},
"outputs": [],
"source": [
"# Your code here"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "h2uOyvKYB_QE"
},
"source": [
"## Training and test split ✂️\n",
"\n",
"Remember, our goal is to create a model that **generalize well** to unseen data and not simply fit some seen data perfectly. To achieve this, our goal while splitting the data should be to ensure that the distribution of the test set is as close as possible to the expected distribution of the future data. Hence, often what we want is to make the training and test datasets to have a similar distribution.\n",
"\n",
"For example, let's see if how many molecules in our dataset are mutagenic vs. non-mutagenic."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QUCpGIgcB0y6",
"outputId": "82ed55b9-820f-4539-9cb4-8a827906003e"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Percentage of mutagenic molecules : 56.42584230635638\n",
"Percentage of non-mutagenic molecules: 43.57415769364362\n"
]
}
],
"source": [
"y = df_clean['Experimental value'].to_numpy()\n",
"perc_mutagenic = y.sum()/len(y)*100\n",
"print('Percentage of mutagenic molecules :', perc_mutagenic)\n",
"print('Percentage of non-mutagenic molecules:', 100-perc_mutagenic)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YFlMSb6TCZ7S"
},
"source": [
"In this case, the proportion of mutagenic and non-mutagenic data is very similar. Then, we will go ahead and split the data randomly. However, when you have a much more imbalanced dataset, how would you split the data better? You can look for instance at what [stratified splitting](https://scikit-learn.org/stable/modules/cross_validation.html#stratification) is and why is it important.\n",
"\n",
"In summary, when splitting your data, always think about the distribution of your splits!"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"id": "DQR8ATRjCPCq"
},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"id": "I09X-mSqCRtN"
},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "yeIZ2XI5jwoD",
"outputId": "32dc2318-453f-4baa-9b3b-285cac037c8b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training points: 4606\n",
"Training points: 1152\n"
]
}
],
"source": [
"print('Training points: ', len(y_train))\n",
"print('Training points: ', len(y_test))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fnRg4cMqDZia"
},
"source": [
"### Exercise - splits distribution ❗❗\n",
"\n",
"* Check what is the proportion of mutagenic molecules in your train and test set? Was the random splitting good?"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"id": "outc17O_DVKZ"
},
"outputs": [],
"source": [
"# Your code here"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KGvYC2i5hW_A"
},
"source": [
"## Feature scaling 📏"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iTfo1fwH7qMv"
},
"source": [
"It is always a good practice to scale your data before starting modeling. This helps the training process of many machine learning models. This is specially true for kNN which works on distances! The distance between two points is naturally afected by the dimensions of the input space. Look for example at the Euclidean distance, if one dimension ranges from 0 to 10,000 and another ranges from 0 to 1, the former one will potentially impact the distance value much more!\n",
"\n",
"We do not want this to happen. Therefore, we need to scale all input features in order to give the same importance to all dimensions regardless of their original scale.\n",
"\n",
"Here, we will use the method known as [standardization](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler). Here, we move the distribution of the data to have unit variance and a mean equal to zero.\n",
"\n",
"$$\n",
"\\hat{\\textbf{x}} = \\frac{\\textbf{x}-\\mu_x}{\\sigma_x}\n",
"$$\n",
"\n",
"Of course there are other [scaling methods](https://medium.com/greyatom/why-how-and-when-to-scale-your-features-4b30ab09db5e) are available and you might want to review them and check which one is better than the other in which conditions."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"id": "KlCTYKzV7Lja"
},
"outputs": [],
"source": [
"from sklearn.preprocessing import StandardScaler"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3nd3K52ulXb1"
},
"source": [
"We initialize our scaler function"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"id": "JDrRFz3o7ORI"
},
"outputs": [],
"source": [
"scaler = StandardScaler()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sPkVGBadlbgO"
},
"source": [
"and fit it to our data (i.e., get the mean vector $\\mu_x$ and the standard deviation vector $\\sigma_x$."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "j6tTHY4Al5U-",
"outputId": "8e2cff7e-8754-4ecd-c82f-0b3a55e99138"
},
"outputs": [
{
"data": {
"text/plain": [
"StandardScaler()"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scaler.fit(X_train)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hAMOgj-JprOW"
},
"source": [
"Now, let's scale our data"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "m4TAblST7lIL",
"outputId": "ca653b6e-0605-47f1-ec43-d752cf4ebe13"
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 6.91725031, -2.50154035, 6.01891181, ..., 3.43592554,\n",
" 6.12598659, -1.84190261],\n",
" [-0.39909237, -1.36770143, 0.74694415, ..., -0.14444052,\n",
" -0.41184123, -0.84860786],\n",
" [ 0.34652217, 0.01697949, -0.31275131, ..., 0.18125274,\n",
" 0.22156128, 0.73178752],\n",
" ...,\n",
" [ 0.29992126, 2.01678401, 0.34399709, ..., 0.69463898,\n",
" 0.66401444, -0.23869147],\n",
" [ 0.53292581, -0.04711992, -0.74958466, ..., 0.09406034,\n",
" 0.34165461, 1.34128367],\n",
" [ 1.83775125, -2.00364986, 0.47608443, ..., 1.57463088,\n",
" 6.0606014 , 2.62264517]])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train = scaler.transform(X_train)\n",
"X_test = scaler.transform(X_test)\n",
"X_train"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "g0zIoG5op95Z"
},
"source": [
"### Exercise - read documentation ❗❗\n",
"\n",
"* What are exactly the mean an standard deviation vectors that we used to scaled the data? Go to the [sklearn documentation](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html) and learn how you can access these. Reading the documentation of a library is a super important skill to learn! "
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"id": "8WDOvs_WqVFj"
},
"outputs": [],
"source": [
"# Your code here"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ti0h11a7CjPs"
},
"source": [
"## kNN model 🏘️"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"id": "fXHhnxgICgJD"
},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "axfX0cUMEWJN"
},
"source": [
"We initialize the kNN model by specifying the parameter \"k\". Later, we will review some ways that help us in determining this parameter better. For now, let's set it to 3."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"id": "0C18Ne_tCxdn"
},
"outputs": [],
"source": [
"knn = KNeighborsClassifier(n_neighbors=3)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ny_zGEKvEwf5"
},
"source": [
"we train it"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "WYtljFtOCzB7",
"outputId": "6d8e7c6c-4233-4f71-8752-1e7c4f0372f7"
},
"outputs": [
{
"data": {
"text/plain": [
"KNeighborsClassifier(n_neighbors=3)"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"knn.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "J1UYc51DEz3w"
},
"source": [
"we predict the test set"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"id": "8op0R9jbC4R0"
},
"outputs": [],
"source": [
"y_pred = knn.predict(X_test)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "M2EDTPLAHWit"
},
"source": [
"Let's now evaluate our kNN model!\n",
"\n",
"We will use several metrics for classification, for a quick reminder on them check the [documentation](https://scikit-learn.org/stable/modules/classes.html#classification-metrics)."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"id": "1iStpf04HV_1"
},
"outputs": [],
"source": [
"from sklearn.metrics import (confusion_matrix, accuracy_score, precision_score, \n",
" recall_score, f1_score, roc_auc_score, ConfusionMatrixDisplay) "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "T6ppJg7yGM2R"
},
"source": [
"Let first look at the confusion matrix"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "47uV_7PAg808",
"outputId": "2b304c3a-788c-4d04-8e05-87a58e77337d"
},
"outputs": [
{
"data": {
"text/plain": [
"array([[327, 176],\n",
" [139, 510]], dtype=int64)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cm = confusion_matrix(y_test, y_pred)\n",
"cm"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CD9QYwXEGQAl"
},
"source": [
"to see a prettier confusion matrix"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 296
},
"id": "zxE7tmAQGaxn",
"outputId": "d77df237-8655-48d4-9c0d-d4906b1cf61c"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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zIFhfAAAApyJkz3D+AAABDgqewCAOZj4cbkkewCAKRiGW4Yfb67z59jWRrIHAJiDYfhXnTNnDwAATldU9gAAczD8nLOnsgcA4DTndvvffLBx40ZdccUVSkxMlMVi0erVq73233DDDbJYLF5txIgRXn0OHjyocePGyWq1ql27dpo4caIqKyt9/uokewAAmkFVVZX69eun7OzsE/YZMWKE9u/f72l///vfvfaPGzdOO3fuVE5OjtauXauNGzfq5ptv9jkWhvEBAObQwsP4I0eO1MiRI3+yT3h4uOx2+3H37d69W2+++aY++ugjXXDBBZKkxx57TKNGjdKf/vQnJSYmNjoWKnsAgCkYbrffTZIqKiq8Wk1NzSnHtGHDBsXHx6tnz56aPHmyvv32W8++vLw8tWvXzpPoJWnYsGEKCgrShx9+6NN1SPYAAPggKSlJNpvN07Kysk7pPCNGjNDzzz+v9evX6//+7/+Um5urkSNHyuVySZKcTqfi4+O9jgkJCVFcXJycTqdP12IYHwBgDk00jF9cXCyr1erZHB4efkqnu+aaazw/p6amqm/fvjr77LO1YcMGDR069NTjPA4qewCAObgN/5skq9Xq1U412f9Yt27d1LFjRxUWFkqS7Ha7ysrKvPrU19fr4MGDJ5znPxGSPQAAp4GvvvpK3377rTp37ixJcjgcOnTokLZu3erp8+6778rtdmvgwIE+nZthfACAORiGJD+eb+/javzKykpPlS5J+/btU35+vuLi4hQXF6d58+Zp7Nixstvt2rt3r/7whz+oe/fuSktLkyT17t1bI0aM0KRJk7R06VLV1dVpypQpuuaaa3xaiS9R2QMATMJwG343X3z88cc677zzdN5550mSpk+frvPOO0/33HOPgoODtX37dl155ZXq0aOHJk6cqAEDBuj999/3mhZYvny5evXqpaFDh2rUqFG6+OKL9de//tXn705lDwAwB8Mt/yp7344dMmSIjJ8YDXjrrbdOeo64uDitWLHCp+seD5U9AAABjsoeAGAKhtuQYTn1W+9+qko/3ZHsAQDm0MLD+KeTNp3sG/7KqledX89JAE5nFYfb7j8wwMlUVB79/W6JqtnfXFGvuqYLpoW16WR/+PBhSdImrWvlSIDm075Ha0cANL/Dhw/LZrM1y7nDwsJkt9u1yel/rrDb7QoLC2uCqFqWxWjDkxBut1slJSWKjY2VxWJp7XBMoaKiQklJScc8LhIIBPx+tzzDMHT48GElJiYqKKj51oxXV1ertrbW7/OEhYUpIiKiCSJqWW26sg8KClKXLl1aOwxTanhMJBCI+P1uWc1V0f9QREREm0zSTYVb7wAACHAkewAAAhzJHj4JDw/Xvffe22RveQJOJ/x+I1C16QV6AADg5KjsAQAIcCR7AAACHMkeAIAAR7IHACDAkezRaNnZ2TrzzDMVERGhgQMH6l//+ldrhwQ0iY0bN+qKK65QYmKiLBaLVq9e3dohAU2KZI9GefHFFzV9+nTde++92rZtm/r166e0tDSVlZW1dmiA36qqqtSvXz9lZ2e3dihAs+DWOzTKwIEDdeGFF+ovf/mLpKPvJUhKStLUqVN15513tnJ0QNOxWCxatWqVrrrqqtYOBWgyVPY4qdraWm3dulXDhg3zbAsKCtKwYcOUl5fXipEBABqDZI+T+uabb+RyuZSQkOC1PSEhQU6ns5WiAgA0FskeAIAAR7LHSXXs2FHBwcEqLS312l5aWiq73d5KUQEAGotkj5MKCwvTgAEDtH79es82t9ut9evXy+FwtGJkAIDGCGntANA2TJ8+XRkZGbrgggt00UUX6ZFHHlFVVZVuvPHG1g4N8FtlZaUKCws9n/ft26f8/HzFxcWpa9eurRgZ0DS49Q6N9pe//EUPPvignE6n+vfvr8WLF2vgwIGtHRbgtw0bNuiyyy47ZntGRoaWLVvW8gEBTYxkDwBAgGPOHgCAAEeyBwAgwJHsAQAIcCR7AAACHMkeAIAAR7IHACDAkewBAAhwJHsAAAIcyR7w0w033KCrrrrK83nIkCG6/fbbWzyODRs2yGKx6NChQyfsY7FYtHr16kafc+7cuerfv79fcX3xxReyWCzKz8/36zwATh3JHgHphhtukMVikcViUVhYmLp376758+ervr6+2a/92muvacGCBY3q25gEDQD+4kU4CFgjRozQs88+q5qaGq1bt06ZmZkKDQ3V7Nmzj+lbW1ursLCwJrluXFxck5wHAJoKlT0CVnh4uOx2u5KTkzV58mQNGzZM//znPyV9P/R+//33KzExUT179pQkFRcX69e//rXatWunuLg4jR49Wl988YXnnC6XS9OnT1e7du3UoUMH/eEPf9CPXy/x42H8mpoazZo1S0lJSQoPD1f37t319NNP64svvvC8fKV9+/ayWCy64YYbJB19hXBWVpbOOussRUZGql+/fnrllVe8rrNu3Tr16NFDkZGRuuyyy7zibKxZs2apR48eioqKUrdu3XT33Xerrq7umH5PPPGEkpKSFBUVpV//+tcqLy/32v/UU0+pd+/eioiIUK9evfT444/7HAuA5kOyh2lERkaqtrbW83n9+vUqKChQTk6O1q5dq7q6OqWlpSk2Nlbvv/++PvjgA8XExGjEiBGe4/785z9r2bJleuaZZ7Rp0yYdPHhQq1at+snrTpgwQX//+9+1ePFi7d69W0888YRiYmKUlJSkV199VZJUUFCg/fv369FHH5UkZWVl6fnnn9fSpUu1c+dOTZs2Tddff71yc3MlHf2jZMyYMbriiiuUn5+vm266SXfeeafP/09iY2O1bNky7dq1S48++qiefPJJPfzww159CgsL9dJLL2nNmjV688039cknn+jWW2/17F++fLnuuece3X///dq9e7cWLlyou+++W88995zP8QBoJgYQgDIyMozRo0cbhmEYbrfbyMnJMcLDw40ZM2Z49ickJBg1NTWeY/72t78ZPXv2NNxut2dbTU2NERkZabz11luGYRhG586djUWLFnn219XVGV26dPFcyzAM49JLLzVuu+02wzAMo6CgwJBk5OTkHDfO9957z5Bk/Pe///Vsq66uNqKioozNmzd79Z04caJx7bXXGoZhGLNnzzZSUlK89s+aNeuYc/2YJGPVqlUn3P/ggw8aAwYM8Hy+9957jeDgYOOrr77ybHvjjTeMoKAgY//+/YZhGMbZZ59trFixwus8CxYsMBwOh2EYhrFv3z5DkvHJJ5+c8LoAmhdz9ghYa9euVUxMjOrq6uR2u3Xddddp7ty5nv2pqale8/SffvqpCgsLFRsb63We6upq7d27V+Xl5dq/f78GDhzo2RcSEqILLrjgmKH8Bvn5+QoODtall17a6LgLCwt15MgRXX755V7ba2trdd5550mSdu/e7RWHJDkcjkZfo8GLL76oxYsXa+/evaqsrFR9fb2sVqtXn65du+qMM87wuo7b7VZBQYFiY2O1d+9eTZw4UZMmTfL0qa+vl81m8zkeAM2DZI+Addlll2nJkiUKCwtTYmKiQkK8f92jo6O9PldWVmrAgAFavnz5Mefq1KnTKcUQGRnp8zGVlZWSpNdff90ryUpH1yE0lby8PI0bN07z5s1TWlqabDabVq5cqT//+c8+x/rkk08e88dHcHBwk8UKwD8kewSs6Ohode/evdH9zz//fL344ouKj48/prpt0LlzZ3344YcaPHiwpKMV7NatW3X++ecft39qaqrcbrdyc3M1bNiwY/Y3jCy4XC7PtpSUFIWHh6uoqOiEIwK9e/f2LDZssGXLlpN/yR/YvHmzkpOTddddd3m2ffnll8f0KyoqUklJiRITEz3XCQoKUs+ePZWQkKDExER9/vnnGjdunE/XB9ByWKAH/M+4cePUsWNHjR49Wu+//7727dunDRs26Pe//72++uorSdJtt92mBx54QKtXr9aePXt06623/uQ98meeeaYyMjL029/+VqtXr/ac86WXXpIkJScny2KxaO3atTpw4IAqKysVGxurGTNmaNq0aXruuee0d+9ebdu2TY899phn0dstt9yizz77TDNnzlRBQYFWrFihZcuW+fR9zznnHBUVFWnlypXau3evFi9efNzFhhEREcrIyNCnn36q999/X7///e/161//Wna7XZI0b948ZWVlafHixfrPf/6jHTt26Nlnn9VDDz3kUzwAmg/JHvifqKgobdy4UV27dtWYMWPUu3dvTZw4UdXV1Z5K/4477tD48eOVkZEhh8Oh2NhY/epXv/rJ8y5ZskRXX321br31VvXq1UuTJk1SVVWVJOmMM87QvHnzdOeddyohIUFTpkyRJC1YsEB33323srKy1Lt3b40YMUKvv/66zjrrLElH59FfffVVrV69Wv369dPSpUu1cOFCn77vlVdeqWnTpmnKlCnq37+/Nm/erLvvvvuYft27d9eYMWM0atQoDR8+XH379vW6te6mm27SU089pWeffVapqam69NJLtWzZMk+sAFqfxTjRyiIAABAQqOwBAAhwJHsAAAIcyR4AgABHsgcAIMCR7AEACHAkewAAAhzJHgCAAEeyBwAgwJHsAQAIcCR7AAACHMkeAIAA9/8By801/ssj8NMAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n",
"disp.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xWWS51LpGv75"
},
"source": [
"Now, let's look at the other metrics"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "JDQ4clUhG0E2",
"outputId": "d4ecf921-195b-4110-c224-98df5b600840"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy: 0.7265625 \n",
"Precision: 0.7434402332361516\n",
"Recall: 0.785824345146379\n",
"F1: 0.7640449438202247\n"
]
}
],
"source": [
"print('{:<10} {:<15}'.format('Accuracy:', accuracy_score(y_test, y_pred)))\n",
"print('{:<10} {:<15}'.format('Precision:', precision_score(y_test, y_pred)))\n",
"print('{:<10} {:<15}'.format('Recall:', recall_score(y_test, y_pred)))\n",
"print('{:<10} {:<15}'.format('F1:', f1_score(y_test, y_pred)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "M3WtaK81L8iT"
},
"source": [
"### Comparison to VEGA model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Tec9purNJ-OK"
},
"source": [
"What do you think about the metrics? Is the kNN model performing good or bad?\n",
"Let's compare it to the predictions of a kNN model trained on this same dataset and published as part of the [VEGA platform](https://www.vegahub.eu/portfolio-item/vega-qsar/). In the VEGA model, they have choosen k=4 with a similarity threshold of 0.7 (according to an internal similarity metric) Why is such threshold important?\n",
"\n",
"Also, the developers of the VEGA kNN model used the [leave-one-out](https://en.wikipedia.org/wiki/Cross-validation_(statistics)#Leave-one-out_cross-validation) approach to assess the performace of their model. Why is this approach specially suitable when using the kNN algorithm? "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nyfyVxebUAAX"
},
"source": [
"#### VEGA model"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 348
},
"id": "cD_XnbgGJ9PD",
"outputId": "2b79c535-7ef7-4ae3-f575-75e48cbdb534"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy: 0.7999305314345259\n",
"Precision: 0.8168631006346329\n",
"Recall: 0.8319482917820868\n",
"F1: 0.8243366880146386\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"y_clean = df_clean['Experimental value'].astype(int)\n",
"y_vega_clean = df_clean['Predicted value'].astype(int)\n",
"\n",
"cm = confusion_matrix(y_clean, y_vega_clean)\n",
"disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n",
"disp.plot()\n",
"print('{:<10} {:<15}'.format('Accuracy:', accuracy_score(y_clean, y_vega_clean)))\n",
"print('{:<10} {:<15}'.format('Precision:', precision_score(y_clean, y_vega_clean)))\n",
"print('{:<10} {:<15}'.format('Recall:', recall_score(y_clean, y_vega_clean)))\n",
"print('{:<10} {:<15}'.format('F1:', f1_score(y_clean, y_vega_clean)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "x-imyMSBUGaE"
},
"source": [
"#### Exercise - leave-one-out cross-validation ❗❗\n",
"\n",
"* Can you now assess our previous kNN model configuration using the leave-one-out approach on the cleaned dataset?"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "uc3jhsfoUZOD",
"outputId": "e2208f4e-2555-420e-f533-944d6f46e230"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of folds: 5758\n"
]
}
],
"source": [
"from sklearn.model_selection import LeaveOneOut\n",
"\n",
"X_clean = df_clean.drop(['Unnamed: 0', 'Id','CAS','SMILES','Status','Experimental value','Predicted value'],axis=1)\n",
"\n",
"loo = LeaveOneOut()\n",
"print('Number of folds: ', loo.get_n_splits(X_clean))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"id": "irPFyGSuW5H-"
},
"outputs": [],
"source": [
"y_pred_loo_our_model = np.zeros(y_clean.shape[0])\n",
"for i, (train_index, test_index) in enumerate(loo.split(X_clean)):\n",
" # Get training data for the current fold\n",
" X_train_loo = X_clean.iloc[train_index]\n",
" y_train_loo = y_clean.iloc[train_index]\n",
"\n",
" # Get test data for the current fold\n",
" X_test_loo = X_clean.iloc[test_index]\n",
"\n",
" # Train kNN\n",
" # Your code here\n",
"\n",
" # Get prediction on the test molecule\n",
" # Your code here\n",
"\n",
" # Store the prediction in `y_pred_loo_our_model`\n",
" # Your code here\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 403
},
"id": "6FW3Wk0KYWnC",
"outputId": "ee03b470-b467-4240-a3b9-040330470fcb"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy: 0.4357415769364363\n",
"Precision: 0.0 \n",
"Recall: 0.0 \n",
"F1: 0.0 \n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\DELL\\Anaconda3\\envs\\ML4ChemEng\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGwCAYAAAA0bWYRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9p0lEQVR4nO3de3gU9dn/8c9mk80BsoEASYiECFKBVA6KFtIqQo0EpCgFn1ZFQQSsNlgBBeRXOVfTBw8oilBFjfSBCp6ogIIRykmilmAUEVKBWEBIACEJieS0O78/YlZXWMlmEzbZeb+uay7dme/M3ssV2Dv3/Z3vWAzDMAQAAEwryN8BAAAA/yIZAADA5EgGAAAwOZIBAABMjmQAAACTIxkAAMDkSAYAADC5YH8H4Aun06kjR44oMjJSFovF3+EAALxkGIZOnz6t+Ph4BQU13O+nZWVlqqio8Pk6NptNYWFh9RBR49Kkk4EjR44oISHB32EAAHx06NAhtWvXrkGuXVZWpg6JzZV/zOHzteLi4pSXlxdwCUGTTgYiIyMlSXes/a1szUL8HA3QMPb3K/d3CECDqVKltukd17/nDaGiokL5xxz6b/bFskfWvfpQfNqpxF5fqaKigmSgMalpDdiahcjWnGQAgSnY4vR3CEDD+W5B/AvR6m0eaVHzyLq/j1OB245u0skAAAC15TCccvjwNB6HEbiJOckAAMAUnDLkVN2zAV/Obey4tRAAAJOjMgAAMAWnnPKl0O/b2Y0byQAAwBQchiGHUfdSvy/nNna0CQAAMDkqAwAAU2ACoWckAwAAU3DKkINk4JxoEwAAYHJUBgAApkCbwDOSAQCAKXA3gWe0CQAAMDkqAwAAU3B+t/lyfqAiGQAAmILDx7sJfDm3sSMZAACYgsOQj08trL9YGhvmDAAAYHJUBgAApsCcAc9IBgAApuCURQ5ZfDo/UNEmAADA5KgMAABMwWlUb76cH6hIBgAApuDwsU3gy7mNHW0CAABMjmQAAGAKNZUBXzZvLFq0SN27d5fdbpfdbldycrLeffdd1/GysjKlpaWpVatWat68uYYPH66CggK3axw8eFCDBw9WRESEYmJiNHnyZFVVVbmN2bRpk6644gqFhoaqU6dOysjI8PrPhmQAAGAKTsPi8+aNdu3a6a9//auys7O1Y8cO/frXv9ZNN92k3bt3S5ImTpyo1atX67XXXtPmzZt15MgRDRs2zHW+w+HQ4MGDVVFRoe3bt+uVV15RRkaGZsyY4RqTl5enwYMHq3///srJydGECRM0duxYrV+/3qtYLYbRdB/DVFxcrKioKI3Z9DvZmof4OxygQXx5Vbm/QwAaTJVRqU36p4qKimS32xvkPWq+K7Z9Hq/mkXX/HbjktFNXX3ZEhw4dcos1NDRUoaGhtbpGdHS0HnvsMd18881q06aNli9frptvvlmStHfvXnXt2lVZWVnq06eP3n33Xf3mN7/RkSNHFBsbK0lavHixpk6dquPHj8tms2nq1Klau3atPv/8c9d73HLLLSosLNS6detq/dmoDAAATKG+2gQJCQmKiopybenp6ed/b4dDr776qkpLS5WcnKzs7GxVVlYqJSXFNaZLly5q3769srKyJElZWVnq1q2bKxGQpNTUVBUXF7uqC1lZWW7XqBlTc43a4m4CAIApOBQkhw+/Azu++++5KgOe7Nq1S8nJySorK1Pz5s311ltvKSkpSTk5ObLZbGrRooXb+NjYWOXn50uS8vPz3RKBmuM1x35qTHFxsc6cOaPw8PBafTaSAQCAKRh16Pv/+HxJrgmBtdG5c2fl5OSoqKhIr7/+ukaNGqXNmzfXOYaGQjIAAEADsdls6tSpkySpV69e+ve//62nn35av//971VRUaHCwkK36kBBQYHi4uIkSXFxcfr444/drldzt8EPx/z4DoSCggLZ7fZaVwUk5gwAAEziQt9aeC5Op1Pl5eXq1auXQkJCtGHDBtex3NxcHTx4UMnJyZKk5ORk7dq1S8eOHXONyczMlN1uV1JSkmvMD69RM6bmGrVFZQAAYAoOI0gOw4c5A17eezdt2jQNGjRI7du31+nTp7V8+XJt2rRJ69evr74TbswYTZo0SdHR0bLb7brvvvuUnJysPn36SJIGDBigpKQk3XHHHZo3b57y8/P18MMPKy0tzTVP4Z577tGzzz6rKVOm6K677tLGjRu1cuVKrV271qtYSQYAAGgAx44d08iRI3X06FFFRUWpe/fuWr9+va6//npJ0vz58xUUFKThw4ervLxcqampeu6551znW61WrVmzRvfee6+Sk5PVrFkzjRo1SnPmzHGN6dChg9auXauJEyfq6aefVrt27bRkyRKlpqZ6FSvrDACNHOsMIJBdyHUG1n7WUc0irXW+Tulp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DcrNzVVmZqbWrFmjyspKpaamKjIyUlu3btUHH3yg5s2ba+DAga7znnjiCWVkZOill17Stm3bdPLkSb311ls/+b4jR47UP/7xDy1YsEB79uzR3/72NzVv3lwJCQl64403JEm5ubk6evSonn76aUlSenq6li5dqsWLF2v37t2aOHGibr/9dm3evFlSddIybNgwDRkyRDk5ORo7dqweeughr/9MIiMjlZGRoS+++EJPP/20XnjhBc2fP99tzL59+7Ry5UqtXr1a69at0yeffKI//vGPruPLli3TjBkz9Mgjj2jPnj169NFHNX36dL3yyitexwPATwwgAI0aNcq46aabDMMwDKfTaWRmZhqhoaHGgw8+6DoeGxtrlJeXu875+9//bnTu3NlwOp2ufeXl5UZ4eLixfv16wzAMo23btsa8efNcxysrK4127dq53sswDOPaa6817r//fsMwDCM3N9eQZGRmZp4zzn/961+GJOPUqVOufWVlZUZERISxfft2t7Fjxowxbr31VsMwDGPatGlGUlKS2/GpU6eeda0fk2S89dZbHo8/9thjRq9evVyvZ86caVitVuPw4cOufe+++64RFBRkHD161DAMw7jkkkuM5cuXu11n7ty5RnJysmEYhpGXl2dIMj755BOP7wvAv5gzgIC1Zs0aNW/eXJWVlXI6nbrttts0a9Ys1/Fu3bq5zRP49NNPtW/fPkVGRrpdp6ysTPv371dRUZGOHj2q3r17u44FBwfryiuvPKtVUCMnJ0dWq1XXXnttrePet2+fvv32W11//fVu+ysqKnT55ZdLkvbs2eMWhyQlJyfX+j1qrFixQgsWLND+/ftVUlKiqqoq2e12tzHt27fXRRdd5PY+TqdTubm5ioyM1P79+zVmzBiNGzfONaaqqkpRUVFexwPAP0gGELD69++vRYsWyWazKT4+XsHB7j/uzZo1c3tdUlKiXr16admyZWddq02bNnWKITw83OtzSkpKJElr1651+xKWqudB1JesrCyNGDFCs2fPVmpqqqKiovTqq6/qiSee8DrWF1544azkxGq11lusABoWyQACVrNmzdSpU6daj7/iiiu0YsUKxcTEnPXbcY22bdvqo48+Ut++fSVV/wacnZ2tK6644pzju3XrJqfTqc2bNyslJeWs4zWVCYfD4dqXlJSk0NBQHTx40GNFoWvXrq7JkDU+/PDD83/IH9i+fbsSExP15z//2bXvv//971njDh48qCNHjig+Pt71PkFBQercubNiY2MVHx+vAwcOaMSIEV69P4DGgwmEwHdGjBih1q1b66abbtLWrVuVl5enTZs26U9/+pMOHz4sSbr//vv117/+VatWrdLevXv1xz/+8SfXCLj44os1atQo3XXXXVq1apXrmitXrpQkJSYmymKxaM2aNTp+/LhKSkoUGRmpBx98UBMnTtQrr7yi/fv3a+fOnXrmmWdck/Luueceffnll5o8ebJyc3O1fPlyZWRkePV5f/azn+ngwYN69dVXtX//fi1YsOCckyHDwsI0atQoffrpp9q6dav+9Kc/6Xe/+53i4uIkSbNnz1Z6eroWLFig//znP9q1a5defvllPfnkk17FA8B/SAaA70RERGjLli1q3769hg0bpq5du2rMmDEqKytzVQoeeOAB3XHHHRo1apSSk5MVGRmp3/72tz953UWLFunmm2/WH//4R3Xp0kXjxo1TaWmpJOmiiy7S7Nmz9dBDDyk2Nlbjx4+XJM2dO1fTp09Xenq6unbtqoEDB2rt2rXq0KGDpOo+/htvvKFVq1apR48eWrx4sR599FGvPu+NN96oiRMnavz48erZs6e2b9+u6dOnnzWuU6dOGjZsmG644QYNGDBA3bt3d7t1cOzYsVqyZIlefvlldevWTddee60yMjJcsQJo/CyGp5lPAADAFKgMAABgciQDAACYHMkAAAAmRzIAAIDJkQwAAGByJAMAAJgcyQAAACZHMgAAgMmRDAAAYHIkAwAAmBzJAAAAJvf/AdJSuacKz29AAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cm = confusion_matrix(y_clean, y_pred_loo_our_model)\n",
"disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n",
"disp.plot()\n",
"print('{:<10} {:<15}'.format('Accuracy:', accuracy_score(y_clean, y_pred_loo_our_model)))\n",
"print('{:<10} {:<15}'.format('Precision:', precision_score(y_clean, y_pred_loo_our_model)))\n",
"print('{:<10} {:<15}'.format('Recall:', recall_score(y_clean, y_pred_loo_our_model)))\n",
"print('{:<10} {:<15}'.format('F1:', f1_score(y_clean, y_pred_loo_our_model)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uOnXu2eHHgUR"
},
"source": [
"\n",
"## Finding the best k in kNN 🔎\n",
"\n",
"What about the parameter k? How do we find the best k for our model? Why the VEGA model developers used k=4? Let's try to answer this...\n",
"\n",
"k is a hyperparameter of the model and should be chosen using a validation set.\n",
"\n",
"```{important}\n",
"Remember to reserve your test set exclusively for assesing your model! Never use it for training or hyperparameter tuning! \n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 49,
"referenced_widgets": [
"131bcbae8f1a4166b7c187e27752a4a1",
"0d5dd3b8b7914bafb3c57066f2117f4b",
"da3943a1533d48339cc99add56f296ec",
"8ab9c22f3c6b407aab7c2b20542caddf",
"62cc78dd0f354e4bab79b1adcbbb8d51",
"bbb549238aca44c0bcc7b41a4e0516d4",
"34b5cde70d7a41ae82eec617f48a33ff",
"b01c55a604c741d3838d98d412f6098e",
"99446b25af0a41efb78e8347a0468bc5",
"536147b20e874c8a820f2ffbfd010b5a",
"cbeab16ad6e344eea77e78270864e9bc"
]
},
"id": "GLeXAFEJnQj8",
"outputId": "59e721c0-50af-4ea9-a904-f99b613cb10e"
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f04bf46177484c8b8837b8299e489551",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/50 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"from tqdm.notebook import tqdm\n",
"\n",
"num_ks = np.arange(1, 100, 2).astype(int)\n",
"\n",
"X_train_hyp, X_valid, y_train_hyp, y_valid = train_test_split(X_train, y_train, test_size=0.1, random_state=0)\n",
"\n",
"train_accuracy = []\n",
"valid_accuracy = []\n",
"\n",
"for i in tqdm(range(len(num_ks))):\n",
" knn = KNeighborsClassifier(n_neighbors=num_ks[i])\n",
" knn.fit(X_train_hyp, y_train_hyp)\n",
"\n",
" pred_train = knn.predict(X_train_hyp)\n",
" pred_valid = knn.predict(X_valid)\n",
"\n",
" train_accuracy.append(1-accuracy_score(y_train_hyp, pred_train))\n",
" valid_accuracy.append(1-accuracy_score(y_valid, pred_valid))"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 388
},
"id": "S4CftpmcHmKM",
"outputId": "c57e9c1d-6335-4ff0-e7d6-9142bdb64a65"
},
"outputs": [
{
"data": {
"image/png": "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pyMAAABAVUNyBQAAAAAhQLdARAS3W/rPf6TvvnM6EgAAAKB4JFcIe/PmSXfcIX3/vbe8OgAAABBuuFWFY440X9WuXdKjj0offWRf16kjDRkiPfxwhYQHAAAABITkCo7wZ74qj5gY6ZZb7LxVe/ZIM2Ycea6q5OTQxQoAAAD4g+QKjvBnvipJOv106dlnpWOPta+POoq5qgAAABCeSK4Q1h57zJtYeTBXFQAAAMIRpdgBAAAAIARIrgAAAAAgBEiuAAAAACAESK7giN27nY4AAAAACC2SK1S4Q4ekESOcjgIAAAAILZIrVLj//ldauvTI6zFfFQAAACIJpdhR4QYNkn7/XWrYUOrSpeT1mK8KAAAAkYTkChUuKkqaMMHpKAAAAIDQolsgKsTPP0vXXSft3+90JAAAAED5oOUK5W7nTun886VffpGio6WnnnI6IgAAACD0aLlCuTp4ULr0UptYNWkijR/vdEQAAABA+SC5QrkaNkxKT5dq1JA++EBKSXE6IgAAAKB8kFyh3MycKT35pORySS+/LLVr53REAAAAQPlhzBXKJCNDysoqunzJEum22+zzKVOkCy+s2LgAAACAikZyhaBlZEitWkkHDpS8TnS0dPnlFRcTAAAA4BS6BSJoWVmlJ1aS5HZL27dXTDwAAACAk0iuAAAAACAESK4AAAAAIARIrgAAAAAgBEiuAAAAACAESK4AAAAAIARIrgAAAAAgBEiuELTkZKlatdLXiY+36wEAAACVHZMII2hNmkg33yw9/rj9OXhw0XWSk+16AAAAQGVHcoUyeewx6dprpWbNpOrVnY4GAAAAcA7JFcrs+OOdjgAAAABwHmOuEJQZM6QffnA6CgAAACB80HKFgH3/vTR0qORyST//LDVv7nREAAAAgPOCarn673//q1NOOUUNGzbUpk2bJEnTpk3Te++9F9LgEH6Mke64Q8rPly65hMQKAAAA8Ag4uXrqqac0fPhwnXfeedq1a5fcbrckqXbt2po2bVqo40OYmTtXmjdPio2VpkxxOhoAAAAgfAScXD3xxBN69tlnNWrUKEVHRxcs79y5s77//vuQBofwcuiQdOed9vltt9FqBQAAABQWcHK1ceNGdezYscjyuLg47d27NyRBITw995y0dq1Ut640apTT0QAAAADhJeDkqlmzZlq9enWR5XPnztVxxx0XipgQhnJy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7bffDklgCE6TJvbhab3q1k068URnYwIAAACqAr+Sq6SkJLlcLklSYmJiwXOErx077M+jjnI2DgAAAKCq8Cu5uvjiixUfHy9Jev7558szHoRAXp60d699XqeOs7EAAAAAVYXfyVVmZqbq1aun6OhobdmyRfXr1y/v2BAkY6SZM6WdO6WkJKejAQAAAKoGv5KrevXqaenSpbrgggtkjKFbYJiLi5NuusnpKAAAAICqJcqflW644QZddNFFio6OlsvlUmpqqqKjo4t9BGrmzJlKS0tTfHy8unXrpuXLl5e47o8//qh+/fopLS1NLpdL06ZNK7LO+PHj5XK5fB6tW7cOOC4AAAAACIRfLVfjx4/XFVdcoV9//VUXXnih5syZo9q1a5f54K+99pqGDx+uWbNmqVu3bpo2bZp69eql9evXF9vtcN++fWrevLkuvfRS3X777SXut02bNvr8888LXsfEBF1xPiJlZtqS7I0aSS1aOB0NAAAAUDX4nXW0bt1arVu31rhx43TppZcqISGhzAd/9NFHde2112rw4MGSpFmzZumjjz7S7NmzNWLEiCLrd+nSpWBureLe94iJiVFqamqZ44tUn30mDRoknXOO9OmnTkcDAAAAVA1+dQssbNy4cSFJrPLy8rRixQr17NnTG0xUlHr27KklS5aUad+//PKLGjZsqObNm2vAgAHKyMgodf3c3Fzl5OT4PCIZZdgBAACAiudXy9WJJ56o9PR01alTRx07diy1oMXKlSv9OnBWVpbcbrdSUlJ8lqekpOinn37yax/F6datm55//nm1atVKW7Zs0YQJE3Taaafphx9+UK1atYrdZvLkyZowYULQxww3O3fan5RhBwAAACqOX8nVRRddpLi4OElS3759yzOeMjv33HMLnrdr107dunVT06ZN9frrr2vIkCHFbjNy5EgNHz684HVOTo4aN25c7rGWF1quAAAAgIrnV3I1bty4Yp+XRXJysqKjo7V161af5Vu3bg3peKnatWvr2GOP1a+//lriOnFxcQXJY2VAcgUAAABUvIDHXG3evFl//PFHwevly5dr2LBheuaZZwLaT2xsrDp16qT09PSCZfn5+UpPT1f37t0DDatEe/bs0YYNG9SgQYOQ7TPc0S0QAAAAqHgBJ1f/+te/NH/+fElSZmamevbsqeXLl2vUqFGaOHFiQPsaPny4nn32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nerQoYOaN2+uW2+9Vb1799brr7/u174///xz/fTTT3rxxRfVvn17nX766XrggQeKrDd69GidfPLJSktL0wUXXKA777yz4BjVq1dXzZo1FRMTo9TUVKWmpqp69epF9vHyyy/rwIEDevHFF3XCCSfozDPP1IwZM/Tf//5XW7duLVivTp06mjFjhlq3bq3zzz9fffr0UXp6eqAfW8AcLWiRlZUlt9utlJQUn+UpKSn66aefit0mMzOz2PUzMzML3vcsK2mdw+Xm5io3N7fgdU5OTmAnAgAAgKqtULe0Ig4fR7VtmzRlinTffVJsrJSXZ7sEjhhRdHLT338PSXitW7fWySefrNmzZ+uMM87Qr7/+qq+++koTJ06U2+3WAw88oNdff11//vmn8vLylJub6/eYqnXr1qlx48Zq2LBhwbLu3bsXWe+1117T9OnTtWHDBu3Zs0eHDh1SYmJiQOexbt06tW/f3qeYximnnKL8/HytX7++IAdo06aNogt97g0aNND3338f0LGC4fiYq3AwefJkJSUlFTwaN27sdEgAAACIJDVqlPyIj/dd99FHbWI1caKUm2t/3nefXX54a01J+wzCkCFD9NZbb2n37t2aM2eOjjnmGPXo0UMPPfSQHn/8cd1zzz2aP3++Vq9erV69eikvLy/ID6OoJUuWaMCAATrvvPP04YcfatWqVRo1alRIj1FYtWrVfF67XC7l5+eXy7EKczS5Sk5OVnR0tE8TniRt3bpVqampxW6Tmppa6vqen4Hsc+TIkcrOzi54bN68OajzAQAAAErlqQo4caK3HPuYMfZ1cVUEQ+iyyy5TVFSUXn75Zb344ou65ppr5HK5tGjRIl100UW68sor1b59ezVv3lw///yz3/s97rjjtHnzZm3ZsqVg2dKlS33WWbx4sZo2bapRo0apc+fOatmypTZt2uSzTmxsrNxu9xGP9d1332lvoaIeixYtUlRUlFq1auV3zOXF0eQqNjZWnTp18un/mJ+fr/T09GKbEiXbxHh4f8l58+YVrN+sWTOlpqb6rJOTk6Nly5aVuM+4uDglJib6PJySnFz0y43Dxcfb9QAAABBh3G7fxMrDk2AdIbkoi5o1a+ryyy/XyJEjtWXLFl199dWSpJYtW2revHlavHix1q1bp+uvv75IQ0VpevbsqWOPPVaDBg3Sd999p6+++kqjRo3yWadly5bKyMjQq6++qg0bNmj69Ol65513fNZJS0vTxo0btXr1amVlZfkM2/EYMGCA4uPjNWjQIP3www+aP3++br31Vl111VVFhgU5wfFJhIcPH65Bgwapc+fO6tq1q6ZNm6a9e/dq8ODBkqSBAweqUaNGmjx5siRp6NCh6tGjhx555BH16dNHr776qr799ls988wzkmyT37Bhw3TfffepZcuWatasmcaMGaOGDRuqb9++Tp2m35o0sRMElzaPVXIyEwgDAABEpNImCC5uYuEQGzJkiP7zn//ovPPOKxgjNXr0aP3222/q1auXEhISdN1116lv377Kzs72a59RUVF65513NGTIEHXt2lVpaWmaPn26evfuXbDOhRdeqNtvv1233HKLcnNz1adPH40ZM0bjC30e/fr109tvv61//OMf2rVrl+bMmVOQAHokJCTo008/1dChQ9WlSxclJCSoX79+evTRR8v82YSC63/lDR01Y8YMPfTQQ8rMzFSHDh00ffp0devWTZJ0xhlnKC0tzacu/xtvvKHRo0fr999/V8uWLfXggw/qvPPOK3jfGKNx48bpmWee0a5du3TqqafqySef1LHHHutXPDk5OUpKSlJ2drajrVgAAAAIHwcOHNDGjRvVrFkzxR+pqxEiSmm/20Byg7BIrsINyRUAAAAOR3JVeYUquaJaIAAAAACEAMkVAAAAAIQAyRUAAAAAhADJFQAAABAAShZUPqH6nZJcAQAAAH6oVq2aJGnfvn0OR4JQ8/xOPb/jYDk+zxUAAAAQCaKjo1W7dm1t27ZNkp1zyeVyORwVysIYo3379mnbtm2qXbu2oqOjy7Q/kisAAADAT6mpqZJUkGChcqhdu3bB77YsSK4AAAAAP7lcLjVo0ED169fXwYMHnQ4HIVCtWrUyt1h5kFwBAAAAAYqOjg7ZDTkqDwpaAAAAAEAIkFwBAAAAQAiQXAEAAABACDDmqhieScRycnIcjgQAAACAkzw5gT8TDZNcFWP37t2SpMaNGzscCQAAAIBwsHv3biUlJZW6jsv4k4JVMfn5+frrr79Uq1atCpkYLicnR40bN9bmzZuVmJhY7sdD5cL1g7Lg+kGwuHZQFlw/KIuKvn6MMdq9e7caNmyoqKjSR1XRclWMqKgoHX300RV+3MTERP6BQdC4flAWXD8IFtcOyoLrB2VRkdfPkVqsPChoAQAAAAAhQHIFAAAAACFAchUG4uLiNG7cOMXFxTkdCiIQ1w/KgusHweLaQVlw/aAswvn6oaAFAAAAAIQALVcAAAAAEAIkVwAAAAAQAiRXAAAAABACJFcAAAAAEAIkV2Fg5syZSktLU3x8vLp166bly5c7HRLCzOTJk9WlSxfVqlVL9evXV9++fbV+/XqfdQ4cOKCbb75ZdevWVc2aNdWvXz9t3brVoYgRzqZMmSKXy6Vhw4YVLOP6QWn+/PNPXXnllapbt66qV6+utm3b6ttvvy143xijsWPHqkGDBqpevbp69uypX375xcGIEQ7cbrfGjBmjZs2aqXr16jrmmGM0adIkFa6lxrUDjy+//FIXXHCBGjZsKJfLpXfffdfnfX+ulR07dmjAgAFKTExU7dq1NWTIEO3Zs6cCz4LkynGvvfaahg8frnHjxmnlypVq3769evXqpW3btjkdGsLIwoULdfPNN2vp0qWaN2+eDh48qHPOOUd79+4tWOf222/XBx98oDfeeEMLFy7UX3/9pUsuucTBqBGOvvnmGz399NNq166dz3KuH5Rk586dOuWUU1StWjV98sknWrt2rR555BHVqVOnYJ0HH3xQ06dP16xZs7Rs2TLVqFFDvXr10oEDBxyMHE6bOnWqnnrqKc2YMUPr1q3T1KlT9eCDD+qJJ54oWIdrBx579+5V+/btNXPmzGLf9+daGTBggH788UfNmzdPH374ob788ktdd911FXUKloGjunbtam6++eaC12632zRs2NBMnjzZwagQ7rZt22YkmYULFxpjjNm1a5epVq2aeeONNwrWWbdunZFklixZ4lSYCDO7d+82LVu2NPPmzTM9evQwQ4cONcZw/aB099xzjzn11FNLfD8/P9+kpqaahx56qGDZrl27TFxcnHnllVcqIkSEqT59+phrrrnGZ9kll1xiBgwYYIzh2kHJJJl33nmn4LU/18ratWuNJPPNN98UrPPJJ58Yl8tl/vzzzwqLnZYrB+Xl5WnFihXq2bNnwbKoqCj17NlTS5YscTAyhLvs7GxJ0lFHHSVJWrFihQ4ePOhzLbVu3VpNmjThWkKBm2++WX369PG5TiSuH5Tu/fffV+fOnXXppZeqfv366tixo5599tmC9zdu3KjMzEyf6ycpKUndunXj+qniTj75ZKWnp+vnn3+WJH333Xf6+uuvde6550ri2oH//LlWlixZotq1a6tz584F6/Ts2VNRUVFatmxZhcUaU2FHQhFZWVlyu91KSUnxWZ6SkqKffvrJoagQ7vLz8zVs2DCdcsopOuGEEyRJmZmZio2NVe3atX3WTUlJUWZmpgNRIty8+uqrWrlypb755psi73H9oDS//fabnnrqKQ0fPlz33nuvvvnmG912222KjY3VoEGDCq6R4v4v4/qp2kaMGKGcnBy1bt1a0dHRcrvduv/++zVgwABJ4tqB3/y5VjIzM1W/fn2f92NiYnTUUUdV6PVEcgVEmJtvvlk//PCDvv76a6dDQYTYvHmzhg4dqnnz5ik+Pt7pcBBh8vPz1blzZz3wwAOSpI4dO+qHH37QrFmzNGjQIIejQzh7/fXX9dJLL+nll19WmzZttHr1ag0bNkwNGzbk2kGlRbdAByUnJys6OrpIRa6tW7cqNTXVoagQzm655RZ9+OGHmj9/vo4++uiC5ampqcrLy9OuXbt81udagmS7/W3btk0nnniiYmJiFBMTo4ULF2r69OmKiYlRSkoK1w9K1KBBAx1//PE+y4477jhlZGRIUsE1wv9lONxdd92lESNG6IorrlDbtm111VVX6fbbb9fkyZMlce3Af/5cK6mpqUUKwh06dEg7duyo0OuJ5MpBsbGx6tSpk9LT0wuW5efnKz09Xd27d3cwMoQbY4xuueUWvfPOO/riiy/UrFkzn/c7deqkatWq+VxL69evV0ZGBtcSdNZZZ+n777/X6tWrCx6dO3fWgAEDCp5z/aAkp5xySpGpH37++Wc1bdpUktSsWTOlpqb6XD85OTlatmwZ108Vt2/fPkVF+d5qRkdHKz8/XxLXDvznz7XSvXt37dq1SytWrChY54svvlB+fr66detWccFWWOkMFOvVV181cXFx5vnnnzdr16411113naldu7bJzMx0OjSEkRtvvNEkJSWZBQsWmC1bthQ89u3bV7DODTfcYJo0aWK++OIL8+2335ru3bub7t27Oxg1wlnhaoHGcP2gZMuXLzcxMTHm/vvvN7/88ot56aWXTEJCgvm///u/gnWmTJliateubd577z2zZs0ac9FFF5lmzZqZ/fv3Oxg5nDZo0CDTqFEj8+GHH5qNGzeat99+2yQnJ5u77767YB2uHXjs3r3brFq1yqxatcpIMo8++qhZtWqV2bRpkzHGv2uld+/epmPHjmbZsmXm66+/Ni1btjT9+/ev0PMguQoDTzzxhGnSpImJjY01Xbt2NUuXLnU6JIQZScU+5syZU7DO/v37zU033WTq1KljEhISzMUXX2y2bNniXNAIa4cnV1w/KM0HH3xgTjjhBBMXF2dat25tnnnmGZ/38/PzzZgxY0xKSoqJi4szZ511llm/fr1D0SJc5OTkmKFDh5omTZqY+Ph407x5czNq1CiTm5tbsA7XDjzmz59f7L3OoEGDjDH+XSvbt283/fv3NzVr1jSJiYlm8ODBZvfu3RV6Hi5jCk2TDQAAAAAICmOuAAAAACAESK4AAAAAIARIrgAAAAAgBEiuAAAAACAESK4AAAAAIARIrgAAAAAgBEiuAAAAACAESK4AADjMGWecoWHDhjkdBgAgwpBcAQAAAEAIkFwBAAAAQAiQXAEAcAQfffSRkpKS9NJLLzkdCgAgjMU4HQAAAOHs5Zdf1g033KCXX35Z559/vtPhAADCGC1XAACUYObMmbrpppv0wQcfkFgBAI6IlisAAIrx5ptvatu2bVq0aJG6dOnidDgAgAhAyxUAAMXo2LGj6tWrp9mzZ8sY43Q4AIAIQHIFAEAxjjnmGM2fP1/vvfeebr31VqfDAQBEALoFAgBQgmOPPVbz58/XGWecoZiYGE2bNs3pkAAAYYzkCgCAUrRq1UpffPGFzjjjDEVHR+uRRx5xOiQAQJhyGTqSAwAAAECZMeYKAAAAAEKA5AoAAAAAQoDkCgAAAABCgOQKAAAAAEKA5AoAAAAAQoDkCgAAAABCgOQKAAAAAEKA5AoAAAAAQoDkCgAAAABCgOQKAAAAAEKA5AoAAAAAQoDkCgAAAABC4P8BURVnw14CHh8AAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.plot(num_ks, train_accuracy, 'bs--', label='Train')\n",
"plt.plot(num_ks, valid_accuracy, 'rx--', label='Validation')\n",
"plt.xlabel('k')\n",
"plt.ylabel('Misclasification rate')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kGhwzvOOHtd5"
},
"source": [
"This graph is pretty similar to the one that we saw on slide 9 of Lecture 2. Here, we can see the expected general trend of the performance curves. \n",
"\n",
"Which k do you think is the best?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7VJZyifr-4nR"
},
"source": [
"### Cross-validation\n",
"\n",
"Problem: if validation set is small and noisy, it might be misleading\n",
"Idea: Increase the size of the validation set\n",
"Problem: This would reduce the size of the training set\n",
"\n",
"Then, let's use all data for training and validation using k-fold cross-validation!"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"id": "t_6J0cmd_558"
},
"outputs": [],
"source": [
"from sklearn.model_selection import cross_validate"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 49,
"referenced_widgets": [
"914eff8c2fae4f248af2dd1c0ab2adec",
"c90eb39b1d6e4b5ba8136df7e5480a61",
"b5249ba10245474e8ea18b502bebffb2",
"3f07d346263c40ae80952f23251b4b74",
"7976f19eb8f1414e8de608ed280755a7",
"d23639c2608d4c4bbbb58fbeeff6c934",
"164fc49ebc3b466f9b4c25260637210a",
"4bfe0903581b4ca999017a19607380d5",
"ef2b2ce93832431aac24fdb8dcbaf7f2",
"d19e4dface4c4701a08ac745a31b8225",
"24b693f1c368469faf63263a9c520158"
]
},
"id": "jXOO3iN3-3n2",
"outputId": "21856a82-4d55-49d0-eb6f-58e9a1645d5c"
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "3e44fad5103941e3a431b8981714649f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/49 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"num_ks = np.arange(1, 50, 1).astype(int)\n",
"\n",
"train_misclassification = []\n",
"valid_misclassification = []\n",
"for i in tqdm(range(len(num_ks))):\n",
" knn = KNeighborsClassifier(n_neighbors=num_ks[i])\n",
" cv_dict = cross_validate(knn, X_train, y_train, cv=10, \n",
" scoring='accuracy', return_train_score=True)\n",
" \n",
" k_fold_train_scored = cv_dict['train_score']\n",
" k_fold_valid_scored = cv_dict['test_score']\n",
" \n",
" train_misclassification.append(1-k_fold_train_scored.mean())\n",
" valid_misclassification.append(1-k_fold_valid_scored.mean())\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 388
},
"id": "fhwmbs0dzoyu",
"outputId": "8fe30b73-c5af-41cd-9dea-210c37810d43"
},
"outputs": [
{
"data": {
"image/png": "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7dYHAACA8qZNk2bMqPi1GTPM6352ySWXaPDgwRW+9vnnn8vhcGjTpk1ebXPt2rW66aab/FFeqWnTpqlnz57l5mdlZemCCy7w675qC+EqGFmWdPfd5vF115l7W3kiKkq64grzmHteAQAA1L3QUGnKlPIBa8YMM78WBiC7/vrrtWzZMu3atavcay+++KJ69+6t7t27e7XNVq1aqfHxt/+pJQkJCYqIiKiTfdUU4SoYrVolrVghhYebAS284byh8JIlUlGR/2sDAABoiPLzK5+OHnUtN3myubRjyhTzOD/f/Jwyxcy/4w7PtuuFiy++WK1atdKCBQvc5h86dEivv/66hgwZohEjRqht27Zq3LixTjvtNL322mtVbvP4boFbt27VOeeco8jISJ188slatmxZuXXuvvtunXjiiWrcuLE6deqkyZMnq+h/56MLFizQ9OnT9c0338jhcMjhcJTWe3y3wG+//VYDBw5UVFSUWrZsqZtuukmHDh0qfX306NEaMmSIZs2apTZt2qhly5a65ZZbSvdVmwhXwah/f+n996VHHpE6dPBu3UGDpFatpJwc6dNPa6c+AACAhiY6uvJp6FD3ZR9/3Px88EHz+oMPup4f3/2tY8eKt+mFsLAwjRw5UgsWLJBV5tY9r7/+uoqLi/XnP/9ZvXr10ocffqjNmzfrpptu0nXXXac1a9Z4tP2SkhJdccUVCg8P11dffaV58+bpbmcvqzKaNm2qBQsW6Pvvv9cTTzyh559/Xv/4xz8kScOGDdPEiRN1yimnKCsrS1lZWRo2bFi5beTn5ys1NVXNmzfX2rVr9frrr+vTTz/VuHHj3JZbsWKFtm/frhUrVuill17SggULyoXL2kC4CkYOh7l+6rbbvF83LExyHqh0DQQAAGgQxo4dq+3bt+uzzz4rnffiiy9q6NCh6tChg+644w717NlTnTp10vjx4zV48GAtWbLEo21/+umn+vHHH/Xyyy+rR48eOuecc/RQBaNT33///TrzzDPVsWNHXXLJJbrjjjtK9xEVFaXo6GiFhYUpISFBCQkJioqKKreNhQsX6ujRo3r55Zd16qmnauDAgZozZ45eeeUV7dmzp3S55s2ba86cOerWrZsuvvhiXXTRRcrIyPD21+a1sFrfA/ynsNA0AzdvXrPtjBpluhRee61/6gIAAGjoynRLK+f466j27jW30XnwQXNOVlhougTec48Uclzbxy+/+KW8bt266cwzz9T8+fM1YMAAbdu2TZ9//rkeeOABFRcX66GHHtKSJUv022+/qbCwUAUFBR5fU/XDDz8oKSlJiYmJpfP69+9fbrnFixfrySef1Pbt23Xo0CEdO3ZMMTExXr2PH374QT169FCTJk1K5/3xj39USUmJtmzZovj4eEnSKaecotAyv/c2bdro22+/9WpfvqDlKpjMmyd16iQ9/3zNttO7t/TYY9IZZ/inLhtGvQEAAAgoTZpUPkVGui/7+OMmWD3wgFRQYH4++KCZf3xrTWXb9MH111+vN998UwcPHtSLL76oE044Qeeee64effRRPfHEE7r77ru1YsUKbdy4UampqSosLPTxl1HeqlWrdO211+rCCy/UBx98oA0bNui+++7z6z7KatSokdtzh8Ohkjq4FRHhKljk5ZmgcuBA4N2jyoZRbwAAAIKS8/zogQfMQBaS+fnAAxWfT/nR1VdfrZCQEC1cuFAvv/yyxo4dK4fDoS+++EKXXXaZ/vznP6tHjx7q1KmTfvrpJ4+3e9JJJ2nnzp3Kysoqnbd69Wq3Zb788kt16NBB9913n3r37q0uXbro119/dVsmPDxcxcXF1e7rm2++UX6ZQT2++OILhYSEqGvXrh7XXFsIV8HiscfMIBQnniiNHVvz7VmWGdDi+uul33+v2bYq+kCo6IMDAACgoSsurvj8yHk+VU24qIno6GgNGzZMkyZNUlZWlkaPHi1J6tKli5YtW6Yvv/xSP/zwg/7yl7+4Xb9UnZSUFJ144okaNWqUvvnmG33++ee677773Jbp0qWLMjMztWjRIm3fvl1PPvmk3n77bbdlOnbsqB07dmjjxo3KyclRQUFBuX1de+21ioyM1KhRo7R582atWLFC48eP13XXXVfaJdBOhKtAdHw3u+xsE64k6fTTpb//veb7cDikiROl+fOlN9+s+fbKBqyICIIVAABARaZNq/z8aPLkWr+c4vrrr9d///tfpaamll4jdf/99+uMM85QamqqBgwYoISEBA0ZMsTjbYaEhOjtt9/WkSNH1LdvX91www36+3Hnq5deeqluv/12jRs3Tj179tSXX36pycf9HoYOHarBgwfrT3/6k1q1alXhcPCNGzfWxx9/rN9//119+vTRlVdeqUGDBmnOnDne/zJqgcMqOx4jJEl5eXmK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739d8woKXCfLJ51kWQ8/bFl33FHx36mJEy3r1lstKzu74u174/PPLatjR9d7iYpyD8xl38Pf/27CpL9OzMeMqfw4Skx0388//2mC765d5rknJ8QFBSa8zJtngkrPnq4vci2r4gBSdnrhBdeyH31U9bIPP+xadvt2E2BmzrSsxYsta+1a8wVF2S8EfDn3qGjdw4cta+tWc15T9ouNjz827/f4AOacnn7a8/16K1i68JY9vu6/3yx7662erVsHCFc11GDDlWW5TirCwsxB7fyP72zCrk3OD6hGjSzrggssa9mywPs2hxPb2sXvt3o1+VavHnbVqFR1v6ebbzYnp/37myDz+eeuZZYvNyeazi5Cztb1pCTTglLWeeeZb78nTHBdd1HZPidPtqyvv7asl16yrLvvNiElOdnsf+ZM1/LO/VU0RUS4/66zssx1QNddZ77lL/sNfsuWlvXUU65lv/666hPSsifwq1dXvex993lWr2RZ99zjWnbXLtMK0bOneW3wYNMrIjbWPB8+3LXsihXmdztunAl5WVmVn7D9+c+WNXq0aztlg9aUKZUfD5Mmmflt21pWhw6uMGZZJjysWVNxq5zz+Z13ut5/48ZmezW5LvnXX83f39atLev88ys/Od2yxfUeu3c33dXy881ynvxfPXbMnPA717EscwyGhFhW587uoSElxf34LClxDwnt21vWsGHm77bkOj6d9fbta6aIiKqPjfvuc///9uc/W9a771rWG29Y1muvmZDk9PPPlvX445b1yCPmuqeyx+/YseaLhOr42hWxputOnuw6z3K+37It4m+/bT4f1q1znQPZ0YW3JvssLrasH35w/Zs6j6UOHSyrd2/TGpqcbK69j4kxv4tXX3Wt/+abrmMkQL50J1zVUIMOVyUlrg9I5wFdFydNx38D5JxOO82yXnzRdQ2Y3exorg62k9qaCNDuAAHH1z/sdnTVsDPQla3tyBFzsiaVPwGXzIlaZeuWfT5tmmuZggJzQl12O84Wp3POMdeVOtcbN67ibm3O6a9/dd+P88Trb38zXbX27av6c9CTYyIry7RC3Xuv6U71pz9ZVpcu7l3fnN3sfv7ZtNicdZYJb2PHmiAxc6Y5kT/+wn7nZ/fQoWaZW24x651xhnv3qM8/r/x34HCY7meevseK5hcUmF4Xo0a5/p1vvNF9uRtusKz33jMneGX3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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.plot(num_ks, train_misclassification, 'bs--', label='Train')\n",
"plt.plot(num_ks, valid_misclassification, 'rx--', label='Validation')\n",
"plt.xlabel('k')\n",
"plt.ylabel('Misclasification rate')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "1ruje72l3Gcv",
"outputId": "f8955444-23e4-4014-83e5-f04032f69eeb"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k with minimum validation misclassification: 17\n"
]
}
],
"source": [
"print('k with minimum validation misclassification: ', num_ks[np.argmin(valid_misclassification)])"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 388
},
"id": "LeGHGE0Z4Iw9",
"outputId": "10e7209a-766e-4c65-ef65-7359fef9c92c"
},
"outputs": [
{
"data": {
"image/png": "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RYrkeO5yueTxeELSVnYEfgi/7EFefDxBHwAAQEFgL7/J/qG8/aF9Xst1HHTDDTcoLi5OkydP1jvvvKO+ffvK5XJp6dKl6tKli2655RalpqaqTp06+u2333y+bsOGDbV161bt2LHjxL5vv/02xzHffPONatasqccee0wtWrRQvXr19Oeff+Y4JjExUW63+7Rt/fjjj8rMluBm6dKliouLU/369X3uc6gQ+CH8sv/RcLtD+kcEAAAAPnK7856JZQd/pwl8glGyZEn16NFDQ4cO1Y4dO3TbbbdJkurVq6c5c+bom2++0bp163THHXfkWC93Oh06dNBZZ52l3r1768cff9TXX3+txx57LMcx9erV05YtWzR16lRt2rRJL774ombOnJnjmFq1amnz5s1avXq19u7dq6NHj57U1s0336xixYqpd+/e+vnnn7VgwQINHDhQt95664lpnpFE4Ifwsj9Jst16a8g/QQIAAIAPRo7MfybWsGEhz8Der18//fPPP+rYseOJNXmPP/64mjVrpo4dO6pt27aqXLmyunbt6vM14+LiNHPmTB0+fFitWrXSv/71Lz311FM5jrnmmmt0//3365577lHTpk31zTffaFiun0P37t11xRVX6NJLL1WFChXyLClRokQJzZ49W/v27VPLli113XXXqX379ho/frz/P4wQcFnZ86aiwDtw4ICSk5OVnp7u94LTiLODvkcfNWv8JJPk5dlnWesHAAAQpCNHjmjz5s2qXbu2iuVeu4eodarfqz+xAVk9ET729IF77jEZow4elIoW9QZ7IZw+AAAAABRmBH4In+zTA8aMkXbulLZulWrUYKQPAAAACCHW+CEyxo2Tzj7bBIAAAAAAQorAD+F36JBk1yrJlu4WAAAAQGgQ+CH83nlHsrMpEfgBAAA4ityNscWp3yeBH8Jv3z7v44yMyPUDAAAghsTHx0uSsrKyItwTOMn+fdq/30CR3AXh988/3seM+AEAADgiISFBJUqU0J49e1SkSBHFxTHGE+08Ho/27NmjEiVKKCEhuNCNwA/hl33Ej8APAADAES6XS1WqVNHmzZv1559/Rro7cEhcXJxSUlLkcrmCug6BH8Iv+4gfUz0BAAAck5iYqHr16jHdM4YkJiY6MnpL4Ifws0f8qlWT+vePbF8AAABiTFxcnIoVKxbpbqCAIfBD+Nkjfm++KV1+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qzPyqf22dOlStWrVSkWKFMmxf+3atSpXrpwqVap00jmZmZlKTU1V3759de211+Z53WnTpmnw4MF6+eWX1bp1a40dO1YdO3bU+vXrT0yBbdq0qY4fP37SuV999ZWqVq162p9PVAm2hp+Us37foUPeQBAAAABAwFyWZVm+HPjnn3/KsizVqVNHy5cvV4UKFU68lpiYqIoVKyo+Pt6RTpUtW1bPPfecTwlj9uzZo4oVK2rRokW6+OKLT3rd4/GoWbNmqlevnqZOnXqij+vXr9cll1yiwYMH66GHHjplGy6XSzNnzlTXrl1z7G/durVatmyp8ePHn2irRo0aGjhwoB555BEfv1szfXb8+PGaMWPGaY89cOCAkpOTlZ6erqSkJJ/bCIuJE6W775a6dZM+/DCwa3g8kn0f7dwp5RGUAwAAAPAvNvB5xK9mzZqSTHATKm63W++//74yMzPVpk0bn85JT0+XZILFvMTFxemLL77QxRdfrF69eundd9/V5s2b1a5dO3Xt2vW0QV9+srKytGLFCg0dOjRHWx06dNCyECQmmTBhgiZMmCC32+34tR1jj/iVKRP4NeLipBIlzGgf6/wAAAAAR/hdx8+2du1abdmy5aREL9dcc43f11qzZo3atGmjI0eOqGTJkpo5c6YaNWp02vM8Ho8GDRqkCy64QGeffXa+x1WtWlXz58/XRRddpJtuuknLli1Thw4dNHHiRL/7atu7d6/cbvdJ00QrVaqkX3/91efrdOjQQT/++KMyMzNVvXp1vf/++3kGvQMGDNCAAQNORPUF0j//mG0wUz0lU/w9M1PKI4kQAAAAAP/5Hfj9/vvv6tatm9asWSOXyyV7pqjL5ZKkgEak6tevr9WrVys9PV0zZsxQ7969tWjRotMGfwMGDNDPP/+sJUuWnLaNlJQUvfvuu7rkkktUp04dvfHGGyf6HElz586NdBecYwd+wYz4SdKffwbfFwAAAAAn+F3O4b777lPt2rW1e/dulShRQr/88osWL16sFi1aaOHChQF1IjExUXXr1lXz5s01evRopaamaty4cac855577tFnn32mBQsWqHr16qdtY9euXerfv786d+6sQ4cO6f777w+or7by5csrPj5eu3btOqmdypUrB3XtqFWmjFS7tlSlSqR7AgAAACAbvwO/ZcuWadSoUSpfvrzi4uIUFxenCy+8UKNH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evppadAgqVIl/9rp0cOs81u2zO8uAgAAAAWZ34Hf7bffrkGDBumtt97Sn3/+qT///FNvvvmm7r//ft1+++1+d2DixIlq0qSJkpKSlJSUpDZt2mjWrFmnPGfx4sXq3LmzqlatKpfLpY8++sjvdn3hSzsTJkxQrVq1VKxYMbVu3VrLly8PSV8KNX8Cv8RE6cEHpRdekIoU8a+dnTtNOYc//vC7iwAAAEBB5lNWz+wefPBB/f3337r77ruVlZUlSSpWrJgefvhhDR061O8OVK9eXWPGjFG9evVkWZbefvttdenSRatWrVLjxo3zPCczM1Opqanq27evrr322tO2sXTpUrVq1UpFcgUCa9euVbly5VQpn5Gh07Uzbdo0DR48WC+//LJat26tsWPHqmPHjlq/fr0qVqwoydRAPH78+EnnfvXVV4yQ+qpkSbP1dY1foKjlBwAAgBjlsk5XlT0fGRkZWrdunYoXL6569eqpaNGijnWqbNmyeu6559SvX7/THutyuTRz5kx17do1z9c9Ho+aNWumevXqaerUqYqPj5ckrV+/XpdccokGDx6shx56KKB2WrdurZYtW2r8+PEn2qpRo4YGDhyoRx555PTfaDYLFy7U+PHjNWPGjFMed+DAASUnJys9PV1JSUl+tRG1fv9d2r3bBGbVqp362K1bpb17pZo1pbJl/Wvn0Uel0aOle+6RXnop8P4CAAAAYeBPbOD3VE9byZIl1bJlS6WkpGjWrFlat25doJc6we12a+rUqcrMzFSbNm2Cvp4kxcXF6YsvvtCqVavUq1cveTwebdq0Se3atVPXrl19CvrykpWVpRUrVqhDhw452urQoYOWhWCN2IQJE9SoUSO1bNnS8WsXeHXqSOedd/qgT5ImTZKaNZMC+b3aI34UcQcAAECM8Tvwu+GGG06McB0+fFgtWrTQDTfcoCZNmuiDDz4IqBNr1qxRyZIlVbRoUd15552aOXOmGjVqFNC18lK1alXNnz9fS5Ys0U033aR27dqpQ4cOmhhEzba9e/fK7XafNE20UqVK2rlzp1/X6tChg66//np98cUXql69ep6B44ABA7R27Vp9//33Afe5UAgmo2dKitky1RMAAAAxxu/Ab/HixbroooskSTNnzpRlWdq/f79efPFFPfnkkwF1on79+lq9erW+++473XXXXerdu7fWrl0b0LXyk5KS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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.plot(num_ks, valid_misclassification, 'rx--', label='Validation')\n",
"plt.yscale('log')\n",
"plt.xlabel('k')\n",
"plt.ylabel('Misclasification rate')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "seihHrN44uia"
},
"source": [
"You can now go back to your implementation of leave-one-out and train your kNN model using the best k that you found. How does it perform compared to the VEGA kNN? Do you got a better model? Why?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IrYX_LjKkjcE"
},
"source": [
"## Challenge - kNN QSPR for predicting BCF 🥇\n",
"\n",
"\n",
"Develop a kNN model for regression to predict the bioconcentration factor (BCF).\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"id": "rv1bQTxtVvuz"
},
"outputs": [],
"source": [
"if 'google.colab' in str(get_ipython()):\n",
" df_bcf = pd.read_csv(\"https://raw.githubusercontent.com/edgarsmdn/MLCE_book/main/references/BCF_training.csv\")\n",
"else:\n",
" df_bcf = pd.read_csv(\"references/BCF_training.csv\")\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"id": "X5a-AgMZ55Rj"
},
"outputs": [],
"source": [
"# Your code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## References\n",
"\n",
"```{bibliography}\n",
":filter: docname in docnames\n",
"```"
]
}
],
"metadata": {
"colab": {
"provenance": [],
"toc_visible": true
},
"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.7.15"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"0d5dd3b8b7914bafb3c57066f2117f4b": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_bbb549238aca44c0bcc7b41a4e0516d4",
"placeholder": "",
"style": "IPY_MODEL_34b5cde70d7a41ae82eec617f48a33ff",
"value": "100%"
}
},
"131bcbae8f1a4166b7c187e27752a4a1": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HBoxView",
"box_style": "",
"children": [
"IPY_MODEL_0d5dd3b8b7914bafb3c57066f2117f4b",
"IPY_MODEL_da3943a1533d48339cc99add56f296ec",
"IPY_MODEL_8ab9c22f3c6b407aab7c2b20542caddf"
],
"layout": "IPY_MODEL_62cc78dd0f354e4bab79b1adcbbb8d51"
}
},
"164fc49ebc3b466f9b4c25260637210a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"24b693f1c368469faf63263a9c520158": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"34b5cde70d7a41ae82eec617f48a33ff": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"3f07d346263c40ae80952f23251b4b74": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_d19e4dface4c4701a08ac745a31b8225",
"placeholder": "",
"style": "IPY_MODEL_24b693f1c368469faf63263a9c520158",
"value": " 49/49 [01:48<00:00, 2.54s/it]"
}
},
"4bfe0903581b4ca999017a19607380d5": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"536147b20e874c8a820f2ffbfd010b5a": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"62cc78dd0f354e4bab79b1adcbbb8d51": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"7976f19eb8f1414e8de608ed280755a7": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"8ab9c22f3c6b407aab7c2b20542caddf": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_536147b20e874c8a820f2ffbfd010b5a",
"placeholder": "",
"style": "IPY_MODEL_cbeab16ad6e344eea77e78270864e9bc",
"value": " 50/50 [00:16<00:00, 3.10it/s]"
}
},
"914eff8c2fae4f248af2dd1c0ab2adec": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HBoxView",
"box_style": "",
"children": [
"IPY_MODEL_c90eb39b1d6e4b5ba8136df7e5480a61",
"IPY_MODEL_b5249ba10245474e8ea18b502bebffb2",
"IPY_MODEL_3f07d346263c40ae80952f23251b4b74"
],
"layout": "IPY_MODEL_7976f19eb8f1414e8de608ed280755a7"
}
},
"99446b25af0a41efb78e8347a0468bc5": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ProgressStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"bar_color": null,
"description_width": ""
}
},
"b01c55a604c741d3838d98d412f6098e": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"b5249ba10245474e8ea18b502bebffb2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "FloatProgressModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ProgressView",
"bar_style": "success",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_4bfe0903581b4ca999017a19607380d5",
"max": 49,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_ef2b2ce93832431aac24fdb8dcbaf7f2",
"value": 49
}
},
"bbb549238aca44c0bcc7b41a4e0516d4": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"c90eb39b1d6e4b5ba8136df7e5480a61": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_d23639c2608d4c4bbbb58fbeeff6c934",
"placeholder": "",
"style": "IPY_MODEL_164fc49ebc3b466f9b4c25260637210a",
"value": "100%"
}
},
"cbeab16ad6e344eea77e78270864e9bc": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"d19e4dface4c4701a08ac745a31b8225": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"d23639c2608d4c4bbbb58fbeeff6c934": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"da3943a1533d48339cc99add56f296ec": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "FloatProgressModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ProgressView",
"bar_style": "success",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_b01c55a604c741d3838d98d412f6098e",
"max": 50,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_99446b25af0a41efb78e8347a0468bc5",
"value": 50
}
},
"ef2b2ce93832431aac24fdb8dcbaf7f2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ProgressStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"bar_color": null,
"description_width": ""
}
}
}
}
},
"nbformat": 4,
"nbformat_minor": 1
}