La validación cruzada en Python te permite comprobar qué tan confiable es un modelo de machine learning antes de llevarlo a producción. Aquí aprenderás a implementarla paso a paso con scikit-learn, pandas y un dataset real de cáncer de mama desde Kaggle, ideal si estás entrenando modelos de clasificación y necesitas validar su precisión sin sesgos.
¿Qué librerías necesitas para empezar el análisis?
Antes de tocar el modelo, prepara tu entorno. Yo trabajo en Google Colab, pero funciona igual en cualquier notebook.
- pandas as pd: para manipular el dataframe.
- numpy as np: para operaciones numéricas.
- io: para cargar archivos desde tu escritorio.
- from google.colab import files: si trabajas en Colab y quieres subir el CSV manualmente.
El dataset que uso se llama cancer_data.csv y lo descargué de Kaggle, una plataforma con bases de datos públicas y competencias de ciencia de datos, algunas con premios económicos [00:54]. Te recomiendo explorarla.
¿Cómo se prepara el dataframe antes de modelar?
Una vez subido el archivo, lo conviertes en dataframe con pd.read_csv(io.BytesIO(uploaded['cancer_data.csv'])). Al inspeccionar las columnas vas a notar algo clave: casi todas las variables son numéricas (radio, textura, perímetro, área, smoothness, concavidad), excepto diagnosis, que es categórica y toma los valores M (maligno) o B (benigno) [02:30].
Aquí defines tus variables predictoras y tu variable objetivo:
X = df.iloc[:, 2:] toma todas las columnas numéricas desde la posición dos en adelante.
y = df.iloc[:, 1] toma la columna categórica diagnosis.
¿Por qué se separan X y Y antes de entrenar? Porque X contiene las variables explicativas (numéricas) y Y la variable que quieres predecir (categórica). El modelo aprende la relación entre ambas.
Cuando ejecutas y.value_counts() obtienes 357 casos benignos y 212 malignos [04:12]. Esa distribución importa: si solo tuvieras una clase, no podrías entrenar un clasificador útil porque faltarían observaciones para aprender el patrón opuesto.
¿Cómo entrenar un árbol de decisión y dividir train test?
Para la clasificación uso DecisionTreeClassifier desde sklearn.tree, junto con train_test_split desde sklearn.model_selection.
La división típica es:
python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=4)
Con esto reservas el 30% de los datos para test y dejas el 70% para entrenamiento. El parámetro random_state fija la semilla aleatoria para que tus resultados sean reproducibles.
Después entrenas el modelo:
python
modelo = DecisionTreeClassifier()
modelo.fit(X_train, y_train)
modelo.score(X_test, y_test)
En mi corrida obtuve una precisión del 88.88% [06:45]. Es un buen punto de partida, pero un solo split puede engañarte: tal vez tuviste suerte con esa partición específica. Ahí entra la validación cruzada.
¿Qué es KFold y cómo se implementa en scikit learn?
KFold es una técnica que divide el dataset en k particiones iguales y entrena el modelo k veces, usando cada partición una vez como test. Así obtienes varias mediciones de precisión en lugar de una sola.
¿Cuántos folds debo usar en KFold? El valor más habitual es 10. Te da un buen balance entre estabilidad estadística y costo computacional.
La implementación es directa:
python
from sklearn.model_selection import KFold, cross_val_score
modelo = DecisionTreeClassifier()
kfold_validacion = KFold(10)
resultados = cross_val_score(modelo, X, y, cv=kfold_validacion)
print(resultados)
print(resultados.mean())
cross_val_score aplica el modelo a cada fold y devuelve un array con las precisiones individuales [09:20]. En mi caso aparecieron valores como 94%, 91% y hasta 98%, con un promedio cercano al 94% [10:05].
¿Por qué el promedio importa más que un solo score?
Porque al promediar 10 mediciones reduces el sesgo de una partición afortunada. Si tu modelo da 94% en una sola corrida pero 70% en validación cruzada, sabes que no generaliza bien. En cambio, un promedio alto y consistente entre folds confirma que el modelo aprendió patrones reales, no ruido.
¿Cómo interpretar los resultados de tu validación cruzada?
Un promedio del 94% de accuracy sobre los 10 folds indica que el clasificador distingue correctamente entre tumores malignos y benignos en la mayoría de los casos. Para un problema médico de este tipo, es una señal sólida, aunque siempre conviene complementar con métricas como recall o F1-score cuando los falsos negativos tienen alto costo.
¿Qué significa accuracy en machine learning? Es el porcentaje de predicciones correctas sobre el total de predicciones hechas por el modelo. Un 94% significa que de cada 100 casos, acierta en 94.
Tus números pueden variar ligeramente porque las muestras son aleatorias, pero deberían moverse en un rango parecido. Si obtienes valores muy bajos, revisa el preprocesamiento, el balance de clases o el random_state.
Cuéntame en los comentarios qué accuracy te dio tu modelo y si probaste con otros valores de k.