{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Machine Learning – A Gentle Introduction" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# import\n", "from sklearn.datasets import load_iris\n", "from sklearn.linear_model import SGDClassifier\n", "from sklearn.cross_validation import train_test_split, KFold, cross_val_score\n", "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n", "from sklearn import preprocessing, pipeline\n", "\n", "import numpy as np\n", "import scipy as sp\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "%matplotlib inline\n", "sns.set()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']\n", "['setosa' 'versicolor' 'virginica']\n" ] } ], "source": [ "#Loading the IRIS dataset\n", "iris_data = load_iris()\n", "\n", "X = iris_data['data']\n", "y = iris_data['target']\n", "\n", "print(iris_data['feature_names'])\n", "print(iris_data['target_names'])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 5. 2.3 3.3 1. ]\n", " [ 4.9 3.1 1.5 0.1]]\n", "X_train shape (112, 4)\n", "X_test shape (38, 4)\n", "[[-0.91090798 -1.59761476 -0.15438202 -0.14641523]\n", " [-1.0271058 0.09442168 -1.15513491 -1.35614105]]\n" ] } ], "source": [ "# splitting and Pre-Processing the data\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)\n", "print(X_train[:2])\n", "print(\"X_train shape\", X_train.shape)\n", "print(\"X_test shape\", X_test.shape)\n", "\n", "# Preprocessing and Standardize the features\n", "scaler = preprocessing.StandardScaler().fit(X_train)\n", "\n", "X_train = scaler.transform(X_train)\n", "X_test = scaler.transform(X_test)\n", "print(X_train[:2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** SGDClassifier ** \n", "\n", " SGD stands for Stochastic Gradient Descent, a very popular numerical procedure \n", " to find the local minimum of a function (in this case, the loss function, which \n", " measures how far every instance is from our boundary). The algorithm will learn the \n", " coefficients of the hyperplane by minimizing the loss function." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "coefficient [[ -9.18360001 12.3553701 -20.48666511 -19.67619653]\n", " [ -7.45335653 -10.85334472 17.47448214 -25.00324191]\n", " [ 0.14640522 1.04172728 31.69797189 35.7343131 ]]\n", "intercept: [-19.53199304 -3.39921378 -46.95465167]\n", "[0]\n", "Model Accuracy on Train data: 0.910714285714\n", "Model Accuracy on Test data: 0.894736842105\n" ] } ], "source": [ "# instantiate\n", "sgd = SGDClassifier()\n", "\n", "# fitting\n", "sgd.fit(X_train, y_train)\n", "\n", "# coefficient\n", "print(\"coefficient\", sgd.coef_)\n", "\n", "# intercept\n", "print(\"intercept: \", sgd.intercept_)\n", "\n", "# predicting for one\n", "y_pred = sgd.predict(scaler.transform([[4.9,3.1,1.5,0.1]]))\n", "print(y_pred)\n", "\n", "# predicting for X_test\n", "y_pred = sgd.predict(X_test)\n", "\n", "# checking accuracy score\n", "print(\"Model Accuracy on Train data: \", accuracy_score(y_train, sgd.predict(X_train)))\n", "print(\"Model Accuracy on Test data: \", accuracy_score(y_test, y_pred))\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n7XKTq0o9nOkEAAAYhH322UfXXUfI3BPOdAIAAMBwhE4AAAAYjtAJAAAAwxE6AQAAYDhCJwAAAAxH\n6AQAAIDhCJ0AAAAG+fGPf6CnnnpiUOvYsuVjzZo1TVu2bElSVebgOZ0AAAAGufPO1crOzhn0enb9\nTvZ0RegEAAAwSO/3sYPQCQAAUkRHd4ee3fxXjRkxVtMLZhh6dm/p0suVlZWlJUuq+saqqpYoOztH\nZWVn6aabrteGDf+S2z1O3/veCTrjjLNks9n01FNP6PHH/yC3e6z8/pd00UWX6Gtf21833VSjd955\nW7m5o/WDH5ysM844S9KOy+uLFp2t7373BIXDYd1552168sk/qrNzu6ZNm6HFiy9Tbu5odXV16c47\nb9PTT69XW1urpk6dpgsvvET5+eO/VHtbW5t++1uf/v73Z9XV1amZM4/SBRcs1qhRoxQIbJDX+ws9\n99y/+n7/uuuukiRdfvlS3X337/TOO2+rra1V77//rq677kYdemiJYft5V3ymEwAAmG7t62s0e92R\nWvjUT3XK4/P03Ydn672Wdw2bb+7c4/TCC88pHA5Lkrq7u/Xii89rzpxjtWTJYo0bt49WrbpfS5Ys\n1dNPr9fq1Xf3Lfvaa69o//0P0O9+t0qHHz5D1dVL9V//daDuvfchXXrpFbrvvtX6v/974Utz3nHH\nrVq//klVVlbp9ttXqbn5My1fXiNJWr78Oj333N905ZXX6Pbb69TT06NLL72ob9loNNr335dddpHe\nffcdLV++Qrfc8lt9+OEHfcFS2vOl+L///Vkdd9x3tWLFbTrooIMT24EJSHro3LRpk84880yVlJRo\n9uzZuuuuu5I9BQAAyCANHQ26/p/X6r3PN0qSusJd8jdu0IV/+5Vhc86YMVORSFR+/0uSpH/840WN\nGDFCNptNDQ0N+vWvl2jixEIVF0/ReeeVa926tX3L2u12lZaWqahoX40ePUZbtnyk3NzRGj9+vA4/\nfIZuueW3mjTpwC/N+cQTj+rss8/TtGkztO++X9XixZdrv/32V1tbm/7856d00UWXqrh4ivbb7wBd\neWW16us/1L/+9X8x69i48R298kpQS5dWa9KkA3Xggd/QlVdereeff0b19Zv2atvd7rH6wQ9O1gEH\nfF1ZWVmD2IvxSerl9Wg0qrPPPluHHnqoHnvsMX3wwQe68MILVVBQoO9///vJnAoAAGSIu1/9nbZ0\n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\nYMN04RMxi58AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# let's plot the data\n", "plt.figure(figsize=(8,6))\n", "\n", "plt.scatter(X_train[:,0][y_train==0],X_train[:,1][y_train==0],color='red', label='setosa')\n", "plt.scatter(X_train[:,0][y_train==1],X_train[:,1][y_train==1],color='blue', label='verginica')\n", "plt.scatter(X_train[:,0][y_train==2],X_train[:,1][y_train==2],color='green', label='versicolour')\n", "\n", "plt.legend(loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Classification Report ** \n", "\n", " Accuracy = (TP+TN)/m \n", " Precision = TP/(TP+FP) \n", " Recall = TP/(TP+FN) \n", " F1-score = 2 * Precision * Recall / (Precision + Recall) \n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 8\n", " 1 0.82 0.82 0.82 11\n", " 2 0.89 0.89 0.89 19\n", "\n", "avg / total 0.89 0.89 0.89 38\n", "\n" ] } ], "source": [ "# predicting \n", "print(classification_report(y_pred=y_pred, y_true=y_test))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 8, 0, 0],\n", " [ 0, 9, 2],\n", " [ 0, 2, 17]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "confusion_matrix(y_pred=y_pred, y_true=y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Using a pipeline mechanism to build and test our model " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.93333333 0.9 0.83333333 0.86666667 0.86666667]\n" ] } ], "source": [ "# create a composite estimator made by a pipeline of the standarization and the linear model\n", "clf = pipeline.Pipeline([\n", " ('scaler', preprocessing.StandardScaler()),\n", " ('linear_model', SGDClassifier())\n", "])\n", "\n", "# create a k-fold cross validation iterator of k=5 folds\n", "cv = KFold(X.shape[0], 5, shuffle=True, random_state=33)\n", "\n", "# by default the score used is the one returned by score method of the estimator (accuracy)\n", "scores = cross_val_score(clf, X, y, cv=cv)\n", "\n", "print(scores)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.88 0.016996731712\n" ] } ], "source": [ "# mean accuracy \n", "print(np.mean(scores), sp.stats.sem(scores))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "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.2" } }, "nbformat": 4, "nbformat_minor": 0 }