Optimización bayesiana para balancear precisión y equidad en modelos de ML

Milo
spikelab
Published in
9 min readAug 20, 2021

Supongamos por un minuto que queremos automatizar la asignación de sueldos a las trabajadoras y trabajadores de Chile 😱. Lo primero que se nos viene a la cabeza es que suena como una idea cyberpunk/distópica y que probablemente algo tan descabellado como esto nunca funcione, aún así, veamos que sacamos al limpio de este ejercicio. Seguramente querríamos que nuestro algoritmo de asignación de sueldos tome en cuenta cosas como el rubro de trabajo, cargo, experiencias pasadas, nivel de estudio y que sea lo más justo posible en temas como género (que el robot no sea sexista), nacionalidad (que no sea xenófobo), región del país (que no sea centralista) y posiblemente un gran etcetera.

Para armar un algoritmo de esta complejidad parece ser necesario (?) usar datos históricos de sueldos para tener al menos una noción de cómo empezar a asignar los montos de manera razonable en función de las variables descritas en el párrafo anterior. Una de las fuentes de datos interesantes que contiene este tipo de datos es la Encuesta Suplementaria de Ingresos (ESI) donde el gran elefante en la habitación es que los sueldos de Chile seguramente ya tienen los sesgos descritos anteriormente. Estos sesgos están muy bien descritos en el estudio Los Verdaderos Sueldos de Chile de la Fundación Sol donde, por poner un ejemplo, describen que una mujer, en la mediana (percentil 50 en sueldo) gana un 21.5% menos que un hombre en la mediana lo que se traduce en una diferencia mensual de ~$100.000 menos. Nos encontramos entonces con un clásico dilema ético y de equidad (o fairness en english) en el uso de datos históricos sesgados (un mal historial) para generar un algoritmo de toma de desiciones automáticas. Si tomamos los datos de la ESI y armamos un algoritmo a tontas y a locas este replicará y perpetuará todos los sesgos y problemáticas pasadas que probablemente queremos mitigar en este ejercicio de imaginación futurística.

En el siguiente artículo usaremos los datos de la ESI para entrenar modelos que predigan el sueldo de una persona según sus características demográficas y aplicaremos técnicas de fairness/equidad para mitigar algunos de los sesgos descritos con la esperanza que, al leer esto, más gente se motive (incluyendonos) a mirar posibles variables sensibles en sus modelos y que de a poco nos empecemos a hacer cargo de la influencia que nuestros modelos pueden estar generando sobre la gente ya sea en algo más banal como la experiencia de compra de un usuario, pasando por la aprobación de préstamos bancario hasta algo tan radical como lo es la asignación automática de sueldos.

Todo el código utilizado para este artículo está disponible en este github

¿Como enfrentamos usualmente el entrenamiento de nuestros modelos?

Usualmente en la etapa de modelamiento buscamos las mejores métricas de desempeño (llámese AUC, PRAUC o MAPE y MAE para este caso que es de regresión) lo que se traduce en un mayor acople entre lo que el modelo dice y lo que los datos dicen y por lo tanto la toma desiciones gatilladas por un modelo optimizado de esta forma seguirían perpetuando las malas prácticas del pasado y no estaríamos utilizando nuestra historia de manera crítica y constructiva como nos enseñó nuestro profesor de historia en 5to básico

La historia es una ciencia que nos permite conocer ese pasado para entender el presente que vivimos y construir nuestro futuro

- Profe de historia de 5to básico

Hagamos un paréntesis para poner un poco de perspectiva y dar un ejemplo un poco más banal, pensemos en un modelo de recomendación de una plataforma de streaming de videos. Supongamos que en tu historial tienes 20% de videos de matemática y 80% de videos de la doctora Polo y que de alguna forma la plataforma sabe que tu eres data scientist (codificado en algún feature). Como probablemente la mayoría de los data scientist no ven muchos videos de la doctora Polo el modelo tendrá un sesgo y en vez de recomendarte videos en la proporción 20/80 (20% de videos afines a matemáticas y 80% de videos afines a la doctora Polo) el modelo te recomendará cosas en la proporción en la que un data scientist “típico” vería. Para mayor información sobre este tipo de fairness en sistemas de recomendación consultar este paper.

Entremos en materia y volvamos al modelamiento de los sueldos

Los datos

Notebook: Link

Como dijimos usaremos la base de datos de la encuesta suplementaria de ingreso del 2019 (ESI) a la cual le renombramos ciertos valores y nombres de variables para hacerla más fácil de leer.

Si lo deseean pueden descargar la base de datos procesada de este link de github

Miremos como se comportan los datos:

Media y mediana de sueldo por sexo: Las lineas horizontales son los valores globales. Vemos una gran diferencia entre los sueldos de hombres y mujeres
Acá vemos una vista un poco más exhaustiva de las distribucion de sueldos de hombres y mujeres. Vemos como la función de percentiles de hombres siempre domina a la de mujeres
Acá vemos cuanto más gana un hombre porcentualmente en cada uno de los percentiles: En general vemos un valor en torno al ~20%. La brecha es más grande en los valores extremos (percentiles < 10% y > 10%)
Acá podemos ver como el nivel educacional afecta el sueldo de los trabajadores: Mientrás mayor nivel educacional mayor sueldo promedio y mayor varianza
Vemos como el factor comuna está correlacionado con el sueldo: En general, comunas de la región metropolitana son las que tienen sueldos más alto
Finalmente vemos como el tipo de ocupación correlaciona con el sueldo

Antes de empezar a entrenar modelos y juzgar si son justos o no debemos considerar indicadores que midan estas cualidades. En lo que sigue del articulo utilizaremos dos métricas y nos concentraremos en el sesgo de género.

Métricas de Fairness

1) Diferencia porcentual contrafactual (DPC)

Supongamos que la persona con características (o features) x es una mujer con un sueldo predicho S(x). Luego construimos a la persona (posiblemente) ficticia y, que es igual a x salvo por el feature de sexo, es decir, es hombre. Dado que x e y son iguales salvo el sexo, esperaríamos que el modelo no sea sexista y que S(x) = S(y), pero como sabemos que los datos están sesgados, por lo general tendremos que S(x) < S(y). Para cuantificar lo injusto que está siendo el modelo calculamos la diferencia porcentual de estos dos valores, es decir, (S(y) — S(x))/S(x), donde el denomiador será siempre la persona de sexo femenino y de esta manera el indicador responde a la pregunta ¿Cuanto más ganaría esta persona si fuese hombre?.

Finalmente hacemos el cálculo anterior para todas las personas del conjunto test y promediamos el resultado para obtener el indicador final al que le ponemos el nombre DPC.

Está métrica se puede generalizar fácilmente para variables no binarias como por ejemplo la nacionalidad utilizando la siguiente formula

el mínimo y el máximo se toma sobre los posibles valores que toma la variable sensible. Por ejemplo, para el caso de la nacionalidad, el máximo se podría alcanzar para la nacionalidad de algún país europeo mientras que el mínimo para uno latino americano. El mínimo y máximo se podrían cambiar por cuantiles para mayor estabilidad en caso de tener muchas categorías

¿Cómo calculamos está métrica?

Solo basta tener un objeto modelo que pueda predecir el sueldo con algún método del tipo modelo.predict sobre un pandas dataframe que tenga la información de la variable sensible. Con estos ingredientes podemos usar las siguientes funciones:

Para el caso de genero el dataframe datos_contraf tiene el doble de personas que datos_test (la versión hombre y mujer de cada una de las personas)

Cabe destacar que para un modelo que no incluya la variable sexo dentro de sus features esta métrica es mala ya que no es posible calcularla y no nos permitirá diferenciar entre modelos. Además, esta métrica aísla el efecto de género y no considera otras variables correlacionadas al sexo que pueden estar generando un sesgo aún mayor. Por ejemplo, el sesgo que puede haber en la composición de hombres y mujeres en puestos de trabajo y rubros más lucrativos codificado en variables como rubro, nivel educacional y otros. Para agregar esta dimensión del sesgo al análisis utilizamos la siguiente métrica

2) Diferencia porcentual de sueldos medianos (DPM)

Siguiendo la idea del indicador reportado por la fundación Sol calculamos el sueldo predicho mediano para hombres y para mujeres S_h y S_m respectivamente y luego calculamos la diferencia porcentual entre ellos

(S_h - S_m)/S_m.

¿Como calculamos está métrica?

Solo tenemos que tener un dataframe datos_test que ya tenga la variable sueldo_predicho generada con nuestro modelo:

Pasemos a los modelos y miremos sus métricas

Primer Modelo

Notebook: Link

Entrenamos un modelo utilizando LightGBM sin hacer ningún tipo de mitigación de sesgos y calculamos ambas métricas de fairness en el conjunto de validación obteniendo en ambos casos 10%. Es decir, el modelo, en promedio, le da un 10% más de dinero a los hombres que a las mujeres. También observamos que la precisión del modelo no es muy alta (MAPE=48%, MedianAPE = 26%)

métricas del modelo

En el caso de la métrica DPC podemos ver como distribuye en cada una de las personas de la base de test obteniendo la siguiente distribución:

distribución del DPC sobre el cojunto test

Vemos que el valor del DPC está concentrado en 10% y que hay una pequeñisima porción (~5% de las personas) donde es cercano a 0% (donde el modelo no discrimina). También hay casos donde el modelo discrimina mucho (valores > 20%)

También podemos ver la dependencia del DPC con respecto a las variables involucradas en el modelamiento

Dependencia del DPC con el sueldo

Vemos que el valor del DPC es más alto para sueldo más altos, es decir, el modelo discrimina más en los percentiles más altos de sueldo

Segundo Modelo (quitando variables sensibles)

Notebook: Link

