{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "*This notebook contains an excerpt from the book [Machine Learning for OpenCV](https://www.packtpub.com/big-data-and-business-intelligence/machine-learning-opencv) by Michael Beyeler.\n", "The code is released under the [MIT license](https://opensource.org/licenses/MIT),\n", "and is available on [GitHub](https://github.com/mbeyeler/opencv-machine-learning).*\n", "\n", "*Note that this excerpt contains only the raw code - the book is rich with additional explanations and illustrations.\n", "If you find this content useful, please consider supporting the work by\n", "[buying the book](https://www.packtpub.com/big-data-and-business-intelligence/machine-learning-opencv)!*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Applying Lasso and Ridge Regression](03.04-Applying-Lasso-and-Ridge-Regression.ipynb) | [Contents](../README.md) | [Representing Data and Engineering Features](04.00-Representing-Data-and-Engineering-Features.ipynb) >" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Classifying Iris Species Using Logistic Regression\n", "\n", "Another famous dataset in the world of machine learning is called the **Iris dataset**.\n", "\n", "The Iris\n", "dataset contains measurements of 150 iris flowers from three different species: setosa,\n", "versicolor, and viriginica. These measurements include the length and width of the petals,\n", "and the length and width of the sepals, all measured in centimeters.\n", "\n", "Our goal is to build a machine learning model that can learn the measurements of these iris\n", "flowers, whose species are known, so that we can predict the species for a new iris flower." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Understanding logistic regression\n", "\n", "Despite its name, **logistic regression** can actually be used as a model for classification. It\n", "uses a **logistic function** (or **sigmoid**) to convert any real-valued input $x$ into a predicted\n", "output value $ŷ$ that takes values between 0 and 1. Rounding $ŷ$ to the nearest integer effectively classifies the input as belonging either to class\n", "0 or 1.\n", "\n", "Of course, most often, our problems have more than one input or feature value, x. For\n", "example, the Iris dataset provides a total of four features.\n", "To find out how logistic regression works in these cases, please refer to the book." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Logistic Regression in OpenCV\n", "\n", "### Loading the dataset\n", "The Iris dataset is included with scikit-learn. We first load all the necessary modules, as we\n", "did in our earlier examples:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import cv2\n", "\n", "from sklearn import datasets\n", "from sklearn import model_selection\n", "from sklearn import metrics\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "plt.style.use('ggplot')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, loading the dataset is a one-liner:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "iris = datasets.load_iris()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function returns a dictionary we call `iris`, which contains a bunch of different fields:\n", "- `DESCR`: Get a description of the data\n", "- `data`: The actual data, <`num_samples` x `num_features`>\n", "- `feature_names`: The names of the features\n", "- `target`: The class labels, <`num_samples` x 1>\n", "- `target_names`: The names of the class labels" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['DESCR', 'data', 'feature_names', 'target', 'target_names']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(iris)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, all the data points are contained in `'data'`. There are 150 data points, each of which\n", "have four feature values:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(150, 4)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris.data.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These four features correspond to the sepal and petal dimensions mentioned earlier:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['sepal length (cm)',\n", " 'sepal width (cm)',\n", " 'petal length (cm)',\n", " 'petal width (cm)']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris.feature_names" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For every data point, we have a class label stored in `target`:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(150,)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris.target.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also inspect the class labels, and find that there is a total of three classes:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.unique(iris.target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making it a binary classification problem\n", "\n", "For the sake of simplicity, we want to focus on a **binary classification problem** for now,\n", "where we only have two classes. The easiest way to do this is to discard all data points\n", "belonging to a certain class, such as class label 2, by selecting all the rows that *do not* belong\n", "to class 2:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "idx = iris.target != 2\n", "data = iris.data[idx].astype(np.float32)\n", "target = iris.target[idx].astype(np.float32)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inspecting the data\n", "\n", "Before you get started with setting up a model, it is always a good idea to have a look at the data. We did this above for the town map example, so let's continue our streak. Using Matplotlib, we create a **scatter plot** where the color of each data point corresponds to the class label.\n", "\n", "To make plotting easier, we limit ourselves to the first two features\n", "(`iris.feature_names[0]` being the sepal length and `iris.feature_names[1]` being\n", "the sepal width). We can see a nice separation of classes in the following figure:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 6))\n", "plt.scatter(data[:, 0], data[:, 1], c=target, cmap=plt.cm.Paired, s=100)\n", "plt.xlabel(iris.feature_names[0])\n", "plt.ylabel(iris.feature_names[1]);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Splitting the data into training and test sets\n", "\n", "We learned in the previous chapter that it is essential to keep training and test data\n", "separate. We can easily split the data using one of scikit-learn's many helper functions:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = model_selection.train_test_split(\n", " data, target, test_size=0.1, random_state=42\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we want to split the data into 90 percent training data and 10 percent test data, which\n", "we specify with `test_size=0.1`. By inspecting the return arguments, we note that we\n", "ended up with exactly 90 training data points and 10 test data points:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((90, 4), (90,))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.shape, y_train.shape" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((10, 4), (10,))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_test.shape, y_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training the classifier\n", "\n", "Creating a logistic regression classifier involves pretty much the same steps as setting up $k$-NN:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "lr = cv2.ml.LogisticRegression_create()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then have to specify the desired training method. Here, we can choose\n", "`cv2.ml.LogisticRegression_BATCH` or `cv2.ml.LogisticRegression_MINI_BATCH`.\n", "For now, all we need to know is that we want to update the model after every data point,\n", "which can be achieved with the following code:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "lr.setTrainMethod(cv2.ml.LogisticRegression_MINI_BATCH)\n", "lr.setMiniBatchSize(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also want to specify the number of iterations the algorithm should run before it\n", "terminates:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "lr.setIterations(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can then call the `train` method of the object (in the exact same way as we did earlier),\n", "which will return `True` upon success:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "lr.train(X_train, cv2.ml.ROW_SAMPLE, y_train);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Retrieve the learned weights:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.04109113, -0.01968078, -0.16216497, 0.28704911, 0.11945518]], dtype=float32)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lr.get_learnt_thetas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Testing the classifier\n", "\n", "Let's see for ourselves by calculating the accuracy score on the training set:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ret, y_pred = lr.predict(X_train)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metrics.accuracy_score(y_train, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Perfect score! However, this only means that the model was able to perfectly **memorize** the\n", "training dataset. This does not mean that the model would be able to classify a new, unseen\n", "data point. For this, we need to check the test dataset:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ret, y_pred = lr.predict(X_test)\n", "metrics.accuracy_score(y_test, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Luckily, we get another perfect score! Now we can be sure that the model we built is truly\n", "awesome." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Applying Lasso and Ridge Regression](03.04-Applying-Lasso-and-Ridge-Regression.ipynb) | [Contents](../README.md) | [Representing Data and Engineering Features](04.00-Representing-Data-and-Engineering-Features.ipynb) >" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.3" } }, "nbformat": 4, "nbformat_minor": 1 }