Visibilidad IA

¿Qué es la Validación Cruzada (Cross-Validation)? Tipos, métodos y ejemplos en Machine Learning

La Validación Cruzada (Cross-Validation) es una técnica de evaluación utilizada en Machine Learning para estimar cómo podría comportarse un modelo cuando recibe datos que no se utilizaron para entrenarlo.

Consiste en dividir los datos de desarrollo en diferentes particiones, entrenar el modelo varias veces y evaluar su rendimiento sobre observaciones reservadas durante cada iteración.

Este procedimiento permite estudiar si los resultados obtenidos dependen demasiado de una única división del conjunto de datos.

Por ejemplo, una empresa puede desarrollar un modelo de clasificación de solicitudes comerciales utilizando 5.000 mensajes de clientes.

Si divide los datos una sola vez, el rendimiento obtenido puede depender de qué mensajes quedaron en entrenamiento y cuáles en validación.

Una división diferente podría producir resultados distintos.

La validación cruzada permite repetir la evaluación utilizando varias particiones organizadas según una estrategia definida.

Entre sus métodos más conocidos se encuentran K-Fold Cross-Validation, Stratified K-Fold, Group K-Fold, Leave-One-Out y Nested Cross-Validation.

También existen procedimientos específicos para series temporales y datos con dependencias entre observaciones.

Sin embargo, no todas las estrategias son apropiadas para todos los problemas.

Una validación aleatoria puede resultar inadecuada cuando los datos tienen dependencia temporal, contienen registros relacionados o incluyen múltiples observaciones de una misma entidad.

En el ámbito de la Visibilidad en Inteligencia Artificial (AI Visibility), la validación cruzada puede utilizarse para evaluar clasificadores que identifican menciones, recomendaciones, comparaciones y otras características de respuestas generadas por asistentes de IA.

Por ejemplo, un clasificador entrenado con respuestas de determinadas marcas puede obtener un rendimiento elevado sobre ejemplos similares, pero presentar dificultades cuando se utiliza con empresas nuevas o versiones posteriores de asistentes.

La validación cruzada permite diseñar experimentos que estudien estas diferencias.

En este artículo explicamos qué es Cross-Validation, cómo funciona, cuáles son sus principales variantes, cómo evitar errores de evaluación y cómo implementarla mediante Python y scikit-learn.

¿Qué es la Validación Cruzada?

La Validación Cruzada es un procedimiento de remuestreo y evaluación que divide los datos disponibles en diferentes subconjuntos de entrenamiento y validación.

El modelo se ajusta varias veces, utilizando en cada iteración una parte de los datos para aprender y otra para evaluar.

El objetivo consiste en obtener información sobre el rendimiento del procedimiento de entrenamiento bajo una estrategia de partición determinada.

Definición breve: La Validación Cruzada (Cross-Validation) es una técnica que evalúa modelos de Machine Learning mediante múltiples divisiones de los datos en subconjuntos de entrenamiento y validación, permitiendo estimar el rendimiento y estudiar su variabilidad.

La técnica no garantiza por sí sola que el modelo funcione correctamente en producción.

Sus resultados dependen de la calidad de los datos y de la adecuación del procedimiento de partición.

¿Qué significa Cross-Validation?

Cross-Validation es el término inglés para Validación Cruzada.

También pueden encontrarse las siguientes expresiones:

  • K-Fold Cross-Validation.
  • Stratified Cross-Validation.
  • Group Cross-Validation.
  • Repeated Cross-Validation.
  • Leave-One-Out Cross-Validation.
  • Nested Cross-Validation.
  • Time Series Cross-Validation.
  • Model Validation.

En ocasiones se utiliza la abreviatura CV.

Por ejemplo:

5-Fold CV significa una validación cruzada con cinco particiones.

¿Por qué es importante la Validación Cruzada?

Una evaluación basada en una única división puede producir resultados sensibles a la selección de observaciones.

Supongamos que una empresa dispone de 1.000 ejemplos.

En una primera división obtiene:

Accuracy = 91 %.

En una segunda división:

Accuracy = 85 %.

En una tercera:

Accuracy = 89 %.

Estas diferencias pueden indicar que la composición de los conjuntos afecta al resultado.

La validación cruzada permite estudiar de forma más sistemática esa variabilidad.

Beneficios principales

  • Aprovecha diferentes particiones de los datos.
  • Reduce la dependencia de una única división.
  • Facilita la comparación de configuraciones.
  • Ayuda a identificar modelos inestables.
  • Permite seleccionar hiperparámetros.
  • Puede resultar útil con conjuntos relativamente pequeños.
  • Facilita evaluaciones reproducibles.
  • Permite incorporar restricciones por grupos o tiempo.

Sin embargo, las puntuaciones obtenidas en diferentes particiones no son necesariamente independientes.

Por tanto, su desviación estándar no debe interpretarse automáticamente como un intervalo de confianza formal.

¿Cómo funciona K-Fold Cross-Validation?

K-Fold Cross-Validation es una de las estrategias más utilizadas.

El conjunto de desarrollo se divide en K partes denominadas folds.

En cada iteración se reserva una parte para validación y se entrena utilizando las otras K − 1 partes.

Ejemplo con K = 5

Supongamos que tenemos 1.000 observaciones.

Dividimos los datos en cinco grupos de aproximadamente 200 registros.

IteraciónEntrenamientoValidación
1Folds 2, 3, 4 y 5Fold 1
2Folds 1, 3, 4 y 5Fold 2
3Folds 1, 2, 4 y 5Fold 3
4Folds 1, 2, 3 y 5Fold 4
5Folds 1, 2, 3 y 4Fold 5

El modelo se entrena cinco veces.

Cada observación participa una vez en validación y cuatro veces en entrenamiento, dentro de este procedimiento.

Al finalizar, se obtienen cinco puntuaciones.

¿Cómo calcular el rendimiento medio?

Supongamos que obtenemos los siguientes resultados F1:

FoldF1-score
10,86
20,89
30,87
40,91
50,88

La media aritmética es:

F1 medio = (0,86 + 0,89 + 0,87 + 0,91 + 0,88) / 5 = 0,882.

La puntuación media es:

0,882.

También podemos estudiar la dispersión de los resultados.

Sin embargo, el rendimiento promedio solamente representa la evaluación bajo esas particiones.

