Google Research presentó TabFM, un modelo básico creado para datos tabulares. TabFM realiza clasificación y regresión sin entrenamiento específico del conjunto de datos. Cada predicción proviene de un único pase hacia adelante. El modelo reformula la predicción tabular como un problema de aprendizaje en contexto. Ya está disponible en Hugging Face y GitHub.
TL;DR
TabFM predice en tablas invisibles sin capacitación, ajuste ni ingeniería de funciones. Lee el conjunto de datos completo como una sola indicación y luego predice mediante el aprendizaje en contexto. La arquitectura combina la atención de filas/columnas de estilo TabPFN con el aprendizaje en contexto de estilo TabICL. La formación utilizó cientos de millones de conjuntos de datos sintéticos de modelos causales estructurales. Google BigQuery pronto expondrá TabFM a través de un comando SQL AI.PREDICT.
¿Qué es TabFM?
Los datos tabulares constituyen la columna vertebral de la infraestructura de datos empresariales. Tareas como la pérdida de clientes y la detección de fraude financiero se encuentran en tablas. Durante años, los métodos basados en árboles dominaron este espacio. XGBoost, AdaBoost y los bosques aleatorios ofrecieron resultados sólidos en datos estructurados. Google encuadra a TabFM como la contraparte tabular de TimesFM, su modelo de series temporales de disparo cero.
Esa confiabilidad tuvo un costo. Ajustar XGBoost a un nuevo conjunto de datos rara vez es una llamada a .fit(). Los científicos de datos dedican horas a la optimización de hiperparámetros y la ingeniería de funciones. Hacen esto sólo para extraer una señal confiable de los datos sin procesar. TabFM apunta exactamente a ese cuello de botella.
TabFM aplica la lógica de disparo cero que los grandes modelos de lenguaje hicieron familiar. Los LLM aprenden nuevas tareas a partir de ejemplos en contexto, sin actualizar ninguna ponderación. Esta técnica se llama aprendizaje en contexto (ICL). TabFM lleva la misma idea a las mesas. Genera predicciones sobre tablas nunca antes vistas en una sola pasada.
Cómo funciona
Los modelos tradicionales actualizan los parámetros para la distribución de cada conjunto de datos. TabFM se salta ese paso por completo. Toma todo el conjunto de datos como un único mensaje unificado. Ese mensaje contiene ejemplos de entrenamiento y filas de prueba de objetivos. El modelo lee las relaciones entre columnas y filas en el momento de la inferencia.
Las tablas no son texto. Son bidimensionales e inherentemente desordenados. Intercambiar dos filas o dos columnas no cambia su significado. En su lugar, los modelos de lenguaje estándar procesan secuencias ordenadas unidimensionales. Para cerrar esa brecha, TabFM sintetiza TabPFN y TabICL en un diseño híbrido.
Se basa en tres mecanismos:
Atención alternada de filas y columnas: la tabla sin formato pasa a través de un módulo de atención multicapa. Después de TabPFN, la atención se alterna entre columnas (características) y filas (ejemplos). Esta contextualización profunda captura las interacciones y dependencias de las características. Realiza trabajos que de otro modo necesitarían una elaboración manual de funciones. Compresión de filas: la información cruzada de cada fila se comprime en un único vector denso. Aprendizaje en contexto: un Transformer dedicado ejecuta estas incrustaciones comprimidas. Siguiendo a TabICL, atender filas comprimidas reduce drásticamente el costo de cálculo. La predicción sigue siendo eficiente incluso en conjuntos de datos mucho más grandes.
Capacitación sobre datos sintéticos a escala
Los modelos de cimentación necesitan datos vastos y diversos. Los conjuntos de datos tabulares de alta calidad son escasos en el espacio de código abierto. Las tablas industriales contienen esquemas propietarios e información confidencial. Esto los hace inaccesibles para una formación previa amplia.
Se pueden generar tablas sintéticas para que sean arbitrariamente grandes. El equipo de investigación de Google los considera efectivamente la única opción viable a esta escala. Entonces TabFM se entrena completamente con cientos de millones de conjuntos de datos sintéticos. Estos se generan dinámicamente utilizando modelos causales estructurales (SCM). Cada uno incorpora una amplia variedad de funciones aleatorias. El enfoque captura distribuciones y relaciones de características complejas que se encuentran en tablas reales. El equipo de investigación informa que el modelo se generaliza bien a datos invisibles del mundo real.
Rendimiento y evaluación comparativa
El equipo de investigación evaluó TabFM en TabArena. TabArena es un punto de referencia viviente que calcula las puntuaciones Elo a partir de las tasas de victorias cara a cara. La evaluación abarca 38 conjuntos de datos de clasificación y 13 conjuntos de datos de regresión. Los tamaños de muestra oscilan entre 700 y 150.000.
Se probaron dos configuraciones. Plain TabFM se ejecuta de inmediato en un solo pase hacia adelante. No necesita ajuste ni validación cruzada. TabFM-Ensemble agrega funciones cruzadas y funciones SVD (descomposición de valores singulares). Calcula pesos óptimos para un conjunto de 32 vías utilizando un solucionador de mínimos cuadrados no negativos. Para la clasificación, también agrega la escala de Platt como paso de calibración.
El equipo de investigación informa que TabFM supera consistentemente a los algoritmos supervisados estándar de la industria y altamente optimizados. Las métricas completas por pliegue y las tasas de ganancias cara a cara se encuentran en la página de GitHub.
Primeros pasos: instalación y código
La instalación clona el repositorio y lo instala localmente. La instalación básica utiliza JAX solo para CPU. Un cuda extra extrae el complemento CUDA 12 y las bibliotecas NVIDIA para ejecuciones de GPU.
Los requisitos básicos son específicos. Necesita Python 3.11 o posterior. Fija jax==0.10.1 y flax==0.12.7, utilizando la API moderna flax.nnx. Hugging Face Hub descarga los pesos previamente entrenados automáticamente.
Aquí fit() prepara codificadores ordinales y escaladores numéricos. No entrena pesos de modelo en sus datos. El regresor refleja este patrón con TabFMRegressor y reg.predict().
Casos de uso con ejemplos
La API se adapta directamente a tareas predictivas comunes. Para la rotación de clientes, el contexto mantiene a los clientes anteriores etiquetados como abandonados o retenidos. TabFM califica el riesgo de abandono de nuevos clientes de una sola vez.
Para el riesgo crediticio, las filas contienen características de edad, trabajo e ingresos. Las etiquetas marcan riesgo_bajo o riesgo_alto, como en el código de muestra. Los nuevos solicitantes reciben puntuación sin un ciclo de formación.
Para la regresión, la predicción del precio de la vivienda es una opción natural. Las filas de contexto contienen metros cuadrados y vecindario. TabFM devuelve un precio previsto para listados no vistos.
Explicador interactivo
"; }); wrap.innerHTML = html; wrap.querySelectorAll("input,select").forEach(function(el){ el.addEventListener("change", function(){ var k = el.getAttribute("data-tk"); state.test[k] = (el.type==="number") ? parseFloat(el.value): el.value; }); }); } // —- predictor ilustrativo: k-NN ponderado por distancia sobre filas de contexto —- rangos de función(){ var t = TASKS[state.task], r = {}; t.numeric.forEach(function(c){ var vals = state.rows.map(function(row){return row[c.key];}); var mn = Math.min.apply(null,vals), mx = Math.max.apply(null,vals); r[c.key] = (mx-mn) || 1; }); return r; var diff = (a[c.key]-b[c.key])/rg[c.key]; diff*diff; }); t.cat.forEach(function(c){ if(a[c.key]!==b[c.key]) d += 1; }); return Math.sqrt(d); } function predict(){ var t = TAREAS[state.task], rg = ranges(); return {fila:fila, dist:dist, w:1/(dist*dist+0.05)}; }).sort(function(a,b){return a.dist-b.dist;}); if(t.target.numeric){ var est = top.reduce(function(s,x){return s + xw*x.row[t.target.key];},0)/wsum; showRegression(est, top } else { var probs = {}; probs[x.row[t.target.key]] += xw; }); t.target.opts.forEach(function(o){ probs[o] = probs[o]/wsum; }); showClassification(probs, top); = TAREAS[state.task]; var parts = top.map(function(x){ var lab = t.target.numeric ? fmtMoney(x.row[t.target.key]): x.row[t.target.key]; return ""+lab+""; }); return "Filas de contexto más cercanas utilizadas: "+parts.join(" "); = TAREAS[estado.tarea]; var mejor = t.target.opts[0]; t.target.opts.forEach(function(o){ if(probs[o]>probs[best]) best=o; }); var isChurn = (mejor==="Sí"); var conf = (probs[mejor]*100).toFixed(1); var barras = ""; t.target.opts.forEach(function(o){ var pct = (probs[o]*100); var color = (o==="Sí") ? "var(–neg)" : "var(–pos)"; barras += "
"+ " "+ "
"; }); $("resultado").innerHTML = "
Predicción · probabilidades de clase
"+ "
Rotación: "+mejor+"
"+ "
Confianza "+conf+"% · decidido únicamente a partir de las filas de contexto anteriores.
"+ "
"+barras+"
"+ "
"+Línea vecina(arriba)+"
"+ "
En TabFM, esto se asigna a predict_proba(). No se actualizaron pesos: "+ "la respuesta se lee del contexto en un solo pase hacia adelante.
"; revelar(); } función showRegression(est, top){ $("resultado").innerHTML = "
Predicción · valor estimado
"+ "
"+fmtDinero(est)+"
"+ "
Estimado a partir de las filas de contexto más cercanas "+top.length+", ponderado por similitud.
"+ "
"+Línea vecina(arriba)+"
"+ "
En TabFM, esto se asigna a reg.predict(). No se ejecutó ningún entrenamiento por conjunto de datos: "+ "la estimación proviene del contexto en una pasada hacia adelante.
"; revelar(); } función revelar(){ var r = $("resultado"); r.className = "mostrar resultados"; setTimeout(function(){ r.querySelectorAll(".bar-fill").forEach(function(f){ f.style.width = f.getAttribute("data-pct")+"%"; }); },40); $("runNote").textContent = "Intente editar el contexto, luego predecir de nuevo."; postSize(); } // —- cableado —- $("tabs").addEventListener("click", function(e){ var b = e.target.closest(".tab"); if(!b) return; $("tabs").querySelectorAll(".tab").forEach(function(x){x.classList.remove("on");}); b.classList.add("on"); loadTask(b.getAttribute("data-task")); postSize(); $("addRow").addEventListener("click", function(){ var t = TAREAS[state.task]; var nr = clone(state.rows[state.rows.length-1] || t.rows[0]); estado.filas.push(nr); renderTable(); tamañopost(); }); $("resetRows").addEventListener("clic", function(){ state.rows = clone(TASKS[state.task].rows); renderTable(); postSize(); }); $("runBtn").addEventListener("hacer clic", predecir); // —- cambio de tamaño automático para la inserción de iframe de WordPress —- función postSize(){ var h = document.body.scrollHeight; if(ventana.parent){ ventana.parent.postMessage({tabfmHeight:h}, "*"); } } window.addEventListener("cargar", postSize); window.addEventListener("redimensionar", postSize); var ro = ventana.ResizeObserver? nuevo ResizeObserver (postSize): nulo; if(ro) ro.observe(documento.cuerpo); loadTask("abandono"); setTimeout(postSize, 60); })();