{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A hands-on Machine Learning Introduction in Python with scikit-learn"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## What is Machine Learning\n",
"\n",
"\n",
"Machine learning is the process of **extracting knowledge from data** automatically.\n",
"\n",
"The goals usually include making predictions on new, unseen data or simply understanding given data better by finding patterns.\n",
"\n",
"Central to machine learning is the concept of **automating decision making** from data **without the user specifying explicit rules** how this decision should be made.\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Examples\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3 Types of Machine Learning\n",
"\n",
"\n",
"\n",
"- **Supervised** (focus of this notebook): 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": [
"## 2 Types of Supervised Learning\n",
"\n",
"\n",
"\n",
"- **In classification, the label is discrete**, such as \"spam\" or \"no spam\" for emails.\n",
"Furthermore, labels are nominal (e.g., colors of something), not ordinal (e.g., T-shirt sizes in S, M, or L).\n",
"\n",
"\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\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Python for scientific computing\n",
"\n",
"Python itself does not come with any scientific algorithms implemented it. However, over time, many open source libraries emerged that are useful to build machine learning applications.\n",
"\n",
"Among the popular ones are numpy (numerical computations, linear algebra), pandas (data processing), matplotlib (visualisations), and scikit-learn (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",
"c = a + b\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",
"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 use very low level functions modern computers provide."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To create an array, use the **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",
"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",
"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",
"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",
"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[0m\n\u001b[0m",
"\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",
"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",
"y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With matplotlib's **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": [
"