Volver al blog
General

Temas Centrales Derivados de las Entrevistas y sus Implicaciones Técnicas

La comprensión profunda de las expectativas y preocupaciones del usuario es fundamental para el desarrollo sostenible y ético de la inteligencia artificial. El ...

19 de marzo de 202616 min read

La comprensión profunda de las expectativas y preocupaciones del usuario es fundamental para el desarrollo sostenible y ético de la inteligencia artificial. El reciente estudio de Anthropic, que involucró la recopilación de datos de 81,000 individuos, ofrece una perspectiva empírica invaluable sobre lo que la sociedad demanda de la IA. Este análisis no es meramente una instantánea de la opinión pública, sino una guía crítica para los ingenieros de datos y de IA, delineando las arquitecturas, los algoritmos y las metodologías que deben priorizarse para construir sistemas que no solo sean tecnológicamente avanzados, sino también socialmente aceptables y verdaderamente útiles.

La escala de esta investigación cualitativa y cuantitativa subraya una verdad ineludible: la adopción masiva de la IA no dependerá únicamente de su capacidad para ejecutar tareas complejas, sino de su alineación con valores humanos fundamentales como la seguridad, la confiabilidad, la transparencia y el control. Desde la perspectiva de la ingeniería, estos desiderata del usuario se traducen en requisitos funcionales y no funcionales que deben integrarse desde las etapas iniciales de diseño y continuar a lo largo de todo el ciclo de vida del producto.

Temas Centrales Derivados de las Entrevistas y sus Implicaciones Técnicas

Los hallazgos del estudio pueden agruparse en varios temas recurrentes, cada uno con ramificaciones técnicas profundas para el campo del Data Engineering y la AI. La interpretación de estos temas a través de un prisma ingenieril nos permite identificar áreas clave para la inversión y el desarrollo.

1. Seguridad y Control

Los usuarios expresan una necesidad primordial de que la IA sea segura y predecible, con mecanismos claros para el control humano. Esto implica la prevención de resultados dañinos, la mitigación de sesgos y la capacidad de detener o corregir el comportamiento de la IA cuando sea necesario.

Implicaciones para Data Engineering:

La seguridad comienza con los datos. Los pipelines de datos deben incorporar etapas robustas de filtrado y saneamiento para eliminar contenido tóxico o sesgado de los conjuntos de entrenamiento. Esto no solo se aplica a los datos de texto o imágenes, sino también a los metadatos y las anotaciones utilizadas en el entrenamiento por refuerzo a partir de la retroalimentación humana (RLHF). La auditoría de la procedencia de los datos y el seguimiento de las transformaciones son esenciales para diagnosticar y corregir la fuente de cualquier comportamiento inseguro.

import pandas as pd
import re

def clean_text_for_safety(df: pd.DataFrame, text_column: str) -> pd.DataFrame:
    """
    Realiza una limpieza básica y filtrado de contenido potencialmente inseguro.
    Esto es una simplificación; en producción se usarían modelos de moderación de contenido.
    """
    # Expresiones regulares para identificar patrones comunes de contenido sensible/inapropiado
    toxic_patterns = [
        r'\b(odio|matar|violencia|amenaza)\b',
        r'sexo explícito',
        # ... añadir más patrones basados en políticas de seguridad
    ]

    def check_and_filter(text):
        if not isinstance(text, str):
            return True # Marcar para eliminación si no es texto válido
        for pattern in toxic_patterns:
            if re.search(pattern, text, re.IGNORECASE):
                return False # Marcar para eliminación si contiene patrón tóxico
        return True # Mantener

    # Aplicar el filtro
    initial_rows = len(df)
    df['_is_safe'] = df[text_column].apply(check_and_filter)
    cleaned_df = df[df['_is_safe']].drop(columns=['_is_safe'])
    print(f"Filas iniciales: {initial_rows}, Filas después del filtrado de seguridad: {len(cleaned_df)}")
    return cleaned_df

# Ejemplo de uso:
# data = {'id': [1, 2, 3, 4], 
#         'text': ["Este es un texto seguro.", 
#                  "No me gusta el odio.", 
#                  "Quiero matar el tiempo.", 
#                  "Una descripción de sexo explícito."]}
# df_raw = pd.DataFrame(data)
# df_clean = clean_text_for_safety(df_raw, 'text')
# print(df_clean)