Si las observaciones pertenecen a otra distribución en producción, el resultado puede ser diferente.

¿Qué valor de K conviene utilizar?

Las opciones habituales incluyen:

  • K = 5.
  • K = 10.

Pero no existe un valor universal.

Con pocos folds

Cada entrenamiento utiliza una proporción menor de los datos.

El número de entrenamientos también es más reducido.

Con más folds

Cada entrenamiento utiliza una proporción mayor.

Sin embargo, aumenta el coste computacional.

Consideraciones importantes

La selección depende de:

  • Número de observaciones.
  • Distribución de clases.
  • Coste del entrenamiento.
  • Dependencias entre registros.
  • Objetivo del análisis.

Con datos muy escasos, un valor elevado de K puede resultar útil en algunos escenarios, pero también puede producir resultados inestables o aumentar considerablemente el procesamiento.

1. KFold en Python

Scikit-learn proporciona KFold.

import numpy as np
from sklearn.model_selection import KFold
X = np.arange(20).reshape(10, 2)
cv = KFold(
n_splits=5,
shuffle=True,
random_state=42
)
for fold, (train_idx, val_idx) in enumerate(
cv.split(X),
start=1
):
print(f"Fold {fold}")
print("Training:", train_idx)
print("Validation:", val_idx)

El procedimiento devuelve índices de entrenamiento y validación.

shuffle=True mezcla las observaciones antes de construir las particiones.

random_state=42 permite reproducir esa mezcla.

Precaución

El uso de mezcla aleatoria no debe aplicarse indiscriminadamente a series temporales.

Tampoco impide que registros relacionados aparezcan en diferentes conjuntos.

2. Stratified K-Fold

Stratified K-Fold es una variante utilizada en clasificación.

Intenta conservar aproximadamente las proporciones de clases en cada fold.

Ejemplo

Supongamos que tenemos:

  • 900 observaciones negativas.
  • 100 observaciones positivas.

La clase positiva representa el 10 %.

Si utilizamos cinco folds estratificados, cada uno intentará mantener una proporción similar.

Esto puede evitar que algunas particiones contengan muy pocos ejemplos de la clase minoritaria.

Ventajas

  • Facilita la evaluación de clases minoritarias.
  • Reduce ciertas diferencias accidentales de composición.
  • Es práctico en clasificación binaria y multiclase.

Limitaciones

No garantiza independencia entre registros.

Tampoco corrige por sí solo el desequilibrio de clases ni asegura representatividad respecto a otras características.

3. StratifiedKFold en Python

from sklearn.datasets import make_classification
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
X, y = make_classification(
n_samples=1000,
n_features=15,
n_informative=8,
weights=[0.90, 0.10],
random_state=42
)
cv = StratifiedKFold(
n_splits=5,
shuffle=True,
random_state=42
)
model = LogisticRegression(max_iter=1000)
scores = cross_val_score(
model,
X,
y,
cv=cv,
scoring="f1"
)
print("F1 por fold:", scores)
print("F1 medio:", scores.mean())

En este ejemplo se utiliza F1 porque existe una clase minoritaria.

Sin embargo, la elección de la métrica depende del coste de falsos positivos y falsos negativos.

4. Repeated K-Fold

Repeated K-Fold repite el procedimiento K-Fold utilizando diferentes particiones.

Por ejemplo:

5 folds × 3 repeticiones = 15 evaluaciones.

Esto permite estudiar el rendimiento bajo varias divisiones aleatorias.

Ventajas

Puede ayudar a comprender la sensibilidad de los resultados a la partición.

Limitaciones

Aumenta el coste de entrenamiento.

Además, las evaluaciones no son independientes entre sí, porque reutilizan observaciones.

Por tanto, deben interpretarse con cuidado las medidas de dispersión.

5. RepeatedStratifiedKFold

Esta variante combina repeticiones y estratificación.

Puede resultar práctica para problemas de clasificación.

from sklearn.model_selection import RepeatedStratifiedKFold
cv = RepeatedStratifiedKFold(
n_splits=5,
n_repeats=3,
random_state=42
)

Cada repetición reorganiza las particiones manteniendo aproximadamente las proporciones de las clases.

No debe utilizarse como sustituto de una evaluación por grupos o por tiempo cuando esas dependencias son relevantes.

6. Leave-One-Out Cross-Validation (LOOCV)

La Validación Cruzada Leave-One-Out utiliza una sola observación para validar en cada iteración.

Si tenemos 100 observaciones:

  • Se realizan 100 entrenamientos.
  • Cada entrenamiento utiliza 99 observaciones.
  • Una observación queda reservada.

Ventajas

Cada modelo utiliza prácticamente todos los registros disponibles.

Limitaciones

  • Puede resultar computacionalmente costoso.
  • Las puntuaciones individuales pueden ser muy variables.
  • No siempre produce mejores estimaciones que K-Fold.
  • No soluciona dependencias entre registros.

LOOCV puede ser útil en determinados conjuntos pequeños, pero no debe considerarse automáticamente superior.

7. LeaveOneOut en Python

from sklearn.model_selection import LeaveOneOut
import numpy as np
X = np.array([
[1],
[2],
[3],
[4],
[5]
])
cv = LeaveOneOut()
for train_idx, val_idx in cv.split(X):
print(
"Entrenamiento:", train_idx,
"Validación:", val_idx
)

En este ejemplo se realizan cinco particiones.

Cada observación se utiliza una vez para validación.

8. Leave-P-Out

Leave-P-Out reserva P observaciones en cada combinación posible.

Por ejemplo, si tenemos diez observaciones y P = 2, el procedimiento considera combinaciones de dos observaciones como conjunto reservado.

El número de combinaciones puede crecer rápidamente.

La cantidad de particiones es:

C(n, p) = n! / [p!(n − p)!].

Para n = 10 y p = 2:

C(10, 2) = 45.

Limitación

El coste puede volverse muy elevado.

Por eso este procedimiento se utiliza sobre todo cuando el tamaño del conjunto y el problema justifican la evaluación exhaustiva.

9. Group K-Fold

Group K-Fold se utiliza cuando existen observaciones relacionadas que deben mantenerse juntas.

Por ejemplo, una empresa recopila múltiples registros de un mismo cliente.

Si algunos registros del cliente aparecen en entrenamiento y otros en validación, el modelo podría aprovechar patrones propios de ese cliente.

