¿Es posible obtener puntajes de prueba para cada iteración de MLPClassifier?

Me gustaría ver las curvas de pérdida para datos de entrenamiento y datos de prueba lado a lado. Actualmente, parece sencillo obtener la pérdida en el conjunto de entrenamiento para cada iteración utilizando clf.loss_curve (ver más abajo).

 from sklearn.neural_network import MLPClassifier clf = MLPClassifier() clf.fit(X,y) clf.loss_curve_ # this seems to have loss for the training set 

Sin embargo, también me gustaría trazar el rendimiento en un conjunto de datos de prueba. ¿Está disponible?

Al usar MLPClassifier(early_stopping=True) , el criterio de parada cambia de la pérdida de entrenamiento al puntaje de precisión, que se calcula en un conjunto de validación (cuyo tamaño está controlado por el parámetro validation_fraction ).

La puntuación de validación de cada iteración se almacena dentro de clf.validation_scores_ .

Otra posibilidad es usar warm_start=True con max_iter=1 , y calcular manualmente toda la cantidad que desea monitorear después de cada iteración.

clf.loss_curve_ no forma parte de los documentos API (aunque se usa en algunos ejemplos). La única razón por la que está ahí es porque se usa internamente para detenerse temprano .

Como menciona Tom, también hay algunos enfoques para usar validation_scores_ .

Aparte de eso, es posible que las configuraciones más complejas tengan que realizar una forma más manual de entrenamiento, donde pueda controlar cuándo, qué y cómo medir algo.

Después de leer la respuesta de Tom, podría ser sabio decir: si solo se necesitan cálculos inter-epoch, su enfoque de combinar warm_start y max_iter guarda algo de código (y usa más del código original de sklearn). Este código aquí también podría hacer cálculos intra-épocas (si es necesario; comparar con keras).

Ejemplo simple (prototipo):

 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import fetch_mldata from sklearn.neural_network import MLPClassifier np.random.seed(1) """ Example based on sklearn's docs """ mnist = fetch_mldata("MNIST original") # rescale the data, use the traditional train/test split X, y = mnist.data / 255., mnist.target X_train, X_test = X[:60000], X[60000:] y_train, y_test = y[:60000], y[60000:] mlp = MLPClassifier(hidden_layer_sizes=(50,), max_iter=10, alpha=1e-4, solver='adam', verbose=0, tol=1e-8, random_state=1, learning_rate_init=.01) """ Home-made mini-batch learning -> not to be used in out-of-core setting! """ N_TRAIN_SAMPLES = X_train.shape[0] N_EPOCHS = 25 N_BATCH = 128 N_CLASSES = np.unique(y_train) scores_train = [] scores_test = [] # EPOCH epoch = 0 while epoch < N_EPOCHS: print('epoch: ', epoch) # SHUFFLING random_perm = np.random.permutation(X_train.shape[0]) mini_batch_index = 0 while True: # MINI-BATCH indices = random_perm[mini_batch_index:mini_batch_index + N_BATCH] mlp.partial_fit(X_train[indices], y_train[indices], classes=N_CLASSES) mini_batch_index += N_BATCH if mini_batch_index >= N_TRAIN_SAMPLES: break # SCORE TRAIN scores_train.append(mlp.score(X_train, y_train)) # SCORE TEST scores_test.append(mlp.score(X_test, y_test)) epoch += 1 """ Plot """ fig, ax = plt.subplots(2, sharex=True, sharey=True) ax[0].plot(scores_train) ax[0].set_title('Train') ax[1].plot(scores_test) ax[1].set_title('Test') fig.suptitle("Accuracy over epochs", fontsize=14) plt.show() 

Salida:

introduzca la descripción de la imagen aquí

O un poco más compacto:

 plt.plot(scores_train, color='green', alpha=0.8, label='Train') plt.plot(scores_test, color='magenta', alpha=0.8, label='Test') plt.title("Accuracy over epochs", fontsize=14) plt.xlabel('Epochs') plt.legend(loc='upper left') plt.show() 

Salida:

introduzca la descripción de la imagen aquí

Yo uso jupyter , este es mi código:

 clf = MLPClassifier(hidden_layer_sizes=(10,10,10)) clf.fit(train_X,train_Y) plt.ylabel('cost') plt.xlabel('iterations') plt.title("Learning rate =" + str(0.001)) plt.plot(pose_clf.loss_curve_) plt.show() 

grafico