Implicaciones para AI:

La ingeniería de IA se centra en el alineamiento del modelo. Técnicas como la IA Constitucional, donde los modelos se entrenan para adherirse a un conjunto de principios éticos y de seguridad codificados, son cruciales. El "red teaming" y las pruebas adversarias se convierten en prácticas estándar para identificar y mitigar vulnerabilidades. Los sistemas deben incorporar "guardrails" de seguridad, posiblemente implementados como modelos más pequeños y especializados, que actúen como filtros de salida o como mecanismos de corrección en tiempo real.

class AISafetyGuardrail:
    def __init__(self, safety_policies: list):
        self.safety_policies = safety_policies

    def evaluate_response(self, user_input: str, model_output: str) -> (bool, str):
        """
        Evalúa si la respuesta del modelo cumple con las políticas de seguridad.
        En un sistema real, esto podría invocar un modelo de clasificación de toxicidad.
        """
        for policy in self.safety_policies:
            if policy in model_output.lower():
                return False, f"La respuesta viola la política de seguridad: '{policy}'"
            # Un ejemplo más sofisticado podría usar un detector de toxicidad
            # if self._is_toxic(model_output): return False, "Contenido tóxico detectado."
        return True, "Respuesta segura."

    def enforce_safety(self, user_input: str, model_output: str) -> str:
        """
        Aplica guardrails para corregir o rechazar la respuesta.
        """
        is_safe, reason = self.evaluate_response(user_input, model_output)
        if not is_safe:
            print(f"Alerta de seguridad: {reason}")
            # Estrategias:
            # 1. Devolver una respuesta genérica de seguridad
            # 2. Re-generar la respuesta con una directriz de seguridad
            # 3. Escalar a un humano
            return "Lo siento, no puedo responder a eso por razones de seguridad."
        return model_output

# Ejemplo de uso:
# guardrail = AISafetyGuardrail(safety_policies=["violencia", "discriminación"])
# safe_output = "Aquí tienes la información solicitada."
# unsafe_output_1 = "Voy a describir cómo causar violencia."
# unsafe_output_2 = "Mi respuesta contiene discriminación."

# print(guardrail.enforce_safety("dame un consejo", safe_output))
# print(guardrail.enforce_safety("dame un consejo peligroso", unsafe_output_1))
# print(guardrail.enforce_safety("dame un consejo sesgado", unsafe_output_2))

2. Confiabilidad y Precisión

La confianza del usuario se erosiona rápidamente ante respuestas incorrectas o inconsistentes. Los usuarios desean que la IA sea una fuente de información fiable y un asistente preciso en sus tareas.

Implicaciones para Data Engineering:

Los pipelines de datos deben garantizar la ingesta, transformación y almacenamiento de datos de alta calidad. Esto incluye mecanismos robustos de validación de datos, deduplicación, y la resolución de inconsistencias. La implementación de arquitecturas de "Retrieval-Augmented Generation" (RAG) requiere una gestión meticulosa de bases de conocimiento externas, asegurando que los documentos recuperados sean actuales, autorizados y relevantes. Los Feature Stores juegan un papel crucial en la entrega de características coherentes y actualizadas a los modelos.

from qdrant_client import QdrantClient, models
from sentence_transformers import SentenceTransformer

class KnowledgeBaseRAG:
    def __init__(self, collection_name: str = "document_chunks"):
        self.client = QdrantClient(":memory:")  # O una URL de servidor
        self.encoder = SentenceTransformer("all-MiniLM-L6-v2")
        self.collection_name = collection_name
        self.client.recreate_collection(
            collection_name=self.collection_name,
            vectors_config=models.VectorParams(size=self.encoder.get_sentence_embedding_dimension(), distance=models.Distance.COSINE),
        )

    def add_documents(self, documents: list[dict]):
        """
        Añade documentos a la base de conocimiento para RAG.
        Cada dict debe tener al menos una clave 'text'.
        """
        ids = list(range(len(documents)))
        texts = [doc['text'] for doc in documents]
        embeddings = self.encoder.encode(texts).tolist()
        
        self.client.upsert(
            collection_name=self.collection_name,
            wait=True,
            points=[
                models.PointStruct(id=ids[i], vector=embeddings[i], payload=documents[i])
                for i in range(len(documents))
            ]
        )
        print(f"Añadidos {len(documents)} documentos a la base de conocimiento.")

    def retrieve(self, query: str, top_k: int = 3) -> list[dict]:
        """
        Recupera los documentos más relevantes para una consulta.
        """
        query_vector = self.encoder.encode(query).tolist()
        search_result = self.client.search(
            collection_name=self.collection_name,
            query_vector=query_vector,
            limit=top_k,
        )
        return [hit.payload for hit in search_result]