Si el objetivo es generalizar a clientes nuevos, conviene separar por identificador de cliente.

Ejemplos de grupos

  • Cliente.
  • Empresa.
  • Paciente.
  • Máquina.
  • Documento original.
  • Producto.
  • Marca.
  • Familia de prompts.

GroupKFold mantiene los registros de un mismo grupo fuera del entrenamiento cuando ese grupo está en validación.

10. GroupKFold en Python

import numpy as np
from sklearn.model_selection import GroupKFold
X = np.arange(24).reshape(12, 2)
y = np.array([
0, 1, 0,
1, 0, 1,
0, 1, 0,
1, 0, 1
])
groups = np.array([
"ClienteA", "ClienteA", "ClienteA",
"ClienteB", "ClienteB", "ClienteB",
"ClienteC", "ClienteC", "ClienteC",
"ClienteD", "ClienteD", "ClienteD"
])
cv = GroupKFold(n_splits=4)
for train_idx, val_idx in cv.split(
X,
y,
groups
):
print("Grupos entrenamiento:")
print(set(groups[train_idx]))
print("Grupos validación:")
print(set(groups[val_idx]))

La validación utiliza grupos no incluidos en el entrenamiento de cada fold.

Precaución

Este procedimiento no garantiza que las clases queden perfectamente equilibradas.

Si los grupos contienen distribuciones muy diferentes, las métricas entre folds pueden variar considerablemente.

11. Stratified Group K-Fold

StratifiedGroupKFold intenta combinar:

  • Separación de grupos.
  • Conservación aproximada de proporciones de clases.

Puede resultar útil cuando se dispone de observaciones repetidas por entidad y existe desequilibrio de clases.

Sin embargo, ambos requisitos pueden entrar en conflicto.

Por ejemplo, si determinados grupos contienen principalmente una clase, puede resultar imposible mantener proporciones idénticas.

Por eso es necesario revisar las distribuciones obtenidas.

12. Leave-One-Group-Out

Leave-One-Group-Out reserva un grupo completo por iteración.

Ejemplo

Una empresa tiene registros procedentes de cinco fábricas.

Puede entrenar con cuatro fábricas y evaluar sobre la quinta.

Repite el procedimiento hasta evaluar cada fábrica.

Aplicaciones

Permite estudiar la generalización a entidades, ubicaciones o dominios diferentes.

En AI Visibility puede utilizarse para dejar fuera una marca o plataforma completa.

Limitación

Si los grupos difieren considerablemente, los resultados pueden presentar alta variabilidad.

Esto puede ser informativo, pero requiere una interpretación específica.

13. ShuffleSplit

ShuffleSplit genera particiones aleatorias repetidas de entrenamiento y validación.

A diferencia de K-Fold, no exige que cada observación aparezca exactamente una vez en validación.

Una observación puede aparecer en múltiples conjuntos de validación o no aparecer en alguno de ellos.

Ventajas

Permite controlar:

  • Número de divisiones.
  • Tamaño de entrenamiento.
  • Tamaño de validación.

Limitaciones

Las particiones pueden solaparse y las evaluaciones no son independientes.

No debe utilizarse de manera ordinaria cuando el tiempo o los grupos exigen una separación específica.

14. Time Series Cross-Validation

Las series temporales requieren un tratamiento especial.

En determinadas tareas, utilizar información futura durante entrenamiento produce una evaluación irreal.

Por ejemplo, un modelo que predice ventas de julio no debería utilizar registros de agosto para aprender patrones específicos de ese periodo.

Ejemplo conceptual

FoldEntrenamientoValidación
1Enero-marzoAbril
2Enero-abrilMayo
3Enero-mayoJunio
4Enero-junioJulio

La información de entrenamiento siempre precede a la validación.

Este procedimiento se conoce habitualmente como validación de origen progresivo.

15. TimeSeriesSplit en Python

import numpy as np
from sklearn.model_selection import TimeSeriesSplit
X = np.arange(30).reshape(-1, 1)
cv = TimeSeriesSplit(
n_splits=5,
test_size=4,
gap=2
)
for fold, (train_idx, val_idx) in enumerate(
cv.split(X),
start=1
):
print("Fold:", fold)
print("Entrenamiento:", train_idx)
print("Validación:", val_idx)

¿Qué significa gap?

El parámetro gap excluye determinadas muestras entre el final del conjunto de entrenamiento y el inicio de validación.

Puede resultar útil cuando existe dependencia temporal próxima al límite.

Sin embargo, un gap apropiado depende del horizonte predictivo y de la forma en que se construyen las características.

Precaución

TimeSeriesSplit funciona sobre el orden de las observaciones.

Para interpretar los resultados como periodos comparables, es importante considerar la frecuencia y regularidad temporal de los registros.

En series irregulares pueden ser necesarias particiones personalizadas basadas en fechas.

16. Expanding Window

La Expanding Window aumenta progresivamente la cantidad de datos históricos utilizados para entrenar.

Ejemplo

Primer entrenamiento:

Enero-marzo.

Segundo:

Enero-abril.

Tercero:

Enero-mayo.

Ventajas

Aprovecha progresivamente más información.

Limitaciones

Los datos antiguos pueden representar condiciones diferentes de las actuales.

En escenarios con cambios rápidos, utilizar toda la historia no siempre es la mejor estrategia.

17. Rolling Window

La Rolling Window utiliza una ventana de longitud limitada que avanza en el tiempo.

Ejemplo

Primer entrenamiento:

Enero-marzo.

Segundo:

Febrero-abril.

Tercero:

Marzo-mayo.

Ventajas

Puede resultar apropiada cuando la información reciente es más relevante.

Limitaciones

Descarta datos antiguos que podrían contener información útil.

La elección entre Rolling y Expanding Window debe evaluarse según la estabilidad de las relaciones predictivas.

18. Nested Cross-Validation

La Validación Cruzada Anidada (Nested Cross-Validation) utiliza dos niveles de evaluación.

Ciclo interno

Se utiliza para seleccionar hiperparámetros, características o configuraciones.

Ciclo externo

Se utiliza para evaluar el procedimiento completo de selección y entrenamiento.

¿Por qué es necesaria?

Supongamos que una empresa compara cien configuraciones y selecciona aquella que obtiene la mejor puntuación de validación cruzada.

