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.
Esto se puede lograr utilizando la función train_test_split() de sklearn.
Normalmente, se divide el modelo en aproximadamente 70-90% para el conjunto de entrenamiento y 10-30% para el conjunto de prueba.
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.
123456789101112131415161718192021from 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.
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.
Entrenamos cinco modelos con subconjuntos ligeramente diferentes. Para cada modelo, calculamos la precisión del conjunto de prueba:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyUna 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=5accuracy1+accuracy2+...+accuracy5Es 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:
Ejemplo de uso de validación cruzada con un modelo k-NN entrenado en el conjunto de datos de calificaciones de Star Wars:
12345678910111213141516171819from 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.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla