{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "69a3U1UyjtSi"
},
"source": [
"Análisis de atributos protegidos con fairlearn\n",
"==============================================\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "D84AuPJvjtSn"
},
"source": [
"## ¿Que significa que un modelo sea justo?\n",
"\n",
"A medida que los modelos predictivos de Machine Learning avanzan más y más en nuestro día a día para decidir, informar y también actuar sobre nuestras vidas, muchas preguntas se nos aparecen sobre qué tan “justas” son tales decisiones que los sistemas toman. De particular interés es el evitar que estas decisiones terminen afectando a grupos minoritarios de forma inequitativa discriminando por género, raza, religión, etc.\n",
"\n",
"Un sistema basado en modelos de aprendizaje automático puede comportarse de manera injusta ante sus usuarios por diversas razones. A veces se debe a sesgos sociales reflejados en los datos de entrenamiento y en las decisiones tomadas durante el desarrollo. En otros casos, los sistemas se comportan injustamente no por sesgos sociales, sino por las características de los datos (por ejemplo, muy pocos datos sobre algún grupo de personas en particular). Puede ser difícil distinguir entre estas razones, especialmente porque no son mutuamente excluyentes y, a menudo, se exacerban entre sí.\n",
"\n",
"Por lo tanto, definimos si un modelo de aprendizaje automático se está comportando injustamente en términos de su impacto en las personas, es decir, en términos de daños, y no en términos de causas específicas, como sesgos sociales, o en términos de intenciones, como prejuicios.\n",
"\n",
"> Para una análisis más profundo sobre este tema puede ver el artículo: [¿Qué significa que un modelo sea justo?](https://santiagof.medium.com/qu%C3%A9-significa-que-un-modelo-sea-justo-793be6741b95)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MZ4nfLeAjtSo"
},
"source": [
"## ¿Que es fairlearn?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5Jv5UeRljtSo"
},
"source": [
"fairlearn es un paquete de Python que puede ayudar a evaluar y mitigar la no imparcialidad en los modelos de aprendizaje automático. Sin embargo, no pierda de vista que la equidad es un desafío fundamentalmente sociotécnico y no se puede resolver solo con herramientas tecnológicas. Dicho esto, fairlearn puede ser útil para ciertas tareas, como evaluar la injusticia a través de varias métricas, o para mitigar la injusticia observada al entrenar un modelo."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2diLOlsUjtSp"
},
"source": [
"Instalamos la librerias necesarias"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ztrf0v7ZjtSp"
},
"outputs": [],
"source": [
"!wget https://raw.githubusercontent.com/santiagxf/E72102/master/docs/develop/modeling/selection/code/fairlearn.txt \\\n",
" --quiet --no-clobber\n",
"!pip install -r fairlearn.txt --quiet"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zLRciseGjtSq"
},
"source": [
"## Utilizando fairlearn en el problema censo de la UCI"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KBAefjcjjtSq"
},
"source": [
"### Sobre el conjunto de datos del censo UCI\n",
"\n",
"El conjunto de datos del censo de la UCI es un conjunto de datos en el que cada registro representa a una persona. Cada registro contiene 14 columnas que describen a una una sola persona, de la base de datos del censo de Estados Unidos de 1994. Esto incluye información como la edad, el estado civil y el nivel educativo. La tarea es determinar si una persona tiene un ingreso alto (definido como ganar más de $50 mil al año). Esta tarea, dado el tipo de datos que utiliza, se usa a menudo en el estudio de equidad, en parte debido a los atributos comprensibles del conjunto de datos, incluidos algunos que contienen tipos sensibles como la edad y el género, y en parte también porque comprende una tarea claramente del mundo real."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JL73pMzNjtSr"
},
"source": [
"Descargamos el conjunto de datos"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "KpndbYYUjtSr",
"outputId": "4c7c8013-f374-4d9e-b081-cac0bda7adfe",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"replace datasets/uci_census/adult.tfrecord? [y]es, [n]o, [A]ll, [N]one, [r]ename: "
]
}
],
"source": [
"!wget https://santiagxf.blob.core.windows.net/public/datasets/uci_census.zip \\\n",
" --quiet --no-clobber\n",
"!mkdir -p datasets/uci_census\n",
"!unzip -qq uci_census.zip -d datasets/uci_census"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "t-yuGDirjtSr"
},
"source": [
"En este ejemplo, utilizaremos el modelo entrenado en uno de los ejercicios anteriores. Para simplificar el proceso, las predicciones del modelo se cargaron y agregaron directamente en el archivo `adult-test-scored.csv`:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "JytqUQrnjtSs"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"scored_dataset = pd.read_csv('datasets/uci_census/data/adult-test-scored.csv')"
]
},
{
"cell_type": "code",
"source": [
"scored_dataset.head(5)"
],
"metadata": {
"id": "oM1rtUeoj4ER",
"outputId": "58373b2b-1294-446e-904e-a67db3b06a96",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 310
}
},
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 age workclass fnlwgt education education-num \\\n",
"0 0 39 State-gov 77516 Bachelors 13 \n",
"1 1 50 Self-emp-not-inc 83311 Bachelors 13 \n",
"2 2 38 Private 215646 HS-grad 9 \n",
"3 3 53 Private 234721 11th 7 \n",
"4 4 28 Private 338409 Bachelors 13 \n",
"\n",
" marital-status occupation relationship race gender \\\n",
"0 Never-married Adm-clerical Not-in-family White Male \n",
"1 Married-civ-spouse Exec-managerial Husband White Male \n",
"2 Divorced Handlers-cleaners Not-in-family White Male \n",
"3 Married-civ-spouse Handlers-cleaners Husband Black Male \n",
"4 Married-civ-spouse Prof-specialty Wife Black Female \n",
"\n",
" capital-gain capital-loss hours-per-week native-country income score \n",
"0 2174 0 40 United-States <=50K <=50K \n",
"1 0 0 13 United-States <=50K <=50K \n",
"2 0 0 40 United-States <=50K <=50K \n",
"3 0 0 40 United-States <=50K <=50K \n",
"4 0 0 40 Cuba <=50K <=50K "
],
"text/html": [
"\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" age \n",
" workclass \n",
" fnlwgt \n",
" education \n",
" education-num \n",
" marital-status \n",
" occupation \n",
" relationship \n",
" race \n",
" gender \n",
" capital-gain \n",
" capital-loss \n",
" hours-per-week \n",
" native-country \n",
" income \n",
" score \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 39 \n",
" State-gov \n",
" 77516 \n",
" Bachelors \n",
" 13 \n",
" Never-married \n",
" Adm-clerical \n",
" Not-in-family \n",
" White \n",
" Male \n",
" 2174 \n",
" 0 \n",
" 40 \n",
" United-States \n",
" <=50K \n",
" <=50K \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 50 \n",
" Self-emp-not-inc \n",
" 83311 \n",
" Bachelors \n",
" 13 \n",
" Married-civ-spouse \n",
" Exec-managerial \n",
" Husband \n",
" White \n",
" Male \n",
" 0 \n",
" 0 \n",
" 13 \n",
" United-States \n",
" <=50K \n",
" <=50K \n",
" \n",
" \n",
" 2 \n",
" 2 \n",
" 38 \n",
" Private \n",
" 215646 \n",
" HS-grad \n",
" 9 \n",
" Divorced \n",
" Handlers-cleaners \n",
" Not-in-family \n",
" White \n",
" Male \n",
" 0 \n",
" 0 \n",
" 40 \n",
" United-States \n",
" <=50K \n",
" <=50K \n",
" \n",
" \n",
" 3 \n",
" 3 \n",
" 53 \n",
" Private \n",
" 234721 \n",
" 11th \n",
" 7 \n",
" Married-civ-spouse \n",
" Handlers-cleaners \n",
" Husband \n",
" Black \n",
" Male \n",
" 0 \n",
" 0 \n",
" 40 \n",
" United-States \n",
" <=50K \n",
" <=50K \n",
" \n",
" \n",
" 4 \n",
" 4 \n",
" 28 \n",
" Private \n",
" 338409 \n",
" Bachelors \n",
" 13 \n",
" Married-civ-spouse \n",
" Prof-specialty \n",
" Wife \n",
" Black \n",
" Female \n",
" 0 \n",
" 0 \n",
" 40 \n",
" Cuba \n",
" <=50K \n",
" <=50K \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "scored_dataset",
"summary": "{\n \"name\": \"scored_dataset\",\n \"rows\": 32561,\n \"fields\": [\n {\n \"column\": \"Unnamed: 0\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 9399,\n \"min\": 0,\n \"max\": 32560,\n \"num_unique_values\": 32561,\n \"samples\": [\n 14160,\n 27048,\n 28868\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"age\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 13,\n \"min\": 17,\n \"max\": 90,\n \"num_unique_values\": 73,\n \"samples\": [\n 28,\n 73,\n 35\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"workclass\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 9,\n \"samples\": [\n \" Without-pay\",\n \" Self-emp-not-inc\",\n \" ?\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"fnlwgt\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 105549,\n \"min\": 12285,\n \"max\": 1484705,\n \"num_unique_values\": 21648,\n \"samples\": [\n 128485,\n 469907,\n 235951\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"education\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 16,\n \"samples\": [\n \" Bachelors\",\n \" HS-grad\",\n \" Some-college\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"education-num\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 1,\n \"max\": 16,\n \"num_unique_values\": 16,\n \"samples\": [\n 13,\n 9,\n 10\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"marital-status\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 7,\n \"samples\": [\n \" Never-married\",\n \" Married-civ-spouse\",\n \" Married-AF-spouse\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"occupation\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 15,\n \"samples\": [\n \" Machine-op-inspct\",\n \" ?\",\n \" Adm-clerical\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"relationship\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 6,\n \"samples\": [\n \" Not-in-family\",\n \" Husband\",\n \" Other-relative\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"race\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \" Black\",\n \" Other\",\n \" Asian-Pac-Islander\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"gender\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \" Female\",\n \" Male\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"capital-gain\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 7385,\n \"min\": 0,\n \"max\": 99999,\n \"num_unique_values\": 119,\n \"samples\": [\n 3781,\n 15831\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"capital-loss\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 402,\n \"min\": 0,\n \"max\": 4356,\n \"num_unique_values\": 92,\n \"samples\": [\n 419,\n 2051\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"hours-per-week\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 12,\n \"min\": 1,\n \"max\": 99,\n \"num_unique_values\": 94,\n \"samples\": [\n 6,\n 22\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"native-country\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 42,\n \"samples\": [\n \" El-Salvador\",\n \" Philippines\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"income\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \">50K\",\n \"<=50K\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"score\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \">50K\",\n \"<=50K\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 10
}
]
},
{
"cell_type": "markdown",
"source": [
"Note como las predicciones del modelo están en la columna `score`."
],
"metadata": {
"id": "Ea5sJS08kKn1"
}
},
{
"cell_type": "markdown",
"metadata": {
"id": "WHD3xAUrjtSs"
},
"source": [
"### Utilizando métricas para identificar paridades"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YbocSSjujtSs"
},
"source": [
"Podemos utilizar algunas métricas para identificar disparidades que se encuentran directamente en nuestro conjunto de datos:\n",
"\n",
"- `selection_rate`: Calcula la fracción de predicciones que coninciden con el resultado \"positivo\""
]
},
{
"cell_type": "markdown",
"source": [
"Primero, convertimos la variable en la que estamos interesados en computar una métrica en numérica:"
],
"metadata": {
"id": "i3y710clk7aM"
}
},
{
"cell_type": "code",
"source": [
"y_true = (scored_dataset['income'] == '>50K') * 1"
],
"metadata": {
"id": "2m6BjATNk5wS"
},
"execution_count": 11,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Luego, seleccionamos el atributo que queremos discriminar:"
],
"metadata": {
"id": "ibEgg-qQlBVG"
}
},
{
"cell_type": "code",
"source": [
"gender = scored_dataset['gender']"
],
"metadata": {
"id": "JOuYBbfIlD6E"
},
"execution_count": 12,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Finalmente, computamos la métrica.\n",
"\n",
"> Note como estamos configurando `y_true` y `y_pred` con los mismos valores. Esto lo hacemos porque estamos interesados en saber cúal es el sezgo original en el conjunto de datos (no en el modelo)."
],
"metadata": {
"id": "3rUK2U1glGOc"
}
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"id": "MkYTCSA4jtSs",
"outputId": "4d424a1a-9475-48db-be4d-84743841c3c3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 472
}
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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05/+ZBYvXlzrOBctWmQkmQMHDphdu3aZ+Pj4WmtP9+3r62skGR8fHzN8+HCTn5/vVPf4448bSaagoMCpvby83Li5uZm0tLSzHTpz1113GR8fH1NVVeXUvmPHDiPJLFy40Bhz6qyJJDNr1qxqfdxxxx0mMDDQ5T6BMxFYcFE6/QZU02LMT4ElKirKlJWVOW17/Pjxah8N7dq1y9jtdjNjxgxH2/Lly40kM2/evGr7P/0X7dk+Evr5G/THH39sJJm77rrLqW7ChAlGkvnvf//raGvdurWRZN555x1HW2FhobHb7Wb8+PFnPTYbNmwwksyqVauc2rOzs6u1//zYGGPMPffcY7y9vc3x48cdbfHx8UaSWbp0qVPt6cDSokULp48W/vGPfxhJ5l//+letx8OYU4HFw8PD7Nixw9H2ySefGEnm6aefdrTdfPPNxtvb2ylQbt++3TRp0uScgaWiosK0atXKdO7c2fz444+O9n//+99Gkpk2bZqjrU+fPiY2NtZp+02bNhlJZuXKlcaYU//v27VrZxITE53ecMvKykybNm3MjTfeWG3Ow4YNO+sYTzsdgLdv337OwJKVlWXGjBljVq1aZf7617+asWPHmiZNmph27dqZoqIiR939999v3N3da+yjZcuWZujQoWcdU//+/U1UVFS19tLSUiPJTJo0yRhjzObNm52O05keeughI8nxM3W+fQJn4iMhXNQWL16st956y2k5U0pKiry8vJza7Ha73NxO/ehXVlbq6NGj8vX1VYcOHbR161ZH3d/+9jcFBQXpgQceqLbfutye+/rrr0uS0tLSnNrHjx8vSdVOzXfq1El9+/Z1vG7ZsqU6dOigb7/99qz7Wbt2rfz9/XXjjTfqyJEjjiU2Nla+vr5av369o/bMY/PDDz/oyJEj6tu3r8rKyvTVV1859Wu325WamlrjPocMGaKAgADH69PjPtdYpVMfGURHRzted+3aVX5+fo5tKysr9fbbbys5OVlhYWGOurZt26pfv37n7P/DDz9UYWGh7rvvPqc7aPr376+OHTs6HfchQ4Zoy5Yt2rlzp6NtzZo1stvtGjhwoCTp448/1vbt23X77bfr6NGjjuNbWlqqG264Qe+8846qqqqcxnDvvfeec5ySNHDgQAUEBOiGG27Q/PnzVVJSouLi4hprx44dq6efflq33367Bg0apKysLL3wwgvavn27/vSnPznqfvzxR6eLXc/k6empH3/88axj+vHHH2W322vc9vT6M/97vrXnUwecicCCi1rv3r2VkJDgtJzp53cQSaeu75g/f77atWsnu92uoKAgtWzZUp9++qmKioocdTt37lSHDh3UpEn93Ey3Z88eubm5qW3btk7tISEhat68ebVrJ868DuC0gICAateh/Nz27dtVVFSkVq1aqWXLlk5LSUmJCgsLHbVffPGFfve738nf319+fn5q2bKl7rjjDklyOhaSFB4eXusb38/Hejq8nGus5zPPwsJC/fjjj9WOm6Qa237u9HHt0KFDtXUdO3Z0Ou6DBw+Wm5ub1qxZI+nU9SFr165Vv3795OfnJ+nU8ZVOheGfH9/nnntO5eXl1Y5dTT+HNQkNDdXmzZsVHx+vl156SVu2bFFgYKASExP1xRdfnHP722+/XSEhIXr77bcdbV5eXqqoqKix/vjx49UC/c95eXlVu8bq9Lan15/53/OtPZ864Ezc1oxGraa/+J588klNnTpVf/jDH5SRkaHAwEC5ublp3Lhx1f5l/Gs437Mztd3Kamq5uPK0qqoqtWrVSqtWrapx/ekLhY8dO6b4+Hj5+flpxowZio6Olqenp7Zu3aqHH3642rE425tIXcf6S7etb2FhYerbt69eeeUVTZkyRR988IH27t2rWbNmOWpOH5c5c+YoJiamxn7OvM1Ycu0NODo6WitXrtTu3bt1yy23aOTIkZoxY4YSEhL05ZdfOp3JqklERIS+++47x+vQ0FBVVlaqsLBQrVq1crRXVFTo6NGjTmetahIaGqr169fLGOP0s3vo0CFJcmwfGhrq1H6mQ4cOKTAw0HFW5Xz7BM5EYMEl569//auuu+46/fnPf3ZqP3bsmIKCghyvo6OjtXHjRp04cUJNmzatsS9XPhpq3bq1qqqqtH37dl1xxRWO9oKCAh07dkytW7d2cSY1i46O1ttvv63f/va3Z32jzM3N1dGjR/X3v/9d11xzjaN9165d9TKO+tKqVSt5enpqx44d1dbV1PZzp4/r119/reuvv95p3ddff13tuA8ZMkT33Xefvv76a61Zs0be3t66+eabHetPf3zl5+dX7YxeffPz89P999+v0NBQDRo0SO+9954GDBhQa70xRrt371b37t0dbadD1Ycffqj/+7//c7R/+OGHqqqqqjV0nbn9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G3oIF5wr7998lxAAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALA8AgsAALC8OgWWxYsXKzIyUp6enoqLi9OmTZtqrV22bJn69u2rgIAABQQEKCEhoVq9MUbTpk1TaGiovLy8lJCQoO3bt9dlaAAAoBFyObCsWbNGaWlpSk9P19atW9WtWzclJiaqsLCwxvrc3FwNGzZM69evV15eniIiInTTTTfpwIEDjprZs2dr4cKFWrp0qTZu3CgfHx8lJibq+PHjdZ8ZAABoNGzGGOPKBnFxcerVq5cWLVokSaqqqlJERIQeeOABTZo06ZzbV1ZWKiAgQIsWLdKIESNkjFFYWJjGjx+vCRMmSJKKiooUHBysFStWaOjQoefss7i4WP7+/ioqKpKfn58r0wEAy4qc9FpDDwEX0O6Z/Rt6CBecK+/fLp1hqaio0JYtW5SQkPBTB25uSkhIUF5e3nn1UVZWphMnTigwMFCStGvXLuXn5zv16e/vr7i4uFr7LC8vV3FxsdMCAAAaL5cCy5EjR1RZWang4GCn9uDgYOXn559XHw8//LDCwsIcAeX0dq70mZmZKX9/f8cSERHhyjQAAMBF5oLeJTRz5kytXr1ar776qjw9Pevcz+TJk1VUVORY9u3bV4+jBAAAVtPEleKgoCC5u7uroKDAqb2goEAhISFn3Xbu3LmaOXOm3n77bXXt2tXRfnq7goIChYaGOvUZExNTY192u112u92VoQMAgIuYS2dYPDw8FBsbq5ycHEdbVVWVcnJy1KdPn1q3mz17tjIyMpSdna2ePXs6rWvTpo1CQkKc+iwuLtbGjRvP2icAALh0uHSGRZLS0tKUkpKinj17qnfv3srKylJpaalSU1MlSSNGjFB4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kJCQGrcJCQlxqV6SoqKiFBQUpB07dtS43m63y8/Pz2kBAACNl0uBxcPDQ7GxscrJyXG0VVVVKScnR3369Klxmz59+jjVS9Jbb71Va70k7d+/X0ePHlVoaKgrwwMAAI2Uy3cJpaWladmyZXrhhRe0bds2jR49WqWlpUpNTZUkjRgxQpMnT3bUjx07VtnZ2Xrqqaf01Vdfafr06frwww81ZswYSVJJSYkeeughffDBB9q9e7dycnI0cOBAtW3bVomJifU0TQAAcDFz+RqWIUOG6PDhw5o2bZry8/MVExOj7Oxsx4W1e/fulZvbTznoqquu0ksvvaRHH31UU6ZMUbt27bRu3Tp17txZkuTu7q5PP/1UL7zwgo4dO6awsDDddNNNysjIkN1ur6dpAgCAi5nNGGMaehC/VHFxsfz9/VVUVHTJXc8SOem1hh4CLqDdM/s39BBwAfH7fWm5FH+/XXn/5ruEAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5RFYAACA5dUpsCxevFiRkZHy9PRUXFycNm3adNb6tWvXqmPHjvL09FSXLl30+uuvO603xmjatGkKDQ2Vl5eXEhIStH379roMDQAANEIuB5Y1a9YoLS1N6enp2rp1q7p166bExEQVFhbWWP/+++9r2LBhGjlypD766CMlJycrOTlZn3/+uaNm9uzZWrhwoZYuXaqNGzfKx8dHiYmJOn78eN1nBgAAGg2XA8u8efM0atQopaamqlOnTlq6dKm8vb21fPnyGusXLFigpKQkPfTQQ7riiiuUkZGhHj16aNGiRZJOnV3JysrSo48+qoEDB6pr165auXKlDh48qHXr1v2iyQEAgMbBpcBSUVGhLVu2KCEh4acO3NyU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s2fP1htvvFFjzXvvvaeBAwfqjjvukCRVVVXpm2++UadOnWqs7969uyorK1VYWKi+ffv+amNHw+OiWzSY4cOHKygoSAMHDtSGDRu0a9cu5ebm6o9//KPTBbSuateunfbu3avVq1dr586dWrhwoV599dWzbvPYY48pMzNTCxcu1DfffKPPPvtMzz//vObNm1fncQCoLiMjQ4cPH1ZiYmKN69u1a6e33npL77//vrZt26Z77rlHBQUFtfbXvn17DR8+XCNGjNDf//537dq1S5s2bVJmZqZee+21X2saaAAEFjQYb29vvfPOO7r88st1yy236IorrtDIkSN1/PjxX3TG5f/9v/+nBx98UGPGjFFMTIzef/99TZ069azb3HXXXXruuef0/PPPq0uXLoqPj9eKFSvUpk2bOo8DQHUeHh4KCgqq9WFxjz76qHr06KHExERde+21CgkJUXJy8ln7fP755zVixAiNHz9eHTp0UHJysjZv3qzLL7/8V5gBGorNGGMaehAAAABnwxkWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWABe9O++885wPFwNwcSOwAAAAyyOwALjkGWN08uTJhh4GgLMgsACoNz/88IOGDx8uHx8fhYaGav78+br22ms1btw4SVJ5ebkmTJig8PBw+fj4KC4uTrm5uY7tV6xYoebNm+vNN9/UFVdcIV9fXyUlJenQoUOOmsrKSqWlpal58+Zq0aKFJk6cqJ9/w0hVVZUyMzPVpk0beXl5qVu3bvrrX//qWJ+bmyubzaY33nhDsbGxstvtevfdd3/VYwPglyGwAKg3aWlpeu+99/TPf/5Tb731ljZs2KCtW7c61o8ZM0Z5eXlavXq1Pv30Uw0ePFhJSUnavn27o6asrExz587Viy++qHfeeUd79+7VhAkTHOufeuoprVixQsuXL9e7776r7777rtq3cWdmZmrlypVaunSpvvjiCz344IO644479L///c+pbtKkSZo5c6a2bdumrl27/kpHBUC9MABQD4qLi03Tpk3N2rVrHW3Hjh0z3t7eZuzYsWbPnj3G3d3dHDhwwGm7G264wUyePNkYY8zzzz9vJJkdO3Y41i9evNgEBwc7XoeGhprZs2c7Xp84ccJcdtllZuDAgcYYY44fP268vb3N+++/77SfkSNHmmHDhhljjFm/fr2RZNatW1c/kwfwq2vS0IEJQOPw7bff6sSJE+rdu7ejzd/fXx06dJAkffbZZ6qsrFT79u2dtisvL1eLFi0cr729vRUdHe14HRoaqsLCQklSUVGRDh06pLi4OMf6Jk2aqGfPno6PhXbs2KGysjLdeOONTvupqKhQ9+7dndp69uz5S6YM4AIisAC4IEpKSuTu7q4tW7bI3d3daZ2vr6/jz02bNnVaZ7PZql2jcq79SNJrr72m8PBwp3V2u93ptY+Pz3n3C6BhEVgA1IuoqCg1bdpUmzdv1uWXXy7p1BmRb775Rtdcc426d++uyspKFRYWqm/fvnXah7+/v0JDQ7Vx40Zdc801kqSTJ09qy5Yt6tGjhySpU6dOstvt2rt3r+Lj4+tncgAaHIEFQL1o1qyZUlJS9NBDDykwMFCtWrVSenq63NzcZLPZ1L59ew0fPlwjRozQU089pe7du+vw4cPKyclR165d1b9///Paz9ixYzVz5ky1a9dOHTt21Lx583Ts2DGncUyYMEEPPvigqqqqdPXVV6uoqEjvvfee/Pz8lJKS8isdAQC/JgILgHozb9483XvvvRowYID8/Pw0ceJE7du3T56enpKk559/Xo8//rjGjx+vAwcOKCgoSL/5zW80YMCA897H+PHjdejQIaWkpMjNzU1/+MMf9Lvf/U5FRUWOmoyMDLVs2VKZmZn69ttv1bx5c/Xo0UNTpkyp9zkDuDBsxpUPhwHABaWlpQoPD9dTTz2lkSNHNvRwAFzEOMMCoN589NFH+uqrr9S7d28VFRVpxowZkqSBAwc28MgAXOwILADq1dy5c/X111/Lw8NDsbGx2rBhg4KCghp6WAAucnwkBAAALI9H8wMAAMsjsAAAAMsjsAAAAMsjsAAAAMsjsAAAAMsjsAAAAMsjsAAAAMsjsAAAAMsjsAAAAMv7/0d1le1WNhv8AAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
],
"source": [
"from fairlearn.metrics import MetricFrame, selection_rate\n",
"\n",
"selection_rates = MetricFrame(metrics=selection_rate,\n",
" y_true=y_true,\n",
" y_pred=y_true,\n",
" sensitive_features=gender)\n",
"\n",
"fig = selection_rates.by_group.plot.bar(\n",
" legend=False, rot=0,\n",
" title='Fraction earning over $50,000')"
]
},
{
"cell_type": "markdown",
"source": [
"Podemos ver en el gráfico anterior que los hombres tienen una probabilidad más alta de ser seleccionados con la etiqueta de `> 50K` que las mujeres. Esto no significa que nuestro modelo efectivamente copie este sezgo. Sin embargo, nos da la pauta de que el modelo podría estar incentivado a copiarlo simplemente al intentar optimizar la métrica de performance sobre el conjunto de datos."
],
"metadata": {
"id": "LJvxWigZpZ3I"
}
},
{
"cell_type": "code",
"source": [
"print(selection_rates.difference())"
],
"metadata": {
"id": "LN_hXiqgrbow",
"outputId": "34a5bbbc-a8ee-4a23-85e4-a4a9310af3cf",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 17,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.19627598779361352\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HDw92gHajtSs"
},
"source": [
"### Evaluando la imparcialidad de un modelo"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jq8CNlAkjtSt"
},
"source": [
"Veamos como podemos evaluar la imparcialidad de un modelo al seleccionar atributos donde estamos interesados que el modelo no tenga sezgos. Al igual que hicimos anteriormente, necesitamos seleccionar el atributo que queremos explorar:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"id": "6Z57GVMpjtSt"
},
"outputs": [],
"source": [
"gender = scored_dataset['gender']"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2tj_r1gTjtSt"
},
"source": [
"Necesitamos las categorias codificadas de forma numerica para trabajar con las métricas de aquí en adelante:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"id": "SgygZZbijtSt"
},
"outputs": [],
"source": [
"y_pred = (scored_dataset['score'] == '>50K') * 1\n",
"y_true = (scored_dataset['income'] == '>50K') * 1"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wwZ4GTYajtSt"
},
"source": [
"Calculamos la métrica `accuracy`"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"id": "CYI5ehXGjtSt"
},
"outputs": [],
"source": [
"from sklearn.metrics import accuracy_score\n",
"\n",
"gm = MetricFrame(metrics=accuracy_score, y_true=y_true, y_pred=y_pred, sensitive_features=gender)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ii-3cKxPjtSu"
},
"source": [
"En general, el modelo tiene la siguiente performance según la métrica `accuracy`"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"id": "wlziNhuyjtSu",
"outputId": "b5c4a8e3-519a-4524-d214-a9dd615eb283",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.821012868155155\n"
]
}
],
"source": [
"print(gm.overall)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Keyqr98-jtSu"
},
"source": [
"Sin embargo, si examinamos la métrica para cada grupo, el valor no es el mismo:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"id": "H2X51FvpjtSu",
"outputId": "9fe8d858-8576-45dc-978c-2a9a0d6e2cc3",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"gender\n",
"Female 0.917278\n",
"Male 0.773428\n",
"Name: accuracy_score, dtype: float64\n"
]
}
],
"source": [
"print(gm.by_group)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cfNTRSH5jtSu"
},
"source": [
"Además, fairlearn tiene muchas otras métricas integradas, como la tasa de selección, es decir, el porcentaje de la población que tiene \"1\" como etiqueta:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"id": "naQUfd9fjtSu",
"outputId": "cb755549-6bb8-46a6-994e-a32ed3200fc6",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.06421792942477196\n"
]
}
],
"source": [
"from fairlearn.metrics import selection_rate\n",
"\n",
"selection_rates = MetricFrame(metrics=selection_rate,\n",
" y_true=y_true,\n",
" y_pred=y_pred,\n",
" sensitive_features=gender)\n",
"print(selection_rates.overall)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"id": "rBFqNk7XjtSv",
"outputId": "b336de04-7372-430f-bcfc-0ce62b7fd0d7",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"gender\n",
"Female 0.027853\n",
"Male 0.082194\n",
"Name: selection_rate, dtype: float64\n"
]
}
],
"source": [
"print(selection_rates.by_group)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gmWhiCUljtSv"
},
"source": [
"Podemos rápidamente graficar estos valores junto con otras métricas interesantes:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"id": "RlxH2NazjtSv",
"outputId": "52320a7f-cb0f-4519-bb9f-335db3dc03f6",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 955
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[,\n",
" ,\n",
" ],\n",
" [,\n",
" ,\n",
" ],\n",
" [,\n",
" , ]], dtype=object)"
]
},
"metadata": {},
"execution_count": 25
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+8AAAMfCAYAAACn6OY8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAvvdJREFUeJzs3XtYVWX+///XBmWDB1BDQJQEzTykgqES5qEpEq0sKhWtTyI5OqlUymRFKWhmmKcws5hsTJuxkTRzmnRIZeRbjajlofKYmmcDTymKCgbr90c/1rjlICiHpT4f17Uu2fd+r3vd93Zzs997rXXfNsMwDAEAAAAAAMtyqu4GAAAAAACA0pG8AwAAAABgcSTvAAAAAABYHMk7AAAAAAAWR/IOAAAAAIDFkbwDAAAAAGBxJO8AAAAAAFgcyTsAAAAAABZH8g4AAAAAgMWRvAMAUEY2m00xMTHV3Yxrkp6eLpvNpvT0dLNs8ODB8vf3r7Y2VRR/f38NHjy4upsBAEClIHkHANz0fvzxR/Xt21dNmzaVq6urGjdurPvvv1+zZs2q7qbdlLZt26bx48dr37591d0UAAAso0Z1NwAAgOq0Zs0a/eEPf9Ctt96qoUOHysfHRwcPHtTatWs1c+ZMPfvss9XdxJvOtm3bNGHCBN1zzz3luiJg586dcnLivAQA4MZE8g4AuKlNmjRJHh4e+vbbb1WvXj2H544ePVo9jUKZGYahCxcuyM3NTXa7vbqbAwBApeHraQDATW3Pnj264447iiTukuTl5VXsPkuXLlXbtm1lt9t1xx13KDU1tUjMpk2b1Lt3b7m7u6tOnTq67777tHbtWvP5U6dOydnZWW+//bZZdvz4cTk5OemWW26RYRhm+fDhw+Xj41NqP/bv368RI0aoZcuWcnNz0y233KJ+/fpV6KXn/v7+euihh5Senq6OHTvKzc1N7dq1M++fX7Jkidq1aydXV1cFBwdr06ZNRerYsWOH+vbtqwYNGsjV1VUdO3bU559/bj4/b9489evXT5L0hz/8QTabzeEe/cI2fPnll2Yb/vKXv5jPXX7P+6lTpzR69Gj5+/vLbrerSZMmGjRokI4fP27GzJo1S3fccYdq1aql+vXrq2PHjvr4448r7HUDAKAikLwDAG5qTZs21YYNG7Rly5YyxX/zzTcaMWKEBgwYoClTpujChQt6/PHHdeLECTNm69at6tatm77//nu9+OKLGjdunPbu3at77rlH69atkyTVq1dPbdu21VdffeVQt81m08mTJ7Vt2zaz/Ouvv1a3bt1Kbde3336rNWvWaMCAAXr77bf1zDPPKC0tTffcc4/OnTtXnpekVLt379YTTzyhPn36KDExUb/++qv69OmjBQsWaPTo0fq///s/TZgwQXv27FH//v1VUFDg8Lrcdddd2r59u15++WVNnz5dtWvXVkREhD777DNJUvfu3fXcc89Jkl555RX97W9/09/+9je1bt3arGfnzp0aOHCg7r//fs2cOVNBQUHFtvXs2bPq1q2bZs2apZ49e2rmzJl65plntGPHDh06dEiSNGfOHD333HNq06aNkpKSNGHCBAUFBZn/TwAAWIYBAMBNbMWKFYazs7Ph7OxshIaGGi+++KLx5ZdfGnl5eUViJRkuLi7G7t27zbLvv//ekGTMmjXLLIuIiDBcXFyMPXv2mGVHjhwx6tata3Tv3t0sGzlypOHt7W0+jo2NNbp37254eXkZ7733nmEYhnHixAnDZrMZM2fOLLUf586dK1KWkZFhSDI++ugjs2z16tWGJGP16tVmWVRUlNG0adNS6zcMw2jatKkhyVizZo1Z9uWXXxqSDDc3N2P//v1m+V/+8pcix7nvvvuMdu3aGRcuXDDLCgoKjC5duhgtWrQwyxYtWlRk38vbkJqaWuxzUVFR5uP4+HhDkrFkyZIisQUFBYZhGMYjjzxi3HHHHVfsOwAA1Y0z7wCAm9r999+vjIwMPfzww/r+++81ZcoUhYeHq3Hjxg6XcxcKCwtT8+bNzcft27eXu7u7fv75Z0lSfn6+VqxYoYiICDVr1syMa9SokZ544gl98803ys7OliR169ZNWVlZ2rlzp6Tfz7B3795d3bp109dffy3p97PxhmFc8cy7m5ub+fPFixd14sQJ3XbbbapXr542btx4la9OUW3atFFoaKj5OCQkRJJ077336tZbby1SXvi6nDx5Uv/5z3/Uv39/nTlzRsePH9fx48d14sQJhYeHa9euXTp8+HCZ2hAQEKDw8PArxn366acKDAzUo48+WuQ5m80m6fcrIA4dOqRvv/22TMcGAKC6kLwDAG56nTp10pIlS/Trr79q/fr1iouL05kzZ9S3b1+Hy9clOSSoherXr69ff/1VknTs2DGdO3dOLVu2LBLXunVrFRQU6ODBg5JkJuRff/21cnJytGnTJnXr1k3du3c3k/evv/5a7u7uCgwMLLUP58+fV3x8vPz8/GS32+Xp6amGDRvq1KlTOn36dPlflBJc3n8PDw9Jkp+fX7Hlha/L7t27ZRiGxo0bp4YNGzpsCQkJkso+QWBAQECZ4vbs2aO2bduWGvPSSy+pTp066ty5s1q0aKGRI0fqv//9b5nqBwCgKjHbPAAA/z8XFxd16tRJnTp10u23367o6GgtWrTITC4lydnZudh9jUsmmCsrX19fBQQE6KuvvpK/v78Mw1BoaKgaNmyo559/Xvv379fXX3+tLl26XHEJtGeffVYffvihRo0apdDQUHl4eMhms2nAgAEO951fq5L6f6XXpbANL7zwQolnzW+77bYyteHSqwyuVevWrbVz50598cUXSk1N1aeffqp3331X8fHxmjBhQoUdBwCAa0XyDgBAMTp27ChJ+uWXX8q1X8OGDVWrVi3zUvhL7dixQ05OTg5nqbt166avvvpKAQEBCgoKUt26dRUYGCgPDw+lpqZq48aNZUoiFy9erKioKE2fPt0su3Dhgk6dOlWu9leWwlsIatasqbCwsFJjCy9pv1bNmzcv00SEtWvXVmRkpCIjI5WXl6fHHntMkyZNUlxcnFxdXSukLQAAXCsumwcA3NRWr15d7Fnz5cuXS1Kxl7+XxtnZWT179tQ///lPh2XasrKy9PHHH6tr165yd3c3y7t166Z9+/YpJSXFvIzeyclJXbp00YwZM3Tx4sUr3u9eeNzL+zFr1izl5+eXq/2VxcvLS/fcc4/+8pe/FPuFyLFjx8yfa9euLUnX/MXD448/ru+//96cyf5Sha/VpasESL9ffdGmTRsZhqGLFy9e0/EBAKhInHkHANzUnn32WZ07d06PPvqoWrVqpby8PK1Zs0YpKSny9/dXdHR0uet8/fXXtXLlSnXt2lUjRoxQjRo19Je//EW5ubmaMmWKQ2xhYr5z50698cYbZnn37t3173//W3a7XZ06dbriMR966CH97W9/k4eHh9q0aaOMjAytWrVKt9xyS7nbX1lmz56trl27ql27dho6dKiaNWumrKwsZWRk6NChQ/r+++8lSUFBQXJ2dtabb76p06dPy263695775WXl1e5jjdmzBgtXrxY/fr109NPP63g4GCdPHlSn3/+uZKTkxUYGKiePXvKx8dHd999t7y9vbV9+3a98847evDBB1W3bt3KeBkAALgqJO8AgJvatGnTtGjRIi1fvlzvv/++8vLydOutt2rEiBEaO3as6tWrV+4677jjDn399deKi4tTYmKiCgoKFBISor///e/mLOyFWrZsKS8vLx09elRdu3Y1ywuT+s6dO8tut1/xmDNnzpSzs7MWLFigCxcu6O6779aqVavKNCt7VWnTpo2+++47TZgwQfPmzdOJEyfk5eWlDh06KD4+3ozz8fFRcnKyEhMTNWTIEOXn52v16tXlTt7r1Kmjr7/+WgkJCfrss880f/58eXl56b777lOTJk0kSX/605+0YMECzZgxQ2fPnlWTJk303HPPaezYsRXadwAArpXNuJoZdgAAAAAAQJXhnncAAAAAACyO5B0AAAAAAIsjeQcAAAAAwOJI3gEAAAAAsDiSdwAAAAAALI7kHQAAAAAAiyN5BwAAAADA4kjeAQAAAACwOJJ3AAAAAAAsjuQdAAAAAACLI3kHAAAAAMDiSN4BAAAAALA4kncAAAAAACyO5B0AAAAAAIsjeQcAAAAAwOJI3gEAAAAAsDiSdwAAAAAALI7kHQAAAAAAiyN5BwAAAADA4kjeAQAAAACwOJJ3AAAAAAAsjuQdAAAAAACLI3kHAAAAAMDiSN4BAAAAALA4kncAAAAAACyO5B0AAAAAAIsjeQcAAAAAwOJI3gEAAAAAsDiSdwAAAAAALI7kHQAAAAAAiyN5BwAAAADA4kjeAQAAAACwOJJ3AAAAAAAsjuQdAAAAAACLI3kHAAAAAMDiSN4BAAAAALA4kncAAAAAACyO5B0AAAAAAIsjeQcAAAAAwOJI3gEAAAAAsDiSdwAAAAAALI7kHQAAAAAAiyN5BwAAAADA4kjeAQBAhbDZbBo/fny59hk8eLD8/f0rpT0AcL2bN2+ebDab9u3bZ5bdc889uueee6qtTag+JO8AAAAAAFhcjepuAAAAuDGcP39eNWqU76PFnDlzVFBQUEktAgDgxsGZd6AC5eTkVHcTAOCKCgoKdOHChQqv19XVtdzJe82aNWW32yu8LQBQkfiMBysgeYel7d+/XyNGjFDLli3l5uamW265Rf369XO476fQqVOnNHr0aPn7+8tut6tJkyYaNGiQjh8/bsZcuHBB48eP1+233y5XV1c1atRIjz32mPbs2SNJSk9Pl81mU3p6ukPd+/btk81m07x588yywYMHq06dOtqzZ48eeOAB1a1bV08++aQk6euvv1a/fv106623ym63y8/PT6NHj9b58+eLtHvHjh3q37+/GjZsKDc3N7Vs2VKvvvqqJGn16tWy2Wz67LPPiuz38ccfy2azKSMjo7wvK4AbxPjx42Wz2cxxxN3dXbfccouef/55h+TcZrMpJiZGCxYs0B133CG73a7U1FRJ0uHDh/X000/L29tbdrtdd9xxh+bOnVvkWFcaPwuPc+k972fOnNGoUaPMcdnLy0v333+/Nm7caMYUd897Tk6O/vznP8vPz092u10tW7bUtGnTZBiGQ1xhv5YuXaq2bdua7S/sGwBcjcKxddu2bXriiSdUv359de3aVZL097//XcHBwXJzc1ODBg00YMAAHTx4sEgd69at0wMPPKD69eurdu3aat++vWbOnGk+/8MPP2jw4MFq1qyZXF1d5ePjo6efflonTpyosn7i+sNl87C0b7/9VmvWrNGAAQPUpEkT7du3T++9957uuecebdu2TbVq1ZIknT17Vt26ddP27dv19NNP684779Tx48f1+eef69ChQ/L09FR+fr4eeughpaWlacCAAXr++ed15swZrVy5Ulu2bFHz5s3L3b7ffvtN4eHh6tq1q6ZNm2a2Z9GiRTp37pyGDx+uW265RevXr9esWbN06NAhLVq0yNz/hx9+ULdu3VSzZk0NGzZM/v7+2rNnj/71r39p0qRJuueee+Tn56cFCxbo0UcfdTj2ggUL1Lx5c4WGhl7DKwzgRtC/f3/5+/srMTFRa9eu1dtvv61ff/1VH330kRnzn//8R5988oliYmLk6ekpf39/ZWVl6a677jKT4IYNG+rf//63hgwZouzsbI0aNUqSrnr8fOaZZ7R48WLFxMSoTZs2OnHihL755htt375dd955Z7H7GIahhx9+WKtXr9aQIUMUFBSkL7/8UmPGjNHhw4f11ltvOcR/8803WrJkiUaMGKG6devq7bff1uOPP64DBw7olltuqZgXGMBNqV+/fmrRooXeeOMNGYahSZMmady4cerfv7/++Mc/6tixY5o1a5a6d++uTZs2qV69epKklStX6qGHHlKjRo30/PPPy8fHR9u3b9cXX3yh559/3oz5+eefFR0dLR8fH23dulXvv/++tm7dqrVr18pms1Vj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h4eH+vXrp1mzZslms6l58+b64osvzPuYyqJVq1Zq3ry5XnjhBR0+fFju7u769NNPi73/8u2331bXrl115513atiwYQoICNC+ffu0bNkybd682SF20KBB6tu3ryRp4sSJ5X8xAdyw9u7dq4cffli9evVSRkaG/v73v+uJJ55QYGBgqftNnjxZq1evVkhIiIYOHao2bdro5MmT2rhxo1atWqWTJ09KUpnGz8udOXNGTZo0Ud++fRUYGKg6depo1apV+vbbbx2uprpcnz599Ic//EGvvvqq9u3bp8DAQK1YsUL//Oc/NWrUqKta1hMArlXz5s31+uuvKy4uTvv27VNERITq1q2rvXv36rPPPtOwYcP0wgsvyMnJSe+995769OmjoKAgRUdHq1GjRtqxY4e2bt2qL7/8Uu7u7urevbumTJmiixcvqnHjxlqxYoX27t1b3d2E1VX19PZAefz6669GdHS04enpadSpU8cIDw83duzYYTRt2tSIiopyiD1x4oQRExNjNG7c2HBxcTGaNGliREVFOSyBdO7cOePVV181AgICjJo1axo+Pj5G3759jT179pgxx44dMx5//HGjVq1aRv369Y0//elPxpYtW4pdKq527drFtnvbtm1GWFiYUadOHcPT09MYOnSouXzRpXUYhmFs2bLFePTRR4169eoZrq6uRsuWLY1x48YVqTM3N9eoX7++4eHhYZw/f778LyaAG07hckbbtm0z+vbta9StW9eoX7++ERMT4zBOSCpxybasrCxj5MiRhp+fnzku3nfffcb777/vEFeW8VOXLBWXm5trjBkzxggMDDTq1q1r1K5d2wgMDDTeffddh3ovXyrOMAzjzJkzxujRow1fX1+jZs2aRosWLYypU6c6LLNUWr+K+xsBAGVVOLYeO3asyHOffvqp0bVrV6N27dpG7dq1jVatWhkjR440du7c6RD3zTffGPfff785/rVv395hCctDhw6Zn/88PDyMfv36GUeOHCmy5CZLxeFSNsNgRhfgevDbb7/J19dXffr00V//+tfqbg4ACxg/frwmTJigY8eOcSsNAAA3OO55B64TS5cu1bFjxxwmwQMAAABwc+Ced8Di1q1bpx9++EETJ05Uhw4dzPXiAQAAANw8OPMOWNx7772n4cOHy8vLSx999FF1NwcAAABANeCedwAAAAAALI4z7wAAAAAA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m1HpatasKbvdXqbYGjVqyNXVtZJbVDY5OTnV3QQANxi73a6aNWtWdzMkMcbdiEjeIen3+xV79OghSerXr59sNpvuueceSdIPP/ygwYMHq1mzZnJ1dZWPj4+efvppnThx4or1fvfddwoPD5enp6fc3NwUEBCgp59+2iGmoKBASUlJuuOOO+Tq6ipvb2/96U9/0q+//lqmdtepU0c///yzwsPDVbt2bfn6+uq1116TYRgOsTk5Ofrzn/8sPz8/2e12tWzZUtOmTSsSt3LlSnXt2lX16tVTnTp11LJlS73yyivm85ff8z548GDNnj1b0u+JfeFW6NJ73hcvXiybzab/9//+X5G+/OUvf5HNZtOWLVvMsh07dqhv375q0KCBXF1d1bFjR33++edXfF0K2zht2jQlJSWpefPmstvt2rZtm/Ly8hQfH6/g4GB5eHiodu3a6tatm1avXu2wf8OGDSVJEyZMMPt06eWiV9s24Ho2fvx4jRkzRpIUEBBg/m4U3ldps9kUExOjBQsW6I477pDdbldqaqrS09Nls9mKnIkuaQ6Nivjdf+utt9S0aVO5ubmpR48eDmNLof/85z/q1q2bateurXr16umRRx7R9u3bHWLOnDmjUaNGyd/fX3a7XV5eXrr//vu1ceNGM+bSe96vNH5cfs9727Zt9Yc//KFI2woKCtS4cWP17dvXoexa/17s2bNHDzzwgOrWrasnn3xSkvT111+rX79+uvXWW2W32+Xn56fRo0c7XCFwpbH+WtoGoGxjjSStW7dOvXr1koeHh2rVqqUePXrov//9b5mO8e9//9sc8+rWrasHH3xQW7duLRK3Y8cO9e/fXw0bNpSbm5tatmypV199VdKV/w4Ud8/7zz//rH79+qlBgwaqVauW7rrrLi1btswhpvDvxCeffKJJkyapSZMmcnV11X333afdu3dfsW+FY+u2bdv0xBNPqH79+uratauksn2Wv1K/JOnvf/+7goOD5ebmpgYNGmjAgAE6ePDgFduGilP9pwNhCX/605/UuHFjvfHGG3ruuefUqVMneXt7S/o9mf35558VHR0tHx8fbd26Ve+//762bt2qtWvXljjx0NGjR9WzZ081bNhQL7/8surVq6d9+/ZpyZIlRY49b948RUdH67nnntPevXv1zjvvaNOmTfrvf/97xW8v8/Pz1atXL911112aMmWKUlNTlZCQoN9++02vvfaaJMkwDD388MNavXq1hgwZoqCgIH355ZcaM2aMDh8+rLfeekuStHXrVj300ENq3769XnvtNdntdu3evbvUPwp/+tOfdOTIEa1cuVJ/+9vfSm3rgw8+qDp16uiTTz4xvywplJKSojvuuENt27Y123L33XercePGevnll1W7dm198sknioiI0KeffqpHH3201GNJ0ocffqgLFy5o2LBhstvtatCggbKzs/XBBx9o4MCBGjp0qM6cOaO//vWvCg8P1/r16xUUFKSGDRvqvffe0/Dhw/Xoo4/qsccekyS1b9++wtoGXI8ee+wx/fTTT/rHP/6ht956S56enpJkJqvS7wnxJ598opiYGHl6esrf379clyBWxO/XRx99pDNnzmjkyJG6cOGCZs6cqXvvvVc//vijObavWrVKvXv3VrNmzTR+/HidP39es2bN0t13362NGzeayfgzzzyjxYsXKyYmRm3atNGJEyf0zTffaPv27brzzjuLHPtK48flIiMjNX78eGVmZsrHx8cs/+abb3TkyBENGDDALLvWvxe//fabwsPD1bVrV02bNk21atWSJC1atEjnzp3T8OHDdcstt2j9+vWaNWuWDh06pEWLFpnHLm2sv9a2ATe7sow1//nPf9S7d28FBwcrISFBTk5O+vDDD3Xvvffq66+/VufOnUus/29/+5uioqIUHh6uN998U+fOndN7772nrl27atOmTeaY98MPP6hbt26qWbOmhg0bJn9/f+3Zs0f/+te/NGnSpDL9HbhUVlaWunTponPnzum5557TLbfcovnz5+vhhx/W4sWLi4zpkydPlpOTk1544QWdPn1aU6ZM0ZNPPql169aV6XXs16+fWrRooTfeeMM8QVWWz/JX6tekSZM0btw49e/fX3/84x917NgxzZo1S927d9emTZu4creqGMD/b/Xq1YYkY9GiRQ7l586dKxL7j3/8w5BkfPXVV2bZhx9+aEgy9u7daxiGYXz22WeGJOPbb78t8Zhff/21IclYsGCBQ3lqamqx5ZeLiooyJBnPPvusWVZQUGA8+OCDhouLi3Hs2DHDMAxj6dKlhiTj9ddfd9i/b9++hs1mM3bv3m0YhmG89dZbhiRzv+Ls3bvXkGR8+OGHZtnIkSONkn6dJBkJCQnm44EDBxpeXl7Gb7/9Zpb98ssvhpOTk/Ha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ySef1MKFC/XHP/5RzZs316pVq3T33XcXO9iURUFBgX7++WfzrLUk/fTTT5JkTj7StGlTrVq1SmfOnHE4+75jxw7z+UJOTk667777dN9992nGjBl644039Oqrr2r16tUKCwsrtg3lvZQqMjJS8+fPV1pamrZv3y7DMBzOMBVeSVCzZs0Sj3m1Fi9erGbNmmnJkiUO7S48q1eopD5VZtuA68HVXDpZeObk8onrLj/jUlG/X8WN0T/99JPDmCjJYW32Qjt27JCnp6dq165tljVq1EgjRozQiBEjdPToUd15552aNGlSicl7eV+jgIAAde7cWSkpKYqJidGSJUsUERHhsPxcRfy9KM6PP/6on376SfPnz9egQYPM8pUrVxaJLalfldU24GZT2ljTvHlzSZK7u3u5x8fCfb28vErdt3AMLm51jkuVZ4xr2rRpiWNt4fOVqTyf5Usb4wzDUEBAgMPnbVQ9LptHqQq/Xbv8276kpKQr7vvrr78W2a/wm9LCS+f79++v/Px8TZw4scj+v/32W5lnaH7nnXfMnw3D0DvvvKOaNWvqvvvukyQ98MADys/Pd4iTpLfeeks2m838AHry5MkidV/e5uIUfsgta3vDwsLUoEEDpaSkKCUlRZ07d3a4zMnLy0v33HOP/vKXv+iXX34psv+xY8fKdJziFPd/um7dOmVkZDjEFc7CfHmfKrNtwPWgvL/v0u8fzpydnfXVV185lL/77rsOjyvq92vp0qUO98avX79e69atM8e6Ro0aKSgoSPPnz3fox5YtW7RixQo98MADkn4/K335JZVeXl7y9fUtdUwsafwoTWRkpNauXau5c+fq+PHjDl9oShX39+JyxY2JhmFo5syZRWJL+r+vrLYBN4uyjDXBwcFq3ry5pk2bprNnzxapo7TxMTw8XO7u7nrjjTeKnYepcN+GDRuqe/fumjt3rg4cOOAQc+kYUZ6/Aw888IDWr1/v8DkrJydH77//vvz9/a96jpSyKs9n+ZL69dhjj8nZ2VkTJkwoUo9hGGVaPhoVgzPvKJW7u7u6d++uKVOm6OLFi2rcuLFWrFihvXv3XnHf+fPn691339Wjjz6q5s2b68yZM5ozZ47c3d3ND4Y9evTQn/70JyUmJmrz5s3q2bOnatasqV27dmnRokWaOXOmwxq/xXF1dVVqaqqioqIUEhKif//731q2bJleeeUV81LFPn366A9/+INeffVV7du3T4GBgVqxYoX++c9/atSoUeY3sq+99pq++uorPfjgg2ratKmOHj2qd999V02aNHGYaORywcHBkqTnnntO4eHhcnZ2dlje6HI1a9bUY489poULFyonJ0fTpk0rEjN79mx17dpV7dq109ChQ9WsWTNlZWUpIyNDhw4d0vfff1/6f0AJHnroIS1ZskSPPvqoHnzwQe3du1fJyclq06aNwx9DNzc3tWnTRikpKbr99tvVoEEDtW3bVm3btq20tgHXg8Lf91dffVUDBgxQzZo11adPH4cz1Zfz8PBQv379NGvWLNlsNjVv3lxffPFFsfcJVsTv12233aauXbtq+PDhys3NVVJSkm655Ra9+OKLZszUqVPVu3dvhYaGasiQIeZScR4eHuaa7GfOnFGTJk3Ut29fBQYGqk6dOlq1apW+/fZbTZ8+vcTjlzZ+lKR///564YUX9MILL6hBgwZFzo5VxN+L4rRq1UrNmzfXCy+8oMOHD8vd3V2ffvppsfeXljTWV1bbgJtFWcYaJycnffDBB+rdu7fuuOMORUdHq3Hjxjp8+LBWr14td3d3/etf/yq2fnd3d7333nt66qmndOedd2rAgAFq2LChDhw4oGXLlunuu+82T/C8/fbb6tq1q+68804NGzZMAQEB2rdvn5YtW6bNmzdLKt/fgZdffln/+Mc/1Lt3bz333HNq0KCB5s+fr7179+rTTz8tcitPRSvPZ/mS+tW8eXO9/vrriouL0759+xQREaG6detq7969+uyzzzRs2DC98MILldoP/P+qeHZ7WFhJS8UdOnTIePTRR4169eoZHh4eRr9+/YwjR44UWQbo8mU5Nm7caAwcONC49dZbDbvdbnh5eRkPPfSQ8d133xU59vvvv28EBwcbbm5uRt26dY127doZL774onHkyJFS2xwVFWXUrl3b2LNnj9GzZ0+jVq1ahre3t5GQkGAuvVHozJkzxujRow1fX1+jZs2aRosWLYypU6c6LP2RlpZmPPLII4avr6/h4uJi+Pr6GgMHDjR++uknM6a4pZ1+++0349lnnzUaNmxo2Gw2h6WELn+dCq1cudKQZNhsNuPgwYPF9m/Pnj3GoEGDDB8fH6NmzZpG48aNjYceeshYvHhxqa9LYRunTp1a5LmCggLjjTfeMJo2bWrY7XajQ4cOxhdf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T56s7du3q1OnToqJidGJEydudDcBAFXUrz+gxgfWAOAXzEegYpX5x+ZPnjypgIAArVmzRj179pTb7dYtt9yiBQsW6OGHH5Yk7d+/X+3atVNqaqq6deumr7/+WgMGDNCxY8cUGBgoSZo7d65efPFFnTx5Uj4+PnrxxRe1bNky7dmzx9zWkCFDlJOTo+XLl0uSIiMjdccdd+idd96R9MttK0JCQvTcc88pISHhqr3zcVfcTPjYvCc+No/y4uXlpezsbPOCS3Xr1tV3332nFi1aWNwZAFiL+QhUrDK/VZzb7ZYk1a9fX5KUlpam8+fPKzo62qxp27atmjZtqtTUVElSamqqOnToYAZ3SYqJiVFubq727t1r1lz6HhdrLr7HuXPnlJaW5lHj5eWl6Ohos+bXCgsLlZub6/EAAOBSDodDeXl5ys3NldvtNm+BxP9/AKjqmI9AxSrTq80XFxfr+eef11133aXbb79dkpSdnS0fHx/5+/t71AYGBio7O9usuTS4X1x/cd1v1eTm5urnn3/W6dOnVVRUdNma/fv3X7bfxMRETZ069fp2FgBQJRiGodatW3s8DwsL83jucDhUVFRkRXsAYBnmI1CxyjS8x8fHa8+ePVq/fn1Zvm25mThxolwul/k8NzdXISEhFnYEALCbVatWWd0CANgS8xGoWGUW3kePHq2lS5dq7dq1atKkibm8UaNGOnfunHJycjzOvh8/flyNGjUya359VfiLV6O/tObXV6g/fvy4fH19VbNmTXl7e8vb2/uyNRff49ecTqecTuf17TAAoEro1auX1S0AgC0xH4GKdcPfeTcMQ6NHj9bixYu1cuVKhYaGeqwPDw9X9erVlZKSYi47cOCAMjIyFBUVJUmKiorS7t27Pa4Kn5ycLF9fX7Vv396sufQ9LtZcfA8fHx+Fh4d71BQXFyslJcWsAQAAAADgZnTDZ97j4+O1YMECffnll6pbt675HXU/Pz/VrFlTfn5+iouLk8vlUv369eXr66vnnntOUVFR6tatmySpd+/eat++vR5//HFNnz5d2dnZeuWVVxQfH2+eGX/mmWf0zjvvaMKECRoxYoRWrlypzz77TMuWLTN7cblcio2NVUREhLp27arZs2eroKBATz755I3uJgAAAAAAlrnh8D5nzhxJ0t133+2xfP78+XriiSckSbNmzZKXl5ceeughFRYW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\n"
},
"metadata": {}
}
],
"source": [
"from fairlearn.metrics import *\n",
"from sklearn.metrics import accuracy_score, precision_score, recall_score\n",
"\n",
"metrics = {\n",
" 'accuracy': accuracy_score,\n",
" 'precision': precision_score,\n",
" 'recall': recall_score,\n",
" 'false positive rate': false_positive_rate,\n",
" 'true positive rate': true_positive_rate,\n",
" 'selection rate': selection_rate,\n",
" 'count': count}\n",
"\n",
"metric_frame = MetricFrame(metrics=metrics,\n",
" y_true=y_true,\n",
" y_pred=y_pred,\n",
" sensitive_features=gender)\n",
"\n",
"metric_frame.by_group.plot.bar(\n",
" subplots=True,\n",
" layout=[3, 3],\n",
" legend=False,\n",
" figsize=[12, 8],\n",
" title=\"Show all metrics\",\n",
")"
]
},
{
"cell_type": "markdown",
"source": [
"#### Métricas personalizadas\n",
"\n",
"PRECAUCIÓN 😱: El tema presentado en esta sección está clasificado como avanzado. El entendimiento de este contenido es totalmente opcional.
\n",
"\n",
"En muchos casos, las métricas que queremos computar no estan en alguna librería predefinida o simplemente están muy ligadas a nuestro negocio. En tales casos, podemos computar nuestras propias métricas.\n",
"\n",
"En el siguiente ejemplo, mostraremos como computar el error asociado con una métrica que computamos para tener en cuenta el intervalo de confianza de la misma. Scikit-learn dispone de la métrica `balanced_accuracy_score`, pero no dispone de una forma de computar su error. En este ejemplo agregaremos una métrica llamada `balanced_accuracy_error`:\n",
"\n",
"> Adaptado de: https://fairlearn.org/v0.9/auto_examples/plot_credit_loan_decisions.html#mitigating-unfairness-in-ml-models"
],
"metadata": {
"id": "Mrrr-9m3r9Rb"
}
},
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"from sklearn.metrics import confusion_matrix, balanced_accuracy_score\n",
"\n",
"def compute_error_metric(metric_value, sample_size):\n",
" \"\"\"Compute standard error of a given metric based on the assumption of\n",
" normal distribution.\n",
"\n",
" Parameters:\n",
" metric_value: Value of the metric\n",
" sample_size: Number of data points associated with the metric\n",
"\n",
" Returns:\n",
" The standard error of the metric\n",
" \"\"\"\n",
" metric_value = metric_value / sample_size\n",
" return (\n",
" 1.96\n",
" * np.sqrt(metric_value * (1.0 - metric_value))\n",
" / np.sqrt(sample_size)\n",
" )\n",
"\n",
"def false_positive_error(y_true, y_pred):\n",
" \"\"\"Compute the standard error for the false positive rate estimate.\"\"\"\n",
" tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()\n",
" return compute_error_metric(fp, tn + fp)\n",
"\n",
"\n",
"def false_negative_error(y_true, y_pred):\n",
" \"\"\"Compute the standard error for the false negative rate estimate.\"\"\"\n",
" tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()\n",
" return compute_error_metric(fn, fn + tp)\n",
"\n",
"\n",
"def balanced_accuracy_error(y_true, y_pred):\n",
" \"\"\"Compute the standard error for the balanced accuracy estimate.\"\"\"\n",
" fpr_error, fnr_error = false_positive_error(\n",
" y_true, y_pred\n",
" ), false_negative_error(y_true, y_pred)\n",
" return np.sqrt(fnr_error**2 + fpr_error**2) / 2"
],
"metadata": {
"id": "dacI6SfNsICO"
},
"execution_count": 26,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Una vez que tenemos las funciones definidas, simplemente creamos un diccionario con las métricas que queremos usar, agregando nuestra nueva métrica `balanced_accuracy_error`:"
],
"metadata": {
"id": "unlDdyqpvU_q"
}
},
{
"cell_type": "code",
"source": [
"metrics = {\n",
" \"balanced_accuracy\": balanced_accuracy_score,\n",
" \"balanced_acc_error\": balanced_accuracy_error,\n",
" \"selection_rate\": selection_rate,\n",
"}"
],
"metadata": {
"id": "E3dUVjW1ssoW"
},
"execution_count": 27,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Construimos nuestro `MetricFrame` de la misma forma que hicimos anteriormente:"
],
"metadata": {
"id": "aYw9eImKvbpA"
}
},
{
"cell_type": "code",
"source": [
"metric_frame = MetricFrame(\n",
" metrics=metrics,\n",
" y_true=y_true,\n",
" y_pred=y_pred,\n",
" sensitive_features=gender\n",
")"
],
"metadata": {
"id": "8y6CcLX1sh_i"
},
"execution_count": 28,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Podemos ver como la métrica se computo para cada groupo:"
],
"metadata": {
"id": "romM_CCUw1CM"
}
},
{
"cell_type": "code",
"source": [
"metric_frame.by_group"
],
"metadata": {
"id": "QyxKQ6_Bw3li",
"outputId": "769de206-4c91-439e-a110-822c2543c0fb",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 143
}
},
"execution_count": 29,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" balanced_accuracy balanced_acc_error selection_rate\n",
"gender \n",
"Female 0.624369 0.012351 0.027853\n",
"Male 0.630852 0.005305 0.082194"
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" balanced_accuracy \n",
" balanced_acc_error \n",
" selection_rate \n",
" \n",
" \n",
" gender \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" Female \n",
" 0.624369 \n",
" 0.012351 \n",
" 0.027853 \n",
" \n",
" \n",
" Male \n",
" 0.630852 \n",
" 0.005305 \n",
" 0.082194 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"summary": "{\n \"name\": \"metric_frame\",\n \"rows\": 2,\n \"fields\": [\n {\n \"column\": \"gender\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2,\n \"samples\": [\n \" Male\",\n \" Female\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"balanced_accuracy\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.00458381524594121,\n \"min\": 0.6243691732083776,\n \"max\": 0.6308516668966002,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.6308516668966002,\n 0.6243691732083776\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"balanced_acc_error\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.004982136083942546,\n \"min\": 0.00530484485291412,\n \"max\": 0.01235064927241405,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.00530484485291412,\n 0.01235064927241405\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"selection_rate\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.038424960124261734,\n \"min\": 0.027852567078265715,\n \"max\": 0.08219366681964203,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.08219366681964203,\n 0.027852567078265715\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 29
}
]
},
{
"cell_type": "markdown",
"source": [
"Para visualizar mas efectivamente la métrica, utilizaremos esta función:"
],
"metadata": {
"id": "j3-4PbWMvfmh"
}
},
{
"cell_type": "code",
"source": [
"def plot_group_metrics_with_error_bars(metricframe, metric, error_name):\n",
" \"\"\"Plot the disaggregated metric for each group with an associated\n",
" error bar. Both metric and the error bar are provided as columns in the\n",
" provided MetricFrame.\n",
"\n",
" Parameters\n",
" ----------\n",
" metricframe : MetricFrame\n",
" The MetricFrame containing the metrics and their associated\n",
" uncertainty quantification.\n",
" metric : str\n",
" The metric to plot\n",
" error_name : str\n",
" The associated standard error for each metric in metric\n",
"\n",
" Returns\n",
" -------\n",
" Matplotlib Plot of point estimates with error bars\n",
" \"\"\"\n",
" import matplotlib.pyplot as plt\n",
"\n",
" grouped_metrics = metricframe.by_group\n",
" point_estimates = grouped_metrics[metric]\n",
" error_bars = grouped_metrics[error_name]\n",
" lower_bounds = point_estimates - error_bars\n",
" upper_bounds = point_estimates + error_bars\n",
"\n",
" x_axis_names = [\n",
" str(name) for name in error_bars.index.to_flat_index().tolist()\n",
" ]\n",
" plt.vlines(\n",
" x_axis_names,\n",
" lower_bounds,\n",
" upper_bounds,\n",
" linestyles=\"dashed\",\n",
" alpha=0.45,\n",
" )\n",
" plt.scatter(x_axis_names, point_estimates, s=25)\n",
" plt.xticks(rotation=0)\n",
" y_start, y_end = np.round(min(lower_bounds), decimals=2), np.round(\n",
" max(upper_bounds), decimals=2\n",
" )\n",
" plt.ylabel(metric)"
],
"metadata": {
"id": "HjiZ-m85tX89"
},
"execution_count": 30,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plot_group_metrics_with_error_bars(\n",
" metric_frame, \"balanced_accuracy\", \"balanced_acc_error\"\n",
")"
],
"metadata": {
"id": "xBbicQUethSW",
"outputId": "d6396e9f-a52a-45bb-b3c1-cb1234f5de48",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 430
}
},
"execution_count": 31,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAGdCAYAAAAGx+eQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOKxJREFUeJzt3Xl4VOX9///XzJAEAlmAkJCEhIDsQkDDYqQiLUug/SB8RasVDSLFikEDsRZoWYpLUKksfqogWJZaKSAViwWJGgQVUCAFcYFg2MKWsMQkECTLzPn9wcdp88sBwzBwBuf5uK5cnrnnnnPeg3/M67rv+5zbZhiGIQAAAFRjt7oAAAAAX0RIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMEFIAgAAMFHH6gKuVy6XS8eOHVNISIhsNpvV5QAAgFowDENnzpxRTEyM7PZLjxURkjx07NgxxcXFWV0GAADwwOHDh9WsWbNL9iEkeSgkJETShX/k0NBQi6sBAAC1UVpaqri4OPfv+KUQkjz0/RRbaGgoIQkAgOtMbZbKsHAbAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADABCEJAADARB2rC0B1lU6XFm86KEl6sGeCAhzkWAAArMAvMAAAgAlCEgAAgAlCEgAAgAnWJPkYm6SmYXXdxwAAwBqEJB9Tx2HXoM4xVpcBAIDfY7oNAADABCEJAADABNNtPqbS6dKyrfmSpHu7x/OcJACAX3G6DH15tESS1DE2TA67dSt0CUk+6Hyly+oSAACwhMNuU+e4cKvLkMR0GwAAgClGkgAAgM8wDEMnz5ZLkpo0CJLNZt10GyNJAADAZ1S5DP1zxzH9c8cxVbkMS2shJAEAAJggJAEAAJhgTZKPsUmKCAl0HwMAAGsQknxMHYdd/++mZlaXAQCA32O6DQAAwAQhCQAAwATTbT6m0unSypwjkqS7kpqxLQkAwK/YbTbd3DzcfWxpLZZe/f+8/PLLSkhIUN26ddWjRw9t3br1kv2Li4uVlpam6OhoBQUFqU2bNlq7dq37/blz5yoxMVGhoaEKDQ1VcnKy3n333Wrn6N27t2w2W7W/Rx555Kp8v8t19nyVzp6vsroMAACuOYfdpqTmjZTUvJGl+7ZJPjCStHz5cmVkZGjevHnq0aOHZs+erZSUFOXm5ioyMrJG/4qKCvXr10+RkZFauXKlYmNjdejQIYWHh7v7NGvWTM8995xat24twzC0ZMkSDR48WDt27NCNN97o7jdq1Cg99dRT7tfBwcFX9bsCAIDrh+UhaebMmRo1apRGjBghSZo3b57WrFmjhQsXasKECTX6L1y4UEVFRdq8ebMCAgIkSQkJCdX6DBo0qNrrZ599VnPnztWnn35aLSQFBweradOmXv5GAADAU4ZhqPhcpSQpPDjAf7clqaioUE5Ojvr27etus9vt6tu3r7Zs2WL6mdWrVys5OVlpaWmKiopSx44dlZmZKafTadrf6XRq2bJlKisrU3JycrX33njjDUVERKhjx46aOHGizp07d9Fay8vLVVpaWu0PAAB4V5XL0MqcI1qZc8TybUksHUk6deqUnE6noqKiqrVHRUVpz549pp/Zv3+/1q9fr2HDhmnt2rXKy8vTo48+qsrKSk2dOtXd74svvlBycrLOnz+vBg0aaNWqVerQoYP7/fvuu0/NmzdXTEyMdu3apfHjxys3N1dvvfWW6XWnT5+uadOmeeFbAwCA64Hl022Xy+VyKTIyUvPnz5fD4VBSUpKOHj2qGTNmVAtJbdu21c6dO1VSUqKVK1dq+PDh2rhxozsoPfzww+6+nTp1UnR0tPr06aN9+/bphhtuqHHdiRMnKiMjw/26tLRUcXFxV/GbAgAAK1kakiIiIuRwOFRYWFitvbCw8KJrhaKjoxUQECCHw+Fua9++vQoKClRRUaHAwAtbegQGBqpVq1aSpKSkJG3btk1z5szRq6++anreHj16SJLy8vJMQ1JQUJCCgoIu/0t6IDw44JpcBwAAXJyla5ICAwOVlJSk7Oxsd5vL5VJ2dnaN9UPf69mzp/Ly8uRyudxte/fuVXR0tDsgmXG5XCovL7/o+zt37pR0IYRZKcBh191d43R31ziekQQAgIUs/xXOyMjQggULtGTJEu3evVujR49WWVmZ+2631NRUTZw40d1/9OjRKioqUnp6uvbu3as1a9YoMzNTaWlp7j4TJ07URx99pIMHD+qLL77QxIkTtWHDBg0bNkyStG/fPj399NPKycnRwYMHtXr1aqWmpqpXr15KTEy8tv8AAADAJ1m+Jumee+7RyZMnNWXKFBUUFKhLly5at26dezF3fn6+7Pb/ZLm4uDhlZWVp3LhxSkxMVGxsrNLT0zV+/Hh3nxMnTig1NVXHjx9XWFiYEhMTlZWVpX79+km6MIL1wQcfaPbs2SorK1NcXJyGDh2qSZMmXdsvDwAAfJbNMAxr76+7TpWWliosLEwlJSUKDQ312nkrnS69veOoJGnITbFMuQEA/IrTZWjbwSJJUrcE7z91+3J+vy0fSUJN3z9ECwAAf+Ow23RLy8ZWlyHJB9YkAQAA+CJGkgAAgM8wDENnyy9s8t4gqI7/bksCAADw36pchpZtPaxlWw9bvi0JIQkAAMAEIQkAAMAEa5J8UIO6/G8BAMBq/Br7mACHXb/qHm91GQAA+D2m2wAAAEwQkgAAAEww3eZjqpwuvbPrmCRpUGKM6rAtCQDAj9htNnWICXUfW4mQ5GMMSafOVLiPAQDwJw67TT1bRVhdhiSm2wAAAEwRkgAAgE85X+nU+Uqn1WUQkgAAgO+odLr0+pZDen3LIVU6XZbWQkgCAAAwQUgCAAAwwd1tPqhuANkVAACrEZJ8TIDDrgeSE6wuAwAAv8eQBQAAgAlCEgAAgAmm23xMldOld78skCQN7NiUbUkAAH7FbrOpdVQD97GVCEk+xpBUUHLefQwAgD9x2G3q3TbS6jIkMd0GAABgipAEAAB8SqXTZfnTtiVCEgAA8CGVTpcWbzqoxZsOWh6UCEkAAAAmCEkAAAAmuLvNB9VxWHvLIwAAICT5nACHXSN6trC6DAAA/B7TbQAAACYISQAAACaYbvMxVU6XPthdKEnq2z6KbUkAAH7FJqlFRH33sZUIST7GkHS46Dv3MQAA/qSOw66+HaKsLkMS020AAACmCEkAAAAmmG4DAAA+4/ttSSTpwZ4JCrBwbS4jSQAAACYISQAAACYISQAAACZYk+RjAhx2jerV0uoyAADwe4wkAQAAmCAkAQAAmGC6zcdUOV3akHtSktS7bRO2JQEA+BWbpLhG9dzHViIk+RhD0oFTZZKk29s2sbYYAACusToOuwZ0jLa6DEmEJAAA4EMOnCrTiu2HdeTb79SsYT39smuce8Pba42QBAAAfMKK7Yc14R+7ZLPZZBiGbDabXt24T88PTdTdXeOueT0seAEAAJY7cKpME/6xSy5DcrqMav8d/49dOvh/S1GuJUISAACw3Irth2WzmS/VttlsWr798DWuiJAEAAB8wJFvv5NhGKbvGYahI99+d40rIiQBAAAf0KxhvUuOJDVrWO8aV0RI8jkBDrse7JmgB3smKIBnJAEA/MQvu8ZdciTpHhZuQ7oQlAhIAAB/0iKivp4fmiibJJvtwoMk7bYLf88PTVSCBY8B4BEAAADAJ9zdNU43xYVr8uqvVHKuUj9pHaH7usdbEpAkQpLPcboMffzNhW1JbmvdRA671Q9lBwDg2kmIqK/7usdLkgZ2bGrp9lyEJB/jMgx9U3hWktSzVYQclu9cAwDAtVPHYdegzjFWlyGJNUkAAACmfCIkvfzyy0pISFDdunXVo0cPbd269ZL9i4uLlZaWpujoaAUFBalNmzZau3at+/25c+cqMTFRoaGhCg0NVXJyst59991q5zh//rzS0tLUuHFjNWjQQEOHDlVhYeFV+X4AAOD6Y3lIWr58uTIyMjR16lT9+9//VufOnZWSkqITJ06Y9q+oqFC/fv108OBBrVy5Urm5uVqwYIFiY2PdfZo1a6bnnntOOTk52r59u372s59p8ODB+uqrr9x9xo0bp3feeUdvvvmmNm7cqGPHjunOO++86t8XAABcXKXTpde3HNTrWw6q0umytBabcbGHElwjPXr0ULdu3fTnP/9ZkuRyuRQXF6fHHntMEyZMqNF/3rx5mjFjhvbs2aOAgIBaX6dRo0aaMWOGRo4cqZKSEjVp0kRLly7VXXfdJUnas2eP2rdvry1btuiWW275wfOVlpYqLCxMJSUlCg0NrXUdP6TS6dLiTQcliWclAQD8ztX+Hbyc329Lf4ErKiqUk5Ojvn37utvsdrv69u2rLVu2mH5m9erVSk5OVlpamqKiotSxY0dlZmbK6XSa9nc6nVq2bJnKysqUnJwsScrJyVFlZWW167Zr107x8fEXvW55eblKS0ur/QEAgB8vS0PSqVOn5HQ6FRUVVa09KipKBQUFpp/Zv3+/Vq5cKafTqbVr12ry5Ml68cUX9cwzz1Tr98UXX6hBgwYKCgrSI488olWrVqlDhw6SpIKCAgUGBio8PLzW150+fbrCwsLcf3Fx1/7JnwAA4Nq57h4B4HK5FBkZqfnz58vhcCgpKUlHjx7VjBkzNHXqVHe/tm3baufOnSopKdHKlSs1fPhwbdy40R2ULtfEiROVkZHhfl1aWnpVglKAw64Hkpu7jwEAgDUsDUkRERFyOBw17iorLCxU06ZNTT8THR2tgIAAORwOd1v79u1VUFCgiooKBQYGSpICAwPVqlUrSVJSUpK2bdumOXPm6NVXX1XTpk1VUVGh4uLiaqNJl7puUFCQgoKCruTr1lrdAMcPdwIAAFeVpUMVgYGBSkpKUnZ2trvN5XIpOzvbvX7o/69nz57Ky8uTy/WfFe979+5VdHS0OyCZcblcKi8vl3QhNAUEBFS7bm5urvLz8y96XQAA4F8sn27LyMjQ8OHD1bVrV3Xv3l2zZ89WWVmZRowYIUlKTU1VbGyspk+fLkkaPXq0/vznPys9PV2PPfaYvvnmG2VmZurxxx93n3PixIkaOHCg4uPjdebMGS1dulQbNmxQVlaWJCksLEwjR45URkaGGjVqpNDQUD322GNKTk6u1Z1tV5PTZejT/aclSbe0bMy2JAAAv2KTFBES6D62kuUh6Z577tHJkyc1ZcoUFRQUqEuXLlq3bp17MXd+fr7s9v8MeMXFxSkrK0vjxo1TYmKiYmNjlZ6ervHjx7v7nDhxQqmpqTp+/LjCwsKUmJiorKws9evXz91n1qxZstvtGjp0qMrLy5WSkqJXXnnl2n3xi3AZhr4+duHOue4tGrEtCQDAr9Rx2PX/bmpmdRmSfOA5SdcrnpMEAMD157p5ThIAAICvsny6DQAA4HuVTpdW5hyRJN2V1MzSGRVCEgAA8Clnz1dZXYIkptsAAABMEZIAAABMMN3mY+rYbbq3e5z7GAAAWMOjkaSysjJv14H/Y7PZFFI3QCF1A2SzEZIAALCKRyEpKipKDz30kD755BNv1wMAAOATPApJf/vb31RUVKSf/exnatOmjZ577jkdO3bM27X5pe+3Jfl0/2k5XTznEwDgf8KDAxQeHGB1GVf2xO2TJ0/q9ddf1+LFi7V7926lpKTooYce0h133KE6dX7cy5144jYAANefa/bE7SZNmigjI0O7du3SzJkz9cEHH+iuu+5STEyMpkyZonPnzl3J6QEAACxzRcM9hYWFWrJkiRYvXqxDhw7prrvu0siRI3XkyBE9//zz+vTTT/Xee+95q1YAAIBrxqOQ9NZbb2nRokXKyspShw4d9Oijj+r+++9XeHi4u8+tt96q9u3be6tOAADgByqdLr2946gkachNsdfftiQjRozQvffeq02bNqlbt26mfWJiYvSHP/zhiooDAAD+p/hcpdUlSPIwJB0/flzBwcGX7FOvXj1NnTrVo6IAAACs5tEY1oYNG5SVlVWjPSsrS+++++4VFwUAAGA1j0LShAkT5HQ6a7QbhqEJEyZccVH+rI7dpruSmumupGZsSwIAgIU8mm775ptv1KFDhxrt7dq1U15e3hUX5c9sNpsa1g+0ugwAAPyeRyNJYWFh2r9/f432vLw81a9f/4qLAgAAsJpHIWnw4MEaO3as9u3b527Ly8vTE088oTvuuMNrxfkjp8tQzqEi5RwqYlsSAIBfalC3jhrUtX7nDo8qeOGFFzRgwAC1a9dOzZo1kyQdOXJEt912m/70pz95tUB/4zIM/ftQsSQpsVm4HGJdEgDAfwQ47PpV93iry5DkYUgKCwvT5s2b9f777+vzzz9XvXr1lJiYqF69enm7PgAAAEt4PJZls9nUv39/9e/f35v1AAAA+ASPQ1JZWZk2btyo/Px8VVRUVHvv8ccfv+LCAACA/6lyuvTOrmOSpEGJMapzvW1LsmPHDv385z/XuXPnVFZWpkaNGunUqVMKDg5WZGQkIQkAAHjEkHTqTIX72EoexbNx48Zp0KBB+vbbb1WvXj19+umnOnTokJKSkli4DQAAfhQ8Ckk7d+7UE088IbvdLofDofLycsXFxemFF17Q73//e2/XCAAAcM15NN0WEBAgu/1CvoqMjFR+fr7at2+vsLAwHT582KsF+ps6dpsG3xTjPgYAANbwKCTddNNN2rZtm1q3bq3bb79dU6ZM0alTp/T666+rY8eO3q7Rr9hsNkWG1LW6DAAA/J5H022ZmZmKjo6WJD377LNq2LChRo8erZMnT2r+/PleLRAAAMAKlz2SZBiGIiMj3SNGkZGRWrdundcL81dOl6Evj5ZIkjrGhsnBlBsAwM/UDbDutv//5lFIatWqlb766iu1bt36atTk11yGoa0HiiRJHWJC2ZYEAOBXAhx2PZCcYHUZkjyYbrPb7WrdurVOnz59NeoBAADwCR6NZz333HN68skn9eWXX3q7HgAAAJ/g0d1tqampOnfunDp37qzAwEDVq1ev2vtFRUVeKQ4AAPiXKqdL735ZIEka2LHp9bctyezZs71cBgAAwIWtSApKzruPreRRSBo+fLi36wAAAPApHoWk/Pz8S74fHx/vUTEAAAC+wqOQlJCQIJvt4remO51Ojwvyd3XsNv0iMdp9DAAArOFRSNqxY0e115WVldqxY4dmzpypZ5991iuF+SubzaaY8Ho/3BEAAFxVHoWkzp0712jr2rWrYmJiNGPGDN15551XXBgAAICVPApJF9O2bVtt27bNm6f0Oy6Xod0FpZKk9k1DZWfKDQDgZ+o4fOO3z6OQVFpaWu21YRg6fvy4/vjHP7JVyRVyGoY25114mnmbqBDZ2ZYEAOBHAhx2jejZwuoyJHkYksLDw2ss3DYMQ3FxcVq2bJlXCgMAALCSRyFp/fr11UKS3W5XkyZN1KpVK9Wp49UZPAAAAEt4lGh69+7t5TIAAAAubEvywe5CSVLf9lGWbkvi0ZWnT5+uhQsX1mhfuHChnn/++SsuCgAA+CdD0uGi73S46DvLtyXxKCS9+uqrateuXY32G2+8UfPmzbviogAAAKzmUUgqKChQdHR0jfYmTZro+PHjV1wUAACA1TxakxQXF6dNmzapRYvqt+ht2rRJMTExXinMXzlsNqXc2NR9DAAArOFRSBo1apTGjh2ryspK/exnP5MkZWdn63e/+52eeOIJrxbob+x2m+IbB1tdBgAAfs+jkPTkk0/q9OnTevTRR1VRUSFJqlu3rsaPH68JEyZ4tUAAAAAreBSSbDabnn/+eU2ePFm7d+9WvXr11Lp1awUFBXm7Pr/jchnKO3lWktSqSQO2JQEAwCIehaSSkhI5nU41atRI3bp1c7cXFRWpTp06Cg0N9VqB/sZpGNqYe1KS1CKiPtuSAAD8SoDDrlG9WlpdhiQP72679957TbcfWbFihe69994rLgoAAMBqHoWkzz77TD/96U9rtPfu3VufffbZFRcFAABgNY9CUnl5uaqqqmq0V1ZW6rvvvrviogAAAKzmUUjq3r275s+fX6N93rx5SkpKuuzzvfzyy0pISFDdunXVo0cPbd269ZL9i4uLlZaWpujoaAUFBalNmzZau3at+/3p06erW7duCgkJUWRkpIYMGaLc3Nxq5+jdu7dsNlu1v0ceeeSyawcAAD9OHi3cfuaZZ9S3b199/vnn6tOnj6QLz0natm2b3nvvvcs61/Lly5WRkaF58+apR48emj17tlJSUpSbm6vIyMga/SsqKtSvXz9FRkZq5cqVio2N1aFDhxQeHu7us3HjRqWlpalbt26qqqrS73//e/Xv319ff/216tev7+43atQoPfXUU+7XwcE8nwgAAFzgUUjq2bOntmzZohkzZmjFihWqV6+eEhMT9Ze//EWtW7e+rHPNnDlTo0aN0ogRIyRdGI1as2aNFi5caPrMpYULF6qoqEibN29WQECAJCkhIaFan3Xr1lV7vXjxYkVGRionJ0e9evVytwcHB6tp06aXVS8AAPAPNsMwLNtkt6KiQsHBwVq5cqWGDBnibh8+fLiKi4v1z3/+s8Znfv7zn6tRo0YKDg7WP//5TzVp0kT33Xefxo8fL4fDYXqdvLw8tW7dWl988YU6duwo6cJ021dffSXDMNS0aVMNGjRIkydPvuhoUnl5ucrLy92vS0tLFRcXp5KSEq8+8sDlMnTwdJkkKaFxfZ6TBACAF5WWliosLKxWv98ejST9t/Pnz7ufuv292oaGU6dOyel0Kioqqlp7VFSU9uzZY/qZ/fv3a/369Ro2bJjWrl2rvLw8Pfroo6qsrNTUqVNr9He5XBo7dqx69uzpDkiSdN9996l58+aKiYnRrl27NH78eOXm5uqtt94yve706dM1bdq0Wn2vK2G329SySYOrfh0AAHBpHoWkc+fO6Xe/+51WrFih06dP13jf6XRecWEX43K5FBkZqfnz58vhcCgpKUlHjx7VjBkzTENSWlqavvzyS33yySfV2h9++GH3cadOnRQdHa0+ffpo3759uuGGG2qcZ+LEicrIyHC//n4kCQAA/Dh5dHfbk08+qfXr12vu3LkKCgrSa6+9pmnTpikmJkZ//etfa32eiIgIORwOFRYWVmsvLCy86Fqh6OhotWnTptrUWvv27VVQUFBjRGvMmDH617/+pQ8//FDNmjW7ZC09evSQdGFqzkxQUJBCQ0Or/V0NLpeh/SfPav/Js3K5LJsJBQDA73kUkt555x298sorGjp0qOrUqaPbbrtNkyZNUmZmpt54441anycwMFBJSUnKzs52t7lcLmVnZys5Odn0Mz179lReXp5cLpe7be/evYqOjlZgYKAkyTAMjRkzRqtWrdL69evVokWLH6xl586dki6EMCs5DUPZu08oe/cJOa1bLgYAgN/zKCQVFRWpZcsL+6qEhoaqqKhIkvSTn/xEH3300WWdKyMjQwsWLNCSJUu0e/dujR49WmVlZe673VJTUzVx4kR3/9GjR6uoqEjp6enau3ev1qxZo8zMTKWlpbn7pKWl6W9/+5uWLl2qkJAQFRQUqKCgwP2gy3379unpp59WTk6ODh48qNWrVys1NVW9evVSYmKiJ/8kXnPwVJnW557Qqh1HNSMrVwdOlVlaDwAA/sqjNUktW7bUgQMHFB8fr3bt2mnFihXq3r273nnnnWrPK6qNe+65RydPntSUKVNUUFCgLl26aN26de7F3Pn5+bLb/5Pl4uLilJWVpXHjxikxMVGxsbFKT0/X+PHj3X3mzp0r6cIdbP9t0aJFevDBBxUYGKgPPvhAs2fPVllZmeLi4jR06FBNmjTJk38Or1mx/bDGr9wl2SQZ0p6CUr328X49PzRRd3dl/RMAANeSR48AmDVrlhwOhx5//HF98MEHGjRokAzDUGVlpWbOnKn09PSrUatPuZxbCGvjwKky9Xlxg8yWIdlt0voneishon7NNwEAQK1d9UcAjBs3zn3ct29f7dmzRzk5OWrVqpXl01XXqxXbD8tms0kmmdVms2n59sMaP6CdBZUBAOCfrvg5SZLUvHlzNW/evEZ7p06dtHbtWm6Vr4Uj336niw3qGYahI9+ycTAAANeSRwu3a+vgwYOqrKy8mpf40WjWsN6FkSQTNptNzRrWu8YVAQDg365qSELt/bJr3CVHku5h4TYAANcUIclHtIior+eHJspukxx2W7X/Pj80kUXbAABcY15ZkwTvuLtrnLolNNLy7Yd15Nvv1KxhPd3TNY6ABACABQhJPia+UbB+1S1e0oV1Sna7+TolAABwdTHd5mOchqGsrwqU9VUB25IAAGChqxqSXn31VfeTswEAAK4ntZ5ue+mll2p90scff1ySdN99911+RQAAAD6g1iFp1qxZ1V6fPHlS586dc+/VVlxcrODgYEVGRrpDEgAAwPWq1tNtBw4ccP89++yz6tKli3bv3q2ioiIVFRVp9+7duvnmm/X0009fzXoBAACuCY/WJE2ePFn/+7//q7Zt27rb2rZtq1mzZmnSpEleKw4AAMAqHoWk48ePq6qqqka70+lUYWHhFRcFAABgNY9CUp8+ffSb3/xG//73v91tOTk5Gj16tPr27eu14vyRw2bTra0a69ZWjeW4yF5uAADg6vMoJC1cuFBNmzZV165dFRQUpKCgIHXv3l1RUVF67bXXvF2jX7HbbboxJkw3xoTxIEkAACzk0RO3mzRporVr12rv3r3as2ePJKldu3Zq06aNV4sDAACwyhVtS5KQkCDDMHTDDTeoTh12OPEGwzB0vOS8JCk6rK5sTLkBAGAJj6bbzp07p5EjRyo4OFg33nij8vPzJUmPPfaYnnvuOa8W6G+qXIbW7DquNbuOq8rFtiQAAFjFo5A0ceJEff7559qwYYPq1q3rbu/bt6+WL1/uteIAAACs4tEc2dtvv63ly5frlltuqTYddOONN2rfvn1eKw4AAMAqHo0knTx5UpGRkTXay8rKWEMDAAB+FDwKSV27dtWaNWvcr78PRq+99pqSk5O9UxkAAICFPJpuy8zM1MCBA/X111+rqqpKc+bM0ddff63Nmzdr48aN3q4RAADgmvNoJOknP/mJdu7cqaqqKnXq1EnvvfeeIiMjtWXLFiUlJXm7RgAAgGvO44cb3XDDDVqwYIE3a4Eku82m7i0auY8BAIA1PApJa9eulcPhUEpKSrX2rKwsuVwuDRw40CvF+SOH3abOceFWlwEAgN/zaLptwoQJcjqdNdoNw9CECROuuCgAAACreTSS9M0336hDhw412tu1a6e8vLwrLsqfGYahk2fLJUlNGgTxSAUAACzi0UhSWFiY9u/fX6M9Ly9P9evXv+Ki/FmVy9A/dxzTP3ccY1sSAAAs5FFIGjx4sMaOHVvt6dp5eXl64okndMcdd3itOAAAAKt4FJJeeOEF1a9fX+3atVOLFi3UokULtW/fXo0bN9af/vQnb9cIAABwzXm0JiksLEybN2/W+++/r88//1z16tVTYmKievXq5e36AAAALOHxc5JsNpv69++v/v37e7MeAAAAn+BxSMrOzlZ2drZOnDghl8tV7b2FCxdecWEAAABW8igkTZs2TU899ZS6du2q6OhoblMHAAA/Oh6FpHnz5mnx4sV64IEHvF2P37PbbLq5ebj7GAAAWMOjkFRRUaFbb73V27VAF7YlSWreyOoyAADwex49AuDXv/61li5d6u1aAAAAfIZHI0nnz5/X/Pnz9cEHHygxMVEBAQHV3p85c6ZXivNHhmGo+FylJCk8OID1XgAAWMSjkLRr1y516dJFkvTll19We48f9StT5TK0MueIJOnBngkKcPDvCQCAFTwKSR9++KG36wAAAPApHq1JAgAA+LHz+GGS27dv14oVK5Sfn6+Kiopq77311ltXXBgAAICVPBpJWrZsmW699Vbt3r1bq1atUmVlpb766iutX79eYWFh3q4RAADgmvMoJGVmZmrWrFl65513FBgYqDlz5mjPnj365S9/qfj4eG/XCAAAcM15FJL27dunX/ziF5KkwMBAlZWVyWazady4cZo/f75XCwQAALCCRyGpYcOGOnPmjCQpNjbW/RiA4uJinTt3znvV+SG7zaZOzcLUqVkY25IAAGAhjxZu9+rVS++//746deqku+++W+np6Vq/fr3ef/999enTx9s1+hWH3aZbWja2ugwAAPyeRyHpz3/+s86fPy9J+sMf/qCAgABt3rxZQ4cO1aRJk7xaIAAAgBVshmEYVhdxPSotLVVYWJhKSkoUGhrqtfMahqGz5VWSpAZBdXiCOQAAXnQ5v9+1HkkqLS2tdQHeDA3+psplaNnWw5LYlgQAACvVOiSFh4f/4KiGYRiy2WxyOp1XXBgAAICVah2S2K8NAAD4k1qHpNtvv/1q1gEAAOBTPN67TZLOnTtnundbYmLiFRUFAABgNY9C0smTJzVixAi9++67pu+zJgkAAFzvPHri9tixY1VcXKzPPvtM9erV07p167RkyRK1bt1aq1evvuzzvfzyy0pISFDdunXVo0cPbd269ZL9i4uLlZaWpujoaAUFBalNmzZau3at+/3p06erW7duCgkJUWRkpIYMGaLc3Nxq5zh//rzS0tLUuHFjNWjQQEOHDlVhYeFl1w4AAH6cPApJ69ev18yZM9W1a1fZ7XY1b95c999/v1544QVNnz79ss61fPlyZWRkaOrUqfr3v/+tzp07KyUlRSdOnDDtX1FRoX79+ungwYNauXKlcnNztWDBAsXGxrr7bNy4UWlpafr000/1/vvvq7KyUv3791dZWZm7z7hx4/TOO+/ozTff1MaNG3Xs2DHdeeednvxzeJXdZlOHmFB1iAllWxIAAKxkeCAkJMQ4cOCAYRiGER8fb3zyySeGYRjG/v37jXr16l3Wubp3726kpaW5XzudTiMmJsaYPn26af+5c+caLVu2NCoqKmp9jRMnThiSjI0bNxqGYRjFxcVGQECA8eabb7r77N6925BkbNmypVbnLCkpMSQZJSUlta4DAABY63J+vz0aSWrbtq17+qpz58569dVXdfToUc2bN0/R0dG1Pk9FRYVycnLUt29fd5vdblffvn21ZcsW08+sXr1aycnJSktLU1RUlDp27KjMzMxLroMqKSmRJDVq1EiSlJOTo8rKymrXbdeuneLj4y963fLycpWWllb7AwAAP14e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1fqdP39eSUlJWrNmjb788ks9/PDDeuCBB7R169aLnnvMmDHasmWLli1bpl27dunuu+/WgAED9M0333hesAGPffjhh4Yko379+tX+Tp06Zbz++utG27ZtDZfL5e5fXl5u1KtXz8jKyjIMwzCGDx9uNG/e3HA6ne4+bdu2NW677Tb366qqKqN+/frG3//+94vWMWPGDCMpKcn9eurUqUbnzp3dr2+44QZj6dKl1T7z9NNPG8nJyR5/dwAAauv738tvv/3WGDJkiDFt2jTDMAzjpz/9qTFnzhxj1apVxg9Fkl/84hfGE0884X59++23G+np6YZhGMahQ4cMh8NhHD16tNpn+vTpY0ycONHjulmT5AUff/yxQkJC3K8bNmyozz//XHl5edXapQvpeN++fe7XN954o+z2/wzoRUVFqWPHju7XDodDjRs31okTJ9xty5cv10svvaR9+/bp7NmzqqqquuguyWVlZdq3b59GjhypUaNGudurqqpqvQsyAADe8tBDDyk9PV3333+/tmzZojfffFMff/xxtT5Op1OZmZlasWKFjh49qoqKCpWXlys4ONj0nF988YWcTqfatGlTrb28vFyNGzf2uFZCkhe0aNFC4eHh1drOnj2rpKQkvfHGGzX6N2nSxH0cEBBQ7T2bzWba5nK5JElbtmzRsGHDNG3aNKWkpCgsLEzLli3Tiy++aFrb2bNnJUkLFixQjx49qr3ncDhq9wUBAPCSgQMH6uGHH9bIkSM1aNAg0xAzY8YMzZkzR7Nnz1anTp1Uv359jR07ttpylf929uxZORwO5eTk1Phtu5KbqQhJV8nNN9+s5cuXKzIy8qKjPJ7YvHmzmjdvrj/84Q/utkOHDl20f1RUlGJiYrR//34NGzbMa3UAAOCJOnXqKDU1VS+88ILeffdd0z6bNm3S4MGDdf/990uSXC6X9u7dqw4dOpj2v+mmm+R0OnXixAnddtttXquVhdtXybBhwxQREaHBgwfr448/1oEDB7RhwwY9/vjj1RZhX67WrVsrPz9fy5Yt0759+/TSSy9p1apVl/zMtGnTNH36dL300kvau3evvvjiCy1atEgzZ870uA4AADz19NNP6+TJk0pJSTF9v3Xr1nr//fe1efNm7d69W7/5zW9UWFh40fO1adNGw4YNU2pqqt566y0dOHBAW7du1fTp07VmzRqP6yQkXSXBwcH66KOPFB8frzvvvFPt27fXyJEjdf78+SsaWbrjjjs0btw4jRkzRl26dNHmzZs1efLkS37m17/+tV577TUtWrRInTp10u23367FixerRYsWHtcBAICnAgMDFRERcdEHSE6aNEk333yzUlJS1Lt3bzVt2lRDhgy55DkXLVqk1NRUPfHEE2rbtq2GDBmibdu2KT4+3uM6bYZhGB5/GgAA4EeKkSQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAThCQAAAAT/x9AlWIeg3G+FAAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
}
],
"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.8.11"
},
"colab": {
"provenance": []
}
},
"nbformat": 4,
"nbformat_minor": 0
}