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": "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1WnSpEmB+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