Saltar al contenido principal

Tipos Semánticos

¿Qué Son los Tipos Semánticos?

Cuando se carga un dataset, DashAI asigna un tipo semántico a cada columna. Los tipos semánticos van más allá de los formatos de almacenamiento en bruto (p. ej., int32 o string de PyArrow) para expresar la naturaleza significativa de los datos para el ML: ¿es esta columna una medida continua, una etiqueta discreta, un texto libre, una fecha?

Esta clasificación impulsa tres comportamientos críticos en toda la plataforma:

  • Compatibilidad de tareas — solo las columnas cuyos tipos coinciden con los requisitos de una tarea pueden seleccionarse como entradas o salidas.
  • Encadenamiento de converters — los converters declaran el tipo que aceptan y el tipo que producen, habilitando pipelines de preprocesamiento seguras.
  • Codificación de etiquetas — las columnas de salida categóricas se codifican automáticamente como enteros antes del entrenamiento y se decodifican de vuelta a etiquetas de cadena tras la predicción.

Jerarquía de Tipos

Todos los tipos semánticos heredan de una clase base abstracta común, DashAIDataType.

DashAIDataType
├── DashAIValue # padre abstracto para todos los tipos de valor
│ ├── Integer # int8, int16, int32, int64 (con o sin signo)
│ ├── Float # float16, float32, float64
│ ├── Text # cadena con codificación (por defecto: UTF-8)
│ ├── Date # fecha de calendario (formato por defecto: YYYY-MM-DD)
│ ├── Time # hora del día (formato por defecto: HH:mm:ss)
│ ├── Timestamp # fecha y hora con zona horaria (por defecto: YYYY-MM-DD HH:mm:ss)
│ ├── Duration # tiempo transcurrido con unidad (s, ms, us, ns)
│ ├── Decimal # decimal preciso (128 o 256 bits, con precisión y escala)
│ └── Binary # datos binarios en bruto
└── Categorical # etiquetas discretas con mapa de codificación str ↔ int

Los tipos DashAIValue representan medidas continuas u ordenadas. Categorical es una rama separada porque lleva estructura adicional: la lista completa de categorías únicas y un mapeo de codificación biyectivo.


Tipos Concretos

Tipos de Valor

TipoAtributos claveUso típico
Integerdtype (p. ej. int64), signedCaracterísticas de conteo, etiquetas con codificación ordinal
Floatdtype (p. ej. float64)Medidas continuas, objetivos de regresión
Textdtype (string), encodingTexto libre, tareas de NLP
Dateformat (por defecto YYYY-MM-DD)Fechas de calendario
Timeformat (por defecto HH:mm:ss)Valores de hora del día
Timestampformat, timezoneFecha y hora con zona horaria
Durationunit (s, ms, us, ns)Intervalos de tiempo
Decimalprecision, scale, bit_widthNuméricos de alta precisión
BinaryCargas útiles de bytes en bruto

Categorical

Categorical es el tipo estructuralmente más rico. Almacena:

  • categories — lista ordenada de valores de cadena únicos (["cat", "dog", "bird"])
  • dtype — tipo de almacenamiento subyacente de PyArrow (string, int64, etc.)
  • encoding / str2int — diccionario que mapea cada categoría a un entero ({"cat": 0, "dog": 1, "bird": 2})
  • decoding / int2str — mapeo inverso ({0: "cat", 1: "dog", 2: "bird"})
  • converted — indicador de si la columna ya ha sido codificada como entero

Categorical se usa para todas las columnas de destino de clasificación y para cualquier columna de característica que contenga un conjunto discreto de etiquetas (p. ej., país, categoría de producto).


Inferencia de Tipos

Los tipos se asignan automáticamente cuando se carga un dataset. DashAI soporta dos métodos de inferencia, seleccionables al momento de la carga.

Primario: DashAIPtype

Usa el modelo de inferencia de tipos probabilístico ptype, que analiza los valores de cada columna para estimar el tipo semántico más probable. Salidas de ptype soportadas y sus mapeos en DashAI:

Salida ptypeTipo DashAI
integerInteger (int64)
floatFloat (float64)
stringText (string, UTF-8)
booleanCategorical (string)
categoricalCategorical (string)
date-iso-8601Text (análisis de fechas aún no automático)
date-euText
float_commaFloat (coma decimal normalizada)

Después de la clasificación con ptype, cualquier columna cuyo conteo y proporción de valores únicos estén dentro de los umbrales configurables se promueve adicionalmente a Categorical, independientemente de la salida original de ptype.

Alternativa: DummyCategoricalInference

Una heurística ligera utilizada cuando ptype no está disponible:

  • Columnas de cadena con menos de 10 valores únicos → Categorical
  • Columnas enteras con menos de 10 valores únicos → Categorical
  • Todas las demás columnas enteras → Integer
  • Todas las demás columnas de cadena → Text
  • Columnas flotantes → Float