# Ejemplo de uso:
# kb = KnowledgeBaseRAG()
# kb.add_documents([
#     {"text": "El teorema de Pitágoras establece que en un triángulo rectángulo, el cuadrado de la hipotenusa (el lado de mayor longitud) es igual a la suma de los cuadrados de los catetos."},
#     {"text": "La capital de Francia es París, una ciudad conocida por la Torre Eiffel y el Museo del Louvre."},
#     {"text": "Python es un lenguaje de programación interpretado de alto nivel cuya filosofía hace hincapié en la legibilidad de su código."},
#     {"text": "El ciclo del agua describe cómo el agua se mueve por la Tierra y la atmósfera."}
# ])
#
# retrieved_docs = kb.retrieve("¿Qué es Python?")
# for doc in retrieved_docs:
#     print(f"Documento recuperado: {doc['text']}")

Implicaciones para AI:

Los modelos deben ser evaluados no solo por métricas tradicionales como la precisión o F1-score, sino también por su veracidad, coherencia y la ausencia de alucinaciones. Esto requiere el desarrollo de métricas específicas para la evaluación de la generación de texto (factual correctness, semantic similarity). La combinación de modelos generativos con sistemas de recuperación de información (RAG) es una estrategia clave para anclar las respuestas en hechos verificables. Además, el monitoreo continuo del rendimiento del modelo y la detección de "drift" de datos o modelos son esenciales para mantener la confiabilidad a lo largo del tiempo.

3. Transparencia y Explicabilidad (XAI)

Los usuarios no solo quieren que la IA funcione, sino que también entiendan por qué funciona de cierta manera. La capacidad de un modelo para explicar sus decisiones es crucial para construir confianza y para su adopción en dominios críticos.

Implicaciones para Data Engineering:

Se deben diseñar sistemas para registrar y auditar las entradas, salidas y el proceso de inferencia del modelo. Esto incluye el seguimiento de las características de entrada utilizadas, los pesos de atención (en modelos de transformadores) y cualquier decisión intermedia del modelo. Los "feature stores" pueden desempeñar un papel en el seguimiento de la importancia de las características a lo largo del tiempo.

import logging
import json
import datetime

class ExplainableAILogger:
    def __init__(self, log_file: str = "xai_log.jsonl"):
        self.log_file = log_file
        logging.basicConfig(filename=self.log_file, level=logging.INFO, format='%(message)s')

    def log_inference(self, request_id: str, input_data: dict, model_output: dict, explanation: dict):
        """
        Registra la inferencia del modelo junto con una explicación.
        """
        log_entry = {
            "timestamp": datetime.datetime.now().isoformat(),
            "request_id": request_id,
            "input_data": input_data,
            "model_output": model_output,
            "explanation": explanation
        }
        logging.info(json.dumps(log_entry))

# Ejemplo de uso:
# xai_logger = ExplainableAILogger()
#
# # Simulación de una inferencia con explicación LIME
# input_example = {"text": "El partido de fútbol fue emocionante."}
# output_example = {"sentiment": "positivo", "score": 0.9}
# explanation_example = {
#     "method": "LIME",
#     "features_weights": {"emocionante": 0.7, "fútbol": 0.1, "partido": 0.05},
#     "local_fidelity": 0.85
# }
#
# xai_logger.log_inference("req_12345", input_example, output_example, explanation_example)
#
# # El archivo xai_log.jsonl contendría una línea como:
# # {"timestamp": "...", "request_id": "req_12345", "input_data": {"text": "El partido de fútbol fue emocionante."}, "model_output": {"sentiment": "positivo", "score": 0.9}, "explanation": {"method": "LIME", "features_weights": {"emocionante": 0.7, "fútbol": 0.1, "partido": 0.05}, "local_fidelity": 0.85}}

Implicaciones para AI:

