{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Lab 07: Nearest neighbors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this lab, we will apply nearest neighbors classification to the Endometrium vs. Uterus cancer data. For documentation, see:\n", "* http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbors-classification; and \n", "* http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier\n", "\n", "\n", "Let us start by setting up our environment, loading the data, and setting up our cross-validation." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "import pandas as pd\n", "%pylab inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load the data as in the previous labs. We will use `small_Endometrium_Uterus.csv` for this lab." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(183, 3000)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn import preprocessing\n", "\n", "# load the endometrium vs. uterus tumor data\n", "endometrium_data = pd.read_csv('data/small_Endometrium_Uterus.csv', sep=\",\") # load data\n", "endometrium_data.head(n=5) # adjust n to view more data\n", "\n", "# Create the design matrix and target vector\n", "X_clf = endometrium_data.drop(['ID_REF', 'Tissue'], axis=1).values\n", "y_clf = pd.get_dummies(endometrium_data['Tissue']).values[:,1]\n", "\n", "print(X_clf.shape)\n", "plt.scatter(X_clf[:,0], X_clf[:,1], c=y_clf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recall functions we had used to create cross validation folds in the previous labs. Redefine them here. \n", "\n", "*Note* : We shall call this *m*-fold cross validation, unlike *k*-fold, which we used in our previous labs, to distinguish it from *k*-nearest neighbors classification. This emphasizes that the two parameters are indeed different from each other." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn import model_selection\n", "\n", "def stratifiedMFolds(y, num_folds):\n", " kf = model_selection.StratifiedKFold(n_splits=num_folds)\n", " folds_ = [(tr, te) for (tr, te) in kf.split(np.zeros(y.size), y)]\n", " return folds_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now create 10 cross validate folds on the data. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "cv_folds = stratifiedMFolds(y_clf, 10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import the previously written cross validation function." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# let's redefine the cross-validation procedure with standardization\n", "from sklearn import preprocessing\n", "def cross_validate(design_matrix, labels, regressor, cv_folds):\n", " \"\"\" Perform a cross-validation and returns the predictions. \n", " Use a scaler to scale the features to mean 0, standard deviation 1.\n", " \n", " Parameters:\n", " -----------\n", " design_matrix: (n_samples, n_features) np.array\n", " Design matrix for the experiment.\n", " labels: (n_samples, ) np.array\n", " Vector of labels.\n", " classifier: Regressor instance; must have the following methods:\n", " - fit(X, y) to train the regressor on the data X, y\n", " - predict_proba(X) to apply the trained regressor to the data X and return predicted values\n", " cv_folds: sklearn cross-validation object\n", " Cross-validation iterator.\n", " \n", " Return:\n", " -------\n", " pred: (n_samples, ) np.array\n", " Vectors of predictions (same order as labels).\n", " \"\"\"\n", " \n", " n_classes = np.unique(labels).size\n", " pred = np.zeros((labels.shape[0], n_classes))\n", " for tr, te in cv_folds:\n", " scaler = preprocessing.StandardScaler()\n", " Xtr = scaler.fit_transform(design_matrix[tr,:])\n", " ytr = labels[tr]\n", " Xte = scaler.transform(design_matrix[te,:])\n", " regressor.fit(Xtr, ytr)\n", " pred[te, :] = regressor.predict_proba(Xte)\n", " return pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. *k*-Nearest Neighbours Classifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A k-neighbours classifier can be initialised as `knn_clf = sklearn.neighbors.KNeighborsClassifier(n_neighbors=k)`\n", "\n", "Cross validate 20 *k*-NN classifiers on the loaded datset using `cross_validate`. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from sklearn import neighbors\n", "from sklearn import metrics\n", "\n", "aurocs_clf = []\n", "# Create a range of values of k. We will use this throughout the lab.\n", "k_range = range(1,40,2) \n", "\n", "for k in k_range:\n", " clf = neighbors.KNeighborsClassifier(n_neighbors=k)\n", " y_pred = cross_validate(X_clf, y_clf, clf, cv_folds)\n", " \n", " fpr, tpr, thresholdss = metrics.roc_curve(y_clf, y_pred[:,1])\n", " aurocs_clf.append(metrics.auc(fpr,tpr))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Question:__ Plot the AUC as a function of the number of nearest neighbours chosen." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Nearest neighbours classification - cross validated AUC.')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(list(range(1,40,2)), aurocs_clf)\n", "plt.xlabel('Number of nearest neighbours', fontsize=14)\n", "plt.ylabel('Cross-validated AUC', fontsize=14)\n", "plt.title('Nearest neighbours classification - cross validated AUC.', fontsize=14)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question.** Find the best value for the parameter `n_neighbors` by finding the one that gives the maximum value of AUC." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us now use `sklearn.model_selection.GridSearchCV` do to the same. The parameter to be cross-validated is the number of nearest neighbours to choose. Use an appropriate list to feed to `GridSearchCV` to find the best value for the nearest neighbours parameter." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "GridSearchCV(cv=[(array([ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n", " 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,\n", " 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,\n", " 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n", " 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,\n", " 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,\n", " 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,\n", " 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 12...\n", " 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,\n", " 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,\n", " 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,\n", " 156, 157, 158, 159, 160, 161, 162, 163, 164]),\n", " array([165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,\n", " 178, 179, 180, 181, 182]))],\n", " estimator=KNeighborsClassifier(),\n", " param_grid={'n_neighbors': range(1, 40, 2)}, scoring='roc_auc')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import model_selection\n", "from sklearn import metrics\n", "\n", "classifier = neighbors.KNeighborsClassifier()\n", "\n", "param_grid = {'n_neighbors': k_range}\n", "clf_knn_opt = model_selection.GridSearchCV(classifier, \n", " param_grid=param_grid, \n", " cv=cv_folds,\n", " scoring='roc_auc')\n", "clf_knn_opt.fit(X_clf, y_clf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Question:__ What is now the optimal parameter?" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'n_neighbors': 25}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Find the best parameter\n", "clf_knn_opt.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try choosing different scoring metrics for GridSearchCV, and see how the result changes. You can find scoring metrics [here](http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now compare the performance of the *k*-nearest neighbours classifier with logistic regularisation (both, non-regularised, and regularised)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n", "/home/wbader/miniconda3/envs/tp-ml/lib/python3.6/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n" ] } ], "source": [ "from sklearn import linear_model\n", "\n", "clf_logreg_l2 = linear_model.LogisticRegression()\n", "logreg_params = {'C':[1e-3, 1e-2, 1e-1, 1., 1e2]}\n", " \n", "clf_logreg_opt = model_selection.GridSearchCV(clf_logreg_l2, \n", " param_grid=logreg_params, \n", " cv=cv_folds,\n", " scoring='accuracy')\n", "clf_logreg_opt.fit(X_clf, y_clf)\n", "ypred_clf_logreg_opt = cross_validate(X_clf, y_clf, \n", " clf_logreg_opt.best_estimator_, \n", " cv_folds)\n", "fpr_clf_logreg_opt, tpr_clf_logreg_opt, thresh = metrics.roc_curve(y_clf, \n", " ypred_clf_logreg_opt[:,1])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "clf_logreg = linear_model.LogisticRegression(C=1e12)\n", "\n", "ypred_clf_logreg = cross_validate(X_clf, y_clf, \n", " clf_logreg, \n", " cv_folds)\n", "fpr_clf_logreg, tpr_clf_logreg, thresh = metrics.roc_curve(y_clf, \n", " ypred_clf_logreg[:, 1])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ypred_clf_knn_opt = cross_validate(X_clf, y_clf, clf_knn_opt.best_estimator_, cv_folds)\n", "fpr_clf_knn_opt, tpr_clf_knn_opt, thresh = metrics.roc_curve(y_clf, ypred_clf_knn_opt[:, 1])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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c+DAAc6cOZNpEuCN0NBQEhISXO9T/w8LCztn2vXr19OmTRu+/vprbr31VjZt2kTLli2Jjo6mRYsWrum++eYb+vXrx7x58yhznv1zKJUfaA2Ayleio6PZsWOH6/3OnTuJjo4GoEKFCuzevds1bteuXRnOJywsjJEjR7J161ZmzJjhunQAmXc8EhMTw6FDhzhy5EimcQYHB/Pqq6/y999/880337g+O2fOnDRnoidPnqRixYrnxH7ixAkOHjyYZp7uccXExBAcHMyBAwdc80pISGDNmjWALZw//PBD4uPjGTNmDN27d3e1hXjqqaf4/fffWbNmDRs3bvR43Tz9dk5KSuLgwYNUrFgx0/X2xsSJE9m6dStRUVFERUXx7LPPcuDAAebMmQPYuy7SX3bZtm0bMTExFCpUiGuvvZZixYq5tqsnkydPJjQ0NMPXzp07AahTp46rER/AqlWrKF++/DnJF8Dq1aupWbMmt912G4UKFaJmzZq0aNHCFTfA3Llz6dq1KzNmzODyyy+/gK2klO9pAqB8Jjk5mZMnT7peZ86coV27dgwfPpz9+/dz4MABhg4dyoMPPgjAAw88wLhx41i3bh3Hjx9n6NChGc575syZbN68GWMMJUuWJCgoyHWbX/ny5dm6davHz6Xebta9e3cOHz5McnJymuvi7ooWLUrv3r1dcXTr1o0BAwa4Ctb9+/e7Wq3fd999zJgxg19++YXTp08zePDgTBvVVahQgWbNmtG7d28SEhI4e/YsW7ZsYfHixQB8/vnnroQiMjISESEoKIiVK1fy66+/kpycTEhICMWKFfN4e2P79u0ZN24ccXFxnDp1iv79+9OgQQPX2f/5WrZsGVu2bGHFihXExcURFxfH6tWrad++vesywL333susWbP44YcfSElJIT4+nuHDh9O2bVvAVtMPHTqUHj168M0333D8+HGSk5OZM2cOzz33HGBrFRITEzN8pV4C6NSpEx9//DFr167l8OHDDB8+nM6dO3uM/corr2TTpk0sWLAAYwxbtmxh5syZ1K1bF7DtJjp06MCXX35J/fr1L2g7KZUvGGP0lcuvq6++2pyPFU/cZQyYmz5sbJqMa5LhK2hAuAl/usk5n1+7du15LTcvVKlSxQBpXgMGDDAnTpwwTz75pImKijJRUVHmySefNCdOnHB97uWXXzbly5c3FSpUMO+//74B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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(6, 6))\n", "\n", "logreg_l2_h, = plt.plot(fpr_clf_logreg_opt, tpr_clf_logreg_opt, 'b-')\n", "logreg_h, = plt.plot(fpr_clf_logreg, tpr_clf_logreg, 'g-')\n", "knn_h, = plt.plot(fpr_clf_knn_opt, tpr_clf_knn_opt, 'r-')\n", "logreg_l2_auc = metrics.auc(fpr_clf_logreg_opt, tpr_clf_logreg_opt)\n", "logreg_auc = metrics.auc(fpr_clf_logreg, tpr_clf_logreg)\n", "knn_auc = metrics.auc(fpr_clf_knn_opt, tpr_clf_knn_opt)\n", "\n", "logreg_legend = 'LogisticRegression. AUC=%.2f' %(logreg_auc)\n", "logreg_l2_legend = 'Regularised LogisticRegression. AUC=%.2f' %(logreg_l2_auc)\n", "knn_legend = 'KNeighborsClassifier. AUC=%.2f' %(knn_auc)\n", "plt.legend([logreg_h, logreg_l2_h, knn_h], \n", " [logreg_legend, logreg_l2_legend, knn_legend], fontsize=12)\n", "plt.xlabel('False Positive Rate', fontsize=16)\n", "plt.ylabel('True Positive Rate', fontsize=16)\n", "plt.title('ROC Curves comparison for logistic regression and k-nearest neighbours classifier.')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Setting the distance metric\n", "__Question__ You will notice that *k*-nearest neighbours classifiers measure distances between points to determine similarity. By default, we use the Euclidean distance metric. Often, using other distance metrics can prove to be helpful. Try to change the distance metric used here by passing it as an argument to the declaration of the classifier. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Metric = manhattan | k = 1 | AUC = 0.594.\n", "Metric = manhattan | k = 3 | AUC = 0.690.\n", "Metric = manhattan | k = 5 | AUC = 0.676.\n", "Metric = manhattan | k = 7 | AUC = 0.710.\n", "Metric = manhattan | k = 9 | AUC = 0.730.\n", "Metric = manhattan | k = 11 | AUC = 0.702.\n", "Metric = manhattan | k = 13 | AUC = 0.718.\n", "Metric = manhattan | k = 15 | AUC = 0.699.\n", "Metric = manhattan | k = 17 | AUC = 0.715.\n", "Metric = manhattan | k = 19 | AUC = 0.743.\n", "Metric = manhattan | k = 21 | AUC = 0.752.\n", "Metric = manhattan | k = 23 | AUC = 0.747.\n", "Metric = manhattan | k = 25 | AUC = 0.757.\n", "Metric = manhattan | k = 27 | AUC = 0.774.\n", "Metric = manhattan | k = 29 | AUC = 0.782.\n", "Metric = manhattan | k = 31 | AUC = 0.786.\n", "Metric = manhattan | k = 33 | AUC = 0.768.\n", "Metric = manhattan | k = 35 | AUC = 0.770.\n", "Metric = manhattan | k = 37 | AUC = 0.766.\n", "Metric = manhattan | k = 39 | AUC = 0.761.\n", "Metric = chebyshev | k = 1 | AUC = 0.504.\n", "Metric = chebyshev | k = 3 | AUC = 0.498.\n", "Metric = chebyshev | k = 5 | AUC = 0.535.\n", "Metric = chebyshev | k = 7 | AUC = 0.517.\n", "Metric = chebyshev | k = 9 | AUC = 0.519.\n", "Metric = chebyshev | k = 11 | AUC = 0.523.\n", "Metric = chebyshev | k = 13 | AUC = 0.543.\n", "Metric = chebyshev | k = 15 | AUC = 0.535.\n", "Metric = chebyshev | k = 17 | AUC = 0.525.\n", "Metric = chebyshev | k = 19 | AUC = 0.523.\n", "Metric = chebyshev | k = 21 | AUC = 0.534.\n", "Metric = chebyshev | k = 23 | AUC = 0.531.\n", "Metric = chebyshev | k = 25 | AUC = 0.539.\n", "Metric = chebyshev | k = 27 | AUC = 0.543.\n", "Metric = chebyshev | k = 29 | AUC = 0.520.\n", "Metric = chebyshev | k = 31 | AUC = 0.528.\n", "Metric = chebyshev | k = 33 | AUC = 0.514.\n", "Metric = chebyshev | k = 35 | AUC = 0.514.\n", "Metric = chebyshev | k = 37 | AUC = 0.497.\n", "Metric = chebyshev | k = 39 | AUC = 0.494.\n" ] } ], "source": [ "classifiers = {} \n", "y_preds = {} \n", "# Fix a set of distance metrics to use\n", "d_metrics = [\"manhattan\", \"chebyshev\"]\n", "aurocs = {} \n", "\n", "for m in d_metrics:\n", " aurocs[m] = [] \n", " for k in k_range: \n", " classifiers[m] = neighbors.KNeighborsClassifier(n_neighbors=k, metric=m)\n", " y_preds[m] = cross_validate(X_clf, y_clf, classifiers[m], cv_folds)\n", " \n", " fpr, tpr, thresholds = metrics.roc_curve(y_clf, y_preds[m][:,1])\n", " auc = metrics.auc(fpr, tpr)\n", " aurocs[m].append(auc) \n", " \n", " print ('Metric = %-12s | k = %3d | AUC = %.3f.' %(m, k, aurocs[m][-1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us now plot ROC curves for all the metrics together." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "f = plt.figure(figsize=(9, 6))\n", "\n", "for i in range(len(d_metrics)): \n", " plt.plot(k_range, aurocs[d_metrics[i]])\n", "\n", "plt.plot(k_range, [logreg_l2_auc for kval in k_range]) \n", " \n", "plt.xlabel('Number of nearest neighbors', fontsize=14)\n", "plt.ylabel('Cross-validated AUC', fontsize=14)\n", "plt.title('Nearest neighbors classification', fontsize=14)\n", "\n", "legends = [m for m in d_metrics]\n", "legends.append('Logistic regression')\n", "plt.legend(legends, fontsize=12)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.6.13" } }, "nbformat": 4, "nbformat_minor": 2 }