### Sesgos de los algoritmos *vs*. Sesgos en los algoritmos. Dante Avaro 28/03/2025 > ### Este post explora la distinción fundamental entre los sesgos inherentes a los algoritmos y aquellos que se manifiestan durante su implementación y entrenamiento. ### Introducción En el campo de la inteligencia artificial, la distinción entre "sesgos de los algoritmos" y "sesgos en los algoritmos" resulta necesaria técnicamente e imprescindible en términos éticos. Esta diferenciación es crucial para comprender cómo abordar los desafíos de equidad y justicia en los sistemas de IA. ### Sesgos de los Algoritmos Los sesgos de los algoritmos se refieren a las predisposiciones inherentes en la estructura y diseño fundamental del algoritmo mismo. Estos sesgos están relacionados con: 1. Limitaciones matemáticas y estadísticas del modelo 2. Suposiciones fundamentales sobre la distribución de datos 3. Arquitectura algorítmica seleccionada Por ejemplo, un algoritmo de regresión lineal tiene un sesgo inherente hacia relaciones lineales, incluso cuando la realidad puede ser más compleja. Este tipo de sesgo es intrínseco al diseño del algoritmo y forma parte de sus limitaciones fundamentales.[^1] ### Sesgos en los Algoritmos Los sesgos en los algoritmos, por otro lado, emergen durante la implementación y el entrenamiento. Estos incluyen: 1. Sesgos en los datos de entrenamiento 2. Prejuicios sociales y culturales reflejados en la selección de características 3. Decisiones de implementación que pueden favorecer ciertos resultados Estos sesgos son típicamente el foco de atención de los equipos de ética en IA, ya que están más directamente relacionados con el impacto social de los sistemas. ### Diferencias Clave y Consideraciones Éticas La principal diferencia radica en la naturaleza de estos sesgos: - Los sesgos de los algoritmos son inherentes y técnicos - Los sesgos en los algoritmos son contingentes y socioculturales Los programadores tienen diferentes niveles de control sobre estos tipos de sesgos. En los Sesgos de los Algoritmos, pueden ser mitigados mediante: a) Selección apropiada de algoritmos, b) Comprensión de limitaciones matemáticas, c) Uso de ensambles de diferentes modelos. Los Sesgos en los Algoritmos, en cambio, pueden ser abordados a través de: a) Diversificación de datos de entrenamiento, b) Auditorías de equidad y c) Pruebas de sesgo sistemáticas ## Estrategias de Mitigación Para Sesgos de los Algoritmos se puede utilizar documentación clara de limitaciones algorítmicas, validación cruzada rigurosa e implementación de múltiples modelos complementarios. Para Sesgos en los Algoritmos conviene disponer de auditorías de datos de entrenamiento, evaluación continua de impacto y diversidad en equipos de desarrollo ### Conclusiones Mientras que los sesgos de los algoritmos representan limitaciones técnicas inherentes que pueden ser comprendidas y manejadas a través de buenas prácticas de ingeniería, los sesgos en los algoritmos requieren un enfoque más holístico que incluya consideraciones éticas, sociales y culturales. Los programadores pueden trabajar en la mitigación de ambos tipos de sesgos, pero con diferentes enfoques y herramientas. La clave está en reconocer la naturaleza distinta de cada tipo de sesgo y aplicar las estrategias apropiadas para cada caso. --- #### **Apéndice 1**: Sesgo Algorítmico. Un Caso de Falla Sistemática en la Arquitectura Computacional En el diseño de algoritmos para la asignación de recursos sociales, la expectativa es que estos sistemas distribuyan los beneficios de manera justa, eficiente y equitativa, reflejando los criterios establecidos por el hacedor de políticas. Sin embargo, cuando un algoritmo debe procesar grandes cantidades de datos con limitaciones de tiempo y recursos, pueden surgir sesgos algorítmicos que afectan negativamente a los mismos grupos que se pretende beneficiar. A diferencia de un error humano intencional o una mala decisión de programación, el sesgo algorítmico aparece como una falla inherente en la estructura computacional del sistema, afectando de manera generalizada a los resultados. Este artículo explora un caso ficticio donde un sesgo algorítmico afecta la implementación de un programa social de transferencias monetarias dirigido a madres jóvenes de bajos ingresos. Veremos cómo el sesgo surge de la arquitectura del sistema y no de una intervención explícita del programador. Para ilustrarlo, incluimos un ejemplo de código en seudo Python que permite observar las limitaciones inherentes y cómo estas llevan a un sesgo sistemático. **Contexto del Caso: El Programa de Transferencias Monetarias** Supongamos que el Ministerio de Desarrollo Social implementa un programa de transferencias monetarias destinado a madres solteras jóvenes (de entre 16 y 21 años) con bajos ingresos. La política prioriza a aquellas madres que, además de ser de bajos recursos, no son clasificadas como parte de la "población blanca", considerando su mayor vulnerabilidad socioeconómica. El programa depende de un algoritmo automatizado para clasificar y priorizar a las solicitantes con base en sus ingresos y su clasificación étnica. Sin embargo, debido a las limitaciones de la arquitectura computacional (específicamente, el procesamiento limitado de datos continuos y la necesidad de agrupación), el algoritmo introduce un sesgo algorítmico que afecta negativamente a las solicitantes que, de acuerdo con los objetivos de política, deberían recibir el mayor beneficio. **La Arquitectura del Algoritmo: Compresión y Agrupación de Datos** La arquitectura del sistema enfrenta un desafío clave: debe procesar un gran número de solicitudes en tiempo real con capacidad de almacenamiento limitada. Para lograrlo, el algoritmo implementa una red neuronal que clasifica automáticamente a las solicitantes basándose en sus ingresos y etnia. Sin embargo, debido a limitaciones de procesamiento y memoria, el algoritmo emplea métodos de **compresión de datos** que agrupan los ingresos en niveles y las categorías étnicas en valores binarios, eliminando matices importantes en los datos. A continuación, presentamos el seudo código que ilustra cómo opera este algoritmo y dónde surge el sesgo: ``` # Simulación de un sistema que prioriza solicitudes basado en ingresos y etnia. # El sistema utiliza una red neuronal con arquitectura limitada para clasificar y asignar prioridades. # Datos de solicitud de ejemplo solicitudes = [ {"id": 1, "edad": 19, "ingreso": 18000, "etnia": "minoría"}, {"id": 2, "edad": 20, "ingreso": 22000, "etnia": "minoría"}, {"id": 3, "edad": 21, "ingreso": 25000, "etnia": "blanca"}, {"id": 4, "edad": 18, "ingreso": 21000, "etnia": "minoría"}, {"id": 5, "edad": 17, "ingreso": 19000, "etnia": "blanca"}, ] # Paso 1: Red neuronal de clasificación # La red tiene capas limitadas y un cuello de botella de procesamiento para mejorar la velocidad. # Esto fuerza al sistema a agrupar datos continuos en categorías discretas. def red_neuronal_clasificacion(ingreso, etnia): """ Clasifica en niveles de prioridad utilizando una red neuronal. Las salidas están limitadas a niveles predefinidos para reducir el procesamiento. """ # Preprocesamiento: Normaliza los ingresos en un rango de 0 a 1 ingreso_normalizado = ingreso / 50000 # Ejemplo de normalización para reducir resolución # Capa de agrupamiento: debido a limitaciones de memoria, el ingreso se agrupa automáticamente if ingreso_normalizado < 0.4: ingreso_nivel = "bajo" elif ingreso_normalizado < 0.7: ingreso_nivel = "medio" else: ingreso_nivel = "alto" # Categorización binaria de etnia, debido a limitaciones de parámetros entrenados if etnia == "minoría": etnia_nivel = 1 else: etnia_nivel = 0 # Cálculo de la prioridad basado en la arquitectura de la red # Al reducir el ingreso a niveles limitados, se pierde precisión if ingreso_nivel == "bajo" and etnia_nivel == 1: return "Alta" elif ingreso_nivel == "medio" and etnia_nivel == 1: return "Media" else: return "Baja" # Paso 2: Aplicación del modelo a cada solicitud # Aquí se aplican las limitaciones de la arquitectura, mostrando el sesgo. for solicitud in solicitudes: solicitud["prioridad"] = red_neuronal_clasificacion(solicitud["ingreso"], solicitud["etnia"]) # Mostrar resultados for solicitud in solicitudes: print(f"ID: {solicitud['id']}, Edad: {solicitud['edad']}, Ingreso: {solicitud['ingreso']}, " f"Etnia: {solicitud['etnia']}, Prioridad: {solicitud['prioridad']}") ``` **Explicación del Sesgo Algorítmico** En este código, el sistema de clasificación utiliza una red neuronal que, debido a limitaciones computacionales, implementa una compresión de datos y una categorización binaria de etnia. La **compresión de datos continuos** (en este caso, los ingresos) fuerza al sistema a simplificar y agrupar información en niveles limitados de ingresos: "bajo", "medio" y "alto". Esta compresión causa que madres con ingresos cercanos a los límites de los niveles (por ejemplo, 21000 y 19000) sean clasificadas de manera diferente, aunque en realidad estén en situaciones socioeconómicas similares. Así, algunas madres en situaciones vulnerables pueden quedar en una prioridad más baja. Además, la **clasificación binaria de etnia** limita la capacidad del algoritmo para capturar la diversidad de perfiles. La etnia queda reducida a una categorización binaria (1 para "minoría" y 0 para "blanca"), lo cual no permite capturar matices importantes en los perfiles étnicos y su relación con el nivel de vulnerabilidad. Esto también contribuye a un sesgo que afecta la precisión y la justicia de las decisiones de priorización. **El Sesgo Algorítmico como Falla Estructural** Este tipo de sesgo no es resultado de una mala decisión consciente del programador, sino de una **falla estructural inherente a la arquitectura computacional** del sistema. La necesidad de procesar datos en tiempo real y a gran escala lleva a una simplificación de los datos que, en la práctica, afecta negativamente a las solicitantes en situaciones límites o que no encajan perfectamente en las categorías simplificadas. En este ejemplo, el sesgo algorítmico surge de la **limitación en la resolución de datos continuos y la categorización binaria**, fallas que ocurren de manera sistemática y que, sin una intervención de revisión arquitectónica, afectan consistentemente al grupo objetivo. **Conclusión: Necesidad de una Revisión Arquitectónica para Evitar el Sesgo Algorítmico** Los sesgos algorítmicos derivados de fallas arquitectónicas son complejos de identificar y mitigar, ya que no son el resultado de decisiones programáticas directas, sino de cómo el sistema procesa la información. En este caso, un rediseño de la arquitectura que permita representar datos continuos de forma más detallada y categorías étnicas más diversas sería necesario para evitar que el sistema excluya a las personas que más necesitan los beneficios. Este caso ilustra la importancia de realizar revisiones técnicas y arquitectónicas periódicas para garantizar que los sistemas automatizados cumplan de manera equitativa con los objetivos de política social, reduciendo así los riesgos de sesgo algorítmico inherente. #### Apéndice 2. Impacto de un Sesgo Algorítmico en el Cálculo de Impuestos. El Caso de Bartolomeo **Introducción** El cálculo automatizado de impuestos busca garantizar la eficiencia y equidad en la recolección de tributos. Sin embargo, los errores acumulativos en la arquitectura de los algoritmos de cálculo pueden generar un **sesgo algorítmico**, afectando sistemáticamente a ciertos contribuyentes. Este artículo explora cómo un sesgo algorítmico se manifiesta a través de errores de redondeo, ajustes inflacionarios imprecisos y categorizaciones de ingresos, lo que lleva a que los contribuyentes como Bartolomeo terminen pagando más impuestos de lo necesario. **Marco Teórico** Los sesgos algorítmicos en la recaudación de impuestos pueden surgir sin una intención humana explícita, como resultado de la estructura y limitaciones computacionales del sistema de cálculo. Los errores de redondeo en operaciones de división y multiplicación iterativa, así como el uso de tasas inflacionarias con decimales extendidos, generan una distorsión que, aunque pequeña cada año, acumula una carga impositiva mayor de la debida. En este estudio, simulamos el impacto de estos errores en la vida laboral de un contribuyente promedio para evidenciar la importancia de revisar arquitecturas algorítmicas con precisión. **Metodología** Para simular el caso, establecemos una serie de parámetros para representar los ingresos, deducciones y ajustes inflacionarios de Bartolomeo entre los años 1955 y 1995. La simulación compara el monto que Bartolomeo debería haber pagado en impuestos, sin sesgo, con el monto afectado por el sesgo algorítmico. Luego, se estima el costo de oportunidad de este exceso suponiendo una tasa de retorno anual del 5% si el dinero hubiese sido invertido. **Parámetros del Ejercicio Simulado** 1. Tramos Impositivos y Tasas: - Hasta 20,000 USD: 10% - Hasta 50,000 USD: 20% - Hasta 100,000 USD: 30% - Más de 100,000 USD: 40% 2. Ingresos Anuales (USD): - 1955-1965: 15,000 - 1966-1975: 30,000 - 1976-1985: 50,000 - 1986-1995: 80,000 3. Deducciones: 10% del ingreso anual, con un error de redondeo acumulativo del 0.5% cada año. 4. Ajuste Inflacionario: Aplicado entre 1970 y 1985, con una tasa de 4% anual y un error adicional de precisión del 0.2%. 5. Costo de Oportunidad: Una tasa de retorno del 5% anual, calculando cuánto habría acumulado Bartolomeo si hubiera invertido el monto en exceso pagado cada año. **Resultados** La simulación arrojó los siguientes resultados: - Exceso Total Pagado: 4,929.69 USD. Este monto representa la cantidad adicional que Bartolomeo pagó a lo largo de su vida laboral debido al sesgo algorítmico en el cálculo de impuestos. - Costo de Oportunidad: 12,003.12 USD. Si Bartolomeo hubiera invertido el exceso pagado a una tasa de retorno del 5% anual, habría acumulado esta cantidad para el final de su vida laboral. Estos resultados evidencian cómo el sesgo algorítmico puede afectar de manera tangible y acumulativa a un contribuyente a lo largo de varias décadas. **Conclusiones** El caso de Bartolomeo demuestra que los sesgos algorítmicos derivados de errores de redondeo y ajustes inflacionarios imprecisos pueden tener efectos financieros significativos en los contribuyentes. Si bien el impacto anual puede parecer mínimo, la acumulación de estos errores a lo largo del tiempo puede resultar en un pago en exceso considerable. Este estudio subraya la necesidad de revisar las arquitecturas algorítmicas en el diseño de sistemas de cálculo de impuestos y sugiere que se adopten métodos para minimizar el impacto de los errores acumulativos. **Código de Simulación** A continuación, se presenta el código en Python utilizado para realizar la simulación: ``` from typing import Dict # Parámetros del ejercicio simulado TRAMOS_IMPOSITIVOS = { 20000: 0.10, 50000: 0.20, 100000: 0.30, float('inf'): 0.40 } INGRESOS_ANUALES = { (1955, 1965): 15000, (1966, 1975): 30000, (1976, 1985): 50000, (1986, 1995): 80000 } TASA_DEDUCCION = 0.10 ERROR_DEDUCCION = 0.005 TASA_INFLACION = 0.04 ERROR_INFLACION = 0.002 TASA_RETORNO_INVERSION = 0.05 def calcular_impuesto_real(ingreso, deduccion): base_imponible = ingreso - deduccion impuesto_total = 0 base_restante = base_imponible tramo_anterior = 0 for limite, tasa in TRAMOS_IMPOSITIVOS.items(): if base_restante <= 0: break monto_en_tramo = min(base_restante, limite - tramo_anterior) impuesto_tramo = monto_en_tramo * tasa impuesto_total += impuesto_tramo base_restante -= monto_en_tramo tramo_anterior = limite return impuesto_total def calcular_impuesto_con_sesgo(ingreso, deduccion, año): deduccion_ajustada = deduccion * (1 + ERROR_DEDUCCION) base_imponible_con_sesgo = ingreso - deduccion_ajustada if 1970 <= año <= 1985: base_imponible_con_sesgo *= (1 + TASA_INFLACION + ERROR_INFLACION) impuesto_total_con_sesgo = 0 base_restante = base_imponible_con_sesgo tramo_anterior = 0 for limite, tasa in TRAMOS_IMPOSITIVOS.items(): if base_restante <= 0: break monto_en_tramo = min(base_restante, limite - tramo_anterior) impuesto_tramo = monto_en_tramo * tasa impuesto_total_con_sesgo += impuesto_tramo base_restante -= monto_en_tramo tramo_anterior = limite return impuesto_total_con_sesgo exceso_pagado = 0 ingreso_invertido = 0 for periodo, ingreso in INGRESOS_ANUALES.items(): for año in range(periodo[0], periodo[1] + 1): deduccion = ingreso * TASA_DEDUCCION impuesto_real = calcular_impuesto_real(ingreso, deduccion) impuesto_con_sesgo = calcular_impuesto_con_sesgo(ingreso, deduccion, año) exceso_anual = impuesto_con_sesgo - impuesto_real exceso_pagado += exceso_anual ingreso_invertido = (ingreso_invertido + exceso_anual) * (1 + TASA_RETORNO_INVERSION) print("Exceso total pagado:", round(exceso_pagado, 2)) print("Costo de oportunidad acumulado:", round(ingreso_invertido, 2)) ``` [^1]: Sesgo de Supervivencia en Análisis Estadístico, 2) Sesgo de Confirmación en Sistemas de Recomendación, 3) Sesgo de Anchor en Sistemas de _Pricing_, 4) Problema del Bandido Multi-brazo, 5) Sesgo de Representación en Árboles de Decisión, y 6) Sesgo de Convergencia Prematura en Algoritmos Genéticos.