La mejor puntuación puede estar influida parcialmente por la variabilidad de los datos y el proceso de búsqueda.

Utilizarla directamente como estimación final puede resultar optimista.

La validación anidada separa la selección interna de la evaluación externa.

Ejemplo conceptual de Nested Cross-Validation

Supongamos que utilizamos:

Ciclo externo: 5 folds.

Ciclo interno: 3 folds.

En cada partición externa:

  1. Se reserva una parte para evaluación.
  2. Se utilizan los datos restantes para selección.
  3. El ciclo interno compara configuraciones.
  4. Se elige una configuración.
  5. Se entrena el modelo correspondiente.
  6. Se evalúa sobre la partición externa.

El procedimiento se repite cinco veces.

Al final, las puntuaciones externas permiten estimar el rendimiento del proceso completo.

19. Nested Cross-Validation en Python

from sklearn.datasets import make_classification
from sklearn.model_selection import (
StratifiedKFold,
GridSearchCV,
cross_val_score
)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
X, y = make_classification(
n_samples=800,
n_features=15,
n_informative=8,
random_state=42
)
pipeline = Pipeline([
("scaler", StandardScaler()),
(
"classifier",
LogisticRegression(max_iter=1000)
)
])
param_grid = {
"classifier__C": [
0.01, 0.1, 1.0, 10.0
]
}
inner_cv = StratifiedKFold(
n_splits=3,
shuffle=True,
random_state=42
)
outer_cv = StratifiedKFold(
n_splits=5,
shuffle=True,
random_state=123
)
search = GridSearchCV(
pipeline,
param_grid,
scoring="f1",
cv=inner_cv
)
scores = cross_val_score(
search,
X,
y,
scoring="f1",
cv=outer_cv
)
print("F1 por fold externo:", scores)
print("F1 medio:", scores.mean())

¿Qué demuestra?

El modelo se ajusta repetidamente.

GridSearchCV selecciona configuraciones dentro de las particiones externas de entrenamiento.

La evaluación externa utiliza registros que no participaron en esa selección.

Limitación

La validación anidada requiere más entrenamientos.

Además, una evaluación final completamente independiente todavía puede resultar útil antes de producción, especialmente cuando el procedimiento ha sufrido numerosos cambios de diseño.

Comparación de Métodos de Cross-Validation

MétodoCaracterística principalUso habitual
K-FoldK particionesDatos independientes
Stratified K-FoldConserva proporciones de clasesClasificación
Repeated K-FoldRepite particionesEstabilidad
Leave-One-OutUna observación por evaluaciónAlgunos conjuntos pequeños
Leave-P-OutCombinaciones de P observacionesEvaluaciones pequeñas y exhaustivas
Group K-FoldSepara entidades relacionadasClientes, pacientes, marcas
Stratified Group K-FoldGrupos y proporciones de clasesClasificación agrupada
Leave-One-Group-OutReserva cada grupo completoGeneralización a grupos nuevos
ShuffleSplitDivisiones aleatorias repetidasAnálisis de sensibilidad
TimeSeriesSplitRespeta orden temporalPredicción temporal
Nested CVSelección interna y evaluación externaEvaluación de búsqueda de modelos

¿Qué método de Cross-Validation es mejor?

La respuesta depende del objetivo.

Datos tabulares independientes

K-Fold o Stratified K-Fold pueden ser apropiados.

Clases desbalanceadas

Stratified K-Fold suele resultar útil.

Varias observaciones por entidad

Group K-Fold puede ser más adecuado.

Series temporales

Conviene utilizar validación temporal.

Comparación intensiva de hiperparámetros

Nested Cross-Validation puede aportar una evaluación más rigurosa del procedimiento de selección.

Conjuntos muy pequeños

Leave-One-Out puede considerarse, aunque su coste y variabilidad deben evaluarse.

La regla principal es que la estrategia de partición debe representar el tipo de datos nuevos para el que se quiere conocer el rendimiento.

¿Qué relación existe entre Cross-Validation y Train/Test Split?

La división Train/Test y la validación cruzada son procedimientos complementarios.

Una arquitectura frecuente es:

Dataset original → Training/Development + Test.

Dentro del conjunto de desarrollo se aplica Cross-Validation.

Finalmente se evalúa el modelo seleccionado sobre el Test Set reservado.

Ejemplo

Una empresa dispone de 10.000 registros.

Reserva 2.000 para prueba.

Utiliza los 8.000 restantes para validación cruzada y selección.

Después evalúa sobre los 2.000 registros reservados.

Esto permite separar las decisiones de desarrollo de la evaluación final.

¿Qué relación existe entre Cross-Validation y Hyperparameter Tuning?

La selección de hiperparámetros utiliza métricas de validación para comparar configuraciones.

Por ejemplo:

  • Número de árboles.
  • Profundidad máxima.
  • Intensidad de regularización.
  • Tasa de aprendizaje.
  • Número de vecinos.

Herramientas como GridSearchCV y RandomizedSearchCV automatizan estas comparaciones.

Sin embargo, si se utilizan repetidamente los mismos resultados para tomar muchas decisiones, existe riesgo de sobreajuste al procedimiento de validación.

Nested Cross-Validation y conjuntos de prueba independientes ayudan a estudiar ese riesgo.

¿Qué es cross_val_score?

cross_val_score es una función de scikit-learn que calcula una puntuación de evaluación por partición.

Por ejemplo:

from sklearn.model_selection import cross_val_score
scores = cross_val_score(
model,
X,
y,
cv=5,
scoring="accuracy"
)

El resultado contiene cinco puntuaciones.

Si se utiliza cv=5 con un clasificador y etiquetas binarias o multiclase, scikit-learn suele utilizar StratifiedKFold como estrategia predeterminada, sin mezcla aleatoria.

Para controlar explícitamente el procedimiento es recomendable proporcionar un objeto de validación.

¿Qué es cross_validate?

cross_validate permite evaluar múltiples métricas y registrar tiempos de procesamiento.

Por ejemplo:

from sklearn.model_selection import cross_validate
resultados = cross_validate(
model,
X,
y,
cv=5,
scoring=[
"accuracy",
"precision",
"recall",
"f1"
],
return_train_score=True
)
print(resultados.keys())

Puede resultar útil cuando una única métrica no describe suficientemente la calidad del modelo.

