Created
August 4, 2014 16:44
-
-
Save gregce/117661f388c0f778389b to your computer and use it in GitHub Desktop.
Scikit+Irisdata+SGD/SVM Ipython Notebook
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "metadata": { | |
| "name": "scikitlearn_practice.ipynb" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import sklearn as sk\n", | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 1 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from sklearn import datasets" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 2 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "iris = datasets.load_iris()\n", | |
| "x_iris, y_iris = iris.data, iris.target" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 4 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print y_iris" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", | |
| " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", | |
| " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2\n", | |
| " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n", | |
| " 2 2]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 10 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from sklearn.cross_validation import train_test_split" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 14 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from sklearn import preprocessing" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 15 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "X, y = x_iris[:, :2], y_iris\n", | |
| "# Split the dataset into a training and a testing set\n", | |
| "# Test set will be the 25% taken randomly\n", | |
| "X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=.25, random_state=33)\n" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 18 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print X_train.shape" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "(112, 2)\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 20 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print y_train" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "[1 0 1 1 1 0 0 1 0 2 0 0 1 2 0 1 2 2 1 1 0 0 2 0 0 2 1 1 2 2 2 2 0 0 1 1 0\n", | |
| " 1 2 1 2 0 2 0 1 0 2 1 0 2 2 0 0 2 0 0 0 2 2 0 1 0 1 0 1 1 1 1 1 0 1 0 1 2\n", | |
| " 0 0 0 0 2 2 0 1 1 2 1 0 0 1 1 1 0 1 1 0 2 2 2 1 2 0 1 0 0 0 2 1 2 1 2 1 2\n", | |
| " 0]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 22 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "#Standardize the features\n", | |
| "scaler=preprocessing.StandardScaler().fit(X_train)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 23 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "?scaler" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 24 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "X_train = scaler.transform(X_train)\n", | |
| "X_test = scaler.transform(X_test)\n", | |
| "#Basically what is happening here is that we calculate the average, subtract\n", | |
| "#the mean value from the feature value and divide the result by their standad deviation. " | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 25 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import matplotlib.pyplot as plt" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 26 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "colors = ['red','greenyellow','blue']" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 27 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "?colors" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 28 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print colors" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "['red', 'greenyellow', 'blue']\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 29 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "for i in xrange(len(colors)):\n", | |
| " xs = X_train[:,0][y_train == i]\n", | |
| " ys = X_train[:,1][y_train == i]\n", | |
| " plt.scatter(xs, ys, c=colors[i])\n", | |
| "plt.legend(iris.target_names)\n", | |
| "plt.xlabel('Sepal length')\n", | |
| "plt.ylabel('Sepal width')" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 33, | |
| "text": [ | |
| "<matplotlib.text.Text at 0x10cba93d0>" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nDfT/c6BZ792FgXMAAAAASUVORK5CYII=\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x10cb14c10>" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 33 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from sklearn.linear_model import SGDClassifier\n", | |
| "#We are going to try and use linear classification to seperate Setosa from \n", | |
| "#the other classes\n", | |
| "from sklearn.svm import SVC" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 69 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "clf = SGDClassifier()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 36 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "?clf.fit" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 38 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "??clf.fit" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 39 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "clf.fit(X_train, y_train)\n", | |
| "#will create a three binary classification problem" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 42, | |
| "text": [ | |
| "SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,\n", | |
| " fit_intercept=True, l1_ratio=0.15, learning_rate='optimal',\n", | |
| " loss='hinge', n_iter=5, n_jobs=1, penalty='l2', power_t=0.5,\n", | |
| " random_state=None, rho=None, shuffle=False, verbose=0,\n", | |
| " warm_start=False)" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 42 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print clf.coef_" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "[[-28.56232699 15.06870628]\n", | |
| " [ -8.94402784 -8.14000854]\n", | |
| " [ 14.04159132 -12.8156682 ]]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 41 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print clf.predict(scaler.transform([[4.7,3.1]]))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "[0]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 44 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "#The simplest performance measure is accuracy: given a classifier and an evaluation dataset,\n", | |
| "#it measures the proportion of instances correctly classified by the classifier.\n", | |
| "#Testing accuracy on training set (this is a bad idea because the model has \n", | |
| "#seen this data\n", | |
| "\n", | |
| "from sklearn import metrics\n", | |
| "y_train_pred = clf.predict(X_train)\n", | |
| "print metrics.accuracy_score(y_train, y_train_pred)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "0.821428571429\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 45 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "y_pred = clf.predict(X_test)\n", | |
| "print metrics.accuracy_score(y_test, y_pred)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "0.684210526316\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 46 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "#Accuracy on the test set is a good performance measure when \n", | |
| "#the number of instances of each class is similar, that is, we have\n", | |
| "#a uniform distribution of classes. But if you have a skewed distribution \n", | |
| "#(say, 99 percent of the instances belong to one class), a classifier \n", | |
| "#that always predicts the majority class could have an excellent \n", | |
| "#performance in terms of accuracy despite the fact that it is an\n", | |
| "#extremely naive method." | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 47 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print metrics.classification_report(y_test, y_pred,target_names=iris.target_names)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| " precision recall f1-score support\n", | |
| "\n", | |
| " setosa 1.00 1.00 1.00 8\n", | |
| " versicolor 0.43 0.27 0.33 11\n", | |
| " virginica 0.65 0.79 0.71 19\n", | |
| "\n", | |
| "avg / total 0.66 0.68 0.66 38\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 49 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "# now lets try to use cross validation. \n", | |
| "\n", | |
| "from sklearn.cross_validation import cross_val_score, KFold\n", | |
| "from sklearn.pipeline import Pipeline\n", | |
| "#create a composite estimator made by a piepline of the standardization and the linear m" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 50 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "?Pipeline" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 51 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "clf = Pipeline([('scaler', preprocessing.StandardScaler()\n", | |
| " ),('linear_model', SGDClassifier())])" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 54 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "clf2 = Pipeline([('scaler', preprocessing.StandardScaler()\n", | |
| " ),('linear_model', SVC())])" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 71 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "#create a k-fold cross validation iterator of k=5 folds\n", | |
| "cv=KFold(X.shape[0], 5, shuffle=True, random_state=25)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 66 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "scores=cross_val_score(clf2, X, y, cv=cv)\n", | |
| "print scores" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "[ 0.8 0.8 0.73333333 0.86666667 0.83333333]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 72 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from scipy.stats import sem\n", | |
| "def mean_score(scores):\n", | |
| " return (\"Mean score: {0:.3f} \\\n", | |
| " (+/- {1:.3f})\").format(np.mean(scores), sem(scores))\n", | |
| "print mean_score(scores)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Mean score: 0.807 (+/- 0.022)\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 73 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment