Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende División de Entrenamiento-Prueba y Validación Cruzada | Sección
Practice
Projects
Quizzes & Challenges
Cuestionarios
Challenges
/
Fundamentos del Aprendizaje Supervisado

bookDivisión de Entrenamiento-Prueba y Validación Cruzada

En los capítulos anteriores, construimos los modelos y realizamos predicciones de nuevos valores. Sin embargo, no sabemos qué tan bien funciona el modelo ni si esas predicciones son confiables.

División en conjunto de entrenamiento y prueba

Para medir el rendimiento del modelo, se necesita un subconjunto de datos etiquetados que el modelo no haya visto. Por lo tanto, se divide aleatoriamente todos los datos etiquetados en conjunto de entrenamiento y conjunto de prueba.

Esto se puede lograr utilizando la función train_test_split() de sklearn.

Argumentos:

  • X — un arreglo de valores de características;
  • y — un arreglo de valores objetivo;
  • test_size — la proporción del conjunto de prueba;

Retorna:

  • X_train, X_test, y_train, y_test — arreglos del mismo tipo de datos que X, y.

Normalmente, se divide el modelo en alrededor de 70-90% para el conjunto de entrenamiento y 10-30% para el conjunto de prueba.

Note
Nota

Cuando tu conjunto de datos tiene millones de instancias, usar solo unos pocos miles para pruebas suele ser más que suficiente. En estos casos, incluso puedes reservar menos del 10% de los datos para pruebas.

Ahora, se puede entrenar el modelo utilizando el conjunto de entrenamiento y evaluar su precisión en el conjunto de prueba.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Pero este enfoque tiene algunas desventajas:

  • No se utiliza toda la información disponible para el entrenamiento, lo que podría mejorar el modelo;
  • Como la precisión del modelo se evalúa en una pequeña porción de los datos (conjunto de prueba), este valor de precisión puede ser poco fiable en conjuntos de datos pequeños. Puedes ejecutar el código anterior varias veces y observar cómo cambia la precisión cada vez que se selecciona un nuevo conjunto de prueba.

Validación Cruzada

La validación cruzada está diseñada para abordar el problema del sobreajuste y asegurar que el modelo pueda generalizar correctamente a datos nuevos y no vistos. Puede considerarse como un entrenamiento en aula para el modelo: ayuda a que el modelo aprenda de manera más equilibrada antes de enfrentarse a la prueba final real.

La idea consiste en mezclar todo el conjunto de datos y dividirlo en n partes iguales, llamadas folds. Luego, el modelo pasa por n iteraciones. En cada iteración, n-1 folds se utilizan para el entrenamiento y 1 fold se utiliza para la validación. De este modo, cada parte de los datos se utiliza una vez para la validación y se obtiene una estimación más fiable del rendimiento del modelo.

Ten en cuenta que la validación cruzada no está pensada para reemplazar el conjunto de prueba. Después de utilizar la validación cruzada para elegir y ajustar el modelo, se debe evaluarlo en un conjunto de prueba independiente para obtener una evaluación imparcial de su rendimiento en el mundo real.

Note
Nota

Una elección común para el número de particiones es 5. En ese caso, una partición se utilizará como conjunto de prueba, y las 4 particiones restantes se utilizarán para el entrenamiento.

Entrenamos cinco modelos con subconjuntos ligeramente diferentes. Para cada modelo, calculamos la precisión del conjunto de prueba:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Una vez hecho esto, podemos calcular el promedio de esas 5 puntuaciones de precisión, que será nuestra puntuación de precisión de validación cruzada:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Es más confiable porque calculamos la puntuación de precisión utilizando todos nuestros datos; solo se dividieron de manera diferente en cinco iteraciones.

Ahora que sabemos qué tan bien funciona el modelo, podemos reentrenarlo utilizando todo el conjunto de datos.

Afortunadamente, sklearn proporciona la función cross_val_score() para evaluar el modelo utilizando validación cruzada, por lo que no es necesario implementarla manualmente:

Argumentos:

  • estimator — el objeto del modelo;
  • X — un arreglo de valores de características;
  • y — un arreglo de valores objetivo;
  • cv — el número de particiones (5 por defecto);
  • scoring — la métrica (precisión por defecto);

Retorna:

  • scores — un arreglo de puntuaciones en cada iteración.

Aquí tienes un ejemplo de cómo utilizar la validación cruzada con un modelo k-NN entrenado en el conjunto de datos de valoraciones de Star Wars:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

La métrica utilizada por defecto para la clasificación es accuracy.

question mark

Selecciona todas las afirmaciones correctas.

Select all correct answers

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 1. Capítulo 19

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

bookDivisión de Entrenamiento-Prueba y Validación Cruzada

Desliza para mostrar el menú

En los capítulos anteriores, construimos los modelos y realizamos predicciones de nuevos valores. Sin embargo, no sabemos qué tan bien funciona el modelo ni si esas predicciones son confiables.

División en conjunto de entrenamiento y prueba

Para medir el rendimiento del modelo, se necesita un subconjunto de datos etiquetados que el modelo no haya visto. Por lo tanto, se divide aleatoriamente todos los datos etiquetados en conjunto de entrenamiento y conjunto de prueba.

Esto se puede lograr utilizando la función train_test_split() de sklearn.

Argumentos:

  • X — un arreglo de valores de características;
  • y — un arreglo de valores objetivo;
  • test_size — la proporción del conjunto de prueba;

Retorna:

  • X_train, X_test, y_train, y_test — arreglos del mismo tipo de datos que X, y.

Normalmente, se divide el modelo en alrededor de 70-90% para el conjunto de entrenamiento y 10-30% para el conjunto de prueba.

Note
Nota

Cuando tu conjunto de datos tiene millones de instancias, usar solo unos pocos miles para pruebas suele ser más que suficiente. En estos casos, incluso puedes reservar menos del 10% de los datos para pruebas.

Ahora, se puede entrenar el modelo utilizando el conjunto de entrenamiento y evaluar su precisión en el conjunto de prueba.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Pero este enfoque tiene algunas desventajas:

  • No se utiliza toda la información disponible para el entrenamiento, lo que podría mejorar el modelo;
  • Como la precisión del modelo se evalúa en una pequeña porción de los datos (conjunto de prueba), este valor de precisión puede ser poco fiable en conjuntos de datos pequeños. Puedes ejecutar el código anterior varias veces y observar cómo cambia la precisión cada vez que se selecciona un nuevo conjunto de prueba.

Validación Cruzada

La validación cruzada está diseñada para abordar el problema del sobreajuste y asegurar que el modelo pueda generalizar correctamente a datos nuevos y no vistos. Puede considerarse como un entrenamiento en aula para el modelo: ayuda a que el modelo aprenda de manera más equilibrada antes de enfrentarse a la prueba final real.

La idea consiste en mezclar todo el conjunto de datos y dividirlo en n partes iguales, llamadas folds. Luego, el modelo pasa por n iteraciones. En cada iteración, n-1 folds se utilizan para el entrenamiento y 1 fold se utiliza para la validación. De este modo, cada parte de los datos se utiliza una vez para la validación y se obtiene una estimación más fiable del rendimiento del modelo.

Ten en cuenta que la validación cruzada no está pensada para reemplazar el conjunto de prueba. Después de utilizar la validación cruzada para elegir y ajustar el modelo, se debe evaluarlo en un conjunto de prueba independiente para obtener una evaluación imparcial de su rendimiento en el mundo real.

Note
Nota

Una elección común para el número de particiones es 5. En ese caso, una partición se utilizará como conjunto de prueba, y las 4 particiones restantes se utilizarán para el entrenamiento.

Entrenamos cinco modelos con subconjuntos ligeramente diferentes. Para cada modelo, calculamos la precisión del conjunto de prueba:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Una vez hecho esto, podemos calcular el promedio de esas 5 puntuaciones de precisión, que será nuestra puntuación de precisión de validación cruzada:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Es más confiable porque calculamos la puntuación de precisión utilizando todos nuestros datos; solo se dividieron de manera diferente en cinco iteraciones.

Ahora que sabemos qué tan bien funciona el modelo, podemos reentrenarlo utilizando todo el conjunto de datos.

Afortunadamente, sklearn proporciona la función cross_val_score() para evaluar el modelo utilizando validación cruzada, por lo que no es necesario implementarla manualmente:

Argumentos:

  • estimator — el objeto del modelo;
  • X — un arreglo de valores de características;
  • y — un arreglo de valores objetivo;
  • cv — el número de particiones (5 por defecto);
  • scoring — la métrica (precisión por defecto);

Retorna:

  • scores — un arreglo de puntuaciones en cada iteración.

Aquí tienes un ejemplo de cómo utilizar la validación cruzada con un modelo k-NN entrenado en el conjunto de datos de valoraciones de Star Wars:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

La métrica utilizada por defecto para la clasificación es accuracy.

question mark

Selecciona todas las afirmaciones correctas.

Select all correct answers

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 1. Capítulo 19
some-alt