Por ejemplo, en detección de recomendaciones es importante estudiar tanto falsos positivos como falsos negativos.

¿Qué métricas deben utilizarse?

Depende de la tarea.

Clasificación

  • Accuracy.
  • Precision.
  • Recall.
  • F1-score.
  • ROC-AUC.
  • PR-AUC.

Regresión

  • Mean Absolute Error.
  • Mean Squared Error.
  • Root Mean Squared Error.
  • R².

Clasificación multiclase

Puede ser útil estudiar:

  • Macro-F1.
  • Weighted-F1.
  • Precision por clase.
  • Recall por clase.
  • Matriz de confusión.

La selección debe considerar las consecuencias de los errores.

Por ejemplo, para una plataforma de AI Visibility puede resultar especialmente importante evitar que valoraciones negativas sean clasificadas como recomendaciones positivas.

¿Qué significa la Variabilidad entre Folds?

Los resultados pueden diferir entre particiones.

Por ejemplo:

F1 = [0,82; 0,90; 0,84; 0,88; 0,86].

La variabilidad puede reflejar diferencias de composición entre subconjuntos.

Sin embargo, no debe interpretarse automáticamente como una medida formal de incertidumbre poblacional.

Las particiones suelen compartir muchos registros de entrenamiento.

Por ello, sus puntuaciones están relacionadas.

Además, una desviación baja no demuestra que el modelo funcione sobre distribuciones futuras diferentes.

¿Qué relación existe entre Cross-Validation y Overfitting?

La validación cruzada puede ayudar a detectar determinados problemas de generalización.

Por ejemplo, un modelo puede obtener:

Accuracy de entrenamiento: 99 %.

Accuracy media de validación: 78 %.

La diferencia puede indicar sobreajuste.

Sin embargo, también deben investigarse otros factores:

  • Cambios de distribución.
  • Errores de etiquetas.
  • Selección incorrecta de métricas.
  • Preprocesamiento inconsistente.
  • Particiones no representativas.

La validación cruzada es una herramienta de evaluación, no una solución automática al sobreajuste.

¿Qué es Data Leakage en Cross-Validation?

El Data Leakage aparece cuando información reservada para evaluación influye indebidamente en el entrenamiento o selección.

Ejemplo

Una empresa utiliza SelectKBest para seleccionar variables sobre todos los registros.

Después aplica K-Fold.

El selector ya ha utilizado las etiquetas de las observaciones que posteriormente pertenecerán a los folds de validación.

Esto puede producir puntuaciones demasiado optimistas.

Solución

Incluir Feature Selection dentro de un Pipeline que se ajuste por separado en cada fold.

El mismo principio se aplica a:

  • Imputación.
  • Escalado.
  • Codificación supervisada.
  • Extracción TF-IDF.
  • Determinados procedimientos de generación de características.

Cross-Validation con Pipeline

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipeline = Pipeline([
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler()),
("classifier", LogisticRegression(max_iter=1000))
])

Este Pipeline puede utilizarse dentro de Cross-Validation.

En cada partición, se ajustan los transformadores utilizando únicamente el subconjunto de entrenamiento correspondiente.

Esto evita determinadas formas de fuga de información.

Sin embargo, el Pipeline no corrige automáticamente una partición incorrecta por tiempo o por grupos.

Cross-Validation y Data Augmentation

Cuando se utiliza aumento de datos, conviene separar primero las observaciones originales.

Incorrecto

Datos → Aumento → K-Fold.

Variaciones del mismo ejemplo pueden aparecer en entrenamiento y validación.

Correcto

Datos originales → Folds → Aumento exclusivo del entrenamiento de cada fold.

En algunos casos conviene mantener todas las variantes de un mismo original dentro del mismo grupo.

Esto ayuda a evitar evaluaciones artificialmente optimistas.

Cross-Validation y Datos Sintéticos

Los generadores de datos sintéticos también pueden introducir fuga de información.

Si un generador se entrena utilizando todo el dataset antes de crear las particiones, puede incorporar propiedades de observaciones que después se utilizarán para validación.

Procedimiento apropiado

  1. Crear las particiones.
  2. Entrenar el generador utilizando únicamente el entrenamiento del fold.
  3. Generar datos sintéticos.
  4. Entrenar el modelo predictivo.
  5. Evaluar sobre datos reservados.

Este procedimiento puede requerir una implementación personalizada.

El principio fundamental es que cualquier operación que aprende propiedades de los datos debe respetar la frontera de evaluación.

¿Qué relación existe entre Cross-Validation y Deep Learning?

La validación cruzada también puede utilizarse en redes neuronales.

Sin embargo, cada entrenamiento puede ser costoso.

Por ejemplo, entrenar una red profunda cinco veces puede requerir recursos considerables.

En determinados proyectos se utiliza un conjunto de validación fijo y una prueba independiente.

En otros, especialmente cuando existen pocos datos, Cross-Validation puede resultar útil.

La decisión depende del presupuesto computacional y de las necesidades de evaluación.

¿Qué relación existe entre Cross-Validation y los LLM?

Los modelos de lenguaje pueden utilizarse en tareas como:

  • Clasificación de texto.
  • Extracción de entidades.
  • Análisis de sentimiento.
  • Evaluación de respuestas.
  • Clasificación de recomendaciones.

Cuando se desarrolla o ajusta un clasificador a partir de ejemplos etiquetados, la validación cruzada puede ayudar a evaluar su rendimiento.

Sin embargo, si se utilizan LLM externos como clasificadores mediante prompts, pueden existir factores adicionales:

  • Cambios de versiones.
  • Variabilidad de respuestas.
  • Configuración de inferencia.
  • Dependencia del prompt.
  • Contaminación de benchmarks.
  • Memorización de ejemplos.

La validación cruzada debe diseñarse de acuerdo con el procedimiento realmente utilizado.

¿Por qué es importante Cross-Validation para AI Visibility?

Una plataforma de AI Visibility puede procesar respuestas generadas por diferentes asistentes.

Su objetivo puede ser clasificar:

  • Menciones neutrales.
  • Recomendaciones explícitas.
  • Recomendaciones condicionales.
  • Comparaciones.
  • Valoraciones negativas.
  • Afirmaciones sobre productos.
  • Referencias a fuentes.

Un modelo puede aprender patrones lingüísticos a partir de respuestas etiquetadas.

Pero es necesario comprobar si esos patrones funcionan en condiciones distintas.

Cross-Validation permite organizar varias estrategias de evaluación.

Ejemplo: K-Fold para Clasificación de Recomendaciones

Supongamos que una plataforma dispone de 5.000 respuestas verificadas.

Las clases son:

  • 2.500 menciones neutrales.
  • 1.200 recomendaciones explícitas.
  • 700 recomendaciones condicionales.
  • 400 comparaciones.
  • 200 valoraciones negativas.

Podemos utilizar Stratified K-Fold para intentar conservar las proporciones de clases.

Después calculamos Macro-F1.

Esta métrica asigna el mismo peso a cada clase al promediar sus F1 individuales.

Puede resultar útil cuando interesa evaluar adecuadamente categorías minoritarias.

Sin embargo, también conviene revisar las métricas por clase y los errores concretos.

Ejemplo: Group K-Fold por Marca

Una plataforma monitoriza 100 marcas.

Dispone de varias respuestas por marca.

Si quiere saber si el clasificador funciona sobre marcas no observadas, puede utilizar Group K-Fold con identificadores de marca.

Ejemplo

Fold 1:

Entrenamiento con 80 marcas.

Validación con 20 marcas.

Fold 2:

Se reserva otro conjunto de marcas.

El procedimiento se repite.

¿Qué permite estudiar?

La generalización a entidades diferentes.

Limitación

Si algunas marcas contienen muchas más respuestas que otras, los folds pueden presentar tamaños y distribuciones diferentes.

Es necesario revisar su composición.

Ejemplo: Leave-One-Platform-Out

Una plataforma de AI Visibility puede recopilar respuestas de cuatro asistentes.

Por ejemplo:

  • ChatGPT.
  • Gemini.
  • Claude.
  • Perplexity.

Podemos evaluar un clasificador reservando una plataforma completa en cada iteración.

Iteración 1

Entrenamiento:

Gemini, Claude y Perplexity.

Validación:

ChatGPT.

Iteración 2

Entrenamiento:

ChatGPT, Claude y Perplexity.

Validación:

Gemini.

Y así sucesivamente.

Interpretación

El procedimiento estudia cómo funciona el clasificador cuando cambia el origen de las respuestas.

Sin embargo, cuatro plataformas proporcionan únicamente cuatro grupos.

Los resultados pueden estar influidos por diferencias importantes de composición, categorías y estilos.

Por eso conviene interpretarlos como una evaluación específica de transferencia entre plataformas.

Ejemplo: Validación por Familia de Prompts

Las respuestas pueden estar relacionadas con consultas similares.

Por ejemplo:

Familia A: facilidad de uso.

Familia B: precios.

Familia C: integraciones.

Familia D: automatización.

Familia E: soporte técnico.

Una estrategia Group K-Fold puede mantener juntas las respuestas pertenecientes a una familia.

Esto permite estudiar la generalización a tipos de consultas no utilizados durante entrenamiento.

Sin embargo, la definición de familias debe ser coherente.

Dos prompts semánticamente muy parecidos pueden pertenecer a una misma familia aunque utilicen palabras diferentes.

Ejemplo: Validación Temporal de AI Visibility

Las respuestas generadas por asistentes pueden cambiar con el tiempo.

Por ello, conviene evaluar la estabilidad de los clasificadores.

Ejemplo

Entrenamiento:

Enero-junio.

Validación:

Julio.

Segundo entrenamiento:

Enero-julio.

Validación:

Agosto.

Tercer entrenamiento:

Enero-agosto.

Validación:

Septiembre.

Este procedimiento permite estudiar el rendimiento sobre respuestas posteriores.

Es especialmente importante conservar información sobre:

  • Fecha de ejecución.
  • Plataforma.
  • Modelo.
  • Versión de clasificación.
  • Definición de etiquetas.
  • Familia de prompts.

Los cambios metodológicos deben documentarse para evitar comparaciones engañosas.

¿Qué es un Benchmark de AI Visibility?

Un benchmark es un conjunto o procedimiento de referencia utilizado para evaluar sistemas bajo condiciones definidas.

En AI Visibility puede contener respuestas etiquetadas manualmente.

Por ejemplo:

  • Menciones neutrales.
  • Recomendaciones explícitas.
  • Recomendaciones condicionales.
  • Valoraciones negativas.
  • Comparaciones ambiguas.

El benchmark debe incluir ejemplos representativos y casos difíciles.

¿Qué aporta Cross-Validation?

Permite estudiar la variabilidad del rendimiento dentro del conjunto de desarrollo.

¿Qué aporta una prueba independiente?

Permite evaluar el procedimiento final sin utilizar esos registros para elegir configuraciones.

Ambas prácticas son complementarias.

Cross-Validation para Comparar Clasificadores

Una plataforma puede comparar:

  • Regresión logística con TF-IDF.
  • SVM con TF-IDF.
  • Random Forest con características estructuradas.
  • Clasificador basado en embeddings.
  • Modelo Transformer ajustado.

Para realizar una comparación apropiada conviene utilizar:

  • Las mismas particiones.
  • Etiquetas verificadas.
  • Métricas definidas previamente.
  • Preprocesamiento sin fuga.
  • Presupuestos y procedimientos comparables.

Una puntuación superior en Cross-Validation no garantiza automáticamente que una arquitectura sea mejor en producción.

También deben considerarse costes, latencia, estabilidad y mantenimiento.

¿Cómo evaluar un Clasificador de AI Visibility con Python?

El siguiente ejemplo genera un dataset sintético y evalúa un clasificador con varias métricas.

No pretende representar resultados reales de asistentes.

from sklearn.datasets import make_classification
from sklearn.model_selection import (
StratifiedKFold,
cross_validate
)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
X, y = make_classification(
n_samples=1200,
n_features=20,
n_informative=10,
n_redundant=5,
weights=[0.75, 0.25],
random_state=42
)
pipeline = Pipeline([
("scaler", StandardScaler()),
(
"classifier",
LogisticRegression(max_iter=1000)
)
])
cv = StratifiedKFold(
n_splits=5,
shuffle=True,
random_state=42
)
resultados = cross_validate(
pipeline,
X,
y,
cv=cv,
scoring={
"precision": "precision",
"recall": "recall",
"f1": "f1",
"accuracy": "accuracy"
},
return_train_score=True
)
for metrica in [
"precision",
"recall",
"f1",
"accuracy"
]:
scores = resultados[f"test_{metrica}"]
print(
metrica,
"media:",
round(scores.mean(), 3),
"desviación:",
round(scores.std(), 3)
)