Casos Especiales

  • Las columnas PyArrow bool siempre se mapean a Categorical (dos categorías: True/False).
  • Las columnas codificadas como diccionario de PyArrow se mapean a Categorical con una lista de categorías inicialmente vacía.

Persistencia de Tipos

Los tipos semánticos se serializan en los metadatos de la tabla Apache Arrow bajo la clave dashai_types y se almacenan junto al archivo Arrow IPC del dataset. Esto significa:

  • Los tipos sobreviven a ciclos de guardado/carga sin necesidad de re-inferencia.
  • Los Notebooks heredan los tipos de su dataset fuente.
  • Los converters que cambian el tipo de una columna actualizan los metadatos en el lugar.

Las utilidades relevantes son save_types_in_arrow_metadata() y get_types_from_arrow_metadata() en DashAI/back/types/utils.py.


Cómo Se Usan los Tipos

Compatibilidad de Tareas

Cada clase de tarea declara los tipos semánticos que acepta para las columnas de entrada y salida mediante un diccionario metadata:

metadata = {
"inputs_types": [Float, Integer, Categorical], # tipos de columnas de entrada permitidos
"outputs_types": [Categorical], # tipo de columna de salida requerido
"inputs_cardinality": "n", # cualquier número de entradas
"outputs_cardinality": 1, # exactamente una salida
}

Antes del entrenamiento, validate_dataset_for_task() verifica que el tipo semántico de cada columna seleccionada esté en el conjunto permitido. Las columnas que no coinciden se rechazan con un error descriptivo.

Requisitos de tipos por tarea:

TareaTipos de entrada permitidosTipo de salida requerido
TabularClassificationTaskFloat, Integer, CategoricalCategorical
RegressionTaskFloat, Integer, CategoricalFloat o Integer
TextClassificationTaskText (exactamente 1 columna)Categorical (exactamente 1 columna)
TranslationTaskText (exactamente 1 columna)Text (exactamente 1 columna)

Contratos de Tipos de Converters

Cada converter implementa get_output_type(column_name) para declarar el tipo semántico de cada columna de salida. Esto permite a DashAI rastrear el tipo de cada columna a través de una pipeline de preprocesamiento de múltiples pasos.

Contratos de converters comunes:

ConverterTipo de entradaTipo de salida
OneHotEncoderCategoricalInteger (una columna binaria por categoría)
OrdinalEncoderCategoricalInteger
LabelEncoderCategoricalInteger
LabelBinarizerCategoricalInteger
StandardScalerInteger, FloatFloat
MinMaxScalerInteger, FloatFloat
NormalizerInteger, FloatFloat
BinarizerInteger, FloatInteger
TFIDFConverterTextFloat
BagOfWordsConverterTextFloat
TokenizerConverterTextInteger
PCA, TruncatedSVD, FastICAInteger, FloatFloat

Codificación de Etiquetas

Las tareas de clasificación requieren una columna de salida Categorical, pero la mayoría de los modelos de ML requieren objetivos numéricos. DashAI maneja esto automáticamente:

  1. Antes del entrenamientocategorical_label_encoder() convierte cada columna de salida Categorical a Integer usando el mapa str2int del tipo Categorical. El mapeo se guarda para poder revertirlo.
  2. Después de la predicciónprocess_predictions() aplica el mapa inverso int2str para convertir las predicciones enteras de vuelta a sus etiquetas de cadena originales antes de mostrar los resultados o guardarlos en disco.

No se necesita ningún paso de codificación manual por parte del usuario.

Validación de Tipos

Cuando un usuario cambia manualmente el tipo semántico de una columna en la UI, validate_type_change() verifica si la conversión es segura y factible:

De \ AIntegerFloatTextCategoricalDateTimeTimestamp
Integer✓ (si baja cardinalidad)
Float✓ (si números enteros)✓ (si baja cardinalidad)
Text✓ (si analizable)✓ (si analizable)✓ (si baja cardinalidad)
Categorical
Date
Time
Timestamp

Si la conversión no es segura (p. ej., promover una columna de texto de alta cardinalidad a Categorical), el validador devuelve un error descriptivo antes de que se modifique ningún dato.


Archivos Fuente

ArchivoRol
DashAI/back/types/dashai_data_type.pyClase base abstracta DashAIDataType
DashAI/back/types/dashai_value.pyClase intermedia abstracta DashAIValue
DashAI/back/types/value_types.pyClases de tipos de valor concretos
DashAI/back/types/categorical.pyTipo Categorical con lógica de codificación
DashAI/back/types/utils.pyConversión de tipos Arrow ↔ DashAI, E/S de metadatos
DashAI/back/types/type_validation.pyvalidate_type_change() y verificaciones de idoneidad
DashAI/back/types/inf/inference_methods.pyDashAIPtype y DummyCategoricalInference
DashAI/back/types/inf/type_inference.pyPunto de entrada infer_types()