{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Clasificador de dominio (desviación covariable)\n", "===============================================\n", "Una alternativa para detectar una desviación covariable es entrenando un clasificar binario el cual utilice todos los predictores de los conjuntos de datos origen y objetivo. Este clasificador intetará predecir a que conjunto de datos pertenece cada observación, es decir que nuestra variable objetivo será `source` y `target`. Si los dos conjuntos de datos son lo suficientemente diferentes, esto implicar[a que el clasificador podrá facilmente discriminar entre los dos conjuntos de datos y por lo tanto mostrará una buena performance. Utilizaremos esto como un síntoma de que el conjunto de datos ha cambiado.\n", "\n", "Para poder utilizar este método, necesitaremos realizar un test de hipótesis binomial el cual compruebe que tan probable es obtener tal performance en nuestro clasificador bajo la suposición de que no hay una desviación. Si el `p-value` (la probabilidad de que el modelo tenga al menos tal performance de clasificación bajo la suposición nula) es bajo, entonces esto significa que una desviación podría haber ocurrido (rechazamos la hipótesis nula en favor de la alternativa). En la práctica dispararemos una alerta cuando el `p-value` del test de hipótesis binomial es menor que el nivel de significancia que estamos buscando." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ejemplo\n", "-------\n", "En este ejemplo, usaremos los datos de IRIS dataset para generar lotes con distribuciones distintas de los datos, lo que provocará una desviación en los datos que utilizaremos productivos. El conjunto de datos de IRIS es parte de la biblioteca sklearn que constan de 3 tipos diferentes de longitud de pétalo y sépalo (Setosa, Versicolour y Virginica), descriptos por la longitud del sépalo, el ancho del sépalo, la longitud del pétalo y el ancho del pétalo:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn import datasets\n", "\n", "iris = datasets.load_iris()\n", "X = iris.data[:,:4]\n", "y = iris.target" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para ilustrar el problema, de forma tendenciosa, filtraremos nuestro conjunto de datos para que algunas muestras especificas no sean incluidas en el conjunto de entrenamiento. En este caso, seleccionaremos todas las muestras donde el predictor `ancho del sépalo` es mayor a 2.8. Veamos primero cual es la distribución de los valores y rangos de los predictores:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | longitud del sepalo | \n", "ancho del sepalo | \n", "longitud del petalo | \n", "ancho del pétalo | \n", "
|---|---|---|---|---|
| count | \n", "150.000000 | \n", "150.000000 | \n", "150.000000 | \n", "150.000000 | \n", "
| mean | \n", "5.843333 | \n", "3.057333 | \n", "3.758000 | \n", "1.199333 | \n", "
| std | \n", "0.828066 | \n", "0.435866 | \n", "1.765298 | \n", "0.762238 | \n", "
| min | \n", "4.300000 | \n", "2.000000 | \n", "1.000000 | \n", "0.100000 | \n", "
| 25% | \n", "5.100000 | \n", "2.800000 | \n", "1.600000 | \n", "0.300000 | \n", "
| 50% | \n", "5.800000 | \n", "3.000000 | \n", "4.350000 | \n", "1.300000 | \n", "
| 75% | \n", "6.400000 | \n", "3.300000 | \n", "5.100000 | \n", "1.800000 | \n", "
| max | \n", "7.900000 | \n", "4.400000 | \n", "6.900000 | \n", "2.500000 | \n", "