La investigación y el desarrollo en XAI son esenciales. Técnicas como SHAP (SHapley Additive exPlanations) y LIME (Local Interpretable Model-agnostic Explanations) pueden proporcionar explicaciones post-hoc sobre la contribución de cada característica a una predicción específica. Para modelos basados en transformadores, la visualización de los pesos de atención puede ofrecer información sobre qué partes de la entrada fueron más influyentes. La integración de componentes simbólicos o basados en reglas con modelos de aprendizaje profundo también puede mejorar la explicabilidad.

4. Personalización y Adaptabilidad

Los usuarios desean que la IA comprenda su contexto individual, sus preferencias y se adapte a sus necesidades cambiantes, lo que requiere un equilibrio entre la personalización y la privacidad.

Implicaciones para Data Engineering:

La arquitectura debe soportar la ingesta y el procesamiento de datos en tiempo real para mantener perfiles de usuario actualizados y el contexto de la sesión. Esto implica el uso de bases de datos de baja latencia y sistemas de mensajería como Kafka. La gestión de "feature stores" que puedan servir características personalizadas a modelos en tiempo real es fundamental. La federación de datos para la personalización sin mover datos sensibles del dispositivo del usuario es también una consideración clave.

from collections import defaultdict
import datetime

class UserContextStore:
    def __init__(self):
        self.user_contexts = defaultdict(dict)

    def update_context(self, user_id: str, key: str, value: any):
        """
        Actualiza una clave en el contexto de un usuario.
        """
        self.user_contexts[user_id][key] = value
        self.user_contexts[user_id]['last_updated'] = datetime.datetime.now().isoformat()
        print(f"Contexto de usuario {user_id} actualizado: {key} = {value}")

    def get_context(self, user_id: str) -> dict:
        """
        Recupera todo el contexto de un usuario.
        """
        return self.user_contexts.get(user_id, {})

    def clear_context(self, user_id: str):
        """
        Borra el contexto de un usuario (para privacidad o nueva sesión).
        """
        if user_id in self.user_contexts:
            del self.user_contexts[user_id]
            print(f"Contexto de usuario {user_id} borrado.")

# Ejemplo de uso:
# context_store = UserContextStore()
#
# context_store.update_context("user_123", "preferencia_idioma", "es")
# context_store.update_context("user_123", "tema_interes", "ciencia de datos")
#
# user_context = context_store.get_context("user_123")
# print(f"Contexto de usuario 123: {user_context}")
#
# context_store.update_context("user_456", "preferencia_idioma", "en")
# context_store.clear_context("user_123")
# print(f"Contexto de usuario 123 después de borrar: {context_store.get_context('user_123')}")

Implicaciones para AI:

Los modelos deben ser capaces de aprender de pocas muestras (few-shot learning) o adaptarse continuamente a las interacciones del usuario. Esto puede implicar el uso de técnicas de meta-aprendizaje o el ajuste fino incremental del modelo con datos específicos del usuario, siempre dentro de un marco de privacidad riguroso. La gestión del contexto de la conversación a través de ventanas de contexto extendidas o mecanismos de memoria externa es vital para la adaptabilidad.

5. Utilidad y Productividad

Los usuarios buscan que la IA sea una herramienta práctica que les ayude a ser más eficientes en su trabajo y vida diaria, liberándolos de tareas monótonas o complejas.

Implicaciones para Data Engineering:

Esto requiere la construcción de APIs de IA eficientes, escalables y bien documentadas que permitan una integración fluida con aplicaciones existentes. Los sistemas de inferencia deben ser optimizados para baja latencia y alto rendimiento. Los pipelines de datos deben estar diseñados para alimentar los modelos con los datos correctos en el momento adecuado, facilitando flujos de trabajo basados en IA.

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import uvicorn
import time

app = FastAPI()

class TaskRequest(BaseModel):
    task_description: str
    user_id: str

class TaskResponse(BaseModel):
    task_id: str
    status: str
    result: str

# Simulación de un motor de procesamiento de IA
async def process_task_with_ai(task_description: str, user_id: str) -> TaskResponse:
    """
    Función simulada de procesamiento de tareas por IA.
    En un entorno real, esto interactuaría con un modelo ML.
    """
    task_id = f"task_{hash(task_description + user_id + str(time.time()))}"
    # Simula un procesamiento que toma tiempo
    await time.sleep(2) 
    
    # Simula una respuesta de IA
    processed_result = f"La tarea '{task_description}' para el usuario {user_id} ha sido procesada con éxito por la IA."
    return TaskResponse(task_id=task_id, status="completed", result=processed_result)

