From 69bf34a6b8fd7dc9899d721525cedb344758c03f Mon Sep 17 00:00:00 2001 From: Mikolaj Rybinski <mikolaj.rybinski@id.ethz.ch> Date: Fri, 28 Dec 2018 20:48:13 +0100 Subject: [PATCH] in-detail review of 01_introduction script --- .gitignore | 2 +- 01_introduction.ipynb | 474 ++++++++++++++++++++++----------- classification-svc-2d-poly.png | Bin 0 -> 26460 bytes classifier_examples.ipynb | 123 ++++++++- data_split.png | Bin 0 -> 6755 bytes regression-lin-1d.png | Bin 0 -> 15438 bytes 6 files changed, 444 insertions(+), 155 deletions(-) create mode 100644 classification-svc-2d-poly.png create mode 100644 data_split.png create mode 100644 regression-lin-1d.png diff --git a/.gitignore b/.gitignore index 60815f0..3c7da3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ .ipynb_checkpoints/ -venv* +.*venv* diff --git a/01_introduction.ipynb b/01_introduction.ipynb index 6c7a651..98806b8 100644 --- a/01_introduction.ipynb +++ b/01_introduction.ipynb @@ -21,7 +21,7 @@ " 1. Where will my car at given velocity stop when I break now ?\n", " 2. Where on the night sky will I see the moon tonight ?\n", " 2. Is the email I received spam ? \n", - " 4. What article X should I recommend to my customers Y ?\n", + " 4. Which article X should I recommend to a customer Y ?\n", " \n", "- The first two questions can be answered based on existing physical models (formulas). \n", "\n", @@ -38,13 +38,17 @@ "\n", "E.g. for the spamming example:\n", "\n", - "- We have no explicit formula for such a task\n", - "- We have a vague understanding of the problem domeani, because we know that some words are specific for spam emails, other words are specific for my personal and job emails.\n", + "- We have no explicit formula for such a task (and devising one would boil down to lots of trial with different statistics or scores and possibly weighting of them).\n", + "- We have a vague understanding of the problem domain, because we know that some words are specific for spam emails, other words are specific for my personal and job emails.\n", "- My mailbox is full with examples for spam vs non-spam.\n", "\n", "\n", "**In such cases machine learning offers approaches to build models based on example data.**\n", "\n", + "<div class=\"alert alert-block alert-info\">\n", + "<i class=\"fa fa-info-circle\"></i>\n", + "The closely-related concept of <b>data mining</b> usually means use of predictive machine learning models to explicitly discover previously unknown knowledge from a specific data set, such as, for instance, association rules between customer and article types in the Problem 4 above.\n", + "</div>\n", "\n", "\n", "\n", @@ -69,16 +73,19 @@ "\n", "Some parts of ML are older than you might think. This is a rough time line with a few selected achievements from this field:\n", "\n", - " \n", - " 1812: Bayes Theorem\n", + " 1805: Least squares regression\n", + " 1812: Bayes' rule\n", " 1913: Markov Chains\n", + "\n", " 1951: First neural network\n", - " 1959: first use or term \"machine learning\" AI pioneer Arthur Samuel\n", + " 1957-65: \"k-means\" clustering algorithm\n", + " 1959: Term \"machine learning\" is coined by Arthur Samuel, an AI pioneer\n", " 1969: Book \"Perceptrons\": Limitations of Neural Networks\n", - " 1986: Backpropagation to learn neural networks\n", - " 1995: Randomized Forests and Support Vector Machines\n", - " 1998: Public appearance of ML: naive Bayes Classifier for Spam detection\n", - " 2000+: Deep learning\n", + " 1984: Book \"Classification And Regression Trees\"\n", + " 1974-86: Neural networks learning breakthrough: backpropagation method\n", + " 1995: Randomized Forests and Support Vector Machines methods\n", + " 1998: Public appearance: first ML implementations of spam filtering methods; naive Bayes Classifier method\n", + " 2006-12: Neural networks learning breakthrough: deep learning\n", " \n", "So the field is not as new as one might think, but due to \n", "\n", @@ -111,7 +118,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## ML terms: What are \"features\" ?\n", + "## ML lingo: What are \"features\" ?\n", "\n", "A typical and very common situation is that our data is presented as a table, as in the following example:" ] @@ -219,12 +226,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", - "**Definitions**:\n", - "- every row of such a matrix is called a **sample** or **feature vector**. \n", - "\n", - "- the cells in a row are **feature values**.\n", - "- every column name is called a **feature name** or **attribute**." + "<div class=\"alert alert-block alert-warning\">\n", + "<i class=\"fa fa-warning\"></i> <strong>Definitions</strong>\n", + "<ul>\n", + " <li>every row of such a matrix is called a <strong>sample</strong> or <strong>feature vector</strong>;</li>\n", + " <li>the cells in a row are <strong>feature values</strong>;</li>\n", + " <li>every column name is called a <strong>feature name</strong> or <strong>attribute</strong>.</li>\n", + "</ul>\n", + "\n", + "Features are also commonly called <strong>variables</strong>.\n", + "</div>" ] }, { @@ -233,18 +244,14 @@ "source": [ "This table shown holds five samples.\n", "\n", - "The feature names are `alcohol_content`, `bitterness`, `darkness`, `fruitiness` and `is_yummy`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "(Almost) all machine learning algorithms require that your data is numerical and/or categorial. In some applications it is not obvious how to transform data to a numerical presentation.\n", - "\n", - "**Definition**:\n", + "The feature names are `alcohol_content`, `bitterness`, `darkness`, `fruitiness` and `is_yummy`.\n", "\n", - "*Categorical data*: data which has only a limited set of allowed values. A `taste` feature could only allow values `sour`, `bitter`, `sweet`, `salty`." + "<div class=\"alert alert-block alert-warning\">\n", + "<i class=\"fa fa-warning\"></i> <strong>More definitions</strong>\n", + "<ul>\n", + " <li>The first four features have continuous numerical values within some ranges - these are called <strong>numerical features</strong>,</li>\n", + " <li>the <code>is_yummy</code> feature has only a finite set of values (\"categories\"): <code>0</code> (\"no\") and <code>1</code> (\"yes\") - this is called a <strong>categorical feature</strong>.</li>\n", + "</ul>\n" ] }, { @@ -253,14 +260,25 @@ "source": [ "A straight-forward application for machine-learning on the previos beer dataset is: **\"can we predict `is_yummy` from the other features\"** ?\n", "\n", - "In this case we would call the features `alcohol_content`, `bitterness`, `darkness`, `fruitiness` our **input features** and `is_yummy` our **target value**." + "<div class=\"alert alert-block alert-warning\">\n", + "<i class=\"fa fa-warning\"></i> <strong>Even more definitions</strong>\n", + "\n", + "In context of the question above we call:\n", + "<ul>\n", + " <li>the <code>alcohol_content</code>, <code>bitterness</code>, <code>darkness</code>, <code>fruitiness</code> features our <strong>input features</strong>, and</li>\n", + " <li>the <code>is_yummy</code> feature our <strong>target/output feature</strong> or a <strong>label</strong> of our data samples.\n", + " <ul>\n", + " <li>Values of categorical labels, such as <code>0</code> (\"no\") and <code>1</code> (\"yes\") here, are often called <strong>classes</strong>.</li>\n", + " </ul>\n", + " </li>\n", + "</ul>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### How to represent images as feature vectors ?\n", + "### How to represent images as feature vectors?\n", "\n", "To simplify our explanations we consider gray images only here. Computers represent images as matrices. Every cell in the matrix represents one pixel, and the numerical value in the matrix cell its gray value.\n", "\n", @@ -273,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -284,30 +302,41 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['DESCR', 'data', 'images', 'target', 'target_names']\n" + ] + } + ], "source": [ - "dd = load_digits()" + "dd = load_digits()\n", + "print(dir(dd))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Next we plot the first nine digits from this data set:" + "Let's plot the first ten digits from this data set:" ] }, { "cell_type": "code", - "execution_count": 76, - "metadata": {}, + "execution_count": 4, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "<Figure size 1296x360 with 9 Axes>" + "<Figure size 1440x360 with 10 Axes>" ] }, "metadata": { @@ -317,12 +346,12 @@ } ], "source": [ - "N = 9\n", + "N = 10\n", "\n", "plt.figure(figsize=(2 * N, 5))\n", "\n", "for i, image in enumerate(dd.images[:N]):\n", - " plt.subplot(1, N, i + 1)\n", + " plt.subplot(1, N, i + 1).set_title(dd.target[i])\n", " plt.imshow(image, cmap=\"gray\")" ] }, @@ -330,53 +359,86 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "And this is the first image from the data set, it is a 8 x 8 matrix with values 0 to 15. The range 0 to 15 is fixed for this specific data set. Other formats allow e.g. values 0..255 or floating point values in the range 0 to 1." + "The data is a set of 8 x 8 matrices with values 0 to 15. The range 0 to 15 is fixed for this specific data set. Other formats allow e.g. values 0..255 or floating point values in the range 0 to 1." ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(8, 8)\n", - "[[ 0. 0. 5. 13. 9. 1. 0. 0.]\n", + "images.ndim: 3\n", + "images[0].shape: (8, 8)\n", + "images[0]:\n", + " [[ 0. 0. 5. 13. 9. 1. 0. 0.]\n", " [ 0. 0. 13. 15. 10. 15. 5. 0.]\n", " [ 0. 3. 15. 2. 0. 11. 8. 0.]\n", " [ 0. 4. 12. 0. 0. 8. 8. 0.]\n", " [ 0. 5. 8. 0. 0. 9. 8. 0.]\n", " [ 0. 4. 11. 0. 1. 12. 7. 0.]\n", " [ 0. 2. 14. 5. 10. 12. 0. 0.]\n", - " [ 0. 0. 6. 13. 10. 0. 0. 0.]]\n" + " [ 0. 0. 6. 13. 10. 0. 0. 0.]]\n", + "images.shape: (1797, 8, 8)\n", + "images.size: 115008\n", + "images.dtype: float64\n", + "images.itemsize: 8\n", + "target.size: 1797\n", + "target_names: [0 1 2 3 4 5 6 7 8 9]\n", + "DESCR:\n", + " Optical Recognition of Handwritten Digits Data Set\n", + "===================================================\n", + "\n", + "Notes\n", + "-----\n", + "Data Set Characteristics:\n", + " :Number of Instances: 5620\n", + " :Number of Attributes: 64\n", + " :Attribute Information: 8x8 image of integer pixels in the range 0..16.\n", + " :Missing Attribute Values: None\n", + " :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)\n", + " :Date: July; 1998\n", + "\n", + "This is a copy of the test set of the UCI ML hand-written digits datasets\n", + "http://archive.ics.uci.edu/ml/datas \n", + "[...]\n" ] } ], "source": [ - "print(dd.images[0].shape)\n", - "print(dd.images[0])" + "print(\"images.ndim:\", dd.images.ndim) # number of dimensions of the array\n", + "print(\"images[0].shape:\", dd.images[0].shape) # dimensions of a first sample array\n", + "print(\"images[0]:\\n\", dd.images[0]) # first sample array\n", + "print(\"images.shape:\", dd.images.shape) # dimensions of the array of all samples\n", + "print(\"images.size:\", dd.images.size) # total number of elements of the array\n", + "print(\"images.dtype:\", dd.images.dtype) # type of the elements in the array\n", + "print(\"images.itemsize:\", dd.images.itemsize) # size in bytes of each element of the array\n", + "print(\"target.size:\", dd.target.size) # size of the target feature vector (labels of samples)\n", + "print(\"target_names:\", dd.target_names) # classes vector\n", + "print(\"DESCR:\\n\", dd.DESCR[:500], \"\\n[...]\") # description of the dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "To transform such an image to a feature vector we just have to concatenate the rows to one single vector of size 64:" + "To transform such an image to a feature vector we just have to flatten the matrix by concatenating the rows to one single vector of size 64:" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(64,)\n", - "[ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5. 0. 0. 3.\n", + "image_vector.shape: (64,)\n", + "image_vector: [ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5. 0. 0. 3.\n", " 15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8. 8. 0. 0. 5. 8. 0.\n", " 0. 9. 8. 0. 0. 4. 11. 0. 1. 12. 7. 0. 0. 2. 14. 5. 10. 12.\n", " 0. 0. 0. 0. 6. 13. 10. 0. 0. 0.]\n" @@ -384,9 +446,9 @@ } ], "source": [ - "vector = dd.images[0].flatten()\n", - "print(vector.shape)\n", - "print(vector)" + "image_vector = dd.images[0].flatten()\n", + "print(\"image_vector.shape:\", image_vector.shape)\n", + "print(\"image_vector:\", image_vector)" ] }, { @@ -400,7 +462,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "If we start a machine learning project for texts, we first have to choose and fix an enumerated dictionary or words for this project. The final representation of texts as feature vectors depends on this dictionary. \n", + "If we start a machine learning project for texts, we first have to choose a dictionary - set of words for this project. The final representation of a text as a feature vector depends on this dictionary.\n", "\n", "Such a dictionary can be very large, but for the sake of simplicity we use a very small enumerated dictionary to explain the overall procedure:\n", "\n", @@ -414,7 +476,7 @@ "| beer | 4 |\n", "| pizza | 5 |\n", "\n", - "To \"vectorize\" a given text we count the words in the text which also exist in the vocabulary and put the counts at the given position `Index`.\n", + "To \"vectorize\" a given text we count the words in the text which also exist in the vocabulary and put the counts at the given `Index`.\n", "\n", "E.g. `\"I dislike american pizza, but american beer is nice\"`:\n", "\n", @@ -427,11 +489,11 @@ "| beer | 4 | 1 |\n", "| pizza | 5 | 1 |\n", "\n", - "The according feature vector is the `Count` column, which is:\n", + "The respective feature vector is the `Count` column, which is:\n", "\n", "`[0, 1, 2, 0, 1, 1]`\n", "\n", - "In real case scenarios the dictionary is much bigger, this results then in vectors with only few non-zero entries (so called sparse vectors)." + "In real case scenarios the dictionary is much bigger, which often results in vectors with only few non-zero entries (so called **sparse vectors**)." ] }, { @@ -443,7 +505,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -458,15 +520,57 @@ "from sklearn.feature_extraction.text import CountVectorizer\n", "from itertools import count\n", "\n", - "vocabulary = {\"like\": 0, \"dislike\": 1, \"american\": 2, \"italian\": 3, \"beer\": 4, \"pizza\": 5}\n", + "vocabulary = {\n", + " \"like\": 0,\n", + " \"dislike\": 1,\n", + " \"american\": 2,\n", + " \"italian\": 3,\n", + " \"beer\": 4,\n", + " \"pizza\": 5,\n", + "}\n", "\n", "vectorizer = CountVectorizer(vocabulary=vocabulary)\n", "\n", "# create count vector for a pice of text:\n", - "vector = vectorizer.fit_transform([\"I dislike american pizza. But american beer is nice\"]).toarray().flatten()\n", + "vector = vectorizer.fit_transform([\n", + " \"I dislike american pizza. But american beer is nice\"\n", + "]).toarray().flatten()\n", "print(vector)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ML lingo: What are the different types of datasets?\n", + "\n", + "<div class=\"alert alert-block alert-warning\">\n", + "<i class=\"fa fa-warning\"></i> <strong>Definitions</strong>\n", + "\n", + "Subset of data used for:\n", + "<ul>\n", + " <li>learning (training) a model is called a <strong>training set</strong>;</li>\n", + " <li>improving ML method performance by adjusting its parameters is called <strong>validation set</strong>;</li>\n", + " <li>assesing final performance is called <strong>test set</strong>.</li>\n", + "</ul>\n", + "</div>\n", + "\n", + "<table>\n", + " <tr>\n", + " <td><img src=\"./data_split.png\" width=300px></td>\n", + " </tr>\n", + " <tr>\n", + " <td style=\"font-size:75%\"><center>Img source: https://dziganto.github.io</center></td>\n", + " </tr>\n", + "</table>\n", + "\n", + "\n", + "You will learn more on how to select wisely subsets of your data and about related issues later in the course. For now just remember that:\n", + "1. the training and validation datasets must be disjunct during each iteration of the method improvement, and\n", + "1. the test dataset must be independent from the model (hence, from the other datasets), i.e. it is indeed used only for the final assesment of the method's performance (think: locked in the safe until you're done with model tweaking).\n", + "\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -487,11 +591,24 @@ "\n", "Examples for supervised learning:\n", "\n", - "- Classification: Predict the class `is_yummy` based on the attributes `alcohol_content`,\t`bitterness`, \t`darkness` and `fruitiness`. (two class problem).\n", + "- Classification: predict the class `is_yummy` based on the attributes `alcohol_content`,\t`bitterness`, \t`darkness` and `fruitiness` (a standard two class problem).\n", + "\n", + "- Classification: predict the digit-shown based on a 8 x 8 pixel image (a multi-class problem).\n", + "\n", + "- Regression: predict temperature based on how long sun was shining in the last 10 minutes.\n", "\n", - "- Classification: predict the digit-shown based on a 8 x 8 pixel image (this is a multi-class problem).\n", "\n", - "- Regression: Predict the length of a salmon based on its age and weight." + "\n", + "<table>\n", + " <tr>\n", + " <td><img src=\"./classification-svc-2d-poly.png\" width=400px></td>\n", + " <td><img src=\"./regression-lin-1d.png\" width=400px></td>\n", + " </tr>\n", + " <tr>\n", + " <td><center>Classification</center></td>\n", + " <td><center>Linear regression</center></td>\n", + " </tr>\n", + "</table>\n" ] }, { @@ -508,13 +625,13 @@ "\n", "Examples for unsupervised learning:\n", "\n", - "- Can we split up our beer data set into sub groups of similar beers ?\n", - "- Can we reduce our data set because groups of features are somehow correlated ?\n", + "- Can we split up our beer data set into sub groups of similar beers?\n", + "- Can we reduce our data set because groups of features are somehow correlated?\n", "\n", "<table>\n", " <tr>\n", - " <td><img src=\"./cluster-image.png/\" width=60%></td>\n", - " <td><img src=\"./nonlin-pca.png/\" width=60%></td>\n", + " <td><img src=\"./cluster-image.png/\" width=400px></td>\n", + " <td><img src=\"./nonlin-pca.png/\" width=400px></td>\n", " </tr>\n", " <tr>\n", " <td><center>Clustering</center></td>\n", @@ -550,6 +667,15 @@ "# Exercise section 1" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\">\n", + "<strong>TODO:</strong> prepare set of actual small exercises out of it (currently it's just more of a tutorial/example).\n", + "</div>" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -559,7 +685,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -644,7 +770,7 @@ "4 4.148710 0.570586 1.461568 0.260218 0" ] }, - "execution_count": 126, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -659,7 +785,7 @@ }, { "cell_type": "code", - "execution_count": 159, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -680,7 +806,7 @@ "for_plot = beer_data.copy()\n", "\n", "def translate_label(value):\n", - " return \"yummy\" if value == 1 else \"not yummy\"\n", + " return \"not yummy\" if value == 0 else \"yummy\"\n", "\n", "for_plot[\"is_yummy\"] = for_plot[\"is_yummy\"].apply(translate_label)\n", "\n", @@ -696,26 +822,34 @@ }, { "cell_type": "code", - "execution_count": 157, - "metadata": {}, + "execution_count": 10, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "# INPUT FEATURES\n", " alcohol_content bitterness darkness fruitiness\n", "0 3.739295 0.422503 0.989463 0.215791\n", "1 4.207849 0.841668 0.928626 0.380420\n", "2 4.709494 0.322037 5.374682 0.145231\n", "3 4.684743 0.434315 4.072805 0.191321\n", "4 4.148710 0.570586 1.461568 0.260218\n", + "...\n", + "(225, 4)\n", "\n", + "# LABELS\n", "0 0\n", "1 0\n", "2 1\n", "3 1\n", "4 0\n", - "Name: is_yummy, dtype: int64\n" + "Name: is_yummy, dtype: int64\n", + "...\n", + "(225,)\n" ] } ], @@ -726,92 +860,111 @@ "# only the last column:\n", "labels = beer_data.iloc[:, -1]\n", "\n", + "print('# INPUT FEATURES')\n", "print(input_features.head(5))\n", + "print('...')\n", + "print(input_features.shape)\n", "print()\n", - "print(labels.head(5))" + "print('# LABELS')\n", + "print(labels.head(5))\n", + "print('...')\n", + "print(labels.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We experiment now the so called `LogisticRegression` classifier. The name is misleading: logistic regression internally uses a kind of regression algorithm for probabilities with the final goal to classify data. So even if the name contains \"regression\" it still is a classifier." - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.linear_model import LogisticRegression" - ] - }, - { - "cell_type": "code", - "execution_count": 144, - "metadata": {}, - "outputs": [], - "source": [ - "classifier = LogisticRegression(C=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In `scikit-learn` all classifiers have a `fit` method to learn from data:" + "Let's start learning with the so called `LogisticRegression` classifier.\n", + "\n", + "<div class=\"alert alert-block alert-info\">\n", + "<i class=\"fa fa-info-circle\"></i>\n", + "In logistic regression the linear regression is used internally and then transformed (using logistic function) to probability of belonging to one of the two classes. Even so the name contains \"regression\", it is still a classifier.\n", + "</div>" ] }, { "cell_type": "code", - "execution_count": 145, - "metadata": {}, + "execution_count": 11, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { "text/plain": [ - "LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n", + "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", " verbose=0, warm_start=False)" ] }, - "execution_count": 145, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "classifier.fit(input_features, labels)" + "from sklearn.linear_model import LogisticRegression\n", + "classifier = LogisticRegression()\n", + "classifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Also `scikit-learn` classifiers have a `predict` method for predicting classes for input features. Here we just re-classify our learning data:" + "<div class=\"alert alert-block alert-warning\">\n", + "<i class=\"fa fa-warning\"></i> <strong>`scikit-learn` API</strong>\n", + "\n", + "In <code>scikit-learn</code> all classifiers have:\n", + "<ul>\n", + " <li>a <strong><code>fit()</code></strong> method to learn from data, and</li>\n", + " <li>and a subsequent <strong><code>predict()</code></strong> method for predicting classes from input features.</li>\n", + "</ul>\n", + "</div>" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train first..\n", + "(225,)\n" + ] + } + ], "source": [ - "predicted_labels = classifier.predict(input_features)" + "# Sanity check: can't predict if not fitted (trained)\n", + "from sklearn.exceptions import NotFittedError\n", + "try:\n", + " classifier.predict(input_features)\n", + "except NotFittedError:\n", + " print(\"train first..\")\n", + "\n", + "# Fit\n", + "classifier.fit(input_features, labels)\n", + "\n", + "# Predict\n", + "predicted_labels = classifier.predict(input_features)\n", + "print(predicted_labels.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Lets check our result with a few examples:" + "Here we've just re-classified our training data. Lets check our result with a few examples:" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -842,7 +995,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -850,7 +1003,7 @@ "output_type": "stream", "text": [ "225 examples\n", - "191 labeled correctly\n" + "187 labeled correctly\n" ] } ], @@ -863,7 +1016,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Comment: `predicted_labels == labels` evaluates as a vector of values `True` or `False`. Python handles `True` as `1` and `False` as `0` when used as numbers. So the `sum(...)` just counts the correct results.\n" + "<div class=\"alert alert-block alert-info\">\n", + "<i class=\"fa fa-info-circle\"></i>\n", + "<code>predicted_labels == labels</code> evaluates to a vector of <code>True</code> or <code>False</code> Boolean values. When used as numbers, Python handles <code>True</code> as <code>1</code> and <code>False</code> as <code>0</code>. So, <code>sum(...)</code> simply counts the correctly predicted labels.\n", + "</div>\n", + "\n" ] }, { @@ -890,76 +1047,94 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we play with a different ML algorithm, the so called `Support Vector Classifier` (which belongs to a class of algorithms named `SVM`s (`Support Vector Machines`).\n", - "\n", - "**we will discuss available ML algorithms in a following script**\n" + "# Exercise section 2" ] }, { - "cell_type": "code", - "execution_count": 154, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "from sklearn.svm import SVC\n", - "\n", - "classifier = SVC(C=1)\n", - "classifier.fit(features, labels)\n", - "\n", - "predicted_labels = classifier.predict(features)" + "<div class=\"alert alert-block alert-danger\">\n", + "<strong>TODO:</strong> I propose to start excercise session 2 here, and ask to do re-classification with SVM, and only then play w/ regularization param.\n", + "</div>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Lets evaluate the performance again:" + "Now, train a different `scikit-learn` classifier - the so called **Support Vector Classifier** `SVC`, and evaluate its \"re-classification\" performance again.\n", + "\n", + "<div class=\"alert alert-block alert-info\">\n", + "<i class=\"fa fa-info-circle\"></i>\n", + "<code>SVC</code> belongs to a class of algorithms named \"Support Vector Machines\" (SVMs). We will discuss available ML algorithms in more detail in the following scripts.\n", + "</div>" ] }, { "cell_type": "code", - "execution_count": 155, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(225,)\n", - "(225,)\n", - "205\n" + "225 examples\n", + "205 labeled correctly\n" ] } ], "source": [ - "print(predicted_labels.shape)\n", - "print(labels.shape)\n", - "print(sum(predicted_labels == labels))" + "from sklearn.svm import SVC\n", + "# ...\n", + "# REMOVE the following lines in the target script\n", + "classifier = SVC()\n", + "classifier.fit(input_features, labels)\n", + "\n", + "predicted_labels = classifier.predict(input_features)\n", + "\n", + "assert(predicted_labels.shape == labels.shape)\n", + "print(len(labels), \"examples\")\n", + "print(sum(predicted_labels == labels), \"labeled correctly\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "This is a better result ! **But this does not indicate that `SVC` is always superior to `LogisticRegression`.**\n", + "Better?\n", "\n", - "Here `SVC` just seems to fit better to our current machine learning task.\n", + "<div class=\"alert alert-block alert-info\">\n", + "<i class=\"fa fa-info-circle\"></i>\n", + "Better re-classification does not indicate here that <code>SVC</code> is better than <code>LogisticRegression</code>. At most it seems to fit better to our training data. We will learn later that this may actually not necessarily be a good thing.\n", + "</div>\n", "\n", - "### Instructions:\n", - "\n", - "- Play with parameter `C` for `LogisticRegresseion` and `SVC`.\n" + "Note that both `LogisticRegression` and `SVC` classifiers have a parameter `C` which allows to enforce simplification (know also as regularization) of the resulting model. Test the beers data \"re-classification\" with different values of this parameter." ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 16, "metadata": {}, + "outputs": [], + "source": [ + "?LogisticRegression\n", + "# ..." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/Users/uweschmitt/Projects/machinelearning-introduction-workshop/venv3.6/lib/python3.6/site-packages/ipykernel_launcher.py:9: UserWarning: get_ipython_dir has moved to the IPython.paths module since IPython 4.0.\n", + "/Users/mikolajr/Workspace/SSDM/machinelearning-introduction-workshop/.venv/lib/python3.7/site-packages/ipykernel_launcher.py:9: UserWarning: get_ipython_dir has moved to the IPython.paths module since IPython 4.0.\n", " if __name__ == '__main__':\n" ] }, @@ -1058,7 +1233,7 @@ "<IPython.core.display.HTML object>" ] }, - "execution_count": 75, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1164,13 +1339,6 @@ "css_styling()\n", "#REMOVEEND" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1189,7 +1357,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.7.1" } }, "nbformat": 4, diff --git a/classification-svc-2d-poly.png b/classification-svc-2d-poly.png new file mode 100644 index 0000000000000000000000000000000000000000..1f26ad59d3beecd513f298abea94bd4a34f078ca GIT binary patch literal 26460 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¥KPD4zqCW>n76CFiGZBx};UeVL6>H(b5 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 literal 0 HcmV?d00001 diff --git a/classifier_examples.ipynb b/classifier_examples.ipynb index b33e955..24acd18 100644 --- a/classifier_examples.ipynb +++ b/classifier_examples.ipynb @@ -662,6 +662,127 @@ "plt.scatter(xv, yv, color=colors)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SVC 2D plots" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "beer_data = pd.read_csv(\"beers.csv\")\n", + "input_features = beer_data.iloc[:, :-1]\n", + "labels = beer_data.iloc[:, -1]\n", + "# pick 2 features from `input_features.columns`\n", + "input_features_names = [\"bitterness\", \"darkness\"]\n", + "X = input_features[input_features_names]\n", + "y = labels\n", + "\n", + "'''Source: https://scikit-learn.org/stable/auto_examples/svm/plot_iris.html#sphx-glr-auto-examples-svm-plot-iris-py\n", + "'''\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "def make_meshgrid(x, y, h=.02):\n", + " \"\"\"Create a mesh of points to plot in\n", + "\n", + " Parameters\n", + " ----------\n", + " x: data to base x-axis meshgrid on\n", + " y: data to base y-axis meshgrid on\n", + " h: stepsize for meshgrid, optional\n", + "\n", + " Returns\n", + " -------\n", + " xx, yy : ndarray\n", + " \"\"\"\n", + " x_min, x_max = x.min() - 1, x.max() + 1\n", + " y_min, y_max = y.min() - 1, y.max() + 1\n", + " xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n", + " np.arange(y_min, y_max, h))\n", + " return xx, yy\n", + "\n", + "\n", + "def plot_contours(ax, clf, xx, yy, **params):\n", + " \"\"\"Plot the decision boundaries for a classifier.\n", + "\n", + " Parameters\n", + " ----------\n", + " ax: matplotlib axes object\n", + " clf: a classifier\n", + " xx: meshgrid ndarray\n", + " yy: meshgrid ndarray\n", + " params: dictionary of params to pass to contourf, optional\n", + " \"\"\"\n", + " Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n", + " Z = Z.reshape(xx.shape)\n", + " out = ax.contourf(xx, yy, Z, **params)\n", + " return out\n", + "\n", + "\n", + "\n", + "from sklearn import svm\n", + "\n", + "# we create an instance of SVM and fit out data. We do not scale our\n", + "# data since we want to plot the support vectors\n", + "C = 1.0 # SVM regularization parameter\n", + "models = (\n", + " svm.SVC(kernel='linear', C=C),\n", + " svm.LinearSVC(C=C),\n", + " svm.SVC(kernel='rbf', gamma=0.7, C=C),\n", + " svm.SVC(kernel='poly', degree=3, C=C),\n", + ")\n", + "models = [clf.fit(X, y) for clf in models]\n", + "\n", + "# title for the plots\n", + "titles = (\n", + " 'SVC with linear kernel',\n", + " 'LinearSVC (linear kernel)',\n", + " 'SVC with RBF kernel',\n", + " 'SVC with polynomial (degree 3) kernel',\n", + ")\n", + "\n", + "models = models[-1:]\n", + "titles = ('Is the beer yummy (blue) or not (red)?',)\n", + "\n", + "# Set-up 2x2 grid for plotting.\n", + "#fig, sub = plt.subplots(2, 2)\n", + "fig, sub = plt.subplots(1, 1)\n", + "plt.subplots_adjust(wspace=0.4, hspace=0.4)\n", + "\n", + "X0, X1 = X.iloc[:, 0], X.iloc[:, 1]\n", + "xx, yy = make_meshgrid(X0, X1)\n", + "\n", + "for clf, title, ax in zip(models, titles, sub.flatten() if hasattr(sub, 'flatten') else [sub]):\n", + " plot_contours(ax, clf, xx, yy,\n", + " cmap=plt.cm.coolwarm, alpha=0.8)\n", + " ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')\n", + " ax.set_xlim(xx.min(), xx.max())\n", + " ax.set_ylim(yy.min(), yy.max())\n", + " ax.set_xlabel(input_features_names[0])\n", + " ax.set_ylabel(input_features_names[1])\n", + " ax.set_xticks(())\n", + " ax.set_yticks(())\n", + " ax.set_title(title)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -686,7 +807,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.7.1" } }, "nbformat": 4, diff --git a/data_split.png b/data_split.png new file mode 100644 index 0000000000000000000000000000000000000000..c368e5cc652ee4df68d4d752182aa6a64fa4fa43 GIT binary patch literal 6755 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 E0K(W85C8xG literal 0 HcmV?d00001 diff --git a/regression-lin-1d.png b/regression-lin-1d.png new file mode 100644 index 0000000000000000000000000000000000000000..aea25afb7a18cdd8effb27010b5a4b56714b071b GIT binary patch literal 15438 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 aBiZGu%8RV3_dxA0NJ&8*TK2*$<o^T3FT5-O literal 0 HcmV?d00001 -- GitLab