Commit 14b2f280 authored by Leigh Smith's avatar Leigh Smith

Added evaluation notebook

parent 6da4af88
{
"metadata": {
"name": "",
"signature": "sha256:28793f27d0ebf2c2407b686acd72bc98485da8fd86b00986839688afb5e57c18"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Evaluation\n",
"----------\n",
"\n",
"Once we have computed results using our test set which can be compared against their ground truth labels, there are a number of evaluation methods to understand how well a classifier is performing, particularly when we want to compare different classifiers."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The simplest evaluation measures to produce are the 'True Positive', 'False Positive' and 'False Negative' counts."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"\n",
"positive_label = 1 # The label that we call correct.\n",
"\n",
"# An example set of labels for our ground truth\n",
"gt_labels = np.array([1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2])\n",
"\n",
"# Some example output from a classifier (i.e. model), with classification errors.\n",
"model_output = np.array([1,1,2,2,2,1,1,1,2,1,2,2,2,2,2,2,1,2,1,2])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 41
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With the true and false positive counts we can compute 'Precision', 'Recall' and 'F-Measure'. \n",
"Precision describes the ratio of correctly classified files against all which were classified as positive. That is, precision = #TP / (#TP + #FP). Hence:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Compute the number of true positives\n",
"tp = sum((model_output == gt_labels) * (gt_labels == positive_label) + 0.0)\n",
"# Determine precision by dividing the true positive count by the number of all claimed as positive.\n",
"precision = tp / sum((model_output == positive_label) + 0.0)\n",
"precision"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 42,
"text": [
"0.75"
]
}
],
"prompt_number": 42
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The false positive count counts the number of classifications as positive but did not match our ground truth labels."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fp = sum((model_output == positive_label) * (gt_labels != positive_label) + 0.0)\n",
"fp"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 43,
"text": [
"2.0"
]
}
],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The false negative count counts the number of incorrect classifications, labelled as negative, when the ground truth label was positive."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fn = sum((model_output != positive_label) * (gt_labels == positive_label) + 0.0)\n",
"fn"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 44,
"text": [
"4.0"
]
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall describes the ratio of correctly classified files against the files which were known to be correct. Recall = # TP / (# TP + # FN)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"recall = tp / (tp + fn)\n",
"recall"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 45,
"text": [
"0.59999999999999998"
]
}
],
"prompt_number": 45
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The F-score is the harmonic mean of precision and recall, combining both measures:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f_score = 2 * precision * recall / (precision + recall)\n",
"f_score"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 46,
"text": [
"0.66666666666666652"
]
}
],
"prompt_number": 46
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alternatively, often we want to understand the performance of a single classifier over a range of different threshold parameter settings. A \"Receiver Operating Characteristics\" (ROC) curve plots true positive rate vs. false positive rate for different parameter settings. This depicts the relative trade-offs between true positive (benefits) and false positive (costs) for each parameter value.\n",
"\n",
"Plotting this curve is made easy with scikit.learn's [ROC](http://scikit-learn.org/stable/modules/model_evaluation.html#receiver-operating-characteristic-roc) functions. It is however, restricted to binary classifications (i.e. snare vs. non-snare)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from sklearn.metrics import roc_curve\n",
"roc_curve?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# We can use roc_curve to produce the false and true positive rates for each example, given the labels and normalised scores. \n",
"# The scores represent the classifier's confidence of each classification.\n",
"# Since our classifications do not issue a confidence measure, we make them binary.\n",
"scores = (model_output == gt_labels) + 0.0\n",
"print scores\n",
"\n",
"# We indicate to roc_curve that the value 1 in gt_labels is our positive snare label.\n",
"fpr, tpr, thresholds = roc_curve(gt_labels, scores, pos_label=positive_label)\n",
"print fpr\n",
"print tpr\n",
"print thresholds"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 1. 1. 0. 0. 0. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 0. 1.\n",
" 0. 1.]\n",
"[ 0. 0.8 1. ]\n",
"[ 0. 0.6 1. ]\n",
"[ 2. 1. 0.]\n"
]
}
],
"prompt_number": 56
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The roc_auc_score function computes the area under the receiver operating characteristic (ROC) curve, which is also denoted by the acronyms AUC or AUROC. This summarises the behaviour of the system to one number."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from sklearn.metrics import roc_auc_score, auc\n",
"\n",
"y_true = np.array([0, 0, 1, 1])\n",
"y_scores = np.array([0.1, 0.4, 0.35, 0.8])\n",
"roc_auc = roc_auc_score(y_true, y_scores)\n",
"roc_auc"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 61,
"text": [
"0.75"
]
}
],
"prompt_number": 61
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"binary_labels = (gt_labels == positive_label) + 0\n",
"print binary_labels\n",
"roc_auc = roc_auc_score(binary_labels, scores)\n",
"\n",
"roc_auc"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 66,
"text": [
"0.39999999999999997"
]
}
],
"prompt_number": 66
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Alternatively the area under curve can be computed directly from the positive rates.\n",
"roc_auc = auc(fpr, tpr)\n",
"roc_auc"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 59,
"text": [
"0.39999999999999997"
]
}
],
"prompt_number": 59
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can then plot an ROC curve with matplotlib"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from matplotlib.pyplot import *\n",
"\n",
"clf()\n",
"plot(fpr, tpr, '-x', label='ROC curve (area = %0.2f)' % roc_auc)\n",
"# Plot the line of no discrimination\n",
"plot([0, 1], [0, 1], 'k--')\n",
"xlim([0.0, 1.0])\n",
"ylim([0.0, 1.0])\n",
"xlabel('False Positive Rate')\n",
"ylabel('True Positive Rate')\n",
"title('Receiver Operating Characteristic')\n",
"legend(loc=\"lower right\")\n",
"show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n/w8lX4hbcLTvYQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x3931b90>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment