Programación lineal y clasificación

Supongamos que tenemos un modelo de programación lineal que resuelve:

 \begin{aligned} \text{Maximizar:} & \quad z = 3x + 5y \\ \text{Sujeto a:} & \quad x + 2y \le 10 \\ & \quad x \ge 0, y \ge 0 \end{aligned}

Normalmente encontramos este tipo de modelos para resolver problemas de regresión u optimización continua. Al ser continuos, estos modelos no pueden resolverse de una forma en la que podamos considerarlos para fines de clasificación y que nos permitan crear, por ejemplo, una matriz de confusión para comparar su rendimiento con clases de datos reales. Para ello necesitamos considerar su solución desde un punto de vista de valores discretos.

Así, si queremos clasificar los puntos de un plano como pertenecientes a una clase A o B , podemos plantear el problema como uno en el que buscamos una línea recta ax + by + c = que divida el plano y lo separe en dos regiones, donde cada una corresponde a una categoría de datos «bien definida».

Supongamos que tenemos el conjunto de datos:

 X = \begin{bmatrix} 2 & 3 \\ 1 & 0 \\ 3 & 3 \\ 3 & 5 \\ 1 & 1 \\ 2 & 1 \\ 5 & 2 \\ 0 & 2 \end{bmatrix} , y = \begin{bmatrix} +1 \\ -1 \\ +1 \\ +1 \\ -1 \\ -1 \\ +1 \\ -1 \end{bmatrix}

Queremos hallar w = [a,b] y c , como:

 \begin{aligned} y_i(ax_i + bx_i + c) \ge 1 \quad \forall i \end{aligned}

Obsérvese que lo que hemos empezado a plantear como «bien definido» nos lleva implícitamente a considerar esa naturaleza discreta ya mencionada y que manifestamos en nuestra restricción con la condición «\ge 1 «. Esta es una forma simplificada de una máquina de vectores de soporte (SVM) lineal y rígida, y puede resolverse como un problema de programación lineal.

A fin de ilustrar mejor la idea, consideremos la representación de nuestro conjunto de datos en un espacio donde y es representada por color (nuestra variable objetivo) y X en un plano 2D (nuestro conjunto de observaciones, que en machine learning consideramos y usamos como datos de entrenamiento). El índice en las etiquetas de los ejes indica la columna de X .

Idealmente, podríamos trazar una línea que nos permitiera separar las regiones en las que se ubican los datos de y , por ejemplo y = -x +4 :

Lo que nos sugiere que el problema tiene una solución y es posible separar ambos conjuntos de datos. Sin embargo, cuando usamos la programación lineal para separarlos con:

 y_i (w^Tx_i+c) \ge 1

Lo que se demanda no es meramente una separación sino una determinada (mínima distancia) por cada punto del híper plano (recordemos que estamos trabajando al final con cantidades discretas y tres dimensiones) de manera que la desigualdad se satisfaga. No es suficiente decir «que el ‘punto’ está del lado correcto»; deben estar separados por una franja marginal unitaria.

Por cada punto x_i de la clase +1 , se requiere:

 w^T x_i +  x \ge 1

y por cada punto de la clase -1 :

 w^T x_i +  x \le -1

Esto genera la franja marginal entre -1 y +1 en la que ningún punto puede estar adentro. Ahora bien, para nuestro particular caso, veremos que tenemos un par de puntos muy cercanos a esta franja unitaria.

Para hacer frente a esta restricción, reformulamos nuestro modelo con variables de holgura, lo que permite puntos dentro del margen o incluso mal clasificados, a cambio de minimizar los errores totales.

 y_i(w^T x_i + c) \ge 1 - \xi, \quad \xi_i \ge 0

Y así, agregamos la variable \xi para permitir que puedan estar dentro de la franga marginal, o inclusive ser erróneamente clasificados.

 \begin{aligned} \text{Maximizar:} & \quad \sum_{i=1}^{n} \xi_i \\ \text{Sujeto a:} & \quad y_i(w^T x_i + c) \ge 1 - \xi, \quad \forall i, \xi_i \ge 0  \end{aligned}

donde:

 \begin{aligned} w \in \mathbb{R}, & \text{coeficiente del l\'{i}mite marginal} \\ c \in \mathbb{R}, & \text{variable independiente} \\ \xi \ge 0,        & \text{variables de holgura para cada punto}  \end{aligned}

Así, si tenemos n datos, el problema tiene 2 + 1 + n = n + 3 variables.

Aunque el modelo «duro» (nuestra primera versión) falló con el margen, al resolver el modelo de holgura, veremos que podemos encontrar una solución factible sin errores reales. Esto sugiere que existe un límite válido, pero el anterior era demasiado estricto al exigir un margen exacto.

Así entonces, el margen lineal es:

 0.5 x + 1.0 y - 3 = 0 \quad \Rightarrow  \quad y = -0.5x_1 +. 3

Un Jupyter notebook exponiendo esto (en inglés) más la implementación en Python junto con el uso de los solucionadores y optimizadores de modelos de programación lineal, está disponible en el hiperenlace al inicio de este párrafo.

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.