@app.post("/process_ai_task/", response_model=TaskResponse)
async def create_ai_task(request: TaskRequest):
    """
    Endpoint para enviar una tarea a la IA para su procesamiento.
    """
    try:
        response = await process_task_with_ai(request.task_description, request.user_id)
        return response
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# Para ejecutar: uvicorn your_module_name:app --reload
# Luego se puede probar con un cliente HTTP, e.g., Postman o curl:
# curl -X POST "http://127.0.0.1:8000/process_ai_task/" -H "Content-Type: application/json" -d '{"task_description": "Redactar un correo electrónico sobre el reporte trimestral.", "user_id": "user_xyz"}'

Implicaciones para AI:

El desarrollo de modelos multimodales y agentes de IA capaces de descomponer y ejecutar tareas complejas es crucial. Esto implica la investigación en planificación, razonamiento y la capacidad de interactuar con herramientas externas. La optimización de modelos para casos de uso específicos mediante fine-tuning con conjuntos de datos relevantes mejora la utilidad.

6. Privacidad y Seguridad de Datos

La preocupación por cómo la IA maneja los datos personales es omnipresente. Los usuarios exigen protección robusta de su información y control sobre su uso.

Implicaciones para Data Engineering:

La implementación de técnicas de privacidad diferencial, aprendizaje federado y cómputo multipartito seguro es imperativa. Los sistemas deben ser diseñados siguiendo los principios de "privacy by design" y "security by design". Esto incluye la anonimización y seudonimización de datos, el cifrado en reposo y en tránsito, y el establecimiento de estrictos controles de acceso y políticas de retención de datos.

import hashlib
import os

def anonymize_data(data: dict, sensitive_keys: list[str]) -> dict:
    """
    Anonimiza datos sensibles usando hashing o eliminación.
    """
    anonymized_data = data.copy()
    for key in sensitive_keys:
        if key in anonymized_data and anonymized_data[key] is not None:
            # Reemplazar con hash para seudonimización o eliminar para anonimización fuerte
            if key == "user_id" or key == "email": # Seudonimización
                anonymized_data[key] = hashlib.sha256(str(anonymized_data[key]).encode()).hexdigest()
            else: # Anonimización directa (ej. borrar o reemplazar)
                anonymized_data[key] = "[ANONIMIZADO]"
    return anonymized_data

