{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Qué es machine learning\n",
    "\n",
    "La idea que le da la vuelta a la programación, y tu primer modelo en seis líneas con la ducha fría incluida.\n",
    "\n",
    "Cuaderno de práctica del capítulo 1 de **Machine learning desde cero**, de Miss Yera.\n",
    "\n",
    "Corre de arriba abajo. Si lo abres en Google Colab no necesitas instalar nada.\n",
    "\n",
    "Capítulo completo: https://missyera.com/guias/machine-learning-desde-cero/que-es-machine-learning/\n",
    "\n",
    "Los ejercicios están al final y traen una celda vacía debajo de cada uno. Las\n",
    "respuestas viven en el cuaderno de soluciones, y merece la pena pelearse un\n",
    "rato antes de abrirlo 💛"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Antes de empezar\n",
    "\n",
    "Esta celda baja el ayudante que corrige tus ejercicios. Después, en cada\n",
    "ejercicio que se pueda corregir solo, vas a ver `%%revisa` arriba de la celda:\n",
    "escribe tu respuesta debajo, ejecuta, y te digo si te salió 💛"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import urllib.request\n",
    "\n",
    "# El ayudante de los cuadernos. Trae la corrección de los ejercicios y, en los\n",
    "# capítulos de consola, la celda mágica que ejecuta los comandos. Se baja en\n",
    "# vez de venir pegado aquí para que siempre sea el último.\n",
    "urllib.request.urlretrieve(\n",
    "    \"https://missyera.com/static/cuadernos/revisa.py\", \"revisa.py\")\n",
    "import revisa\n",
    "revisa.carga({\n",
    "    1: \"Y2FuYWwKV2hhdHNBcHAgICAgICAgMC42NTI0ClRpZW5kYSAgICAgICAgIDAuNjE5MApXZWIgICAgICAgICAgICAwLjU4MzAKTWFya2V0cGxhY2UgICAgMC40NjEzCk5hbWU6IGNvbXBybywgZHR5cGU6IGZsb2F0NjQ=\",\n",
    "    2: \"ICAgICAgICAgICAgY291bnQgICAgbWVhbgpzZWdtZW50byAgICAgICAgICAgICAgICAgCkJvZGVnYSAgICAgICAgNzE5ICAwLjM3NTUKSG9yZWNhICAgICAgICA3NTAgIDAuNjMyMApNYXlvcmlzdGEgICAgIDc1OCAgMC43MjMwCk1pbmltYXJrZXQgICAgODEwICAwLjU2OTE=\",\n",
    "    3: \"ICAgICAgICAgICAgICBjb3VudCAgICBtZWFuCnNhdGlzZmFjY2lvbiAgICAgICAgICAgICAgIAoxLjAgICAgICAgICAgICAgNTY4ICAwLjQ0NzIKMi4wICAgICAgICAgICAgIDU0MiAgMC41MzUxCjMuMCAgICAgICAgICAgICA1NTcgIDAuNTQwNAo0LjAgICAgICAgICAgICAgNTY3ICAwLjYyNzkKNS4wICAgICAgICAgICAgIDU2OSAgMC43MTM1\",\n",
    "    4: \"MC41ODky\",\n",
    "    6: \"VmFsdWVFcnJvcjogY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiAnVHJ1amlsbG8n\",\n",
    "    7: \"MC41NzM1\",\n",
    "}, lenguaje=\"python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hola! Bienvenida al libro 🌸\n",
    "\n",
    "Antes de empezar quiero que te pares un segundo y pienses una cosa:\n",
    "**¿cuántas decisiones tomaste hoy que en realidad te sugirió un\n",
    "modelo?**\n",
    "\n",
    "Piénsalo de verdad, no sigas leyendo de corrido. Yo te ayudo con la\n",
    "lista 🐣\n",
    "\n",
    "- 📱 El orden de tu feed de TikTok. No es cronológico desde hace años.\n",
    "\n",
    "- ⌨️ La palabra que te propone el teclado del celular antes de que la\n",
    "escribas.\n",
    "\n",
    "- 🎬 Las tres series que Netflix te puso arriba del todo.\n",
    "\n",
    "- 📧 Los correos que ni viste porque cayeron en spam.\n",
    "\n",
    "- 💸 Ese Yape que te pidió confirmar dos veces porque le pareció raro.\n",
    "\n",
    "Los cinco son lo mismo por dentro, y ese \"lo mismo\" es lo que vas a aprender\n",
    "a construir en este libro."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La idea que le da la vuelta a todo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Voy a empezar por la frase que más me costó entender, y que cuando la\n",
    "entiendes se te acomoda todo lo demás:\n",
    "\n",
    "**En programación normal tú escribes las reglas. En machine learning\n",
    "das los ejemplos y la máquina escribe las reglas.**\n",
    "\n",
    "Piénsalo con algo que ya sabes hacer. Si quisieras marcar los pedidos\n",
    "sospechosos con Python, escribirías algo así:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "if (monto > 5000\n",
    "        and cliente_nuevo\n",
    "        and hora > 23):\n",
    "    marcar_como_sospechoso()\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y funciona hasta que el fraude cambia de forma, que es la semana que viene 🙃\n",
    "Entonces alguien añade otra condición, y otra, y a los seis meses hay\n",
    "cuatrocientas líneas de `if` que nadie se atreve a tocar.\n",
    "\n",
    "Machine learning le da la vuelta: le das mil pedidos etiquetados como buenos\n",
    "o sospechosos, y el modelo saca las reglas solo. Cuando el fraude cambie, le\n",
    "das ejemplos nuevos y vuelve a aprender.\n",
    "\n",
    "Y esto no es de ahora. En 1959, Arthur Samuel puso a una computadora a jugar\n",
    "damas contra sí misma hasta que le ganó a él, que era quien la había\n",
    "programado 🕰️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Los tres tipos, en una frase cada uno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El tipo de machine learning no lo eliges tú por gusto: lo eligen los datos\n",
    "que tengas encima de la mesa. Con dos preguntas queda decidido 🔀\n",
    "\n",
    "- 🎯 **Supervisado.** Tienes ejemplos con la respuesta correcta\n",
    "y quieres predecir esa respuesta en casos nuevos. \"Estos 3.000 clientes\n",
    "compraron o no compraron; dime qué va a hacer el 3.001\". Es con diferencia lo que más\n",
    "se usa en empresa, y es lo que hace este libro.\n",
    "\n",
    "- 🧩 **No supervisado.** No tienes respuesta y quieres que salgan\n",
    "grupos. \"Aquí están mis clientes, dime en cuántos grupos se parecen entre\n",
    "ellos\". A eso se le llama **clustering** o análisis de\n",
    "conglomerados, y su algoritmo más conocido es k-means. No sale en este libro,\n",
    "que va entero de supervisado, y te lo digo aquí para que no lo busques en vano\n",
    "durante los veinticinco.\n",
    "\n",
    "- 🎮 **Por refuerzo.** Un sistema que prueba, se equivoca y\n",
    "recibe premio o castigo. Es lo de los robots y los juegos. No sale en este libro\n",
    "porque en empresa peruana casi no aparece, y prefiero decírtelo que hacerte\n",
    "perder el tiempo.\n",
    "\n",
    "Dentro del supervisado hay dos sabores, y la diferencia es solo qué tipo de\n",
    "respuesta quieres:\n",
    "\n",
    "- 🔢 **Regresión** cuando la respuesta es un número: cuántos\n",
    "soles va a facturar este cliente.\n",
    "\n",
    "- 🏷️ **Clasificación** cuando la respuesta es una etiqueta: va a\n",
    "comprar o no va a comprar.\n",
    "\n",
    "La pregunta que lo decide es una sola y te la vas a hacer en cada proyecto:\n",
    "**¿lo que quiero de vuelta es una etiqueta o un número?**\n",
    "\n",
    "Este libro va casi todo sobre clasificación, porque es lo que más te van a\n",
    "pedir y porque ahí están los errores más interesantes 💛"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dónde estamos parados, en un solo dibujo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Todo lo de arriba cabe en una escalera, y quiero que la tengas a mano porque\n",
    "la vas a necesitar cada vez que alguien suelte una sigla en una reunión 🪜\n",
    "\n",
    "La casilla rosa es este libro entero: de las 25 paradas que vienen, ninguna\n",
    "se sale de ahí.\n",
    "\n",
    "Y ahora el uso práctico de la escalera, que es lo que quiero que te lleves de\n",
    "esta sección. Cuando en una reunión alguien diga \"necesitamos IA\", esa frase no\n",
    "significa nada todavía. La pregunta que la convierte en algo accionable es en\n",
    "qué casilla cae lo que están pidiendo, y para contestarla hacen falta dos datos\n",
    "que casi nunca están sobre la mesa: qué se quiere predecir, y si existen\n",
    "ejemplos pasados con la respuesta ya puesta.\n",
    "\n",
    "Si los hay, estás en supervisado y este libro te sirve entero. Si no los hay,\n",
    "lo que te están pidiendo o es no supervisado, o es un proyecto de recolectar\n",
    "datos disfrazado de proyecto de modelos, que es lo que pasa la mayoría de las\n",
    "veces. Distinguir esas dos cosas antes de firmar te ahorra meses 🧭\n",
    "\n",
    "Fíjate además en la casilla de arriba del todo. Inteligencia artificial es el\n",
    "paraguas grande y machine learning es una de sus ramas, así que \"compramos IA\"\n",
    "puede significar cinco cosas distintas y solo una de ellas es lo que vas a\n",
    "aprender aquí. Esa precisión no es pedantería: es la diferencia entre pagar por\n",
    "lo que necesitas y pagar por la palabra 💸"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cuándo NO usar machine learning"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Esta sección va antes que el código a propósito, porque es la que más plata\n",
    "ahorra.\n",
    "\n",
    "- 📏 **Si la regla se puede escribir.** \"Avisar cuando el stock\n",
    "baje de 10\" es un `if`. Meterle un modelo es cobrar de más y\n",
    "entregar algo peor.\n",
    "\n",
    "- 🔍 **Si necesitas explicar cada decisión con certeza.** Un\n",
    "modelo da probabilidades, no razones. Si el área legal necesita el porqué exacto\n",
    "de cada rechazo, hay que pensarlo distinto desde el principio.\n",
    "\n",
    "- 📉 **Si tienes cien filas.** Con cien filas no se aprende nada\n",
    "que no se vea mirando el Excel un rato.\n",
    "\n",
    "- 🤷‍♀️ **Si nadie va a hacer nada con la predicción.** El caso\n",
    "más común y el más caro: un modelo precioso que nadie usa porque no había una\n",
    "decisión esperándolo. Antes de modelar, pregunta qué se va a hacer distinto con\n",
    "el resultado.\n",
    "\n",
    "De hecho, ese último punto es el capítulo 2 entero 🌟"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Los datos con los que vamos a trabajar"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Todo este libro corre sobre el mismo archivo, y viene sucio a propósito."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "URL = 'https://missyera.com/static/datasets/ventas-miss-yera.csv'\n",
    "ventas = pd.read_csv(URL)\n",
    "\n",
    "print(ventas.shape)\n",
    "print(ventas['compro'].value_counts())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.037 ventas y 14 columnas. Y la columna que vamos a predecir es\n",
    "`compro`: 1 si la venta se cerró, 0 si no."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(ventas[['ciudad', 'segmento', 'canal', 'unidades', 'satisfaccion', 'compro']].head(5).to_string(index=False))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cada fila es una venta: dónde, a qué tipo de cliente, por qué canal, cuántas\n",
    "unidades, qué satisfacción tenía ese cliente y si compró o no.\n",
    "\n",
    "Si te fijas en la segunda fila ya vas a ver el primer problema: la ciudad dice\n",
    "`lima` en minúscula. Hay más, muchos más, y son el capítulo 4 🧽"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El número que hay que saber antes que ningún otro"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(round(ventas['compro'].mean(), 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El 57,7% de las ventas se cerraron.\n",
    "\n",
    "Guárdate ese número, porque es el **listón**. Si yo digo \"todas\n",
    "las ventas se cierran\" sin mirar nada, acierto el 57,7% de las veces. Cualquier\n",
    "modelo que no le gane a eso no vale nada, por muy elegante que sea 📏\n",
    "\n",
    "La cantidad de proyectos que se presentan con un \"77% de exactitud\" sin decir\n",
    "que el listón estaba en 75... muchos. Vamos a volver sobre esto en el capítulo\n",
    "14, que va entero de eso."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tu primer modelo, en seis líneas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vamos a hacer el equivalente del \"hola mundo\": un modelo de verdad, con dos\n",
    "columnas y sin limpiar nada."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "d = ventas[['unidades', 'satisfaccion', 'compro']].dropna()\n",
    "X, y = d[['unidades', 'satisfaccion']], d['compro']\n",
    "X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.25,\n",
    "                                          random_state=42, stratify=y)\n",
    "\n",
    "arbol = DecisionTreeClassifier(max_depth=2, random_state=42).fit(X_tr, y_tr)\n",
    "print(round(arbol.score(X_te, y_te), 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "0,582. O sea que acierta el 58,2% de las veces 🎉"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Los porqués de esas seis líneas\n",
    "\n",
    "Ninguna de esas decisiones es de adorno, y las cuatro te las van a preguntar\n",
    "en una entrevista:\n",
    "\n",
    "- ✂️ **`test_size=0.25`.** Le escondo una cuarta parte\n",
    "de las filas al modelo para tomarle examen con datos que no vio. Si le tomara el\n",
    "examen con lo que ya estudió, aprobaría siempre.\n",
    "\n",
    "- ⚖️ **`stratify=y`.** Obliga a que el trozo escondido\n",
    "tenga el mismo porcentaje de ventas cerradas que el original. Sin esto, el azar\n",
    "puede dejarte un examen con muchos más \"sí\" que la realidad, y la nota deja de\n",
    "significar nada.\n",
    "\n",
    "- 🎲 **`random_state=42`.** El reparto es al azar, y\n",
    "esto fija ese azar. Sin él, cada corrida te da un número distinto y no puedes\n",
    "comparar el modelo de hoy con el de ayer. El 42 no tiene nada de especial, lo\n",
    "que importa es que sea siempre el mismo.\n",
    "\n",
    "- 🌳 **`max_depth=2`.** Le prohíbo al árbol hacer más\n",
    "de dos preguntas seguidas. Es una decisión mía, no algo que el modelo aprenda, y\n",
    "a eso se le llama **hiperparámetro**. En el ejercicio 5 vas a ver\n",
    "qué pasa cuando se lo suelto."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y ahora la ducha fría, que es la parte importante de este capítulo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(round(y_te.mean(), 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El listón en ese mismo trozo de datos era 0,5735. Nuestro modelo saca 0,582.\n",
    "**Le ganamos por menos de un punto porcentual.**\n",
    "\n",
    "Eso no es un fracaso, es información. Y se puede averiguar por qué en una\n",
    "línea:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(ventas.groupby('compro')['unidades'].mean().round(2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "11,47 unidades en las ventas que no se cerraron y 11,69 en las que sí.\n",
    "**Prácticamente lo mismo.** Esa columna no sabe nada sobre el\n",
    "resultado, así que el modelo estaba trabajando con una sola señal de verdad, la\n",
    "satisfacción, y con un ruido al lado.\n",
    "\n",
    "Yo elegí esas dos columnas porque eran las dos numéricas que tenía a mano, y\n",
    "esa es exactamente la trampa: **las columnas que sí separan en este\n",
    "archivo son de texto**, y scikit-learn no come texto. Lo vas a ver en los\n",
    "ejercicios y es lo que justifica los veinticuatro capítulos que vienen 🐣"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué aprendió, exactamente"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un árbol tiene una gracia enorme y es que se puede leer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import export_text\n",
    "\n",
    "print(export_text(arbol, feature_names=['unidades', 'satisfaccion']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahí está: aprendió que si la satisfacción es 1 (o sea, malísima) la venta no\n",
    "se cierra, y en todo lo demás dice que sí. **Eso son cuatro reglas que\n",
    "nadie escribió**, salidas solas de mirar 2.100 ejemplos.\n",
    "\n",
    "Fíjate también que las ramas de abajo a la derecha dicen las dos\n",
    "`class: 1`, o sea que ese corte no separaba nada. Un árbol se parte\n",
    "aunque la partición no sirva, y eso es exactamente el tipo de cosa que hay que\n",
    "saber mirar 🔍\n",
    "\n",
    "Y una cosa que voy a repetir todo el libro: **ese\n",
    "`random_state=42` no es decoración**. Sin él, cada vez que\n",
    "corras esto te sale un número distinto y no puedes comparar nada."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Contra qué hay que comparar tu primer modelo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El árbol de arriba acierta el 58,2%. Suena a aprobado, y no se puede saber si\n",
    "es bueno hasta compararlo con dos cosas 📏"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "print('decir que todos compran :', round(y_te.mean(), 4))\n",
    "print('el árbol                :', round(arbol.score(X_te, y_te), 4))\n",
    "print()\n",
    "\n",
    "for col, umbral in [('satisfaccion', 4), ('unidades', 12)]:\n",
    "    regla = (X_te[col] >= umbral).astype(int)\n",
    "    print(f'regla \"{col} >= {umbral}\"'.ljust(30),\n",
    "          round(accuracy_score(y_te, regla), 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y aquí está el balde de agua fría del capítulo 🪣\n",
    "\n",
    "**Decir que todos compran acierta el 57,35%.** Sin modelo, sin\n",
    "datos, sin nada: solo porque la mayoría compra. El árbol acierta el 58,2%, o sea\n",
    "que todo el trabajo vale **ocho décimas de punto porcentual**.\n",
    "\n",
    "Y las reglas escritas a mano lo hacen peor todavía. \"Compra si la satisfacción\n",
    "es 4 o más\" acierta el 56,9%, por debajo de no hacer nada. \"Compra si lleva 12\n",
    "unidades o más\" acierta el 50,5%, que es tirar una moneda.\n",
    "\n",
    "### Qué se hace con un resultado así\n",
    "\n",
    "Lo primero, no esconderlo. Un modelo que gana ocho décimas al listón\n",
    "**no está listo para nada**, y decirlo el primer día es mucho más\n",
    "barato que descubrirlo cuando ya lo prometiste 💬\n",
    "\n",
    "Lo segundo, entender que esto es lo normal al empezar. El árbol de arriba usa\n",
    "dos columnas y ninguna preparación. Con el libro entero por delante, ese número\n",
    "va a subir bastante, y va a subir por cosas concretas que se pueden explicar.\n",
    "\n",
    "Y lo tercero, que es lo que quiero que te lleves: **el listón se calcula\n",
    "antes que el modelo, no después**. Si primero entrenas y luego buscas con\n",
    "qué compararlo, vas a encontrar la comparación que te deje bien. Es humano y pasa\n",
    "siempre 🙈\n",
    "\n",
    "Las dos reglas de arriba también valen la pena por otro motivo. Muchas veces\n",
    "llegas a un proyecto donde ya hay una regla de negocio escrita en un Excel, y la\n",
    "pregunta no es \"¿mi modelo es bueno?\" sino **\"¿mi modelo es mejor que lo\n",
    "que ya hacen?\"**. Si no lo es, el proyecto es cambiar el Excel, no montar\n",
    "un modelo 📋"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y ahora al revés: el número que se ve precioso"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Acabas de ver un modelo honesto que gana ocho décimas. Ahora mira uno que\n",
    "presume de acertar el 100%, porque de estos vas a ver muchos más 👀"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Alguien de tu equipo te manda esto un viernes con un \"ya está, sale 100%\". Léelo antes de responder: el código corre, no da ningún error y el número es de verdad. Hay dos cosas mal y las dos caben en dos líneas.\n",
    "\n",
    "```\n",
    "cols = ['id_venta', 'unidades',\n",
    "        'satisfaccion']\n",
    "d = ventas[cols + ['compro']].dropna()\n",
    "X, y = d[cols], d['compro']\n",
    "\n",
    "arbol = DecisionTreeClassifier(\n",
    "    random_state=42).fit(X, y)\n",
    "print(round(arbol.score(X, y), 4))\n",
    "```\n",
    "\n",
    "**¿Qué está mal?** La respuesta está en el cuaderno de soluciones. Míralo tú primero."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cómo se ve un proyecto entero, para que tengas el mapa"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Casi todos los cursos te enseñan el paso 6 y te dejan sola con los otros\n",
    "siete. Estos son los ocho, y este libro los recorre en orden:\n",
    "\n",
    "- 1️⃣ **La pregunta.** Qué se va a decidir distinto con la\n",
    "predicción. Sin esto no se empieza. (Capítulo 2)\n",
    "\n",
    "- 2️⃣ **Mirar los datos.** Cuántas filas, cuántos huecos, qué\n",
    "está sucio. (Capítulo 4)\n",
    "\n",
    "- 3️⃣ **Construir las columnas.** Convertir lo que hay en algo\n",
    "que un modelo pueda usar. Es donde más se gana. (Capítulos 9 y 11)\n",
    "\n",
    "- 4️⃣ **El listón.** Lo tonto que hay que ganar. (Capítulo 14)\n",
    "\n",
    "- 5️⃣ **Comprobar que no hay trampa.** Que ninguna columna esté\n",
    "contando el futuro. (Capítulo 12)\n",
    "\n",
    "- 6️⃣ **Los modelos.** Probar varios y quedarse con uno. (Capítulos 13 y 18)\n",
    "\n",
    "- 7️⃣ **Medir bien.** Elegir la métrica que corresponde al\n",
    "problema, no la que se ve mejor. (Capítulos 14 a 16)\n",
    "\n",
    "- 8️⃣ **Explicarlo y vigilarlo.** Porque un modelo que nadie\n",
    "entiende no se usa, y todos se pudren con el tiempo. (Capítulos 20 a 27)\n",
    "\n",
    "Y fíjate dónde está el paso de los modelos: **en el sexto de ocho**.\n",
    "Cuando alguien dice que el 80% del trabajo es limpiar y preparar datos no está\n",
    "exagerando ni quejándose, está describiendo el oficio 🧹"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El vocabulario, para que no te agarre desprevenida"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Palabra | Qué es en cristiano |\n",
    "|---|---|\n",
    "| **Feature** o variable | Una columna que usas para predecir. `unidades`, `ciudad` |\n",
    "| **Target** u objetivo | La columna que quieres predecir. Aquí, `compro` |\n",
    "| **Entrenar** | Mostrarle los ejemplos al modelo para que saque sus reglas |\n",
    "| **Train y test** | Los datos partidos en dos: con unos aprende y con los otros se le toma examen |\n",
    "| **Predecir** | Pedirle la respuesta para filas que no vio |\n",
    "| **Hiperparámetro** | Una decisión tuya sobre el modelo, no algo que aprenda. El `max_depth=2` de arriba |\n",
    "| **Baseline** o listón | Lo tonto que hay que ganarle. Aquí, decir siempre que sí |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Si en algún capítulo te sale una palabra que no está en esta tabla, la tengo\n",
    "definida en dos líneas en el [glosario de IA](https://missyera.com/glosario-ia/) 📖\n",
    "\n",
    "Y si el código de arriba te resultó cuesta arriba más que los conceptos, eso\n",
    "no es de machine learning: es de Python, y se arregla con el\n",
    "[libro de Python desde cero](https://missyera.com/guias/python-desde-cero/). No hace\n",
    "falta terminarlo para seguir aquí, tranqui 🐣"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Siete sobre el mismo archivo. Intenta antes de abrir 💛"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Cuánto se cierra por canal\n",
    "\n",
    "Qué porcentaje de ventas se cierra en cada canal."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Y por segmento de cliente\n",
    "\n",
    "Lo mismo con `segmento`, y de paso cuántas filas\n",
    "tiene cada uno."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. La satisfacción sí separa\n",
    "\n",
    "Tasa de cierre por nivel de satisfacción."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Un árbol un poco más profundo\n",
    "\n",
    "El mismo modelo con `max_depth=4`. ¿Mejora?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Cuánto acierta en los datos que ya vio\n",
    "\n",
    "Compara la nota del árbol de profundidad 4 en train y en\n",
    "test."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. El error que vas a cometer el primer día\n",
    "\n",
    "Entrena con una columna de texto sin convertirla."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. El listón, escrito como se debe\n",
    "\n",
    "Calcula el baseline con la herramienta que trae\n",
    "scikit-learn para eso, en vez de a mano."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 7\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "El 57,7% de las ventas se cierra y tu modelo acierta el 58%. ¿Qué tienes?\n",
    "\n",
    "a) Nada todavía: eso es lo mismo que decir que sí a todo\n",
    "\n",
    "b) Un modelo que acierta más de la mitad, que es un buen empiece\n",
    "\n",
    "c) Un modelo que hay que ajustar un poco\n",
    "\n",
    "d) Un modelo mal entrenado"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 🔄 En programación tú escribes las reglas; en ML das ejemplos y salen las\n",
    "reglas.\n",
    "\n",
    "- 🎯 Supervisado es predecir con ejemplos etiquetados, y es lo que más se usa\n",
    "en empresa. Dentro, regresión para números y clasificación para etiquetas.\n",
    "\n",
    "- 🚫 No uses ML si la regla se puede escribir, si tienes cien filas, o si\n",
    "nadie va a hacer nada con la predicción.\n",
    "\n",
    "- 📏 El listón primero. Aquí es 57,7% y todo se compara contra eso.\n",
    "\n",
    "- 🌳 Tu primer modelo sacó 0,582 contra un listón de 0,5735. Menos de un punto,\n",
    "y eso también es un resultado.\n",
    "\n",
    "- 🎲 `random_state` en todo lo que reparta o baraje, o no puedes\n",
    "comparar nada.\n",
    "\n",
    "- 🔢 scikit-learn solo entiende números.\n",
    "\n",
    "- 🧾 Una columna que identifica la fila en vez de describirla te regala un\n",
    "100% que no existe.\n",
    "\n",
    "Y si de todo el capítulo te llevas una sola frase, que sea esta:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un modelo no se mide contra\n",
    "cero. Se mide contra lo que ya funciona sin él."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En el capítulo 2 vamos a lo que va antes del código y que casi nadie enseña:\n",
    "el contrato de datos, o sea qué se acuerda con el cliente antes de tocar una\n",
    "sola fila.\n",
    "\n",
    "Que tengas lindo día! 🌸"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 1 de **Machine learning desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/machine-learning-desde-cero/que-es-machine-learning/\n",
    "\n",
    "Que tengas lindo día! 🌸"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
