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 | Clasificador K-NN
Clasificación con Python

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

Desliza para mostrar el menú

En los capítulos anteriores, construimos los modelos y predecimos nuevos valores. Pero no tenemos idea de 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, necesitamos un subconjunto de datos etiquetados que el modelo no haya visto. Por lo tanto, dividimos aleatoriamente todos los datos etiquetados en conjunto de entrenamiento y conjunto de prueba.

traintestset

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

FunciónTrainTest

Normalmente, se divide el modelo en aproximadamente 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, puedes reservar incluso 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 = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train, y_train) # Printing the accuracy on the test set print(knn.score(X_test, y_test))

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), esta puntuación de precisión puede ser poco confiable 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 bien 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 es mezclar todo el conjunto de datos y dividirlo en n partes iguales, llamadas folds. Luego, el modelo realiza n iteraciones. En cada iteración, n-1 folds se utilizan para el entrenamiento y 1 fold se utiliza para la validación. De esta manera, cada parte de los datos se utiliza para validación una vez, y se obtiene una estimación más confiable 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 separado 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 folds es 5. En ese caso, un fold se utilizará como conjunto de prueba y los 4 folds restantes se utilizarán para el entrenamiento.

cruz

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 usando todos nuestros datos, solo divididos 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 usando validación cruzada, por lo que no tienes que implementarla tú mismo:

Función de validación cruzada

Ejemplo de uso de validación cruzada con un modelo k-NN entrenado en el conjunto de datos de calificaciones 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())

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

question mark

Selecciona todas las afirmaciones correctas.

Selecciona todas las respuestas correctas

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 1. Capítulo 6

Pregunte a AI

expand

Pregunte a AI

ChatGPT

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

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