Usamos el mismo modelo de LightGBM pero quitamos la variable de sexo en las features y obtenemos el siguiente resultado:

El model empeora en un punto porcentual de MAPE y mejora bastante el DPM (de ~10% a ~4%). Como ya mencionamos antes, no es posible calcular el DPC para este modelo

Modelo (o modelos) mas “justos”

Notebook: Link

La idea acá es explorar el espacio de los modelos (y sus métricas) de la forma más eficiene posible con el proposito de tener un visión clara del trade-off entre precisión y fairness. Para esto utilizamos una optimización bayesiana multi-objetivo sobre el espacio de los hyperparámetros de nuestro modelo (idea tomada de este paper).

¿Cómo funciona esto? El espacio de los modelos puede ser parametrizado por los hyperparámetros involucrados en el entrenamiento, llamémosle a este espacio de hyperparamétros H. En el caso de LightGBM encontramos en H a

  • El número de árboles
  • La profundidad máxima
  • La fracción de sampleo de features
  • El learning rate
  • y un gran etc

En el caso de una red neuronal por ejemplo pueden estar en este espacio el número de capas, la probabilidad de drop out, el número de neuronas y otros. Para cada set de hyperparámetros h en H va haber un modelo S_h entrenado usando h que tendra sus métricas MAPE(S_h), DPC(S_h), DPM(S_h). La idea entonces es resolver el problema multiobjetivo que maximiza la siguiente función:

Función a optimizar: Trataremos de optimizar precisión y fairness codificados en estos tres indicadores

Usualmente en este tipo de problemas los objetivos están en conflicto (precisión vs fairness) y no existe una única solución si no más bien una curva de posibles soluciones llamada la frontera de pareto en donde ocurre que si una de las métricas mejora alguna otra si o si tiene que empeorar. Es entonces en este espacio de soluciones donde podemos tomar la decisión de cuan justo queremos ser y cuanta precisión estamos dispuestos a sacrificar para lograrlo.

¿Cómo logramos hacer esta optimización?

Usamos una libreria llamada optuna (optimización bayesiana) que tiene un modulo de optimización multiobjetivo.

Primero, definimos la función, que tiene como argumento los hiperparametros y retorna las tres métricas que deseamos optimizar:

función a optimizar

Luego definimos el espacio de hiperparámetros (rangos y distribución a priori) y echamos a correr la optimización!

Dentro de los hiperparámetros optimizados podemos ver una variable llamada sexo_feature_contri, esta variable hace alusión a cuánto queremos que el feature sexo importe en el modelo final. Para más detalles sobre este feature visitar la página de lightgbm en el siguiente link

Finalmente podemos extraer los modelos entrenados (en este experimento fueron 5.000) desde el objeto study de optuna que además nos identifica la frontera de pareto con las siguientes lineas de código

Con esta información podemos gráficar las proyecciones de las fronteras de pareto y escoger el modelo desde ahí

Observamos como podemos llegar a valores de MAPE en torno al 42% con un DPC=0% mientras que el menor valor de MAPE posible es de 41% con un DPC ~25% que es muy alto. Además vemos como nuestro primer modelo es super ineficiente ya que está muy lejos de la frontera de pareto.
Similar a lo anterior podemos ver como podemos llegar a un MAPE de ~45% con un valor de DPM ~1.4% que es mucho mejor es mucho mejor que el modelo que se entrenó sin la variable sexo

Finalmente buscamos el modelo ganador, para esto seteamos un rango de MAPE razonable (escojemos que sea < 45%) y miramos cómo se comportan los modelos pareto pero solo en términos de DPC y DPM

Las dos métricas están super correlacionadas y por los valores de MAPE que se observan conviene tomar el modelo que está en la esquina inferior izquierda

A continuación podemos ver una tabla resumen de los tres modelos entrenados

Observamos que el MedianAPE se mantiene casi igual en los distinos experimentos

Conclusiones

El mensaje principal de este artículo es que los datos (nuestra historia) pueden estar llenos de sesgos injustos que nuestros modelos perpetuarán de manera sistemática y automatizada si es que solo ponemos esfuerzos en optimizar para ser precisos. Como data scientists debemos hacernos cargo de esta problemática y para esto podemos seguir los siguientes tres pasos básicos:

  • Identificar las variables sensibles: Estas variables cambian de problema a problema y por lo general cumplen con dos condiciones básicas 1) El target está correlacionado con ellas 2) Son variables que las personas no pueden cambiar (como genero, edad, nacionalidad y raza)
  • Monitorear métricas de Fairness: Encontrar e implementar las métricas de fairness que se ajusten al problema y monitorearlas de cerca, familiarizarnos con sus pros y contras tal cual como lo hacemos con las métricas de precisión. Este es un buen articulo que tiene una revisión exaustiva de métricas de fairness
  • Mitigar sesgos: Buscar formas de optimizar estas métricas de fairness al igual como optimizamos las métricas de precisión

Bibliografía

--

--