Validación cruzada KFold en Python

Resumen

La validación cruzada en Python te permite comprobar qué tan preciso es tu modelo de machine learning antes de confiar en sus predicciones. Aquí aprenderás a automatizarla paso a paso usando scikit-learn, KFold y un dataset real de cáncer de pecho descargado desde Kaggle, ideal para quienes ya entienden la teoría y quieren llevarla al código.

¿Qué librerías necesitas para hacer validación cruzada?

Antes de tocar el modelo, prepara el entorno con las herramientas que vas a usar a lo largo del flujo.

En un notebook de Colab, importa lo básico para manipular datos y cargar archivos desde tu equipo local [0:30]:

  • pandas as pd para manejar la tabla de datos.
  • numpy as np para operaciones numéricas.
  • io para leer archivos cargados desde el escritorio.
  • from google.colab import files para subir el CSV.

El dataset del ejercicio se llama cancerdata.csv y proviene de Kaggle, una plataforma donde científicos de datos compiten con bases de datos públicas o corporativas, a veces con premios económicos de por medio [1:10].

¿Qué es Kaggle? Es una plataforma de competencias de ciencia de datos donde puedes practicar con datasets reales, públicos o compartidos por empresas, y a veces ganar premios.

¿Cómo separar variables numéricas y categóricas?

Una vez cargado el archivo con pd.read_csv y io.BytesIO, revisa los primeros registros con .head() para entender la estructura [2:30].

La tabla incluye un ID, una columna diagnosis con valores M (maligno) o B (benigno), y variables numéricas como radio promedio, textura, perímetro, área, smoothness, compacidad y concavidad. Casi todo es numérico, salvo la clasificación final.

La división se hace por posición de columnas:

  • X = df.iloc[:, 2:] agrupa todas las variables cuantitativas desde la tercera columna en adelante.
  • y = df.iloc[:, 1] aísla la variable categórica diagnosis, que es la que queremos predecir.

Al correr y.value_counts() aparecen 357 casos benignos y 202 malignos [3:50]. Esa proporción importa, porque si solo tuvieras una clase, el modelo no tendría con qué aprender a clasificar.

¿Cómo entrenar un árbol de decisión antes de validar?

Con las variables listas, toca dividir los datos y entrenar un primer modelo base.

Desde sklearn.tree importa DecisionTreeClassifier y desde sklearn.model_selection importa train_test_split. Esa función parte el dataset en dos bloques: uno para entrenar y otro que se mantiene intacto para evaluar [4:40].

La división típica queda así:

  1. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=4).
  2. Instancias el modelo: modelo = DecisionTreeClassifier().
  3. Ajustas con modelo.fit(X_train, y_train).
  4. Mides con modelo.score(X_test, y_test).

El resultado del score fue de 88.88% de precisión [6:00]. Es un número alto, cercano al 100%, pero viene de una sola partición aleatoria. Y ahí es donde la validación cruzada cambia el juego.

¿Qué hace train_test_split? Divide tu dataset en dos partes: una para entrenar el modelo y otra para probarlo. El parámetro test_size=0.30 reserva el 30% para evaluación.

¿Cómo aplicar KFold para validar el modelo?

KFold es uno de los métodos de validación cruzada más usados porque reparte los datos en k particiones y entrena el modelo varias veces, rotando cuál bloque sirve de prueba.

Desde sklearn.model_selection importa KFold. Luego define el número de particiones, que por convención suele ser 10 folds [7:20]:

  • modelo = DecisionTreeClassifier().
  • kfold_validacion = KFold(n_splits=10).

Esto solo prepara el esquema de partición. No devuelve resultados todavía, porque falta aplicarlo sobre el modelo.

¿Qué hace cross_val_score con tus 10 folds?

Ahora importa cross_val_score desde sklearn.model_selection y úsalo para correr el modelo sobre las 10 particiones a la vez:

resultados = cross_val_score(modelo, X, y, cv=kfold_validacion).

Al imprimir resultados aparecen las precisiones individuales de cada fold, con valores de 91%, 94% e incluso 98% [8:40]. Cuando calculas resultados.mean(), el promedio queda en 94%.

Ese promedio es la verdadera medida de confianza: en lugar de depender de una sola partición afortunada, estás evaluando el modelo en 10 escenarios distintos y sacando una métrica estable.

¿Por qué el promedio importa más que un solo score?

Un score aislado puede salir alto por suerte en cómo se repartieron los datos. Con KFold obligas al modelo a demostrar consistencia en múltiples cortes, lo que reduce el sesgo y te da una accuracy mucho más realista.

En este caso, pasar de un 88.88% puntual a un 94% promedio confirma que el árbol de decisión clasifica bien los casos de cáncer benigno y maligno, no por casualidad, sino de forma sostenida.

Cuéntame en los comentarios qué accuracy obtuviste tú al correr el mismo flujo y si tus 10 folds quedaron tan parejos como los del ejercicio.