Divisió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, 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.
Por lo general, se divide el modelo en alrededor de 70-90% para el conjunto de entrenamiento y 10-30% para el conjunto de prueba.
Cuando el conjunto de datos contiene millones de instancias, utilizar solo unos pocos miles para pruebas suele ser más que suficiente. En estos casos, se puede 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_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
Sin embargo, este enfoque presenta algunas deficiencias:
- No se utiliza toda la información disponible para el entrenamiento, lo que podría mejorar el modelo;
- Dado que 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. Puede 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 garantizar 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 evaluación final real.
La idea consiste en mezclar todo el conjunto de datos y dividirlo en n partes iguales, denominadas 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 este modo, cada parte de los datos se utiliza para validación una vez, y se obtiene una estimación más fiable del rendimiento del modelo.
Tenga en cuenta que la validación cruzada no está destinada a reemplazar el conjunto de prueba. Después de utilizar la validación cruzada para seleccionar y ajustar el modelo, debe evaluarse en un conjunto de prueba independiente para obtener una valoración imparcial de su rendimiento en el mundo real.
Una elección común para el número de particiones es 5. En ese caso, una partición se utilizará como el conjunto de prueba, y las 4 particiones restantes se emplearán para el entrenamiento.
Se entrenan cinco modelos con subconjuntos ligeramente diferentes. Para cada modelo, se calcula la precisión del conjunto de prueba:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyUna vez realizado este proceso, se puede calcular el promedio de esas 5 puntuaciones de precisión, que será la puntuación de precisión de la validación cruzada:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Es más confiable porque calculamos la puntuación de precisión utilizando 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 utilizando validación cruzada, por lo que no es necesario implementarla manualmente:
A continuación se muestra 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:
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
Can you explain the difference between train-test split and cross-validation?
How do I choose the right number of folds for cross-validation?
What are some common pitfalls when using cross-validation?
Awesome!
Completion rate improved to 4.17
Divisió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, 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.
Por lo general, se divide el modelo en alrededor de 70-90% para el conjunto de entrenamiento y 10-30% para el conjunto de prueba.
Cuando el conjunto de datos contiene millones de instancias, utilizar solo unos pocos miles para pruebas suele ser más que suficiente. En estos casos, se puede 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_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
Sin embargo, este enfoque presenta algunas deficiencias:
- No se utiliza toda la información disponible para el entrenamiento, lo que podría mejorar el modelo;
- Dado que 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. Puede 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 garantizar 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 evaluación final real.
La idea consiste en mezclar todo el conjunto de datos y dividirlo en n partes iguales, denominadas 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 este modo, cada parte de los datos se utiliza para validación una vez, y se obtiene una estimación más fiable del rendimiento del modelo.
Tenga en cuenta que la validación cruzada no está destinada a reemplazar el conjunto de prueba. Después de utilizar la validación cruzada para seleccionar y ajustar el modelo, debe evaluarse en un conjunto de prueba independiente para obtener una valoración imparcial de su rendimiento en el mundo real.
Una elección común para el número de particiones es 5. En ese caso, una partición se utilizará como el conjunto de prueba, y las 4 particiones restantes se emplearán para el entrenamiento.
Se entrenan cinco modelos con subconjuntos ligeramente diferentes. Para cada modelo, se calcula la precisión del conjunto de prueba:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyUna vez realizado este proceso, se puede calcular el promedio de esas 5 puntuaciones de precisión, que será la puntuación de precisión de la validación cruzada:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Es más confiable porque calculamos la puntuación de precisión utilizando 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 utilizando validación cruzada, por lo que no es necesario implementarla manualmente:
A continuación se muestra 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:
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!