¿Qué demuestra?

El código evalúa varias métricas sobre cinco particiones.

También permite comparar resultados de entrenamiento y validación.

La separación del preprocesamiento se gestiona mediante Pipeline.

Limitación

Los datos son artificiales.

No contiene respuestas reales, marcas ni etiquetas de recomendación.

Para evaluar una plataforma de AI Visibility, debe sustituirse el dataset por observaciones verificadas y seleccionarse una estrategia de partición que refleje el escenario de generalización.

¿Cómo interpretar un Resultado de Cross-Validation?

Supongamos que un clasificador produce:

Macro-F1 medio: 0,87.

Desviación entre folds: 0,03.

Estos valores son ilustrativos.

La interpretación correcta sería:

«El procedimiento obtuvo un Macro-F1 promedio de 0,87 en las particiones definidas, con una desviación descriptiva de 0,03 entre puntuaciones».

No sería correcto afirmar automáticamente:

«El modelo clasificará correctamente el 87 % de todas las respuestas futuras».

Macro-F1 no equivale a accuracy.

Además, las respuestas futuras pueden pertenecer a condiciones distintas.

¿Qué ocurre cuando los Folds tienen diferente tamaño?

Algunas estrategias producen particiones de validación de tamaños diferentes.

Esto puede ocurrir especialmente con grupos.

Promediar directamente las métricas por fold asigna el mismo peso a cada partición.

Calcular una métrica global a partir de todas las predicciones reservadas puede producir otro resultado.

Ejemplo

Una partición contiene 100 observaciones.

Otra contiene 1.000.

La media simple de sus F1-scores otorga el mismo peso a ambos folds.

Sin embargo, una métrica calculada sobre todas las predicciones individuales puede reflejar una ponderación diferente.

Ninguno de estos enfoques es universalmente superior.

La elección depende de si se desea dar el mismo peso a cada grupo, periodo u observación.

¿Qué es cross_val_predict?

cross_val_predict produce predicciones para observaciones utilizando modelos entrenados sin esas observaciones en cada partición apropiada.

Puede resultar útil para:

  • Inspeccionar errores.
  • Generar predicciones fuera de fold.
  • Analizar matrices de confusión.
  • Estudiar determinadas características de clasificación.

Sin embargo, no debe utilizarse indiscriminadamente como sustituto de cross_val_score.

Calcular una métrica global sobre predicciones fuera de fold puede no producir el mismo resultado que promediar las métricas de los folds.

Además, determinadas métricas no son directamente descomponibles por observación.

Cross-Validation y Selección de Umbral

Un clasificador puede producir probabilidades o puntuaciones.

Posteriormente, se define un umbral para asignar una clase.

Por ejemplo:

Probabilidad ≥ 0,50 → positivo.

Sin embargo, 0,50 no siempre es el umbral más apropiado.

Una aplicación puede necesitar priorizar precision o recall.

La selección del umbral debe realizarse utilizando datos de entrenamiento y validación apropiados, no ajustándose reiteradamente sobre la prueba final.

En AI Visibility, el umbral puede influir en cuántas respuestas se clasifican como recomendaciones.

Por ello, debe documentarse y evaluarse por separado.

Cross-Validation y Calibración de Probabilidades

Algunos modelos producen probabilidades que no están bien calibradas.

Por ejemplo, entre los registros que reciben una probabilidad estimada de 80 %, la frecuencia real del resultado podría ser diferente.

La calibración intenta mejorar la correspondencia entre probabilidades predichas y frecuencias observadas.

Puede utilizar procedimientos basados en validación cruzada.

Sin embargo, la evaluación de calibración también debe respetar la separación de datos.

Las probabilidades calibradas no garantizan exactitud perfecta ni estabilidad fuera de distribución.

Errores frecuentes en Cross-Validation

Error 1. Utilizar K-Fold aleatorio en series temporales

Puede introducir información futura.

Error 2. Ignorar grupos relacionados

Puede producir evaluaciones demasiado optimistas.

Error 3. Ajustar preprocesamiento antes de crear folds

Puede contaminar la validación.

Error 4. Aplicar Data Augmentation antes de dividir

Puede distribuir variantes relacionadas entre entrenamiento y validación.

Error 5. Seleccionar características utilizando todo el dataset

Puede introducir información de etiquetas reservadas.

Error 6. Utilizar una única métrica

Puede ocultar errores importantes.

Error 7. Interpretar la desviación entre folds como intervalo de confianza formal

Puede producir conclusiones estadísticas incorrectas.

Error 8. Probar demasiadas configuraciones sin evaluación independiente

Puede sobreajustar el proceso de selección.

Error 9. Comparar modelos con particiones diferentes sin control

Puede dificultar una comparación justa.

Error 10. Ignorar cambios de distribución

Puede producir una estimación poco representativa del uso futuro.

Buenas prácticas de Validación Cruzada

Para desarrollar una evaluación fiable conviene:

  1. Definir el objetivo predictivo.
  2. Identificar la unidad independiente de observación.
  3. Seleccionar una estrategia compatible con los datos.
  4. Reservar una prueba final cuando corresponda.
  5. Utilizar pipelines para preprocesamiento.
  6. Mantener grupos relacionados juntos.
  7. Respetar la temporalidad.
  8. Elegir métricas relevantes.
  9. Documentar semillas aleatorias y particiones.
  10. Comparar modelos sobre condiciones equivalentes.
  11. Evaluar errores por clase y segmento.
  12. Mantener una interpretación estadística prudente.

En AI Visibility también es conveniente evaluar por marca, plataforma, familia de prompts y periodo.

Preguntas frecuentes sobre Validación Cruzada

¿Qué significa Cross-Validation?

Significa Validación Cruzada y es una técnica para evaluar modelos mediante múltiples particiones de datos.

¿Para qué sirve la validación cruzada?

Permite estudiar el rendimiento de modelos sobre diferentes subconjuntos reservados y reducir la dependencia de una única división.

¿Qué es K-Fold?

Es un procedimiento que divide los datos en K partes y utiliza cada una como validación una vez.

