{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Workshop: Machine Learning for Beginners"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## What is Machine Learning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Machine learning is the process of **extracting knowledge from data** in an automated fashion.\n",
"\n",
"The use cases usually are making predictions on new and unseen data or simply understanding a given dataset better by finding patterns.\n",
"\n",
"Central to machine learning is the idea of **automating** the **decision making** from data **without** the user specifying **explicit rules** how these decisions should be made."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Examples"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Types of Machine Learning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- **Supervised** (focus of this workshop): Each entry in the dataset comes with a \"label\". Examples are a list of emails where spam mail is already marked as such or a sample of handwritten digits. The goal is to use the historic data to make predictions.\n",
"\n",
"- **Unsupervised**: There is no desired output associated with a data entry. In a sense, one can think of unsupervised learning as a means of discovering labels from the data itself. A popular example is the clustering of customer data.\n",
"\n",
"- **Reinforcement**: Conceptually, this can be seen as \"learning by doing\". Some kind of \"reward function\" tells how good a predicted outcome is. For example, chess computers are typically programmed with this approach."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Types of Supervised Learning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- In **classification** tasks, the labels are *discrete*, such as \"spam\" or \"no spam\" for emails. Often, labels are nominal (e.g., colors of something), or ordinal (e.g., T-shirt sizes in S, M, or L).\n",
"- In **regression**, the labels are *continuous*. For example, given a person's age, education, and position, infer his/her salary."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Case Study: Iris Flower Classification"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Python for Scientific Computing: A brief Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python itself does not come with any scientific algorithms. However, over time, many open source libraries emerged that are useful to build machine learning applications.\n",
"\n",
"Among the popular ones are [numpy](https://numpy.org/) (numerical computations, linear algebra), [pandas](https://pandas.pydata.org/) (data processing), [matplotlib](https://matplotlib.org/) (visualisations), and [scikit-learn](https://scikit-learn.org/stable/index.html) (machine learning algorithms).\n",
"\n",
"First, import the libraries:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following line is needed so that this Jupyter notebook creates the visiualizations in the notebook and not in a new window. This has nothing to do with Python."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Standard Python can do basic arithmetic operations ..."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 1\n",
"b = 2\n",
"\n",
"c = a + b\n",
"\n",
"c"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... and provides some simple **data structures**, such as a list of values."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 4]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l = [a, b, c, 4]\n",
"\n",
"l"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numpy provides a data structure called an **n-dimensional array**. This may sound fancy at first but when used with only 1 or 2 dimensions, it basically represents vectors and matrices. Arrays allow for much faster computations as they are implemented in the very fast [C language](https://en.wikipedia.org/wiki/C_%28programming_language%29)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To create an array, we use the [array()](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy-array) function from the imported `np` module and provide it with a `list` of values."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1 = np.array([1, 2, 3])\n",
"\n",
"v1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A vector can be multiplied with a scalar."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([3, 6, 9])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v2 = v1 * 3\n",
"\n",
"v2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To create a matrix, just use a list of (row) list of values instead."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1, 2, 3],\n",
" [4, 5, 6]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1 = np.array([\n",
" [1, 2, 3],\n",
" [4, 5, 6],\n",
"])\n",
"\n",
"m1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can use numpy to multiply a matrix with a vector to obtain a new vector ..."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([14, 32])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v3 = np.dot(m1, v1)\n",
"\n",
"v3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... or simply transpose it."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1, 4],\n",
" [2, 5],\n",
" [3, 6]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1.T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The rules from maths still apply and it makes a difference if a vector is multiplied from the left or the right by a matrix. The following operation will fail."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0)",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mdot\u001b[0;34m(*args, **kwargs)\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0)"
]
}
],
"source": [
"np.dot(v1, m1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to retrieve only a slice (= subset) of an array's data, we can \"index\" into it. For example, the first row of the matrix is ..."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[0, :]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... while the second column is:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 5])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[:, 1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To acces the lowest element in the right column, two indices can be used."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"6"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[1, 2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numpy also provides various other functions and constants, such as sinus or pi. To further illustrate the concept of **vectorization**, let us calculate the sinus curve over a range of values."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-9.42477796, -9.23437841, -9.04397885, -8.8535793 , -8.66317974,\n",
" -8.47278019, -8.28238063, -8.09198108, -7.90158152, -7.71118197,\n",
" -7.52078241, -7.33038286, -7.1399833 , -6.94958375, -6.75918419,\n",
" -6.56878464, -6.37838508, -6.18798553, -5.99758598, -5.80718642,\n",
" -5.61678687, -5.42638731, -5.23598776, -5.0455882 , -4.85518865,\n",
" -4.66478909, -4.47438954, -4.28398998, -4.09359043, -3.90319087,\n",
" -3.71279132, -3.52239176, -3.33199221, -3.14159265, -2.9511931 ,\n",
" -2.76079354, -2.57039399, -2.37999443, -2.18959488, -1.99919533,\n",
" -1.80879577, -1.61839622, -1.42799666, -1.23759711, -1.04719755,\n",
" -0.856798 , -0.66639844, -0.47599889, -0.28559933, -0.09519978,\n",
" 0.09519978, 0.28559933, 0.47599889, 0.66639844, 0.856798 ,\n",
" 1.04719755, 1.23759711, 1.42799666, 1.61839622, 1.80879577,\n",
" 1.99919533, 2.18959488, 2.37999443, 2.57039399, 2.76079354,\n",
" 2.9511931 , 3.14159265, 3.33199221, 3.52239176, 3.71279132,\n",
" 3.90319087, 4.09359043, 4.28398998, 4.47438954, 4.66478909,\n",
" 4.85518865, 5.0455882 , 5.23598776, 5.42638731, 5.61678687,\n",
" 5.80718642, 5.99758598, 6.18798553, 6.37838508, 6.56878464,\n",
" 6.75918419, 6.94958375, 7.1399833 , 7.33038286, 7.52078241,\n",
" 7.71118197, 7.90158152, 8.09198108, 8.28238063, 8.47278019,\n",
" 8.66317974, 8.8535793 , 9.04397885, 9.23437841, 9.42477796])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.linspace(-3*np.pi, 3*np.pi, 100)\n",
"\n",
"x"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-3.67394040e-16, -1.89251244e-01, -3.71662456e-01, -5.40640817e-01,\n",
" -6.90079011e-01, -8.14575952e-01, -9.09631995e-01, -9.71811568e-01,\n",
" -9.98867339e-01, -9.89821442e-01, -9.45000819e-01, -8.66025404e-01,\n",
" -7.55749574e-01, -6.18158986e-01, -4.58226522e-01, -2.81732557e-01,\n",
" -9.50560433e-02, 9.50560433e-02, 2.81732557e-01, 4.58226522e-01,\n",
" 6.18158986e-01, 7.55749574e-01, 8.66025404e-01, 9.45000819e-01,\n",
" 9.89821442e-01, 9.98867339e-01, 9.71811568e-01, 9.09631995e-01,\n",
" 8.14575952e-01, 6.90079011e-01, 5.40640817e-01, 3.71662456e-01,\n",
" 1.89251244e-01, -1.22464680e-16, -1.89251244e-01, -3.71662456e-01,\n",
" -5.40640817e-01, -6.90079011e-01, -8.14575952e-01, -9.09631995e-01,\n",
" -9.71811568e-01, -9.98867339e-01, -9.89821442e-01, -9.45000819e-01,\n",
" -8.66025404e-01, -7.55749574e-01, -6.18158986e-01, -4.58226522e-01,\n",
" -2.81732557e-01, -9.50560433e-02, 9.50560433e-02, 2.81732557e-01,\n",
" 4.58226522e-01, 6.18158986e-01, 7.55749574e-01, 8.66025404e-01,\n",
" 9.45000819e-01, 9.89821442e-01, 9.98867339e-01, 9.71811568e-01,\n",
" 9.09631995e-01, 8.14575952e-01, 6.90079011e-01, 5.40640817e-01,\n",
" 3.71662456e-01, 1.89251244e-01, 1.22464680e-16, -1.89251244e-01,\n",
" -3.71662456e-01, -5.40640817e-01, -6.90079011e-01, -8.14575952e-01,\n",
" -9.09631995e-01, -9.71811568e-01, -9.98867339e-01, -9.89821442e-01,\n",
" -9.45000819e-01, -8.66025404e-01, -7.55749574e-01, -6.18158986e-01,\n",
" -4.58226522e-01, -2.81732557e-01, -9.50560433e-02, 9.50560433e-02,\n",
" 2.81732557e-01, 4.58226522e-01, 6.18158986e-01, 7.55749574e-01,\n",
" 8.66025404e-01, 9.45000819e-01, 9.89821442e-01, 9.98867339e-01,\n",
" 9.71811568e-01, 9.09631995e-01, 8.14575952e-01, 6.90079011e-01,\n",
" 5.40640817e-01, 3.71662456e-01, 1.89251244e-01, 3.67394040e-16])"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y = np.sin(x)\n",
"\n",
"y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With matplotlib's [plot()](https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) function we can visualize the sinus curve."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"