{ "cells": [ { "cell_type": "markdown", "id": "56e6df09", "metadata": { "id": "presidential-train" }, "source": [ "#
Taller de Aprendizaje Automático
\n", "##
Taller 1: Titanic
" ] }, { "cell_type": "markdown", "id": "641ec10d", "metadata": { "id": "functioning-mortality" }, "source": [ "En esta actividad se trabajará con el dataset [Titanic](https://www.kaggle.com/c/titanic/overview) disponible en Kaggle. El objetivo es predecir si un pasajero sobrevivirá a partir de atributos personales. La descripción de los atributos se encuentra en la misma [página](https://www.kaggle.com/c/titanic/data) en que se pueden bajar los datos. " ] }, { "cell_type": "markdown", "id": "cf515408", "metadata": { "id": "immediate-rwanda" }, "source": [ "## Objetivos Generales del Taller\n", " - Abordar un problema de aprendizaje automático de punta a punta\n", " - Familiarizarse con la biblioteca **pandas** para levantar y explorar los datos\n", " - Familiarizarse con los **pipelines** de **scikit-learn** como una forma de resolver un problema en forma ordenada." ] }, { "cell_type": "markdown", "id": "dce3faac", "metadata": { "id": "graphic-longitude" }, "source": [ "## Formas de trabajo \n", "\n", "Se podrá elegir entre dos formas de trabajo: instalación local o Colab. Para trabajar en clase Colab es completamente adecuado. Para ejecutar corridas que demanden mucho tiempo (por ejemplo, búsqueda de hiperparámetros) puede ser conveniente trabajar localmente. A continuación se explica cómo proceder en cada caso. Cualquiera sea la elección se recomienda trabajar con `scikit-learn>1.1.0`." ] }, { "cell_type": "markdown", "id": "bd1f2c8d", "metadata": { "id": "similar-surgery" }, "source": [ "### Opción 1: Trabajar localmente" ] }, { "cell_type": "markdown", "id": "6a69d951", "metadata": { "id": "40f58d99" }, "source": [ "#### Ambiente de Trabajo" ] }, { "cell_type": "markdown", "id": "5337d0a6", "metadata": { "id": "2ceaed09" }, "source": [ "Deberá trabajar en su propio ambiente de desarrollo. Ej: **conda environment**. En caso de no contar con uno deberá crearlo ejecutando la siguiente línea de comando: \n", "\n", "`conda create -n TAA-py311 python=3.11` \n", "\n", "Una vez creado se procede a activarlo: \n", "\n", "`conda activate TAA-py311` \n", "\n", "Una vez activado se instalan en el entorno los paquetes que se utilizaran: \n", "\n", "`pip install numpy matplotlib pandas \"scikit-learn>1.1.0\" notebook` \n", "\n", "Una vez finalizada la instalación abra el Jupyter Notebook:\n", "\n", "`jupyter-notebook`" ] }, { "cell_type": "markdown", "id": "71a72bc4", "metadata": { "id": "fresh-prize" }, "source": [ "Los paquetes faltantes se pueden instalar desde el notebook haciendo: \n", "\n", "`!pip install paquete_faltante`" ] }, { "cell_type": "markdown", "id": "e83900c9", "metadata": { "id": "baeed628", "jp-MarkdownHeadingCollapsed": true }, "source": [ "#### Configuración del API token " ] }, { "cell_type": "markdown", "id": "0f84354a", "metadata": { "id": "65511396" }, "source": [ "A continuación, vaya a su cuenta de [Kaggle](https://www.kaggle.com/) (o cree una si aún no lo ha hecho), haga clic en el icono de perfil en la esquina superior derecha de la pantalla y seleccione \"Your Account\" en la lista desplegable. Luego, seleccione la viñeta \"Account\" y haga clic en \"Create new API token\". Entonces un archivo llamado kaggle.json se descargará automáticamente a su carpeta de descargas. Este archivo contiene sus credenciales de inicio de sesión para permitirle acceder a la API." ] }, { "cell_type": "markdown", "id": "5679841f", "metadata": { "id": "078a13be" }, "source": [ "Cree (en caso de no existir) la carpeta `.kaggle`. Modifique *nombre_usuario* por el nombre del usuario donde está trabajando." ] }, { "cell_type": "code", "execution_count": null, "id": "daa56599", "metadata": { "id": "d93098d6" }, "outputs": [], "source": [ "!mkdir C:\\Users\\nombre_usuario\\.kaggle" ] }, { "cell_type": "markdown", "id": "b656757b", "metadata": { "id": "1e95cc52" }, "source": [ "Mueva el archivo descargado a la carpeta creada. " ] }, { "cell_type": "code", "execution_count": null, "id": "f53f7709", "metadata": { "id": "6ac83b45", "outputId": "20d75cc7-5a6c-4a10-fdf3-0e03dfac8a2b" }, "outputs": [], "source": [ "#Comando en Windows\n", "!move C:\\Users\\nombre_usuario\\Downloads\\kaggle.json C:\\Users\\nombre_usuario\\.kaggle\n", "\n", "#Comando en Linux\n", "# !mv C:\\Users\\nombre_usuario\\Downloads\\kaggle.json C:\\Users\\nombre_usuario\\.kaggle" ] }, { "cell_type": "markdown", "id": "634e8a7b", "metadata": { "id": "efficient-thailand", "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Opción 2: Trabajar en *Colab*. " ] }, { "cell_type": "markdown", "id": "a1ee4a73", "metadata": { "id": "compound-criminal" }, "source": [ "Se puede trabajar en Google Colab. Para ello es necesario contar con una cuenta de **google drive** y ejecutar un notebook almacenado en dicha cuenta. De lo contrario, no se conservarán los cambios realizados en la sesión. En caso de ya contar con una cuenta, se puede abrir el notebook y luego ir a `Archivo-->Guardar una copia en drive`. \n", "\n", "\n", " \n", "
\n", " Ejecutar en Google Colab\n", "
" ] }, { "cell_type": "markdown", "id": "a637c9fa", "metadata": { "id": "e_rith_Skga5" }, "source": [ "La siguiente celda monta el disco personal del drive:" ] }, { "cell_type": "code", "execution_count": null, "id": "7a541d79", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 21875, "status": "ok", "timestamp": 1645451536176, "user": { "displayName": "Emiliano Acevedo", "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s64", "userId": "09255842080725499836" }, "user_tz": 180 }, "id": "timely-power", "outputId": "9b878f94-05b8-4598-baa4-08a3e132868d" }, "outputs": [], "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "markdown", "id": "7559ffd0-b664-4a65-aef7-7a7107a8b487", "metadata": {}, "source": [ "#### Configuración del API token en Colab" ] }, { "cell_type": "markdown", "id": "6d5f5528", "metadata": { "id": "9WC47WBdkeqj" }, "source": [ "A continuación, vaya a su cuenta de [Kaggle](https://www.kaggle.com/) (o cree una si aún no lo ha hecho), haga clic en el icono de perfil en la esquina superior derecha de la pantalla y seleccione \"Your Account\" en la lista desplegable. Luego, seleccione la viñeta \"Settings\" y en la sección API haga clic en \"Create new token\". Entonces un archivo llamado kaggle.json se descargará automáticamente a su carpeta de descargas. Este archivo contiene sus credenciales de inicio de sesión para permitirle acceder a la API." ] }, { "cell_type": "markdown", "id": "1034537a", "metadata": { "id": "changing-enhancement" }, "source": [ "La siguiente celda realiza la configuración necesaria para obtener datos desde la plataforma Kaggle. Le solicitará que suba el archivo kaggle.json descargado anteriormente." ] }, { "cell_type": "code", "execution_count": null, "id": "49aaa7fd", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 90, "resources": { "http://localhost:8080/nbextensions/google.colab/files.js": { "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZG8gewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwoKICAgICAgbGV0IHBlcmNlbnREb25lID0gZmlsZURhdGEuYnl0ZUxlbmd0aCA9PT0gMCA/CiAgICAgICAgICAxMDAgOgogICAgICAgICAgTWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCk7CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPSBgJHtwZXJjZW50RG9uZX0lIGRvbmVgOwoKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCk7CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK", "headers": [ [ "content-type", "application/javascript" ] ], "ok": true, "status": 200, "status_text": "" } } }, "executionInfo": { "elapsed": 31400, "status": "ok", "timestamp": 1645451632279, "user": { "displayName": "Emiliano Acevedo", "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s64", "userId": "09255842080725499836" }, "user_tz": 180 }, "id": "convinced-person", "outputId": "59951021-dcb6-4622-e24e-062806a6ce7f" }, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')\n", "from google.colab import files\n", "\n", "# El siguiente archivo solicitado es para habilitar la API de Kaggle en el entorno que está trabajando.\n", "# Este archivo se descarga entrando a su perfíl de Kaggle, en la sección Settings/API, presionando donde dice: Create New Token\n", "\n", "uploaded = files.upload()\n", "\n", "for fn in uploaded.keys():\n", " print('User uploaded file \"{name}\" with length {length} bytes'.format(\n", " name=fn, length=len(uploaded[fn])))\n", "\n", "#Then move kaggle.json into the folder where the API expects to find it.\n", "!mkdir -p ~/.kaggle/ && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json" ] }, { "cell_type": "markdown", "id": "f029977e-fb92-4680-8b71-2a4bcf26ff57", "metadata": {}, "source": [ "## Descarga de los datos" ] }, { "cell_type": "markdown", "id": "d82f8112-3316-4325-869f-693ae24ff829", "metadata": {}, "source": [ "### Unirse a la competición" ] }, { "cell_type": "markdown", "id": "25b171b7-ee0b-43a2-be69-5ada231a1146", "metadata": {}, "source": [ "Vaya a la competición de [Titanic](https://www.kaggle.com/c/titanic) en Kaggle y presione **Join Competition**. " ] }, { "cell_type": "markdown", "id": "d50f73ee-3d4d-4ca8-9ed6-ec93b14c8b64", "metadata": {}, "source": [ "### Instalar el paquete *kaggle*" ] }, { "cell_type": "markdown", "id": "ab102661", "metadata": { "id": "a8d1d5d7" }, "source": [ "Para obtener los datos de Kaggle primero se instalará la librería de **Kaggle**" ] }, { "cell_type": "code", "execution_count": null, "id": "b3e53070", "metadata": { "ExecuteTime": { "end_time": "2023-03-08T11:54:51.678223Z", "start_time": "2023-03-08T11:54:50.184110Z" }, "id": "7a237ab0", "scrolled": true }, "outputs": [], "source": [ "!pip install kaggle" ] }, { "cell_type": "markdown", "id": "8d0de337", "metadata": { "id": "616b3cae" }, "source": [ "Si la instalación fue exitosa, el siguiente comando debería mostrar una lista de todas las competiciones activas de Kaggle. " ] }, { "cell_type": "code", "execution_count": null, "id": "b769ca4a", "metadata": { "id": "c2435eef", "outputId": "ebf3675e-9000-405a-fcf0-46b3d4d5d4f8" }, "outputs": [], "source": [ "!kaggle competitions list" ] }, { "cell_type": "markdown", "id": "87bb5824-2df1-400c-ae4e-a95ea5647a8f", "metadata": {}, "source": [ "#### Descargar y descomprimir los datos" ] }, { "cell_type": "markdown", "id": "d9032e65", "metadata": { "id": "fossil-australian" }, "source": [ "Ejecutar el siguiente comando para bajar los datos de la competencia *titanic*." ] }, { "cell_type": "code", "execution_count": null, "id": "de5aee66", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 2104, "status": "ok", "timestamp": 1645451663400, "user": { "displayName": "Emiliano Acevedo", "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s64", "userId": "09255842080725499836" }, "user_tz": 180 }, "id": "independent-eagle", "outputId": "bfe00bd3-81a5-487f-e60f-8b6e2ce1a189" }, "outputs": [], "source": [ "!kaggle competitions download -c titanic" ] }, { "cell_type": "markdown", "id": "7ca61700", "metadata": { "id": "e60a6af5" }, "source": [ "Descomprima el archivo descargado:" ] }, { "cell_type": "code", "execution_count": null, "id": "5891d0bb", "metadata": { "id": "0c354714", "outputId": "61a66a02-6248-4c03-a6a6-b1eb711b2970" }, "outputs": [], "source": [ "# Forma 1\n", "!unzip titanic.zip\n", "\n", "# Forma 2\n", "# import zipfile\n", "# with zipfile.ZipFile(\"titanic.zip\",\"r\") as zip_ref:\n", "# zip_ref.extractall(\"./\")" ] }, { "cell_type": "markdown", "id": "e1ad0f59", "metadata": { "id": "selected-expression" }, "source": [ "## Parte 1 - Carga de datos" ] }, { "cell_type": "markdown", "id": "cc06be81", "metadata": { "id": "hundred-impact" }, "source": [ "#### Ejercicios:\n", "\n", " - Levantar el conjunto de entrenamiento utilizando el método `read_csv()` de la biblioteca **pandas**. \n", " - Explorar los métodos `head()`, `info()` y `describe()` para obtener información relevante de los datos. " ] }, { "cell_type": "code", "execution_count": null, "id": "36125d16-15eb-43b1-94e1-692f7aa75c90", "metadata": {}, "outputs": [], "source": [ "# data_train = " ] }, { "cell_type": "markdown", "id": "4c36e4b4", "metadata": { "id": "amber-scenario" }, "source": [ "## Parte 2 - Exploración con pandas" ] }, { "cell_type": "markdown", "id": "78b551e2", "metadata": { "id": "inclusive-ministry", "solution2": "shown", "solution2_first": true }, "source": [ "#### Ejemplos de manipulación con Pandas " ] }, { "cell_type": "markdown", "id": "29fe4d41", "metadata": { "id": "secure-davis", "solution2": "shown" }, "source": [ "**1)** Ejemplo de filtrado utilizando `df.loc[..]`. ¿Quiénes eran los pasajeros mayores de 60 años que viajaban en tercera clase? ¿Cuáles sobrevivieron?" ] }, { "cell_type": "code", "execution_count": null, "id": "d96579c7", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:31:58.517283Z", "start_time": "2022-02-21T11:31:58.493347Z" }, "id": "convertible-liver", "outputId": "5a7282e5-9d58-44cc-d955-a4e76dd1422b", "solution2": "shown" }, "outputs": [], "source": [ "data_train.loc[(data_train['Age'] > 60) & (data_train['Pclass'] == 3)]" ] }, { "cell_type": "code", "execution_count": null, "id": "05d27ef7", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:31:59.100114Z", "start_time": "2022-02-21T11:31:59.077168Z" }, "id": "environmental-merchandise", "outputId": "226ab91c-0f1e-4ea4-d3af-aae76847d359", "solution2": "shown" }, "outputs": [], "source": [ "data_train.loc[(data_train['Age'] > 60) & (data_train['Pclass'] == 3) & (data_train['Survived'] == 1)]" ] }, { "cell_type": "markdown", "id": "82a9ada0", "metadata": { "id": "fallen-province", "solution2": "shown" }, "source": [ "**2)** Ejemplo de manipular columnas y filas de dataframes. Generar un vector con las etiquetas a partir del nombre." ] }, { "cell_type": "code", "execution_count": null, "id": "c6c28f26", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:32:00.227091Z", "start_time": "2022-02-21T11:32:00.213130Z" }, "id": "continental-cabin", "outputId": "183e77c5-ec62-4bf6-b0cc-c0df6e19f5bd", "solution2": "shown" }, "outputs": [], "source": [ "y_target = data_train['Survived']\n", "y_target" ] }, { "cell_type": "code", "execution_count": null, "id": "c73da135", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:32:00.748080Z", "start_time": "2022-02-21T11:32:00.738107Z" }, "id": "charitable-dominant", "outputId": "490a4278-b32f-4774-82de-86a29957a789", "solution2": "shown" }, "outputs": [], "source": [ "y_target = data_train.loc[:, 'Survived']\n", "y_target" ] }, { "cell_type": "markdown", "id": "2c2262fc-66ba-4a4e-b223-9a9a54140913", "metadata": {}, "source": [ "**3)** Generar el vector de etiquetas a partir del número de la columna. " ] }, { "cell_type": "code", "execution_count": null, "id": "b49dbb48", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:32:01.299941Z", "start_time": "2022-02-21T11:32:01.278002Z" }, "id": "received-mother", "outputId": "b7195108-8ce0-49df-9d06-9466f0401618", "solution2": "shown" }, "outputs": [], "source": [ "column_names = data_train.columns.to_list()\n", "print(column_names)\n", "\n", "index_survived = column_names.index('Survived')\n", "print(index_survived)\n", "\n", "y_target = data_train.iloc[:,index_survived]\n", "y_target" ] }, { "cell_type": "markdown", "id": "c3c447ee", "metadata": { "id": "coated-million" }, "source": [ "#### Ejercicios:\n", " - Identificar el atributo a predecir \n", " - Obtener el porcentaje de pasajeros del conjunto de entrenamiento que sobrevivió. ¿Es un problema de clases desbalanceadas? \n", " - Identificar los atributos numéricos y categóricos.\n", " - En caso de contar con datos categóricos identifique las categorías.\n", " - Obtener el porcentaje de pasajeros dentro de cada categoría que sobrevivió. Asegúrese de poder responder preguntas del tipo: ¿Qué porcentaje de mujeres sobrevivieron? ¿Cuál fue el porcentaje de paraseros de primera clase (PClass 1) que sobrevivió?)\n", " - Identificar y cuantificar datos faltantes.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "d56c7c3a-f76f-472f-a0b9-26a4eb35717c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "9113b5af", "metadata": { "id": "featured-pharmacy" }, "source": [ "## Parte 3 - Descubrir y visualizar los datos para obtener información relevante. \n" ] }, { "cell_type": "markdown", "id": "5a7429d5", "metadata": { "id": "broadband-tsunami" }, "source": [ " - Explore [métodos de visualización](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html) con **pandas**. Para graficar con *pandas* es necesario importar *matplotlib*. Puede ser útil comparar los histogramas de cada clase contra los histogramas de supervivencia en cada clase. \n", " - Estudie la correlación de las características con la etiqueta a predecir. Se sugiere utilizar el método `corr()`.\n", " - Concluya que factores tuvieron mayor incidencia en la supervivencia o no de un pasajero." ] }, { "cell_type": "code", "execution_count": null, "id": "a362e944", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "76032391", "metadata": { "ExecuteTime": { "end_time": "2022-02-14T13:43:12.322654Z", "start_time": "2022-02-14T13:43:12.318666Z" }, "id": "duplicate-landing" }, "source": [ "## Parte 4 - Un Primer Pipeline " ] }, { "cell_type": "markdown", "id": "3321b311", "metadata": { "id": "retired-first" }, "source": [ "- Construir un **pipeline** que realice el preprocesamiento de los datos necesario para que éstos puedan ser utilizados por un clasificador de *sklearn*. Dicho preprocesamiento deberá en primera instancia realizar las siguientes tareas:\n", "\n", " 1. Descartar los atributos *Cabin*, *Name* y *Ticket*.\n", " 2. Rellenar datos faltantes con algún criterio elegido" ] }, { "cell_type": "code", "execution_count": null, "id": "de5282b0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "8b794507", "metadata": { "id": "answering-yacht", "solution2": "hidden", "solution2_first": true }, "source": [ "- Acceda a los elementos del pipeline. Para acceder a las distintas transformaciones se usa `named_transformers_` y para acceder a los steps de cada transformación `named_steps` " ] }, { "cell_type": "code", "execution_count": null, "id": "cac06e15", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:32:41.314068Z", "start_time": "2022-02-21T11:32:41.291125Z" }, "id": "latest-grass", "outputId": "aba6d625-f665-4cfb-a9f3-7ba5b4639782", "solution2": "hidden" }, "outputs": [], "source": [ "preprocessing_pipeline_default.get_feature_names_out()" ] }, { "cell_type": "code", "execution_count": null, "id": "9249a1d2", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:32:41.977263Z", "start_time": "2022-02-21T11:32:41.963303Z" }, "id": "subject-console", "outputId": "6062fb00-a79f-4e74-8b1e-81411192a3b0", "scrolled": true, "solution2": "hidden" }, "outputs": [], "source": [ "preprocessing_pipeline_default.named_transformers_" ] }, { "cell_type": "code", "execution_count": null, "id": "0f22c30c", "metadata": { "ExecuteTime": { "end_time": "2022-02-21T11:32:42.722270Z", "start_time": "2022-02-21T11:32:42.714294Z" }, "id": "double-scoop", "outputId": "9955fc90-5ba6-40b1-d5a3-c610d77943ba", "solution2": "hidden" }, "outputs": [], "source": [ "preprocessing_pipeline_default.named_transformers_['cat'].named_steps['ohe'].categories_" ] }, { "cell_type": "markdown", "id": "0272bb0d", "metadata": { "id": "earlier-board" }, "source": [ "## Parte 5 - Un Segundo Pipeline" ] }, { "cell_type": "markdown", "id": "a16e2a2e", "metadata": { "id": "lesser-teacher" }, "source": [ "- Realizar un **pipeline** que utilice como único atributo el género del pasajero. " ] }, { "cell_type": "code", "execution_count": null, "id": "024f90a7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "66340f80", "metadata": { "id": "faced-climb" }, "source": [ "## Parte 6 - Clasificación con Regresión Logística" ] }, { "cell_type": "markdown", "id": "5ad84773", "metadata": { "id": "massive-burst" }, "source": [ "- Con los datos procesados por los pipelines de la Parte 4 y Parte 5 entrenar un modelo de *Regresión Logística* con parámetros por defecto y estimar el desempeño mediante validación cruzada 5-folds.\n", "- Observe los desempeños obtenidos. ¿Qué puede decir sobre los datos? ¿Y sobre el modelo?" ] }, { "cell_type": "code", "execution_count": null, "id": "6df7145e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "2fdb958d", "metadata": { "ExecuteTime": { "end_time": "2022-02-14T14:27:14.408426Z", "start_time": "2022-02-14T14:27:14.398454Z" }, "heading_collapsed": true, "id": "entertaining-asian" }, "source": [ "## Parte 7 - Busqueda de Hiperparámetros" ] }, { "cell_type": "markdown", "id": "85fa9ade", "metadata": { "hidden": true, "id": "friendly-melissa" }, "source": [ "- Utilizar *Grid Search* para encontrar el valor óptimo del parámetro *C* del mejor clasificador de *Regresión Logística* obtenido de la parte anterior. " ] }, { "cell_type": "code", "execution_count": null, "id": "3035cc1b", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "5fe5e557", "metadata": { "id": "stunning-price" }, "source": [ "## Parte 8 - Guardar Modelo" ] }, { "cell_type": "markdown", "id": "062acf1b", "metadata": { "id": "prompt-capture" }, "source": [ "- Guarde el modelo obtenido de la parte anterior.\n", " \n", "*Observación: Es usual que entrenar modelos tome un tiempo considerable por lo que el guardado del modelo resulta de vital importancia.*" ] }, { "cell_type": "code", "execution_count": null, "id": "0e64efe9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "0a8595f3", "metadata": { "id": "careful-biology" }, "source": [ "## Parte 9 - Generar predicciones en conjunto de test" ] }, { "cell_type": "markdown", "id": "979a7d96", "metadata": { "id": "induced-working" }, "source": [ "- Levante el modelo guardado en la parte anterior.\n", "- Genere las predicciones con el conjunto de test." ] }, { "cell_type": "code", "execution_count": null, "id": "c928ca95", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "15114419", "metadata": { "id": "sharing-transparency" }, "source": [ "## Parte 10 - Generar una Kaggle Submission" ] }, { "cell_type": "markdown", "id": "2d2cf97f", "metadata": { "id": "checked-disaster" }, "source": [ "- Generar una Kaggle Submission utilizando las prediciones obtenidas en el conjunto de Test. Puede ver un ejemplo de como hacerlo [aquí](https://www.kaggle.com/jlawman/complete-beginner-your-first-titanic-submission?scriptVersionId=1700267&cellId=17). " ] }, { "cell_type": "code", "execution_count": null, "id": "58fda0e6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "93fa6c11", "metadata": {}, "source": [ "Una vez generado el archivo *.csv*, la submission se puede realizar subiendo directamente el archivo a la página de Kaggle o desde la línea de comandos como:\n", "\n", "`!kaggle competitions submit -c [COMPETITION] -f [FILE] -m [MESSAGE]` " ] }, { "cell_type": "code", "execution_count": null, "id": "78dd9be5", "metadata": {}, "outputs": [], "source": [ "!kaggle competitions submit -c titanic -f my_first_titanic_predictions.csv -m primer_submission" ] }, { "cell_type": "markdown", "id": "ddd83801", "metadata": { "ExecuteTime": { "end_time": "2022-02-14T15:13:41.567355Z", "start_time": "2022-02-14T15:13:41.549405Z" }, "id": "partial-enzyme" }, "source": [ "## Parte 11 - En busca de un mejor modelo" ] }, { "cell_type": "markdown", "id": "1037f7d6", "metadata": { "id": "alpine-approach" }, "source": [ "- Generar un nuevo **pipeline** y evaluar si éste genera un mejor clasificador. Algunas de las opciones que se pueden explorar son las siguientes:\n", " * Evaluar la característica Pclass como dato numérico, ordinal o categórico. \n", " * Estudiar qué escalado sirve en los atributos numéricos \n", " * Agregar nuevas características y/o sustituir las existentes. Por ejemplo: \n", " - Reemplazar *SibSp* y *Parch* por la suma \n", " - Discretizar algún atributo numérico, por ejemplo la edad.\n", " * Estudiar algún modelo alternativo (*Se sugiere experimentar con SVM o RandomForestClassifier*) \n", " * Construir un **pipeline** que permita determinar automáticamente qué grupo de características utilizar y qué estrategia seguir para lidiar con datos faltantes." ] }, { "cell_type": "code", "execution_count": null, "id": "0ff34288", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [ "similar-surgery", "40f58d99", "baeed628", "616868da", "efficient-thailand", "hundred-impact", "coated-million", "inclusive-ministry", "broadband-tsunami", "innocent-edward", "retired-first", "answering-yacht", "lesser-teacher", "massive-burst", "friendly-melissa", "prompt-capture", "induced-working", "checked-disaster", "alpine-approach", "selected-meeting", "global-prefix" ], "name": "taller1_titanic.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "position": { "height": "484.844px", "left": "725px", "right": "20px", "top": "118px", "width": "514px" }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }