\n",
"Micro-averaging: In micro-averaging, we aggregate the binary metrics over all the classes. This means that we sum up the number of true positives, false positives, false negatives, and true negatives over all the classes and then compute the performance metrics.
\n",
"Macro-averaging: In macro-averaging, we compute the binary metrics, e.g. precision, for each class separately and then take the average across all the classes. Macro-averaging gives equal weight to all classes and is suitable when we want to evaluate the performance of each class separately.
\n",
"Weighted averaging: In weighted averaging, we compute the binary metrics for each class separately and then take the weighted average across all the classes. The weight of each class is proportional to the number of samples from that class in the dataset. Weighted averaging is most suitable averaging technique when the dataset is unbalanced among the various classes.
\n",
"
\n",
"\n",
"\n",
"We can use the function below to compute multi-class performance measures, aggregating the corresponding binary metrics with weighted averaging. "
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "e19e1aa94b31762ba50c300b1066f333",
"grade": false,
"grade_id": "cell-d95e6fcea9692d4d",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": [
"##### DO NOT CHANGE #####\n",
"\n",
"def compute_multiclass_metrics(knn, ground_truth, threshold=.3, labels=np.arange(10)):\n",
" metrics_list = []\n",
" for label in labels:\n",
" metrics_list.append(compute_binary_metrics(knn, label, ground_truth, threshold))\n",
" weights = np.asarray([(ground_truth==label).sum() for label in labels])\n",
" multiclass_metrics = {}\n",
" for m in ['precision', 'recall', 'fall-out']:\n",
" multiclass_metrics[m] = sum([weights[i]*metrics_list[i][m] for i in range(len(labels))])/weights.sum()\n",
" return multiclass_metrics, metrics_list\n",
"\n",
"##### DO NOT CHANGE #####"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Multiclass knn performance, weighted average: \n",
"\t-precision: 0.84\n",
"\t-recall: 0.64\n",
"\t-fall-out: 0.02\n"
]
}
],
"source": [
"knn.set_k(5)\n",
"metrics, _ = compute_multiclass_metrics(knn, y_unknown, threshold=.3)\n",
"print(f'Multiclass knn performance, weighted average: ')\n",
"for k, v in metrics.items():\n",
" print(f'\\t-{k}: {v:.2f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As stated above, the ROC curve is generated by calculating the TPR and FPR for different threshold values, ranging from 0 to 1. As the threshold increases, the model becomes more conservative, classifying fewer instances as positive, which leads to a decrease in the FPR and TPR. Conversely, as the threshold decreases, the model becomes more aggressive, classifying more instances as positive, which leads to an increase in the FPR and TPR.\n",
"\n",
"A perfect classifier would have a ROC curve that passes through the top-left corner of the plot (TPR=1, FPR=0), indicating a TPR of 100% and an FPR of 0%. The area under the ROC curve (AUC) is a measure of the overall performance of the classifier, with a value of 1 indicating a perfect classifier and a value of 0.5 indicating a classifier that is no better than random guessing.\n",
"\n",
"The following code plots the Recall VS Precision (RvP) curve and the ROC curve (with AUC), so that we can see how modifying the threshold gives us classifiers with different trade-offs for the metrics."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "code",
"checksum": "03e3f6d3713e1ec9a7b7ecff034d6ab1",
"grade": false,
"grade_id": "cell-20702f8b17c1bd95",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"outputs": [],
"source": [
"##### DO NOT CHANGE #####\n",
"\n",
"def plot_measures(knn, y_unknown, plot_type='ROC', all=True):\n",
" measures = {'ROC':('fall-out', 'recall'), 'RvP': ('recall', 'precision')}\n",
" measures = measures[plot_type]\n",
" m0 = {k:[] for k in ['mc']+list(range(10))}\n",
" m1 = {k:[] for k in ['mc']+list(range(10))}\n",
" for threshold in np.arange(0,1,.1):\n",
" mc, bin = compute_multiclass_metrics(\n",
" knn, \n",
" y_unknown, \n",
" threshold)\n",
" m0['mc'].append(mc[measures[0]])\n",
" m1['mc'].append(mc[measures[1]])\n",
" for i in range(10):\n",
" m0[i].append(bin[i][measures[0]])\n",
" m1[i].append(bin[i][measures[1]])\n",
" if all:\n",
" for i in range(10):\n",
" plt.plot(m0[i][::-1], m1[i][::-1], label='digit_'+str(i))\n",
" plt.plot(m0['mc'][::-1], m1['mc'][::-1], label='multiclass')\n",
" auc = ''\n",
" if plot_type=='ROC':\n",
" plt.plot([0, 1], [0, 1], linestyle='dashed', color='red', label='random_guess')\n",
" auc = np.abs(np.trapz(y=m1['mc'][::-1], x=m0['mc'][::-1]))\n",
" auc = f', AUC: {auc:.3f}'\n",
" plt.xlim(0, 1)\n",
" plt.ylim(0, 1)\n",
" plt.xlabel(measures[0])\n",
" plt.ylabel(measures[1])\n",
" plt.title(plot_type+auc)\n",
" plt.legend()\n",
" plt.grid()\n",
" plt.show()\n",
" plt.close()\n",
"\n",
"##### DO NOT CHANGE #####"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"editable": false,
"nbgrader": {
"cell_type": "markdown",
"checksum": "8c7d14c3da4a8ef2a65620bd6c08a34d",
"grade": false,
"grade_id": "cell-ba8f5378c673ceef",
"locked": true,
"schema_version": 3,
"solution": false,
"task": false
}
},
"source": [
"Let's plot some of the curves varying the number of neighbors we use for the classification."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"K: 2\n"
]
},
{
"data": {
"image/png": "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hiWEuYJ0RWKErkisuNvt8Kli/7xJ5z7ptvdooQ6eKFSRx6fvDp3Sd4dOVXj96AZOJfln4/5+MHdSdIgaR4Uo2MEtdQAIRAQhWJ7NZlNcuFtx4W51aV5+f0npmW63c+dNOmes0rECj47ml+hofok2XqDbrdm545LOGcgdG+bkt1sAVfL0009r0aJF2rBhw3mP2b17t1q2bKn169crOTn5R69577336vjx41q0aFG11RnICELAj3AG2dUitoFaxFbc7XayyOMftH3uGm9nlzEpLv2+2y1zZ/nzQ4IdZcYmlRmf1DBUDeh2A3CRKgoxSUlJOnjwoGJjY80rLIDxHRa4ROHuYLVvHKz2jct3u/l8hnJPFfu72rKOfH9nad/RAh3MK1Khx6tvc07p25yKu91iGjjPmTup7PQAiZFuBdHtBuACHA6HEhISzC4jYBGEgBpkt9sUF+FWXIRbXVtEl9tfXOrVgeNFPxiX9H332/ECj47kl+hIfok27j1e7nyH3abESPc5E0yGlplLKaYB3W5AoOjVq5c6duwoh8OhefPmyel06rnnntPgwYM1ZswYvf3224qPj9fLL7+sm266SXPnztUjjzxSZuLIRYsW6bbbbqtwVYann35a8+bNk/T9oOMVK1aoRYsW5brGvvnmG40dO1affPKJDMNQcnKy5s6dq9aty6+ttHTpUj333HPatGmTHA6HUlNT9eKLL/qPLSkpUVpamt555x0dO3ZM8fHxGjlypNLT02UYhiZOnKg5c+YoJydHMTExuv322/XSSy9V81e36ghCgIlcQQ61jG2glufpdssr8nw/DcA5C+CeffKtpNSnfccKte9YoaQj5c4PdTr8g7Z/uGRJUnSIQp18C0DdZxiGCj01s/yFz+dTYYlXQSWlFc4jFBLsqNQvG/PmzdPvf/97rVmzRgsWLNADDzyg9957T7fddpueeOIJ/eUvf9GQIUPKrLN5sX73u99py5YtysvL02uvvSZJio6O1oEDB8oct3//fv3sZz9Tr1699PHHHysiIkKrVq1SaWlphdfNz89XWlqaOnXqpFOnTmn8+PG67bbbtGHDBtntdr300kv617/+pYULF6pZs2bau3ev9u7dK0l655139Je//EXz58/XlVdeqezsbG3cuLHC9zEL3wWBABbhDtaVjSN1ZePIcvt8PkOHThb77yL9cAHc7Lwi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BAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALIsgBAAALCsgglBGRoZatGght9utlJQUrVmz5rzHzpo1Sz179lTDhg3VsGFD9enT54LHAwAAnI/pQWjBggVKS0vThAkTtG7dOl111VXq27evDh06VOHxK1eu1F133aUVK1YoMzNTSUlJuuGGG7R///5arhwAANR1pgehqVOnasSIERo2bJjat2+vGTNmKDQ0VHPmzKnw+H/84x8aNWqUkpOT1a5dO82ePVs+n0/Lly+v5coBAEBdF2Tmm5eUlGjt2rVKT0/3b7Pb7erTp48yMzMv6hoFBQXyeDyKjo6ucH9xcbGKi4v9r/Py8iRJHo9HHo/nEqrHpTr79acdAgPtEThoi8BBWwSOmmoDU4NQbm6uvF6v4uPjy2yPj4/X1q1bL+oaY8eOVePGjdWnT58K90+ePFkTJ04st33FihUKDQ2tfNGodsuWLTO7BJyD9ggctEXgoC3MV1BQUCPXNTUIXaopU6Zo/vz5Wrlypdxud4XHpKenKy0tzf86Ly9PSUlJ6t27t2JiYmqrVFTA4/Fo2bJluv766xUcHGx2OZZHewQO2iJw0BaB48iRIzVyXVODUGxsrBwOh3Jycspsz8nJUUJCwgXPfeGFFzRlyhR99NFH6tSp03mPc7lccrlc5bYHBwfzjzpA0BaBhfYIHLRF4KAtzFdTX39TB0s7nU516dKlzEDnswOfU1NTz3ve888/r2effVZLly5V165da6NUAABQD5neNZaWlqZ77rlHXbt2Vbdu3TRt2jTl5+dr2LBhkqShQ4eqSZMmmjx5siTpj3/8o8aPH68333xTLVq0UHZ2tiQpLCxMYWFhpn0OAABQ95gehAYNGqTDhw9r/Pjxys7OVnJy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",
"text/plain": [
"