Last active
December 9, 2024 10:19
-
-
Save raimonizard/60abb6bdf76c8b3157e9632b212f4977 to your computer and use it in GitHub Desktop.
machine_learning_intro.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "provenance": [], | |
| "toc_visible": true, | |
| "include_colab_link": true | |
| }, | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3" | |
| }, | |
| "language_info": { | |
| "name": "python" | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/raimonizard/60abb6bdf76c8b3157e9632b212f4977/machine_learning_intro.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "# About" | |
| ], | |
| "metadata": { | |
| "id": "l1uWVK2uWpLS" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "An exemple in order to work with the basics of **Machine Learning (ML)** with Python.\n" | |
| ], | |
| "metadata": { | |
| "id": "UtWQe9dgRrcd" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "# Theory" | |
| ], | |
| "metadata": { | |
| "id": "BmKwwiIsl6mN" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Machine Learning" | |
| ], | |
| "metadata": { | |
| "id": "Kqtnfo5B4c49" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "**Machine Learning** is making **the computer learn** from studying data and statistics.\n", | |
| "\n", | |
| "Machine Learning is a step into the direction of **artificial intelligence** (AI).\n", | |
| "\n", | |
| "Machine Learning is a program that analyses data and learns to **predict the outcome**." | |
| ], | |
| "metadata": { | |
| "id": "0SOGlkSA4hiN" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Data Set" | |
| ], | |
| "metadata": { | |
| "id": "4njstV_h5Ob7" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "In the mind of a computer, a data set is any collection of data. It can be anything from an array to a complete database." | |
| ], | |
| "metadata": { | |
| "id": "0MsgaooA5R8m" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Mean, Median and Mode" | |
| ], | |
| "metadata": { | |
| "id": "O2j0DD4y5XwP" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "In Machine Learning (and in mathematics) there are often three values that interests us:\n", | |
| "\n", | |
| "- **Mean**: The average value.\n", | |
| "- **Median**: The mid point value after sorting the array. If there are two numbers in the middle, divide the sum of those numbers by two.\n", | |
| "- **Mode**: The most common value (the one which appears more times)." | |
| ], | |
| "metadata": { | |
| "id": "fLwheQwM5Z_M" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import numpy as np\n", | |
| "from scipy import stats as st\n", | |
| "import random\n", | |
| "\n", | |
| "# Use random.choices to select k elements within a range with the chance of repeating values\n", | |
| "# Used range(1, 220, 1) means values from min = 1 to max = 220 with 1 step between values.\n", | |
| "# So values in (1, 2, 3, 4, ..., 220)\n", | |
| "# [Source](https://pynative.com/python-random-sample/)\n", | |
| "speed2 = random.choices(range(1, 220, 1), k = 15)\n", | |
| "\n", | |
| "print(speed2)\n", | |
| "\n", | |
| "mean = np.mean(speed2)\n", | |
| "median = np.median(speed2)\n", | |
| "\n", | |
| "# Note that for mode() we use scipy.stats library instead of numpy:\n", | |
| "mode = st.mode(speed2)\n", | |
| "\n", | |
| "print('Mean: ', mean, ' Median: ', median, ' Mode: ', mode)" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "Z8Wutgwc5pW3", | |
| "outputId": "98dada64-0ed8-4985-ac87-a21967d87450" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "[169, 2, 7, 11, 73, 130, 68, 75, 8, 65, 51, 139, 145, 55, 194]\n", | |
| "Mean: 79.46666666666667 Median: 68.0 Mode: ModeResult(mode=2, count=1)\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Standard Deviation σ" | |
| ], | |
| "metadata": { | |
| "id": "EbNk337K_kli" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "**Standard deviation** is a number that describes **how spread out the values are**.\n", | |
| "\n", | |
| "The standard deviation uses the same data unit as the values inside the dataset.\n", | |
| "\n", | |
| "- A **low standard deviation** means that **most of the numbers** are **close to** the **mean** (average) value.\n", | |
| "\n", | |
| "- A **high standard deviation** means that the **values are spread out** over a wider range." | |
| ], | |
| "metadata": { | |
| "id": "kK8DZtm9_oVA" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import pandas as pd\n", | |
| "speed = random.choices(range(0, 220, 1), k = 400)\n", | |
| "print(pd.DataFrame({ 'speed' : speed }))\n", | |
| "\n", | |
| "mean = np.mean(speed)\n", | |
| "print(mean)\n", | |
| "\n", | |
| "standard_deviation = np.std(speed)\n", | |
| "print(standard_deviation)" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "6ZHj_UuQAMCp", | |
| "outputId": "ac385e11-b27d-4033-e14e-bd617b0488f0" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| " speed\n", | |
| "0 13\n", | |
| "1 21\n", | |
| "2 36\n", | |
| "3 147\n", | |
| "4 37\n", | |
| ".. ...\n", | |
| "395 40\n", | |
| "396 149\n", | |
| "397 100\n", | |
| "398 188\n", | |
| "399 116\n", | |
| "\n", | |
| "[400 rows x 1 columns]\n", | |
| "107.84\n", | |
| "61.76649091538226\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Variance σ^2" | |
| ], | |
| "metadata": { | |
| "id": "2zoiwAHzCCH2" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "**Variance** is **another number** that **indicates how spread out** the values are.\n", | |
| "\n", | |
| "In fact, if you take the square root of the variance, you get the standard deviation!\n", | |
| "\n", | |
| "Or the other way around, if you multiply the standard deviation by itself, you get the variance!" | |
| ], | |
| "metadata": { | |
| "id": "OG6BuunUCD4I" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "To calculate the variance you have to do as follows:\n", | |
| "\n", | |
| "1. Find the mean:\n", | |
| "\n", | |
| "(32+111+138+28+59+77+97) / 7 = 77.4\n", | |
| "\n", | |
| "2. For each value: find the difference from the mean:\n", | |
| "\n", | |
| " 32 - 77.4 = -45.4\n", | |
| "\n", | |
| " 111 - 77.4 = 33.6\n", | |
| "\n", | |
| " 138 - 77.4 = 60.6\n", | |
| "\n", | |
| " 28 - 77.4 = -49.4\n", | |
| "\n", | |
| " 59 - 77.4 = -18.4\n", | |
| "\n", | |
| " 77 - 77.4 = - 0.4\n", | |
| "\n", | |
| " 97 - 77.4 = 19.6\n", | |
| "\n", | |
| "3. For each difference: find the square value:\n", | |
| "\n", | |
| " (-45.4)^2 = 2061.16\n", | |
| " \n", | |
| " (33.6)^2 = 1128.96\n", | |
| " \n", | |
| " (60.6)^2 = 3672.36\n", | |
| " \n", | |
| " (-49.4)^2 = 2440.36\n", | |
| " \n", | |
| " (-18.4)^2 = 338.56\n", | |
| " \n", | |
| " (- 0.4)^2 = 0.16\n", | |
| " \n", | |
| " (19.6)^2 = 384.16\n", | |
| "\n", | |
| "4. The variance is the average number of these squared differences:\n", | |
| "\n", | |
| " (2061.16 + 1128.96 + 3672.36 + 2440.36 + 338.56 + 0.16 + 384.16) / 7 = 1432.2" | |
| ], | |
| "metadata": { | |
| "id": "Ko6JW-pDCdnr" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import numpy\n", | |
| "\n", | |
| "speed = [32,111,138,28,59,77,97]\n", | |
| "\n", | |
| "x = numpy.var(speed)\n", | |
| "\n", | |
| "print(x)" | |
| ], | |
| "metadata": { | |
| "id": "hEGW-kIdDCPf", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "8b5e98ed-7dff-4aa1-a73f-f03b83a16a86" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "1432.2448979591834\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Percentiles" | |
| ], | |
| "metadata": { | |
| "id": "595_JdAkDp4n" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Percentiles are used in statistics to give you a number that describes the value that a given percent of the values are lower than." | |
| ], | |
| "metadata": { | |
| "id": "ECrBHph4DsAU" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "ages = random.choices(range(0, 100, 1), k = 100)\n", | |
| "print(ages)\n", | |
| "\n", | |
| "# Sort the values of ages list ordered from small to bigger\n", | |
| "ages.sort()\n", | |
| "print(ages)\n", | |
| "\n", | |
| "# Find the age value from which the 50% of the population is equal or younger\n", | |
| "print(np.percentile(ages, 50))\n", | |
| "\n", | |
| "# Fint the the top 10% younger age:\n", | |
| "print(np.percentile(ages, 10))" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "eKmUHYveD193", | |
| "outputId": "496fd273-aac1-4270-b9c2-a633f984e36d" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "[51, 55, 3, 35, 78, 89, 41, 18, 23, 37, 75, 31, 29, 20, 98, 97, 11, 91, 92, 69, 16, 50, 77, 45, 23, 58, 58, 99, 49, 49, 55, 82, 98, 59, 38, 48, 39, 17, 47, 94, 78, 26, 57, 66, 39, 5, 9, 20, 98, 45, 89, 60, 2, 78, 11, 99, 87, 12, 21, 37, 71, 84, 22, 85, 75, 72, 28, 36, 25, 0, 45, 98, 90, 8, 25, 67, 46, 89, 29, 95, 6, 34, 78, 75, 60, 19, 99, 17, 2, 76, 31, 36, 65, 1, 71, 63, 11, 90, 52, 49]\n", | |
| "[0, 1, 2, 2, 3, 5, 6, 8, 9, 11, 11, 11, 12, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 25, 25, 26, 28, 29, 29, 31, 31, 34, 35, 36, 36, 37, 37, 38, 39, 39, 41, 45, 45, 45, 46, 47, 48, 49, 49, 49, 50, 51, 52, 55, 55, 57, 58, 58, 59, 60, 60, 63, 65, 66, 67, 69, 71, 71, 72, 75, 75, 75, 76, 77, 78, 78, 78, 78, 82, 84, 85, 87, 89, 89, 89, 90, 90, 91, 92, 94, 95, 97, 98, 98, 98, 98, 99, 99, 99]\n", | |
| "49.0\n", | |
| "11.0\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Data Distribution: Histogram" | |
| ], | |
| "metadata": { | |
| "id": "HBzCsi8JG2l7" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "To visualize the **data distribution** set we can draw a **histogram** with the data we collected.\n", | |
| "\n", | |
| "We will use the Python module **Matplotlib** to draw a histogram.\n", | |
| "\n", | |
| "The **histogram** graph is a **two axis bar diagram**.\n", | |
| "\n", | |
| "- The x-axis: contains ordered values form the dataset.\n", | |
| "- The y-axis: contains the count of elements inside the dataset which have its value inside each x-axis value.\n", | |
| "\n", | |
| "The histogram will have multiple vertical bars.\n", | |
| "\n", | |
| "It might be interesting to check out the standard deviation of the data in order to know how many bars to be used in the histogram.\n", | |
| "\n", | |
| "As more bars, more detailed information about the data distribution.\n" | |
| ], | |
| "metadata": { | |
| "id": "nokQI-r8G6_R" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Example 1 with 400 integer pseudorandom values between 0 and 1000:\n", | |
| "dataset = random.choices(range(0, 1000, 1), k = 400)\n", | |
| "dataset.sort()\n", | |
| "\n", | |
| "print(type(dataset))\n", | |
| "print(dataset)\n", | |
| "\n", | |
| "# matplotlib.pyplot.hist returns 3 arguments (counts, edges, bars)\n", | |
| "# Calling the function plt.hist(dataset, number_of_bars) generates the graph\n", | |
| "# and we can also get the output arguments to be used later for the bar_label\n", | |
| "counts, edges, bars = plt.hist(dataset, 20)\n", | |
| "plt.bar_label(bars)\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "O6iw4QrTIcZh", | |
| "outputId": "b83832b4-46c6-45b4-8a23-8d8117966dec" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "<class 'list'>\n", | |
| "[2, 6, 7, 8, 11, 13, 15, 17, 20, 23, 23, 24, 26, 28, 29, 32, 35, 36, 39, 45, 47, 52, 52, 54, 58, 60, 60, 65, 66, 69, 69, 72, 73, 78, 82, 82, 88, 90, 91, 92, 93, 93, 97, 99, 101, 107, 111, 111, 113, 114, 115, 119, 120, 126, 129, 131, 138, 140, 143, 143, 145, 145, 146, 149, 156, 161, 164, 165, 168, 169, 180, 180, 184, 185, 186, 188, 188, 190, 191, 198, 204, 207, 209, 216, 217, 218, 218, 223, 227, 231, 233, 234, 241, 244, 245, 246, 247, 250, 255, 256, 259, 264, 268, 268, 274, 280, 283, 288, 291, 297, 299, 300, 301, 301, 306, 312, 317, 317, 317, 322, 324, 327, 329, 339, 345, 348, 361, 361, 366, 366, 367, 372, 373, 375, 376, 377, 379, 379, 380, 383, 385, 388, 391, 392, 393, 398, 399, 400, 401, 401, 401, 403, 405, 406, 407, 408, 408, 408, 410, 411, 413, 414, 416, 421, 424, 425, 435, 438, 438, 439, 440, 441, 442, 450, 452, 459, 460, 462, 463, 471, 474, 477, 478, 482, 492, 492, 494, 495, 498, 498, 498, 501, 502, 507, 509, 516, 523, 524, 524, 527, 530, 531, 531, 531, 532, 533, 535, 540, 542, 542, 542, 544, 544, 547, 548, 555, 557, 558, 559, 559, 562, 567, 568, 568, 570, 572, 575, 580, 588, 593, 597, 597, 598, 598, 600, 602, 602, 603, 604, 607, 607, 608, 609, 616, 617, 618, 620, 626, 632, 635, 637, 638, 642, 648, 649, 650, 653, 655, 659, 661, 664, 666, 671, 673, 678, 681, 685, 691, 694, 697, 697, 701, 705, 707, 711, 711, 711, 713, 714, 714, 717, 718, 721, 721, 723, 725, 725, 726, 735, 738, 739, 741, 746, 747, 751, 751, 751, 752, 761, 762, 763, 765, 765, 766, 769, 773, 775, 778, 780, 780, 783, 787, 788, 791, 793, 793, 795, 798, 799, 802, 803, 803, 804, 805, 806, 814, 820, 823, 824, 825, 825, 828, 829, 829, 830, 831, 833, 835, 835, 836, 837, 839, 843, 845, 845, 847, 852, 852, 858, 860, 862, 865, 865, 872, 873, 873, 877, 879, 881, 884, 890, 891, 892, 892, 900, 900, 902, 902, 914, 916, 925, 931, 934, 935, 937, 940, 941, 942, 944, 944, 951, 951, 952, 959, 962, 966, 966, 972, 980, 981, 982, 985, 986, 986, 989, 991, 992, 996, 998, 998]\n" | |
| ] | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ], | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsB0lEQVR4nO3df3BU5b3H8c9CSAiSLAZIltQEIiCoICIgghixZgKBq0SZqjRSQCvaG0TAokSr4lhvkFqLdRDaTgW9iqFWAogWjfxIZCQgkajxR/ghXFBJqGKyECQg+9w/vOx1IZIEdp/N7r5fMzvjnvNw9pvn5Jx8POfZ8ziMMUYAAACWtAp2AQAAILIQPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYFRXsAk7m8Xj01VdfKS4uTg6HI9jlAACAJjDG6ODBg0pOTlarVqe/ttHiwsdXX32llJSUYJcBAADOwN69e3Xeeeedtk2LCx9xcXGSfig+Pj4+yNUAAICmcLvdSklJ8f4dP50WFz5O3GqJj48nfAAAEGKaMmSCAacAAMAqwgcAALCK8AEAaJHy8/M1aNAgxcXFKTExUdnZ2aqsrPRpU1VVpfHjx8vlcumcc87RZZddpldffTVIFaOpCB8AgBapuLhYubm5Ki0tVVFRkY4dO6bMzEzV1dV52/zqV79SZWWlVq5cqY8++kg33nijbrrpJm3dujWIlaMxDmOMCXYRP+Z2u+V0OlVbW8uAUwCA17///W8lJiaquLhY6enpkqT27dtrwYIFGj9+vLddx44d9cQTT+jXv/51sEqNSM35+82VDwBASKitrZUkJSQkeJcNHTpUS5cu1YEDB+TxeFRQUKAjR45o+PDhQaoSTdHivmoLAMDJPB6Ppk2bpiuvvFJ9+vTxLv/HP/6hm2++WR07dlRUVJTatWunwsJC9ejRI4jVojGEDwBAi5ebm6uKigpt2LDBZ/lDDz2kmpoavf322+rUqZOWL1+um266Se+884769u0bpGrRGMZ8AABatClTpmjFihUqKSlRWlqad/nOnTvVo0cPVVRU6OKLL/Yuz8jIUI8ePbRw4cJglBuxmvP3mysfAIAWyRiju+++W4WFhVq/fr1P8JCkw4cPS9Ipk5i1bt1aHo/HWp1oPsIHAKBFys3N1ZIlS7RixQrFxcWpqqpKkuR0OhUbG6vevXurR48euvPOO/Xkk0+qY8eOWr58uYqKirRq1aogV4/T4bYLAKBF+qk5QhYtWqSJEydKkrZv365Zs2Zpw4YNOnTokHr06KHf/va3Pl+9hR3N+ftN+AAAAGeN53wAAIAWizEfAIAWo9us1wOy3d1zRgdkuzgzXPkAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAwkh+fr4GDRqkuLg4JSYmKjs7W5WVlae027hxo37+85/rnHPOUXx8vNLT0/Xdd98FoWIAkYjwAYSR4uJi5ebmqrS0VEVFRTp27JgyMzNVV1fnbbNx40aNHDlSmZmZ2rx5s9577z1NmTJFrVpxOgBgR1SwCwDgP6tXr/Z5v3jxYiUmJqqsrEzp6emSpOnTp2vq1KmaNWuWt12vXr2s1gkgsvG/OkAYq62tlSQlJCRIkvbv369NmzYpMTFRQ4cOVVJSkq6++mpt2LAhmGUCiDCEDyBMeTweTZs2TVdeeaX69OkjSfr8888lSbNnz9Ydd9yh1atX67LLLtO1116r7du3B7NcABGE8AGEqdzcXFVUVKigoMC7zOPxSJLuvPNOTZo0Sf3799ef/vQn9erVS88991ywSgUQYRjzAYShKVOmaNWqVSopKdF5553nXd6lSxdJ0kUXXeTT/sILL9SePXus1gggcnHlAwgjxhhNmTJFhYWFWrt2rdLS0nzWd+vWTcnJyad8/Xbbtm3q2rWrzVIBRDCufABhJDc3V0uWLNGKFSsUFxenqqoqSZLT6VRsbKwcDodmzpypRx55RP369dOll16q559/Xp999pn++c9/Brl6AJGC8AGEkQULFkiShg8f7rN80aJFmjhxoiRp2rRpOnLkiKZPn64DBw6oX79+KioqUvfu3S1XCyBSET6AMGKMaVK7WbNm+TznAwBsYswHAACwiisfQAjrNuv1gG1795zRAds2gMjGlQ8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVc0KH/n5+Ro0aJDi4uKUmJio7OzsU2bHHD58uBwOh8/rrrvu8mvRAAAgdDUrfBQXFys3N1elpaUqKirSsWPHlJmZqbq6Op92d9xxh/bt2+d9zZ07169FAwCA0NWsx6uvXr3a5/3ixYuVmJiosrIypaene5e3a9dOLpfLPxUCAICwclZjPmprayVJCQkJPstfeuklderUSX369FFeXp4OHz78k9uor6+X2+32eQEAgPB1xuHD4/Fo2rRpuvLKK9WnTx/v8l/+8pd68cUXtW7dOuXl5em///u/deutt/7kdvLz8+V0Or2vlJSUMy2pRWnK+JgTjDHKysqSw+HQ8uXL7RYKBBnHSuhjH6K5zjh85ObmqqKiQgUFBT7LJ0+erBEjRqhv377KycnRCy+8oMLCQu3cubPB7eTl5am2ttb72rt375mW1KI0dXyMJM2bN08OhyMIVQLBx7ES+tiHaK5mjfk4YcqUKVq1apVKSkp03nnnnbbt4MGDJUk7duxQ9+7dT1kfExOjmJiYMymjRWvq+Jjy8nL98Y9/1JYtW9SlSxfbZQJBx7ES+tiHaK5mhQ9jjO6++24VFhZq/fr1SktLa/TflJeXS1LE/6I1ND7m8OHD+uUvf6n58+czQBf4PxwroY99iMY0K3zk5uZqyZIlWrFiheLi4lRVVSVJcjqdio2N1c6dO7VkyRKNGjVKHTt21Icffqjp06crPT1dl1xySUB+gFDwU+Njpk+frqFDh2rMmDFBrA5oOThWQh/7EE3RrPCxYMECST88SOzHFi1apIkTJyo6Olpvv/225s2bp7q6OqWkpGjs2LH63e9+57eCQ9GJ8TEbNmzwLlu5cqXWrl2rrVu3BrEyoGXhWAl97EM0RbNvu5xOSkqKiouLz6qgcPNT42PWrl2rnTt3qkOHDj7tx44dq6uuukrr16+3WygQZBwroY99iKZymMYShWVut1tOp1O1tbWKj48Pdjln7OTxMT179vRZX1VVpa+//tpnWd++ffX000/ruuuua9J4GqDbrNcDtu3dc0YHbNs/xrES+vy5DwP1O23r9zmSNefv9xl92wWNa2x8jMvlanDQVWpqKidTRBSOldDHPkRzMattgCxYsEC1tbUaPny4unTp4n0tXbo02KUBLQrHSuhjH6K5uPIRIGdyN6uF3QEDrOBYCX3sQzQXVz4AAIBVhA8AiABNmX/lzjvvVPfu3RUbG6vOnTtrzJgx+uyzz4JUMcIZt138JBy+dQDYwLESHCfmXxk0aJC+//57PfDAA8rMzNQnn3yic845R5I0YMAA5eTkKDU1VQcOHNDs2bOVmZmpXbt2qXXr1t5tBXIfIjIQPgAgAjRl/pXJkyd713fr1k2///3v1a9fP+3evbvBubmAM8VtFwCIQA3Nv/JjdXV1WrRokdLS0pSSkmKzNEQAwgcARJifmn9Fkp599lm1b99e7du317/+9S8VFRUpOjo6SJUiXBE+ACDCnJh/paCg4JR1OTk52rp1q4qLi3XBBRfopptu0pEjR4JQJcIZYz4AIIL81PwrJzidTjmdTvXs2VNXXHGFzj33XBUWFmrcuHFBqBbhivABABHg5PlXmvJYc2OMjDGqr6+3UCEiCeEDACJAY/OvfP7551q6dKkyMzPVuXNnffHFF5ozZ45iY2M1atSoIFePcMOYDwCIAI3Nv9K2bVu98847GjVqlHr06KGbb75ZcXFxevfdd5WYmBjk6hFuuPIBABGgsblUkpOT9cYbb1iqBpGOKx8AAMAqwgcAALCK2y6AZfn5+Vq2bJk+++wzxcbGaujQoXriiSfUq1cvSdKBAwf0yCOP6K233tKePXvUuXNnZWdn67HHHpPT6Qxy9QglzMGCloorH4BlJyb4Ki0tVVFRkY4dO6bMzEzV1dVJkr766it99dVXevLJJ1VRUaHFixdr9erVuv3224NcOQD4B1c+AMsam+CrT58+evXVV73ru3fvrscff1y33nqrvv/+e0VFcdgCCG1c+QCCrLEJvk60iY+PJ3gACAuEDyCITjfB1wlff/21HnvsMZ/pzgEglPG/UUAQnZjga8OGDQ2ud7vdGj16tC666CLNnj3bbnEAECCEDyBIGpvg6+DBgxo5cqTi4uJUWFioNm3aBKFKAPA/brsAlhljNGXKFBUWFmrt2rUNTvDldruVmZmp6OhorVy5Um3btg1CpQAQGFz5ACxrbIKvE8Hj8OHDevHFF+V2u+V2uyVJnTt3VuvWrYNZPgCcNcIHYNmCBQskScOHD/dZvmjRIk2cOFHvv/++Nm3aJEnq0aOHT5tdu3apW7duNsoEgIAhfACWNTbB1/DhwxttAwChjDEfAADAKsIHAACwKqJvuzQ2wZck/fWvf9WSJUv0/vvv6+DBg/r222/VoUOH4BWNkMQEX+GFcwdwdiL6ykdjE3xJ0uHDhzVy5Eg98MADQawUQEvCuQM4OxF95aOxCb4kadq0aZKk9evXW64OQEvFuQM4OxF95eNkTZngCwBOxrkDaB7Cx/9pygRfAHAyzh1A80X0bZcfa2yCLwBoCOcOoPkIH2p8gi8AaAjnDuDMRHT4MMbo7rvvVmFhodavX9/gBF8AcDLOHcDZiejw0dgEX5JUVVWlqqoq7dixQ5L00UcfKS4uTqmpqQwuAyIU5w7g7ET0gNMFCxaotrZWw4cPV5cuXbyvpUuXetssXLhQ/fv31x133CFJSk9PV//+/bVy5cpglQ0gyDh3AGcnoq98NGXyrtmzZ2v27NmBLwZAyODcAZydiL7yAQAA7Iu4Kx/MsQGguQJ53tg9Z3TAto3w0pQ5hY4cOaJ7771XBQUFqq+v14gRI/Tss88qKSkpiJWfiisfAACEgKbMKTR9+nS99tpreuWVV1RcXKyvvvpKN954YxCrbljEXfkAACAUNTanUG1trf7+979ryZIl+vnPfy5JWrRokS688EKVlpbqiiuuCEbZDeLKBwAAIejkOYXKysp07NgxZWRkeNv07t1bqamp2rhxY1Bq/CmEDwAAQkxDcwpVVVUpOjpaHTp08GmblJTkfRZNS8FtFwAAQkyozynElQ8AAELIiTmF1q1b5zOnkMvl0tGjR1VTU+PTvrq6Wi6Xy3KVp0f4AAAgBBhjNGXKFBUWFmrt2rWnzCk0YMAAtWnTRmvWrPEuq6ys1J49ezRkyBDb5Z4Wt10AAAgBjc0p5HQ6dfvtt2vGjBlKSEhQfHy87r77bg0ZMqRFfdNFauaVj/z8fA0aNEhxcXFKTExUdna2KisrfdocOXJEubm56tixo9q3b6+xY8equrrar0UDABBpmjKn0J/+9Cf9x3/8h8aOHav09HS5XC4tW7YsiFU3rFnhI5wecAIAQCgxxjT4mjhxordN27ZtNX/+fB04cEB1dXVatmxZixvvITXztks4PeAEAAAEx1kNOPXHA07q6+vldrt9XgAAIHyd8YBTfz3gJD8/X48++uiZlhGRSkpK9Ic//EFlZWXat2+fCgsLlZ2d7V1fXV2t+++/X2+99ZZqamqUnp6uZ555Rj179gxe0UAQcKwglIXzhIZnfOXjxANOCgoKzqqAvLw81dbWel979+49q+1Fgrq6OvXr10/z588/ZZ0xRtnZ2fr888+1YsUKbd26VV27dlVGRobP2BwgEnCsAC3TGV35OPGAk5KSkp98wMmPr36c7gEnMTExiomJOZMyIlZWVpaysrIaXLd9+3aVlpaqoqJCF198saQfRki7XC69/PLL+vWvf22zVCCoOFaAlqlZVz7C6QEn4aq+vl7SDyOeT2jVqpViYmJC9jG8QCBwrADB06zwkZubqxdffFFLlizxPuCkqqpK3333nST5POBk3bp1Kisr06RJk1rkA07C1YkBvnl5efr222919OhRPfHEE/riiy+0b9++YJcHtBgcK0DwNCt8hNMDTsJVmzZttGzZMm3btk0JCQlq166d1q1bp6ysLLVqxdP0gRM4VoDgadaYD2NMo21OPOCkoQFesGPAgAEqLy9XbW2tjh49qs6dO2vw4MEaOHBgsEsDWhSOFSA4iPdhzOl0qnPnztq+fbu2bNmiMWPGBLskoEXiWAHsYmK5EHTo0CHt2LHD+37Xrl0qLy9XQkKCUlNT9corr6hz585KTU3VRx99pHvuuUfZ2dnKzMwMYtWAfRwrQMtE+AhBW7Zs0TXXXON9P2PGDEnShAkTtHjxYu3bt08zZsxQdXW1unTpol/96ld66KGHglUuEDQcK0DLRPgIQcOHDz/t+JupU6dq6tSpFisCWiaOFaBlYswHAACwiisfISAcnu/f2Bwbhw4d0qxZs7R8+XJ98803SktL09SpU3XXXXdZqQ/hIZDHCsIL56Tg4soHrDjdHBvSD/fiV69erRdffFGffvqppk2bpilTpmjlypWWKwUQCTgnBRdXPmDF6ebYkKR3331XEyZM0PDhwyVJkydP1l/+8hdt3rxZ119/vaUqAUQKzknBxZUPtAhDhw7VypUr9eWXX8oYo3Xr1mnbtm185RFAUHBOCiyufKBFeOaZZzR58mSdd955ioqKUqtWrfS3v/1N6enpwS4NQATinBRYhA+0CM8884xKS0u1cuVKde3aVSUlJcrNzVVycrIyMjKCXR6ACMM5KbAIHwi67777Tg888IAKCws1evQP37655JJLVF5erieffJIDHYBVnJMCjzEfCLpjx47p2LFjp8wk2rp1a3k8niBVBSBScU4KPK58wIrG5ti4+uqrNXPmTMXGxqpr164qLi7WCy+8oKeeeiqIVQMIV5yTgovwASsam2OjoKBAeXl5ysnJ0YEDB9S1a1c9/vjjPNAHQEBwTgouwgesaGyODZfLpUWLFlmsCEAk45wUXIz5AAAAVhE+AACAVdx2QUCEw2R48NXYRFwOh6PBfzd37lzNnDnTUpVAwzgntSxc+QDQJI1NxLVv3z6f13PPPSeHw6GxY8darhRAS8eVDwBN0thEXC6Xy+f9ihUrdM011+j8888PdGkAQgzhA4DfVVdX6/XXX9fzzz8f7FIAtEDcdgHgd88//7zi4uJ04403BrsUAC0Q4QOA3z333HPKyclR27Ztg10KgBaI2y4A/Oqdd95RZWWlli5dGuxSALRQXPkA4Fd///vfNWDAAPXr1y/YpQBoobjyAaBJGpuIS5LcbrdeeeUV/fGPfwxWmQBCAOEDQJM0NhGXJBUUFMgYo3HjxgWjRAAhgvABoEkam4hLkiZPnqzJkydbqghAqGLMBwAAsIrwAa+SkhJdd911Sk5OlsPh0PLly09p8+mnn+r666+X0+nUOeeco0GDBmnPnj32iwXCFMdh6GMfNo7bLvA6MXfHbbfd1uDDoXbu3Klhw4bp9ttv16OPPqr4+Hh9/PHHPMshTAVyIi78NI7D0Mc+bBzhA16Nzd3x4IMPatSoUZo7d653Wffu3W2UBkQMjsPQxz5sHLdd0CQej0evv/66LrjgAo0YMUKJiYkaPHhwg5cTAQQGx2HoYx/+gPCBJtm/f78OHTqkOXPmaOTIkXrrrbd0ww036MYbb1RxcXGwywMiAsdh6GMf/oDbLmgSj8cjSRozZoymT58uSbr00kv17rvvauHChbr66quDWR4QETgOQx/78Adc+UCTdOrUSVFRUbrooot8ll944YURNUIbCCaOw9DHPvwB4QNNEh0drUGDBqmystJn+bZt29S1a9cgVQVEFo7D0Mc+/AG3XeDV2NwdM2fO1M0336z09HRdc801Wr16tV577TWtX78+eEUDYYbjMPSxDxtH+IBXY3N33HDDDVq4cKHy8/M1depU9erVS6+++qqGDRsWrJKBsMNxGPrYh40jfMCrKXN33HbbbbrtttssVQREHo7D0Mc+bBxjPgAAgFWEDwAAYBW3XSIc83cAwcUxGPrYh83HlQ8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVc0OHyUlJbruuuuUnJwsh8Oh5cuX+6yfOHGiHA6Hz2vkyJH+qhcAAIS4ZoePuro69evXT/Pnz//JNiNHjtS+ffu8r5dffvmsigQAAOGj2Y9Xz8rKUlZW1mnbxMTEyOVynXFRAAAgfAVkzMf69euVmJioXr166Te/+Y2++eabn2xbX18vt9vt8wIAAOHL7+Fj5MiReuGFF7RmzRo98cQTKi4uVlZWlo4fP95g+/z8fDmdTu8rJSXF3yUhzDU2DunH7rrrLjkcDs2bNy9o2wWASOf38HHLLbfo+uuvV9++fZWdna1Vq1bpvffe0/r16xtsn5eXp9raWu9r7969/i4JYa4p45AkqbCwUKWlpUpOTg7qdgEg0jV7zEdznX/++erUqZN27Niha6+99pT1MTExiomJCXQZCGNNGYf05Zdf6u6779abb76p0aNHB3W7ABDpAv6cjy+++ELffPONunTpEuiPAhrk8Xg0fvx4zZw5UxdffHGL3y4AhLtmX/k4dOiQduzY4X2/a9culZeXKyEhQQkJCXr00Uc1duxYuVwu7dy5U/fdd5969OihESNG+LVwoKmeeOIJRUVFaerUqSGxXQAId80OH1u2bNE111zjfT9jxgxJ0oQJE7RgwQJ9+OGHev7551VTU6Pk5GRlZmbqscce49YKgqKsrExPP/203n//fTkcjha/XQCIBM0OH8OHD5cx5ifXv/nmm2dVEOBP77zzjvbv36/U1FTvsuPHj+vee+/VvHnztHv37ha1XQCIBAEfcAoE0/jx45WRkeGzbMSIERo/frwmTZrU4rYLAJGA8IGQd7pxSKmpqerYsaNP+zZt2sjlcqlXr15B2S4ARDrCB0Le6cYhLV68uMVtFwAiHeEDIa+xcUgna+p4jEBtFwAiXcCf8wEAAPBjXPlAyOk26/VglwAAOAtc+QAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWNTt8lJSU6LrrrlNycrIcDoeWL1/us94Yo4cfflhdunRRbGysMjIytH37dn/VCwAAQlyzw0ddXZ369eun+fPnN7h+7ty5+vOf/6yFCxdq06ZNOuecczRixAgdOXLkrIsFAAChL6q5/yArK0tZWVkNrjPGaN68efrd736nMWPGSJJeeOEFJSUlafny5brlllvOrloAABDy/DrmY9euXaqqqlJGRoZ3mdPp1ODBg7Vx40Z/fhQAAAhRzb7ycTpVVVWSpKSkJJ/lSUlJ3nUnq6+vV319vfe92+32Z0kAAKCFCfq3XfLz8+V0Or2vlJSUYJcEAAACyK/hw+VySZKqq6t9lldXV3vXnSwvL0+1tbXe1969e/1ZEgAAaGH8Gj7S0tLkcrm0Zs0a7zK3261NmzZpyJAhDf6bmJgYxcfH+7wAAED4avaYj0OHDmnHjh3e97t27VJ5ebkSEhKUmpqqadOm6fe//7169uyptLQ0PfTQQ0pOTlZ2drY/6wYAACGq2eFjy5Ytuuaaa7zvZ8yYIUmaMGGCFi9erPvuu091dXWaPHmyampqNGzYMK1evVpt27b1X9UAACBkOYwxJthF/Jjb7ZbT6VRtbW1AbsF0m/W637cJAEAo2T1ntN+32Zy/30H/tgsAAIgshA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFb5PXzMnj1bDofD59W7d29/fwwAAAhRUYHY6MUXX6y33377/z8kKiAfAwAAQlBAUkFUVJRcLlcgNg0AAEJcQMZ8bN++XcnJyTr//POVk5OjPXv2/GTb+vp6ud1unxcAAAhffg8fgwcP1uLFi7V69WotWLBAu3bt0lVXXaWDBw822D4/P19Op9P7SklJ8XdJAACgBXEYY0wgP6CmpkZdu3bVU089pdtvv/2U9fX19aqvr/e+d7vdSklJUW1treLj4/1eT7dZr/t9mwAAhJLdc0b7fZtut1tOp7NJf78DPhK0Q4cOuuCCC7Rjx44G18fExCgmJibQZQAAgBYi4M/5OHTokHbu3KkuXboE+qMAAEAI8Hv4+O1vf6vi4mLt3r1b7777rm644Qa1bt1a48aN8/dHAQCAEOT32y5ffPGFxo0bp2+++UadO3fWsGHDVFpaqs6dO/v7owAAQAjye/goKCjw9yYBAEAYYW4XAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVAQsf8+fPV7du3dS2bVsNHjxYmzdvDtRHAQCAEBKQ8LF06VLNmDFDjzzyiN5//33169dPI0aM0P79+wPxcQAAIIQEJHw89dRTuuOOOzRp0iRddNFFWrhwodq1a6fnnnsuEB8HAABCSJS/N3j06FGVlZUpLy/Pu6xVq1bKyMjQxo0bT2lfX1+v+vp67/va2lpJktvt9ndpkiRP/eGAbBcAgFARiL+xJ7ZpjGm0rd/Dx9dff63jx48rKSnJZ3lSUpI+++yzU9rn5+fr0UcfPWV5SkqKv0sDAACSnPMCt+2DBw/K6XSeto3fw0dz5eXlacaMGd73Ho9HBw4cUMeOHeVwOPz2OW63WykpKdq7d6/i4+P9tl2cir62g362h762g362JxB9bYzRwYMHlZyc3Ghbv4ePTp06qXXr1qqurvZZXl1dLZfLdUr7mJgYxcTE+Czr0KGDv8vyio+P55faEvraDvrZHvraDvrZHn/3dWNXPE7w+4DT6OhoDRgwQGvWrPEu83g8WrNmjYYMGeLvjwMAACEmILddZsyYoQkTJmjgwIG6/PLLNW/ePNXV1WnSpEmB+DgAABBCAhI+br75Zv373//Www8/rKqqKl166aVavXr1KYNQbYqJidEjjzxyyi0e+B99bQf9bA99bQf9bE+w+9phmvKdGAAAAD9hbhcAAGAV4QMAAFhF+AAAAFYRPgAAgFURET7mz5+vbt26qW3btho8eLA2b94c7JJCSn5+vgYNGqS4uDglJiYqOztblZWVPm2OHDmi3NxcdezYUe3bt9fYsWNPedDcnj17NHr0aLVr106JiYmaOXOmvv/+e5s/SsiZM2eOHA6Hpk2b5l1GX/vHl19+qVtvvVUdO3ZUbGys+vbtqy1btnjXG2P08MMPq0uXLoqNjVVGRoa2b9/us40DBw4oJydH8fHx6tChg26//XYdOnTI9o/Soh0/flwPPfSQ0tLSFBsbq+7du+uxxx7zmf+Dvj4zJSUluu6665ScnCyHw6Hly5f7rPdXv3744Ye66qqr1LZtW6WkpGju3LlnX7wJcwUFBSY6Oto899xz5uOPPzZ33HGH6dChg6murg52aSFjxIgRZtGiRaaiosKUl5ebUaNGmdTUVHPo0CFvm7vuusukpKSYNWvWmC1btpgrrrjCDB061Lv++++/N3369DEZGRlm69at5o033jCdOnUyeXl5wfiRQsLmzZtNt27dzCWXXGLuuece73L6+uwdOHDAdO3a1UycONFs2rTJfP755+bNN980O3bs8LaZM2eOcTqdZvny5eaDDz4w119/vUlLSzPfffedt83IkSNNv379TGlpqXnnnXdMjx49zLhx44LxI7VYjz/+uOnYsaNZtWqV2bVrl3nllVdM+/btzdNPP+1tQ1+fmTfeeMM8+OCDZtmyZUaSKSws9Fnvj36tra01SUlJJicnx1RUVJiXX37ZxMbGmr/85S9nVXvYh4/LL7/c5Obmet8fP37cJCcnm/z8/CBWFdr2799vJJni4mJjjDE1NTWmTZs25pVXXvG2+fTTT40ks3HjRmPMDwdJq1atTFVVlbfNggULTHx8vKmvr7f7A4SAgwcPmp49e5qioiJz9dVXe8MHfe0f999/vxk2bNhPrvd4PMblcpk//OEP3mU1NTUmJibGvPzyy8YYYz755BMjybz33nveNv/617+Mw+EwX375ZeCKDzGjR482t912m8+yG2+80eTk5Bhj6Gt/OTl8+Ktfn332WXPuuef6nDvuv/9+06tXr7OqN6xvuxw9elRlZWXKyMjwLmvVqpUyMjK0cePGIFYW2mprayVJCQkJkqSysjIdO3bMp5979+6t1NRUbz9v3LhRffv29XnQ3IgRI+R2u/Xxxx9brD405ObmavTo0T59KtHX/rJy5UoNHDhQv/jFL5SYmKj+/fvrb3/7m3f9rl27VFVV5dPPTqdTgwcP9unnDh06aODAgd42GRkZatWqlTZt2mTvh2nhhg4dqjVr1mjbtm2SpA8++EAbNmxQVlaWJPo6UPzVrxs3blR6erqio6O9bUaMGKHKykp9++23Z1xf0Ge1DaSvv/5ax48fP+XJqklJSfrss8+CVFVo83g8mjZtmq688kr16dNHklRVVaXo6OhTJgRMSkpSVVWVt01D++HEOvy/goICvf/++3rvvfdOWUdf+8fnn3+uBQsWaMaMGXrggQf03nvvaerUqYqOjtaECRO8/dRQP/64nxMTE33WR0VFKSEhgX7+kVmzZsntdqt3795q3bq1jh8/rscff1w5OTmSRF8HiL/6taqqSmlpaads48S6c88994zqC+vwAf/Lzc1VRUWFNmzYEOxSwtLevXt1zz33qKioSG3btg12OWHL4/Fo4MCB+q//+i9JUv/+/VVRUaGFCxdqwoQJQa4uvPzjH//QSy+9pCVLlujiiy9WeXm5pk2bpuTkZPo6goX1bZdOnTqpdevWp3wToLq6Wi6XK0hVha4pU6Zo1apVWrdunc477zzvcpfLpaNHj6qmpsan/Y/72eVyNbgfTqzDD8rKyrR//35ddtllioqKUlRUlIqLi/XnP/9ZUVFRSkpKoq/9oEuXLrrooot8ll144YXas2ePpP/vp9OdO1wul/bv3++z/vvvv9eBAwfo5x+ZOXOmZs2apVtuuUV9+/bV+PHjNX36dOXn50uirwPFX/0aqPNJWIeP6OhoDRgwQGvWrPEu83g8WrNmjYYMGRLEykKLMUZTpkxRYWGh1q5de8oluAEDBqhNmzY+/VxZWak9e/Z4+3nIkCH66KOPfH7Ri4qKFB8ff8ofgUh27bXX6qOPPlJ5ebn3NXDgQOXk5Hj/m74+e1deeeUpXxfftm2bunbtKklKS0uTy+Xy6We3261Nmzb59HNNTY3Kysq8bdauXSuPx6PBgwdb+ClCw+HDh9Wqle+fmtatW8vj8UiirwPFX/06ZMgQlZSU6NixY942RUVF6tWr1xnfcpEUGV+1jYmJMYsXLzaffPKJmTx5sunQoYPPNwFwer/5zW+M0+k069evN/v27fO+Dh8+7G1z1113mdTUVLN27VqzZcsWM2TIEDNkyBDv+hNf/8zMzDTl5eVm9erVpnPnznz9swl+/G0XY+hrf9i8ebOJiooyjz/+uNm+fbt56aWXTLt27cyLL77obTNnzhzToUMHs2LFCvPhhx+aMWPGNPg1xf79+5tNmzaZDRs2mJ49e0b81z9PNmHCBPOzn/3M+1XbZcuWmU6dOpn77rvP24a+PjMHDx40W7duNVu3bjWSzFNPPWW2bt1q/ud//scY459+rampMUlJSWb8+PGmoqLCFBQUmHbt2vFV26Z45plnTGpqqomOjjaXX365KS0tDXZJIUVSg69FixZ523z33XfmP//zP825555r2rVrZ2644Qazb98+n+3s3r3bZGVlmdjYWNOpUydz7733mmPHjln+aULPyeGDvvaP1157zfTp08fExMSY3r17m7/+9a8+6z0ej3nooYdMUlKSiYmJMddee62prKz0afPNN9+YcePGmfbt25v4+HgzadIkc/DgQZs/RovndrvNPffcY1JTU03btm3N+eefbx588EGfr27S12dm3bp1DZ6bJ0yYYIzxX79+8MEHZtiwYSYmJsb87Gc/M3PmzDnr2h3G/OgxcwAAAAEW1mM+AABAy0P4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYNX/AnbuvKmZXk57AAAAAElFTkSuQmCC\n" | |
| }, | |
| "metadata": {} | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Example 2 with 400 float pseudorandom values from 0.0 to 100.0:\n", | |
| "dataset = np.random.uniform(0.0, 100.0, 400)\n", | |
| "dataset.sort()\n", | |
| "\n", | |
| "print(type(dataset))\n", | |
| "print(dataset)" | |
| ], | |
| "metadata": { | |
| "id": "ZNgm9g3dKqYY" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "counts, edges, bars = plt.hist(dataset, 10)\n", | |
| "plt.bar_label(bars)\n", | |
| "\n", | |
| "plt.show()\n" | |
| ], | |
| "metadata": { | |
| "id": "1OmUVDC-L5Ae" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Normal Data Distribution" | |
| ], | |
| "metadata": { | |
| "id": "tYZ6owkJQhqZ" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "In this chapter we will learn how to **create an array** where the **values are concentrated** **around a given value**.\n", | |
| "\n", | |
| "In probability theory this kind of data distribution is known as the **normal data distribution**, or the **Gaussian data distribution**, after the mathematician Carl Friedrich Gauss who came up with the formula of this data distribution.\n", | |
| "\n", | |
| "Normal data Distribution is commongly known with the term **nd**.\n", | |
| "\n", | |
| "**Note**: A normal distribution graph is also known as the bell curve because of it's characteristic shape of a bell." | |
| ], | |
| "metadata": { | |
| "id": "SdSzFfc-Qj6l" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# The instruction numpy.random.normal(center_value, standard_deviation, num elements)\n", | |
| "# generates a numpy.ndarray list with values around the median value = 5 with the standard deviation of 1.\n", | |
| "# Assuming that we created a normal distribution series, the 68% of the values of the ndarray will be between [4, 6]; because (5-1) = 4 and (5+1) = 6. Those values are called to be on one standard deviation\n", | |
| "# The 95% of the values will be between [3, 7] within two standard deviations (standard deviation value * 2).\n", | |
| "# The 99.73% of the values will be within three standard deviations values [2, 8].\n", | |
| "dataset_nd = np.random.normal(5.0, 1.0, 100000)\n", | |
| "print(type(dataset_nd))\n", | |
| "\n", | |
| "counts, edges, bars = plt.hist(dataset_nd, 20)\n", | |
| "plt.bar_label(bars)\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "0e3U47glRCO9" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Cars example with normal distribution" | |
| ], | |
| "metadata": { | |
| "id": "XJrOPcuIUztv" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Generate the two sets (cars age and cars speed)" | |
| ], | |
| "metadata": { | |
| "id": "AD3ztQOgaGGk" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import numpy as np\n", | |
| "\n", | |
| "cars_years_old = np.random.normal(5.0, 1.0, 1000)\n", | |
| "cars_speed = np.random.normal(50.0, 20.0, 1000)" | |
| ], | |
| "metadata": { | |
| "id": "H4hWXwBXaECS" | |
| }, | |
| "execution_count": 2, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Plot the datasets:" | |
| ], | |
| "metadata": { | |
| "id": "lK9_MDZcaLP1" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import matplotlib.pyplot as plt\n", | |
| "\n", | |
| "# Generate a scatter plot representing all the points\n", | |
| "plt.scatter(cars_years_old, cars_speed)\n", | |
| "\n", | |
| "# Add a title for the graph\n", | |
| "plt.title('Distribution of speed and age for cars', fontsize = 14)\n", | |
| "\n", | |
| "# Add labels for axis\n", | |
| "plt.xlabel('car age (years)', fontsize = 8, color = 'blue', fontweight = 'bold')\n", | |
| "plt.ylabel('car speed (kms/h)', fontsize = 8, color = 'blue', fontweight = 'bold')\n", | |
| "\n", | |
| "# Show a background grid\n", | |
| "plt.grid()\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "1MR16h7wU5Qs", | |
| "outputId": "3e11c175-9ba9-4dda-ea1c-293ea970f9cc", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 469 | |
| } | |
| }, | |
| "execution_count": 7, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ], | |
| "image/png": "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\n" | |
| }, | |
| "metadata": {} | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Check the mean and standard deviation of the generated sets:" | |
| ], | |
| "metadata": { | |
| "id": "KHBmU59vaNuv" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "mean_age = np.mean(cars_years_old)\n", | |
| "print('The cars age mean is: ', mean_age)\n", | |
| "\n", | |
| "standard_deviation_age = np.std(cars_years_old)\n", | |
| "print('The standard deviation for cars age is: ', standard_deviation_age)\n", | |
| "\n", | |
| "mean_speed = np.mean(cars_speed)\n", | |
| "print('The mean value for cars speed is: ', mean_speed)\n", | |
| "\n", | |
| "standard_deviation_speed = np.std(cars_speed)\n", | |
| "print('The std deviation for cars speed is: ', standard_deviation_speed)" | |
| ], | |
| "metadata": { | |
| "id": "vCch_xZPZvWL", | |
| "outputId": "5fefbc1d-4c9b-4ddd-f6ed-0f4cd5c2b268", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "execution_count": 8, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "The cars age mean is: 4.998381513061106\n", | |
| "The standard deviation for cars age is: 0.9892486206465505\n", | |
| "The mean value for cars speed is: 50.603779692796415\n", | |
| "The std deviation for cars speed is: 20.18948558606819\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## The mathematics line formula" | |
| ], | |
| "metadata": { | |
| "id": "4Bx1PIUTo5Mn" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "In mathematics, the line is represented as shown below:\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "Source [here](https://www.geogebra.org/m/WCbjCGDC)" | |
| ], | |
| "metadata": { | |
| "id": "uB_ge5ITl999" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Regression" | |
| ], | |
| "metadata": { | |
| "id": "pB4-27EFo-dq" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "The **term regression** is used when **you try to find the relationship between variables**.\n", | |
| "\n", | |
| "In Machine Learning, and in statistical modeling, **that relationship is used to predict the outcome of future events**.\n", | |
| "\n", | |
| "There are **different kinds of regression** to be used depending on the distribution of the data." | |
| ], | |
| "metadata": { | |
| "id": "pGhSmSJao_8_" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Linear Regression" | |
| ], | |
| "metadata": { | |
| "id": "01OHAB4ypE2w" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "The **linear regression** is the **straight line** which represents the relation among two variables.\n", | |
| "\n", | |
| "Linear regression uses the relationship between the data-points to draw a straight line through all them.\n", | |
| "\n", | |
| "This line can be used to predict future values.\n" | |
| ], | |
| "metadata": { | |
| "id": "er1V0L5mpnMo" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "" | |
| ], | |
| "metadata": { | |
| "id": "6VnEqxyArYA0" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Polynomial Regression" | |
| ], | |
| "metadata": { | |
| "id": "ZB7aadQ6qVdj" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "**If your data points** clearly **will not fit a linear regression** (a straight line through all data points), **it might be ideal** for **polynomial regression**.\n", | |
| "\n", | |
| "Polynomial regression, like linear regression, uses the relationship between the variables x and y to find the best way to draw a line through the data points." | |
| ], | |
| "metadata": { | |
| "id": "7SdEtGVTqX8J" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "" | |
| ], | |
| "metadata": { | |
| "id": "eSJa83uwq6Rs" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Multiple Regression" | |
| ], | |
| "metadata": { | |
| "id": "Bsb29UFj2vwb" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Multiple regression is like linear regression, but with more than one independent value, meaning that we try to **predict a value based on two or more variables**.\n", | |
| "\n", | |
| "We have a **result variable** that **we want to predict** in **function** of **two or more known variables**." | |
| ], | |
| "metadata": { | |
| "id": "cqQpTPLo2y-k" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "The multiple regression explains how two or more independent variables determine a dependent resulting variable.\n", | |
| "\n", | |
| "Those two or more independent variables can take part with different impact over the result variable. This is called the **coefficient factor**.\n", | |
| "\n", | |
| "With the independent variables' coefficients we can know what would happen over the dependent variable if we increse or decrease one of the independent variables.\n", | |
| "\n", | |
| "We can imagine the multiple regression model as a polynomical function with two or more variables multiplied by a factor.\n", | |
| "\n", | |
| "Something such as:\n", | |
| "dependent_variable = a·x + b·y + c·z ...\n", | |
| "\n", | |
| "Where a, b and c are numerical values." | |
| ], | |
| "metadata": { | |
| "id": "d7ghSgVvCtqQ" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Scale Features" | |
| ], | |
| "metadata": { | |
| "id": "lAZzfD399X3f" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "When your data has different values, and even different measurement units, it can be difficult to compare them. What is kilograms compared to meters? Or altitude compared to time?\n", | |
| "\n", | |
| "The answer to this problem is scaling. We can scale data into new values that are easier to compare." | |
| ], | |
| "metadata": { | |
| "id": "yiPXszql9au3" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "The standardization method uses this formula:\n", | |
| "\n", | |
| "z = (x - u) / s\n", | |
| "\n", | |
| "Where z is the new value, x is the original value, u is the mean and s is the standard deviation.\n", | |
| "\n", | |
| "If you take the weight column from the data set above, the first value is 790, and the scaled value will be:\n", | |
| "\n", | |
| " (790 - 1292.23) / 238.74 = -2.1\n", | |
| "\n", | |
| "If you take the volume column from the data set above, the first value is 1.0, and the scaled value will be:\n", | |
| "\n", | |
| " (1.0 - 1.61) / 0.38 = -1.59\n", | |
| "\n", | |
| "Now you can compare -2.1 with -1.59 instead of comparing 790 with 1.0.\n", | |
| "\n", | |
| "You do not have to do this manually, the Python **sklearn** module has a method called **StandardScaler()** which returns a Scaler object with methods for transforming data sets." | |
| ], | |
| "metadata": { | |
| "id": "lfc17ywo9oJQ" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "- It is necessary to import: **from sklearn.preprocessing import StandardScaler**\n", | |
| "\n", | |
| "- And use: **scale = StandardScaler()**" | |
| ], | |
| "metadata": { | |
| "id": "IenALSdE-Aqy" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "For more detail, click [here](https://www.w3schools.com/python/python_ml_scale.asp)" | |
| ], | |
| "metadata": { | |
| "id": "Y1MYOh4v90Oo" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "\n", | |
| "\n", | |
| "---\n", | |
| "\n" | |
| ], | |
| "metadata": { | |
| "id": "rErblYNRqOva" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "# Code examples" | |
| ], | |
| "metadata": { | |
| "id": "xf56O6BrbWgj" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Import libraries" | |
| ], | |
| "metadata": { | |
| "id": "CCPiKFWfWSRd" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": { | |
| "id": "tmTVCqCJRfg-" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import matplotlib.pyplot as plt\n", | |
| "from sklearn.linear_model import LinearRegression\n", | |
| "import pandas as pd\n", | |
| "from scipy import stats\n", | |
| "import random\n", | |
| "import numpy as np" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Diamonds example - Linear Regression" | |
| ], | |
| "metadata": { | |
| "id": "pjAK1WQOWA5i" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "For more info click [here](https://discovery.cs.illinois.edu/learn/Towards-Machine-Learning/Machine-Learning-Models-in-Python-with-sk-learn/)\n", | |
| "\n", | |
| "The variable **model** uses the column variables *carat* and *price* from the dataframe comming from the [diamonds file](https://waf.cs.illinois.edu/discovery/diamonds.csv)\n", | |
| "\n" | |
| ], | |
| "metadata": { | |
| "id": "cHa_GeDhXbQb" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Get the data" | |
| ], | |
| "metadata": { | |
| "id": "z_07li2mfFH5" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "diamonds_dataset = pd.read_csv(\"https://waf.cs.illinois.edu/discovery/diamonds.csv\")\n", | |
| "\n", | |
| "print(diamonds_dataset)" | |
| ], | |
| "metadata": { | |
| "id": "dTnVAIMxTvS_" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Train the model" | |
| ], | |
| "metadata": { | |
| "id": "ncCRdUBTe1o5" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "diamonds_model = LinearRegression().fit(diamonds_dataset[ ['carat'] ]\n", | |
| " , diamonds_dataset['price'])" | |
| ], | |
| "metadata": { | |
| "id": "dHTT1oZWe2oC" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Check the regression score" | |
| ], | |
| "metadata": { | |
| "id": "e2oBnrTlfW8j" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "diamonds_model.score(diamonds_dataset[ ['carat'] ]\n", | |
| " , diamonds_dataset['price'])" | |
| ], | |
| "metadata": { | |
| "id": "PxaJQb2RfZKp" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Test the model" | |
| ], | |
| "metadata": { | |
| "id": "aZS5WSkNtpsk" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "diamonds_test = pd.DataFrame({'carat' : np.arange(0.1, 5.1, 0.1)})\n", | |
| "\n", | |
| "# Add a new column called 'predicted_price' to the diamonds_test dataset\n", | |
| "diamonds_test['predicted_price'] = diamonds_model.predict(diamonds_test)\n" | |
| ], | |
| "metadata": { | |
| "id": "yttwNt66trxm" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Print the calculated results" | |
| ], | |
| "metadata": { | |
| "id": "pmt4RSUGuksk" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "print(diamonds_test)" | |
| ], | |
| "metadata": { | |
| "id": "FoZVr6C8ucyh" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Plot the actual data vs calculated data" | |
| ], | |
| "metadata": { | |
| "id": "jYVtE7GeunWV" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "plt.plot(diamonds_dataset['price']\n", | |
| " , diamonds_dataset['carat'])\n", | |
| "\n", | |
| "# To filter the values from a pandas.DataFrame:\n", | |
| "# dataframe[\n", | |
| "# dataframe['column_name'] < > = != value\n", | |
| "# ]\n", | |
| "# ['column_name_to_show']\n", | |
| "plt.plot(diamonds_test[diamonds_test['carat'] < 5]['predicted_price']\n", | |
| " , diamonds_test[diamonds_test['carat'] < 5]['carat'])\n", | |
| "\n", | |
| "plt.title('Price of the diamond in function of its weight')\n", | |
| "plt.xlabel('Diamond price (eur)')\n", | |
| "plt.ylabel('Diamond weight (carat)')\n", | |
| "\n", | |
| "plt.grid()\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "hDxgDTveuptc" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Car speed example - Linear Regression" | |
| ], | |
| "metadata": { | |
| "id": "PQ6SlyfN0nw3" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "The values of the python list **years_old** represent the age of the cars; the values of **speed* represent the velocity of the cars.\n", | |
| "\n", | |
| "The point here is to find the **Linear Regression** which represents the relation between the variables **years_old** and **speed**.\n", | |
| "\n", | |
| "The linear regression is used to determine one variable in function of another one.\n", | |
| "\n", | |
| "The values will be placed in the x-y axis.\n", | |
| "\n", | |
| "**cars** variable will be a pandas.DataFrame build from a python dictionary with two *keys* were each one will have a python list as a value inluding multiple values inside.\n", | |
| "\n" | |
| ], | |
| "metadata": { | |
| "id": "CIMzasjBYGUW" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "years_old = [5,7,8,7,2,17,2,9,4,11,12,9,6]\n", | |
| "speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]\n", | |
| "cars = pd.DataFrame({\n", | |
| " \"years_old\" : years_old\n", | |
| " , \"speed\" : speed\n", | |
| " })" | |
| ], | |
| "metadata": { | |
| "id": "vLRGSGW8SUqx" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "print(cars)" | |
| ], | |
| "metadata": { | |
| "id": "NMYtqKe8S6A5" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Prepare a plot from the columns *years_old* and *speed* from the DataFrame **cars**." | |
| ], | |
| "metadata": { | |
| "id": "_NKND0VsZ98l" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "plt.scatter(cars['years_old'], cars['speed'])\n", | |
| "\n", | |
| "plt.title('Cars age vs car speed')\n", | |
| "plt.xlabel('car age (years)')\n", | |
| "plt.ylabel('car speed (km/h)')\n", | |
| "\n", | |
| "plt.grid()\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "TPIKd49jVyZ5" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Train the model with sklearn" | |
| ], | |
| "metadata": { | |
| "id": "JZy8FofNzl1b" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Use the function **fit** from **sklearn.linear_model.LinearRegression** to train the model.\n", | |
| "\n", | |
| "In the current example, the variable **model_cars** will store the result of the trained model having the Linear Regression among *years_old* and *speed*." | |
| ], | |
| "metadata": { | |
| "id": "Qs1PLOxbab5U" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "model_cars = LinearRegression()\n", | |
| "model_cars = model_cars.fit(cars[ [\"years_old\"] ], cars[\"speed\"] )" | |
| ], | |
| "metadata": { | |
| "id": "tPFJbhJEabQQ" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Test the model" | |
| ], | |
| "metadata": { | |
| "id": "SnLqSkxxzrhq" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Use the function **predict** from **sklearn.linear_model.LinearRegression** to calculate the resulting **speed** for each value.\n", | |
| "\n", | |
| "In the current example, we create a new pandas.DataFrame with some values for the variable **years_old**.\n", | |
| "\n", | |
| "After that, we create a new column called **calc_speed** which will have the predicted speed value in function of the years of the car and responding to the calculated linear regression." | |
| ], | |
| "metadata": { | |
| "id": "wdDgO7z0jKqK" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "sample_data_cars = pd.DataFrame({\"years_old\" :\n", | |
| " [1, 3, 4, 5, 6, 7, 8, 9, 10, 20]})\n", | |
| "sample_data_cars[\"calc_speed\"] = model_cars.predict(sample_data_cars)" | |
| ], | |
| "metadata": { | |
| "id": "GWlmm8Zqc4YZ" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "print(sample_data_cars)" | |
| ], | |
| "metadata": { | |
| "id": "Sw4micwvhTDm" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "plt.plot(sample_data_cars[\"years_old\"], sample_data_cars[\"calc_speed\"])\n", | |
| "plt.scatter(sample_data_cars[\"years_old\"], sample_data_cars[\"calc_speed\"])\n", | |
| "\n", | |
| "plt.title('Linear Regression age vs speed')\n", | |
| "plt.xlabel('car age (years)')\n", | |
| "plt.ylabel('car speed (km/h)')\n", | |
| "plt.grid()\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "cF0nLcwHj2uS" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "plt.scatter(cars[\"years_old\"], cars[\"speed\"])\n", | |
| "plt.plot(sample_data_cars[\"years_old\"], sample_data_cars[\"calc_speed\"])\n", | |
| "\n", | |
| "plt.title('Actual values and Linear Regression')\n", | |
| "plt.xlabel('car age (years)')\n", | |
| "plt.ylabel('car speed (km/h)')\n", | |
| "plt.grid()\n", | |
| "\n", | |
| "plt.show()\n" | |
| ], | |
| "metadata": { | |
| "id": "gzH6Se2LkNXa" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Check the linear regression line formula" | |
| ], | |
| "metadata": { | |
| "id": "EMgMk-Y5x_0X" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Once we trained the model and obtained the linear regression, we can get the line formula as follows:" | |
| ], | |
| "metadata": { | |
| "id": "lAquYd8zy84l" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "m = model_cars.coef_\n", | |
| "b = model_cars.intercept_\n", | |
| "\n", | |
| "print('f(x) = ', m ,'x +', b)" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "tsvBUb43zEcF", | |
| "outputId": "0010c0a3-4ced-4d16-d68b-53c4ea340e2a" | |
| }, | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "error", | |
| "ename": "NameError", | |
| "evalue": "name 'model_cars' is not defined", | |
| "traceback": [ | |
| "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
| "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", | |
| "\u001b[0;32m<ipython-input-8-976d3dd0dd6c>\u001b[0m in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel_cars\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcoef_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel_cars\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintercept_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'f(x) = '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m,\u001b[0m\u001b[0;34m'x +'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;31mNameError\u001b[0m: name 'model_cars' is not defined" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Now we've got the **formula** of the **linear regression line**.\n", | |
| "\n", | |
| "Now for instance we can check what would be the speed of a 7.5 years old car:" | |
| ], | |
| "metadata": { | |
| "id": "yA9MAskE1OBk" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "y = lambda x : -1.75128771 * x + 103.10596026490066\n", | |
| "\n", | |
| "print(y(7.5))" | |
| ], | |
| "metadata": { | |
| "id": "RUiICt211agm" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "If the check the values over the previous graph, it looks great!\n", | |
| "\n", | |
| "We can also check a single value by using the **model_cars**:" | |
| ], | |
| "metadata": { | |
| "id": "Qiei4yM91umr" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "print(model_cars.predict([[7.5]]))" | |
| ], | |
| "metadata": { | |
| "id": "fUOkEDLy17LW" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Nevertheless, our model is not perfect, because if we test the speed for a 0 years old car, we get 103.10... value, because it is the value of the intercept of the line over the y axis when x equals 0." | |
| ], | |
| "metadata": { | |
| "id": "RtVtiyLe2VyE" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Rain example - Linear Regression" | |
| ], | |
| "metadata": { | |
| "id": "qeTSsv6y0ttR" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "#first_20_days = np.random.uniform(0.8, 1, 20)\n", | |
| "#last_11_days = np.random.uniform(0, 0.20, 11)\n", | |
| "\n", | |
| "# Get k elements within a range(min, max, step) with random.choices()\n", | |
| "first_20_days = random.choices(range(0, 10, 1), k = 20)\n", | |
| "last_11_days = random.choices(range(11, 120, 1), k = 11)\n", | |
| "\n", | |
| "rain_values = np.concatenate((first_20_days, last_11_days), axis=None)\n", | |
| "\n", | |
| "print(rain_values)\n", | |
| "\n", | |
| "days = range(1, 32, 1)\n", | |
| "\n", | |
| "print(rain_values.size)\n", | |
| "\n", | |
| "rain_month = pd.DataFrame({\"day\" : days, \"rain\" : rain_values})\n", | |
| "\n", | |
| "print(rain_month)" | |
| ], | |
| "metadata": { | |
| "id": "qUPrbdTK0vw2" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Plot the previous series" | |
| ], | |
| "metadata": { | |
| "id": "F5QWPp-nlONn" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "plt.plot(rain_month[\"day\"], rain_month[\"rain\"])\n", | |
| "plt.scatter(rain_month[\"day\"], rain_month[\"rain\"])\n", | |
| "\n", | |
| "plt.title('Poured rain per day')\n", | |
| "plt.xlabel('Day of the month')\n", | |
| "plt.ylabel('Rain (ml/m^2)')\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "g35QCoKvk1iR" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Train the rain model" | |
| ], | |
| "metadata": { | |
| "id": "uxw9VGQ2E4cI" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "model_rain = LinearRegression()\n", | |
| "model_rain = model_rain.fit(rain_month[ [\"day\"] ], rain_month[\"rain\"] )" | |
| ], | |
| "metadata": { | |
| "id": "gmqVtOfeEsGj" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Test the model" | |
| ], | |
| "metadata": { | |
| "id": "2J7syQ7necOk" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Generate a new DF called days representing the 31 days of the month\n", | |
| "days = pd.DataFrame({\"day\" : range(1, 32, 1)})\n", | |
| "\n", | |
| "# Test our model for each day\n", | |
| "days[\"predict\"] = model_rain.predict(days)\n", | |
| "\n", | |
| "print(days)" | |
| ], | |
| "metadata": { | |
| "id": "GDFLLV6EE3pn" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "As we can see at the plot below, there is no such a good correlation between the days of the month and the amount of poured rain (orange series).\n", | |
| "\n", | |
| "That is why the linear regression represented in blue doesn't have a great accuracy." | |
| ], | |
| "metadata": { | |
| "id": "LzB_z-FxlrUi" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Plot the continous line for the actual data\n", | |
| "plt.plot(rain_month[\"day\"], rain_month[\"rain\"])\n", | |
| "\n", | |
| "# Plot the scatter dots for the actual data\n", | |
| "plt.scatter(rain_month[\"day\"], rain_month[\"rain\"])\n", | |
| "\n", | |
| "# Plot the continuos line for the prediction\n", | |
| "# Represents the Linear Regression line\n", | |
| "plt.plot(days[\"day\"], days[\"predict\"])\n", | |
| "\n", | |
| "plt.title('Poured rain per day with the linear regression')\n", | |
| "plt.xlabel('Day of the month')\n", | |
| "plt.ylabel('Rain (ml/m^2)')\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "fZGqps9QlUii" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Linear Regression score" | |
| ], | |
| "metadata": { | |
| "id": "IoiHT-O2cXn-" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "**LinearRegression.score(x, y)** returns the **coefficient of determination** of the **prediction** (a float number between 0 and 1; being 1 a perfect determination and 0 a poor one)." | |
| ], | |
| "metadata": { | |
| "id": "KqVcm6U_nMBL" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "model_rain.score(rain_month[ [\"day\"] ], rain_month[\"rain\"])" | |
| ], | |
| "metadata": { | |
| "id": "6VTl55Itm7PK" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Polynominal Regression example" | |
| ], | |
| "metadata": { | |
| "id": "Cwq4qp601vop" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "**If your data points** clearly **will not fit a linear regression**(a straight line through all data points), **it might be ideal for polynomial regression**.\n", | |
| "\n", | |
| "Polynomial regression, like linear regression, uses the relationship between the variables x and y to find the best way to draw a line through the data points but by using a curved line.\n", | |
| "\n", | |
| "For that purpose, we will use:\n", | |
| "- **numpy.poly1d(numpy.polyfit(x, y, polynomic degree))** to create a polynomial model\n", | |
| "- **numpy.linspace(start, end, count of value points)** to specify how to draw the polynomial model curve." | |
| ], | |
| "metadata": { | |
| "id": "R1GqzWTm2c9E" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Create sample data for a polynomic function of degree = 3:" | |
| ], | |
| "metadata": { | |
| "id": "1BbuYLXK6aJm" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "x = range(1, 23, 1)\n", | |
| "print(x[21])\n", | |
| "y = [100,90,80,82,60,60,55,58,60,65,70,70,75,78,76,78,79,80,90,99,99,100]" | |
| ], | |
| "metadata": { | |
| "id": "MBDAyuiM6GB2" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Show the created points:" | |
| ], | |
| "metadata": { | |
| "id": "Rgg5_rPf6iHh" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "plt.scatter(x, y)" | |
| ], | |
| "metadata": { | |
| "id": "zBd_7c1t6hZY" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Train the polynomic model:" | |
| ], | |
| "metadata": { | |
| "id": "hSaKSo9l7r_g" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "mymodel = np.poly1d(np.polyfit(x, y, 3))\n", | |
| "\n", | |
| "myline = np.linspace(1, 22, 100)" | |
| ], | |
| "metadata": { | |
| "id": "dSo0Xngn7rnl" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Show the results:" | |
| ], | |
| "metadata": { | |
| "id": "qcEMYiCh76GD" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "plt.scatter(x, y)\n", | |
| "plt.plot(myline, mymodel(myline))\n", | |
| "\n", | |
| "plt.title('Actual points and Polynomic regression')\n", | |
| "plt.grid()\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "metadata": { | |
| "id": "775tqJGF77q6" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Check the model significancy by looking the r-squared.\n", | |
| "\n", | |
| "If the model is significant, means that we can trust his predictions, if not, it won't bring trustfull predictions.\n", | |
| "\n", | |
| "The r-squared value ranges from 0 to 1, where 0 means no relationship, and 1 means 100% related.\n", | |
| "\n", | |
| "Python and the Sklearn module will compute this value for you, all you have to do is feed it with the x and y arrays:" | |
| ], | |
| "metadata": { | |
| "id": "047LAmnb8Cj7" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from sklearn.metrics import r2_score\n", | |
| "\n", | |
| "r_squared = r2_score(y, mymodel(x))\n", | |
| "\n", | |
| "print(r_squared)" | |
| ], | |
| "metadata": { | |
| "id": "Yrg0W6ny8Ffm" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Test the model with individual values:" | |
| ], | |
| "metadata": { | |
| "id": "IleN0bac8p5k" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "predicted_value = mymodel(15)\n", | |
| "\n", | |
| "print(predicted_value)" | |
| ], | |
| "metadata": { | |
| "id": "NTne7Wvz8xDc" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "## Car example - Multiple Regression" | |
| ], | |
| "metadata": { | |
| "id": "DKKu5mLP42Oh" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Get the data from csv" | |
| ], | |
| "metadata": { | |
| "id": "E1kCwavSEnrd" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Take a look at the data set below, it contains some information about cars." | |
| ], | |
| "metadata": { | |
| "id": "Rj5S4qQq5Xkp" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "cars_complete_dataset = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/cars.csv')" | |
| ], | |
| "metadata": { | |
| "id": "25eVHGrq8sX5" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "print(cars_complete_dataset)" | |
| ], | |
| "metadata": { | |
| "id": "2EAlAQ6889PO" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "We can predict the CO2 emission of a car based on the size of the engine, but with multiple regression we can throw in more variables, like the weight of the car, to make the prediction more accurate." | |
| ], | |
| "metadata": { | |
| "id": "8FTuZnsk8wsL" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Prepare the data for the model" | |
| ], | |
| "metadata": { | |
| "id": "b-jXQ5koEuub" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "From the dataset, get the subset of *independent variables* that we want to use to predict (columns 'Weight' and 'Volume') and the result variable or also called *dependent variable* (column 'CO2').\n", | |
| "\n", | |
| "**Note**: It is common to name the list of independent values with a upper case X, and the list of dependent values with a lower case y." | |
| ], | |
| "metadata": { | |
| "id": "2PoDk6zs9HAf" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "X = cars_complete_dataset[['Weight', 'Volume']]\n", | |
| "y = cars_complete_dataset['CO2']" | |
| ], | |
| "metadata": { | |
| "id": "O4kBwJBD-SwU" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Train the model" | |
| ], | |
| "metadata": { | |
| "id": "Ys6lCp-vEzEW" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Import the library **linear_model** from **sklearn**." | |
| ], | |
| "metadata": { | |
| "id": "9yrpGm4X_crN" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from sklearn import linear_model as lm" | |
| ], | |
| "metadata": { | |
| "id": "gTgNvhBr_0YA" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Create the model co2_model and train it with the fit function and passing the independent variables ['Weight', 'Volume'] and the dependent variable ['CO2']." | |
| ], | |
| "metadata": { | |
| "id": "ByE7mZ5l_3zx" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "co2_model = lm.LinearRegression().fit(X, y)\n", | |
| "print(type(co2_model))" | |
| ], | |
| "metadata": { | |
| "id": "t_GaXtox_dPZ" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Test the model" | |
| ], | |
| "metadata": { | |
| "id": "p5qSX40DE36N" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Now, we can use this **co2_model** to predict the CO2 generation of other motors based on their values of car weight and engine volume." | |
| ], | |
| "metadata": { | |
| "id": "4jBjXa_8AOGf" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "cybertruck_weight = 3104\n", | |
| "cybertruck_engine = 6000\n", | |
| "\n", | |
| "cybertruck_co2 = co2_model.predict([[cybertruck_weight, cybertruck_engine]])\n", | |
| "\n", | |
| "print(cybertruck_co2)" | |
| ], | |
| "metadata": { | |
| "id": "Ljux4LA2AiD-" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Get the coefficient factor" | |
| ], | |
| "metadata": { | |
| "id": "t3ldcBfqE6iv" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Calculate the **coefficient factor** for each independent variables." | |
| ], | |
| "metadata": { | |
| "id": "CxC4mtz6Ec5p" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "print(co2_model.coef_)" | |
| ], | |
| "metadata": { | |
| "id": "qgQxLc2jEkG_" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "The result array represents the coefficient values of weight and volume.\n", | |
| "\n", | |
| "Weight: 0.00755095\n", | |
| "Volume: 0.00780526\n", | |
| "\n", | |
| "These values tell us that if the weight increase by 1kg, the CO2 emission increases by 0.00755095g.\n", | |
| "\n", | |
| "And if the engine size (Volume) increases by 1 cm3, the CO2 emission increases by 0.00780526 g." | |
| ], | |
| "metadata": { | |
| "id": "FcpCvg48FZAF" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Scale its features" | |
| ], | |
| "metadata": { | |
| "id": "Bm37MRUw-ckP" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from sklearn.preprocessing import StandardScaler\n", | |
| "from sklearn import linear_model\n", | |
| "\n", | |
| "scale = StandardScaler()\n", | |
| "\n", | |
| "# Scale the values inside X (independent variables weight and engine)\n", | |
| "scaledX = scale.fit_transform(X)" | |
| ], | |
| "metadata": { | |
| "id": "SdzKKMF9-kW3" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Regenerate the model:" | |
| ], | |
| "metadata": { | |
| "id": "hWFg6gjf_wNF" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "new_model = linear_model.LinearRegression().fit(scaledX, y)" | |
| ], | |
| "metadata": { | |
| "id": "wxgJhl4p_yl8" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Scale a single value to be tested:" | |
| ], | |
| "metadata": { | |
| "id": "GbMnq81xAY_K" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "scaled = scale.transform([[2300, 1.3]])" | |
| ], | |
| "metadata": { | |
| "id": "rIEhOeiCAafy" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Test the scaled value:" | |
| ], | |
| "metadata": { | |
| "id": "Vr5kWPRDAi5w" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "predictedCO2 = new_model.predict([scaled[0]])\n", | |
| "\n", | |
| "print(predictedCO2)" | |
| ], | |
| "metadata": { | |
| "id": "nAOikw-TAkiT" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "---" | |
| ], | |
| "metadata": { | |
| "id": "iGNj8SEN4zMD" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "# References" | |
| ], | |
| "metadata": { | |
| "id": "o9LMPSz7h5e8" | |
| } | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "- [Machine Learning Models in Python with sk-learn](https://discovery.cs.illinois.edu/learn/Towards-Machine-Learning/Machine-Learning-Models-in-Python-with-sk-learn/)\n", | |
| "- [Machine Learning - Linear Regression](https://www.w3schools.com/python/python_ml_linear_regression.asp)\n", | |
| "- [Matplotlib axis labels](https://www.scaler.com/topics/matplotlib/matplotlib-axis-label/)\n", | |
| "- [Machine Learning - Multiple Regression](https://www.w3schools.com/python/python_ml_multiple_regression.asp)" | |
| ], | |
| "metadata": { | |
| "id": "9_99KMHZh73p" | |
| } | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment