CNTK: medición del rendimiento
Este capítulo explicará cómo medir el rendimiento del modelo en CNKT.
Estrategia para validar el desempeño del modelo
Después de crear un modelo de aprendizaje automático, solíamos entrenarlo con un conjunto de muestras de datos. Debido a esta capacitación, nuestro modelo ML aprende y deriva algunas reglas generales. El rendimiento del modelo de aprendizaje automático es importante cuando alimentamos el modelo con nuevas muestras, es decir, muestras diferentes a las proporcionadas en el momento del entrenamiento. El modelo se comporta de manera diferente en ese caso. Puede que sea peor para hacer una buena predicción sobre esas nuevas muestras.
Pero el modelo también debe funcionar bien para nuevas muestras porque en el entorno de producción obtendremos una entrada diferente a la que usamos los datos de muestra para fines de capacitación. Esa es la razón por la que deberíamos validar el modelo de aprendizaje automático mediante el uso de un conjunto de muestras diferentes de las muestras que usamos con fines de capacitación. Aquí, vamos a discutir dos técnicas diferentes para crear un conjunto de datos para validar una NN.
Conjunto de datos de reserva
Es uno de los métodos más sencillos para crear un conjunto de datos para validar un NN. Como su nombre lo indica, en este método retendremos un conjunto de muestras del entrenamiento (digamos 20%) y lo usaremos para probar el rendimiento de nuestro modelo ML. El siguiente diagrama muestra la relación entre las muestras de capacitación y validación:
El modelo de conjunto de datos de retención garantiza que tengamos suficientes datos para entrenar nuestro modelo ML y, al mismo tiempo, tendremos una cantidad razonable de muestras para obtener una buena medición del rendimiento del modelo.
Para incluir en el conjunto de entrenamiento y de prueba, es una buena práctica elegir muestras aleatorias del conjunto de datos principal. Garantiza una distribución uniforme entre el entrenamiento y el conjunto de prueba.
A continuación se muestra un ejemplo en el que estamos produciendo nuestro propio conjunto de datos de reserva mediante el uso de train_test_split función de la scikit-learn biblioteca.
Ejemplo
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Here above test_size = 0.2 represents that we provided 20% of the data as test data.
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors=3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)
Salida
Predictions: ['versicolor', 'virginica']
Mientras usamos CNTK, necesitamos aleatorizar el orden de nuestro conjunto de datos cada vez que entrenamos nuestro modelo porque:
Los algoritmos de aprendizaje profundo están muy influenciados por los generadores de números aleatorios.
El orden en el que proporcionamos las muestras a NN durante el entrenamiento afecta en gran medida su rendimiento.
La principal desventaja de usar la técnica de retención de datos es que no es confiable porque a veces obtenemos muy buenos resultados, pero a veces, obtenemos malos resultados.
Validación cruzada de K-fold
Para hacer que nuestro modelo ML sea más confiable, existe una técnica llamada validación cruzada de K-fold. En la naturaleza, la técnica de validación cruzada de K-fold es la misma que la técnica anterior, pero la repite varias veces, generalmente de 5 a 10 veces. El siguiente diagrama representa su concepto:
Trabajo de validación cruzada de K-fold
El funcionamiento de la validación cruzada de K-fold se puede entender con la ayuda de los siguientes pasos:
Step 1- Al igual que en la técnica de conjunto de datos Hand-out, en la técnica de validación cruzada de K-fold, primero necesitamos dividir el conjunto de datos en un conjunto de entrenamiento y prueba. Idealmente, la proporción es 80-20, es decir, 80% del conjunto de entrenamiento y 20% del conjunto de prueba.
Step 2 - A continuación, necesitamos entrenar nuestro modelo usando el conjunto de entrenamiento.
Step 3−Por último, usaremos el conjunto de pruebas para medir el rendimiento de nuestro modelo. La única diferencia entre la técnica del conjunto de datos de Hold-out y la técnica de validación k-cross es que el proceso anterior se repite generalmente de 5 a 10 veces y al final se calcula el promedio sobre todas las métricas de rendimiento. Ese promedio sería la métrica de rendimiento final.
Veamos un ejemplo con un pequeño conjunto de datos:
Ejemplo
from numpy import array
from sklearn.model_selection import KFold
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
kfold = KFold(5, True, 1)
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train],(data[test]))
Salida
train: [0.1 0.2 0.4 0.5 0.6 0.7 0.8 0.9], test: [0.3 1. ]
train: [0.1 0.2 0.3 0.4 0.6 0.8 0.9 1. ], test: [0.5 0.7]
train: [0.2 0.3 0.5 0.6 0.7 0.8 0.9 1. ], test: [0.1 0.4]
train: [0.1 0.3 0.4 0.5 0.6 0.7 0.9 1. ], test: [0.2 0.8]
train: [0.1 0.2 0.3 0.4 0.5 0.7 0.8 1. ], test: [0.6 0.9]
Como vemos, debido al uso de un escenario de prueba y entrenamiento más realista, la técnica de validación cruzada de k-fold nos brinda una medición de desempeño mucho más estable pero, en el lado negativo, lleva mucho tiempo validar modelos de aprendizaje profundo.
CNTK no admite la validación de k-cross, por lo tanto, necesitamos escribir nuestro propio script para hacerlo.
Detectar desajustes y sobreajustes
Ya sea que usemos el conjunto de datos Hand-out o la técnica de validación cruzada de k veces, descubriremos que el resultado de las métricas será diferente para el conjunto de datos utilizado para el entrenamiento y el conjunto de datos utilizado para la validación.
Detectando sobreajuste
El fenómeno llamado sobreajuste es una situación en la que nuestro modelo ML modela los datos de entrenamiento excepcionalmente bien, pero no funciona bien en los datos de prueba, es decir, no pudo predecir los datos de prueba.
Ocurre cuando un modelo de aprendizaje automático aprende un patrón y ruido específicos de los datos de entrenamiento hasta tal punto que impacta negativamente la capacidad de ese modelo para generalizar desde los datos de entrenamiento a datos nuevos, es decir, no vistos. Aquí, el ruido es la información irrelevante o la aleatoriedad en un conjunto de datos.
Las siguientes son las dos formas con la ayuda de las cuales podemos detectar si nuestro modelo está sobreajustado o no:
El modelo de sobreajuste funcionará bien en las mismas muestras que usamos para el entrenamiento, pero funcionará muy mal en las nuevas muestras, es decir, muestras diferentes a las de entrenamiento.
El modelo está sobreajustado durante la validación si la métrica en el conjunto de prueba es menor que la misma métrica que usamos en nuestro conjunto de entrenamiento.
Detectando falta de ajuste
Otra situación que puede surgir en nuestro ML es la falta de adecuación. Esta es una situación en la que nuestro modelo ML no modeló bien los datos de entrenamiento y no puede predecir resultados útiles. Cuando comencemos a entrenar en la primera época, nuestro modelo estará desajustado, pero se volverá menos desajustado a medida que avance el entrenamiento.
Una de las formas de detectar si nuestro modelo es inadecuado o no es observar las métricas del conjunto de entrenamiento y el conjunto de prueba. Nuestro modelo será inadecuado si la métrica en el conjunto de prueba es más alta que la métrica en el conjunto de entrenamiento.