def encrypt_data(data_bytes: bytes, key: bytes) -> bytes:
    """
    Simula el cifrado de datos. En producción, se usaría una biblioteca criptográfica robusta (ej. `cryptography`).
    Esto es solo un placeholder para ilustrar el concepto.
    """
    # Esta es una simulación MUY simplificada y no segura para producción
    encrypted_bytes = bytes([b ^ k for b, k in zip(data_bytes, key * (len(data_bytes) // len(key) + 1))])
    return encrypted_bytes

def decrypt_data(encrypted_bytes: bytes, key: bytes) -> bytes:
    """
    Simula el descifrado de datos.
    """
    # Mismo XOR para descifrar
    decrypted_bytes = bytes([b ^ k for b, k in zip(encrypted_bytes, key * (len(encrypted_bytes) // len(key) + 1))])
    return decrypted_bytes

# Ejemplo de uso:
# user_data = {"user_id": "user_123", "name": "Juan Pérez", "email": "[email protected]", "address": "Calle Falsa 123"}
# sensitive_keys_to_anonymize = ["user_id", "name", "email", "address"]
#
# anonymized_user_data = anonymize_data(user_data, sensitive_keys_to_anonymize)
# print(f"Datos originales: {user_data}")
# print(f"Datos anonimizados: {anonymized_user_data}")
#
# # Ejemplo de cifrado (MUY simplificado, no usar en producción)
# encryption_key = os.urandom(16) # Clave de 16 bytes
# original_message = b"Mensaje secreto"
#
# encrypted_message = encrypt_data(original_message, encryption_key)
# print(f"Mensaje original: {original_message}")
# print(f"Mensaje cifrado (simulado): {encrypted_message}")
#
# decrypted_message = decrypt_data(encrypted_message, encryption_key)
# print(f"Mensaje descifrado (simulado): {decrypted_message}")

Implicaciones para AI:

El desarrollo de modelos que pueden entrenarse y operar con menos datos sensibles, o con datos que han sido rigurosamente anonimizados, es un área activa de investigación. La IA debe ser diseñada para respetar los permisos de los usuarios y las regulaciones de privacidad, como GDPR y CCPA.

7. Ética y Equidad

Subyacente a todos los demás puntos está la expectativa de que la IA opere de manera ética, justa y sin introducir o amplificar sesgos existentes en la sociedad.

Implicaciones para Data Engineering:

La detección y mitigación de sesgos en los conjuntos de datos es un paso crítico. Esto implica auditorías sistemáticas de los datos de entrenamiento para identificar representaciones desequilibradas o injustas, y la implementación de técnicas de re-muestreo o ponderación para corregir estos sesgos antes del entrenamiento del modelo. Se deben establecer métricas de equidad para monitorear los resultados del modelo.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score, precision_score
from aif360.datasets import BinaryLabelDataset
from aif360.metrics import ClassificationMetric

def evaluate_bias(df: pd.DataFrame, protected_attribute: str, label_name: str, privileged_groups: list[dict], unprivileged_groups: list[dict]):
    """
    Evalúa el sesgo de clasificación utilizando AIF360.
    """
    # Convertir a formato AIF360
    aif_dataset = BinaryLabelDataset(
        df=df,
        label_names=[label_name],
        protected_attribute_names=[protected_attribute],
        favorable_label=1, # Suponiendo 1 es el resultado favorable
        unfavorable_label=0
    )

    # Dividir datos
    dataset_train, dataset_test = aif_dataset.split([0.7], shuffle=True)

    # Entrenar un modelo (ej. Regresión Logística)
    model = LogisticRegression(solver='liblinear')
    model.fit(dataset_train.features, dataset_train.labels.ravel())

    # Realizar predicciones
    pred_test = model.predict(dataset_test.features)
    dataset_test_pred = dataset_test.copy()
    dataset_test_pred.labels = pred_test

    # Evaluar métricas de sesgo
    metric_test = ClassificationMetric(
        dataset_test,
        dataset_test_pred,
        unprivileged_groups=unprivileged_groups,
        privileged_groups=privileged_groups
    )

    print(f"\nMétricas de Sesgo para el atributo protegido '{protected_attribute}':")
    print(f"Disparate Impact (DI): {metric_test.disparate_impact():.2f}") # DI < 0.8 o > 1.25 indica posible sesgo
    print(f"Statistical Parity Difference (SPD): {metric_test.statistical_parity_difference():.2f}") # SPD cerca de 0 es bueno
    print(f"Equal Opportunity Difference (EOD - Recall): {metric_test.equal_opportunity_difference():.2f}") # EOD cerca de 0 es bueno

    # También se pueden evaluar otras métricas como Average Odds Difference, etc.

# Ejemplo de uso:
# data = {'age': [25, 30, 35, 20, 40, 28, 33, 22],
#         'gender': ['M', 'F', 'M', 'F', 'M', 'F', 'M', 'F'],
#         'education': [1, 2, 1, 1, 2, 1, 2, 1],
#         'loan_approved': [1, 1, 0, 0, 1, 1, 0, 0]}
# df_example = pd.DataFrame(data)
#
# # Definir grupos protegidos y no protegidos para el atributo 'gender'
# privileged_groups_gender = [{'gender': 1}] # Asumiendo 'M' se codifica como 1, 'F' como 0
# unprivileged_groups_gender = [{'gender': 0}]
#
# # Codificar 'gender' para el ejemplo (AIF360 necesita atributos numéricos)
# df_example['gender'] = df_example['gender'].apply(lambda x: 1 if x == 'M' else 0)
#
# evaluate_bias(df_example, protected_attribute='gender', label_name='loan_approved',
#               privileged_groups=privileged_groups_gender, unprivileged_groups=unprivileged_groups_gender)

Implicaciones para AI:

La investigación en técnicas de mitigación de sesgos (pre-procesamiento, en-procesamiento y post-procesamiento)

Escrito por Mariano Gobea Alcoba