¿Qué significa 5-Fold Cross-Validation?

Significa que se realizan cinco ciclos de entrenamiento y validación, reservando una partición diferente cada vez.

¿Qué es Stratified K-Fold?

Es una variante de K-Fold que intenta conservar las proporciones de clases.

¿Qué es Repeated K-Fold?

Es una estrategia que repite K-Fold con diferentes particiones.

¿Qué es Leave-One-Out?

Es un método que reserva una observación para evaluación en cada iteración.

¿Qué es Leave-P-Out?

Es un procedimiento que utiliza combinaciones de P observaciones como conjuntos reservados.

¿Qué es Group K-Fold?

Es una técnica que mantiene las observaciones del mismo grupo juntas dentro de cada partición.

¿Qué es StratifiedGroupKFold?

Es un procedimiento que combina separación de grupos y conservación aproximada de proporciones de clases.

¿Qué es Leave-One-Group-Out?

Es una estrategia que reserva un grupo completo en cada iteración.

¿Qué es ShuffleSplit?

Es un generador de divisiones aleatorias repetidas de entrenamiento y validación.

¿Qué es TimeSeriesSplit?

Es una estrategia de validación para datos ordenados temporalmente.

¿Qué es Expanding Window?

Es una estrategia donde el entrenamiento incorpora progresivamente más datos históricos.

¿Qué es Rolling Window?

Es una estrategia donde una ventana de entrenamiento de longitud limitada avanza en el tiempo.

¿Qué es Nested Cross-Validation?

Es una validación cruzada con un ciclo interno de selección y otro externo de evaluación.

¿Qué es cross_val_score?

Es una función de scikit-learn que devuelve puntuaciones por partición.

¿Qué es cross_validate?

Es una función que puede evaluar múltiples métricas y registrar tiempos de procesamiento.

¿Qué es cross_val_predict?

Es una función que produce predicciones fuera de fold para inspección y determinados análisis.

¿Qué valor de K conviene utilizar?

Depende del tamaño, las clases, la dependencia entre observaciones y el coste de entrenamiento.

¿La validación cruzada elimina el overfitting?

No. Puede ayudar a detectarlo y comparar configuraciones, pero no lo elimina automáticamente.

¿Es necesario conservar un Test Set independiente?

Suele ser recomendable cuando se realiza selección de modelos y se necesita una evaluación final no utilizada durante el desarrollo.

¿Qué es Data Leakage en Cross-Validation?

Es la utilización indebida de información reservada, como estadísticas o etiquetas de los folds de validación, durante entrenamiento.

¿Se puede utilizar Cross-Validation con Python?

Sí. Scikit-learn proporciona diferentes divisores y herramientas de evaluación.

¿Qué método conviene para datos temporales?

Una estrategia temporal que respete el orden y el horizonte de predicción.

¿Qué método conviene para múltiples registros del mismo cliente?

Una estrategia basada en grupos puede ser apropiada cuando se quiere evaluar generalización a clientes nuevos.

¿Por qué utilizar Group K-Fold por marca en AI Visibility?

Permite estudiar si el modelo generaliza a marcas no observadas durante entrenamiento.

¿Por qué realizar validación por plataforma?

Permite evaluar si el clasificador conserva su rendimiento al cambiar el asistente de origen.

¿Cross-Validation garantiza rendimiento futuro?

No. La estimación depende de la representatividad de los datos y de la estrategia de partición.

Conceptos relacionados

  • Inteligencia Artificial (IA): desarrollo de sistemas inteligentes.
  • Aprendizaje Automático (Machine Learning): aprendizaje de patrones a partir de datos.
  • Aprendizaje Supervisado: entrenamiento con etiquetas.
  • Clasificación: predicción de categorías.
  • Regresión: predicción de valores numéricos.
  • Clustering: agrupamiento de observaciones.
  • Ingeniería de Características: creación y transformación de variables.
  • Selección de Características: elección de características relevantes.
  • Extracción de Características: construcción de representaciones.
  • Estandarización de Datos: escalado mediante media y desviación estándar.
  • Tratamiento de Valores Faltantes: gestión de datos incompletos.
  • Aumento de Datos: generación de variaciones de entrenamiento.
  • Datos Sintéticos: observaciones generadas artificialmente.
  • Training Set: datos utilizados para entrenamiento.
  • Validation Set: datos utilizados para selección.
  • Test Set: datos reservados para evaluación final.
  • Overfitting: sobreajuste.
  • Data Leakage: fuga de información.
  • Hyperparameter Tuning: selección de configuraciones.
  • Nested Cross-Validation: evaluación anidada.
  • Visibilidad en Inteligencia Artificial: análisis de menciones y recomendaciones de marcas en respuestas de IA.

Conclusión

La Validación Cruzada (Cross-Validation) es una herramienta fundamental para evaluar modelos de inteligencia artificial de manera más rigurosa.

Permite entrenar y validar modelos sobre diferentes particiones de los datos, proporcionando información sobre rendimiento y variabilidad.

Entre sus métodos más utilizados se encuentran K-Fold, Stratified K-Fold, Repeated K-Fold, Group K-Fold, Leave-One-Out y TimeSeriesSplit.

Nested Cross-Validation añade una separación entre selección de configuraciones y evaluación del procedimiento completo.

Sin embargo, la validación cruzada no garantiza automáticamente resultados fiables.

La estrategia debe adaptarse a la estructura de los datos y al escenario de generalización.

En particular, es necesario respetar las dependencias temporales, mantener separadas las entidades relacionadas y evitar fugas de información durante el preprocesamiento.

En plataformas de AI Visibility, esta metodología permite evaluar clasificadores de recomendaciones y menciones utilizando diferentes marcas, plataformas, periodos y familias de consultas.

Esto ayuda a comprender mejor hasta qué punto los modelos pueden funcionar sobre respuestas nuevas.

La conclusión fundamental es que Cross-Validation permite evaluar el rendimiento de modelos de Machine Learning utilizando múltiples particiones, pero la fiabilidad de sus resultados depende de elegir una estrategia adecuada, prevenir Data Leakage y mantener una evaluación independiente del proceso de selección.

Solicitar Análisis Gratuito
Solicitar Análisis Gratuito

Visibilidad IA

Contact

Menu

(c) 2025-2026  Todos los derechos reservados | Designed by Benelux-IT