J'essaie d'utiliser l'apprentissage en profondeur pour prédire le revenu de 15 attributs auto-déclarés d'un site de rencontres.
Nous obtenons des résultats plutôt étranges, où nos données de validation obtiennent une meilleure précision et une perte moindre, que nos données d'entraînement. Et cela est cohérent sur différentes tailles de couches cachées. Voici notre modèle:
for hl1 in [250, 200, 150, 100, 75, 50, 25, 15, 10, 7]:
def baseline_model():
model = Sequential()
model.add(Dense(hl1, input_dim=299, kernel_initializer='normal', activation='relu', kernel_regularizer=regularizers.l1_l2(0.001)))
model.add(Dropout(0.5, seed=seed))
model.add(Dense(3, kernel_initializer='normal', activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='adamax', metrics=['accuracy'])
return model
history_logs = LossHistory()
model = baseline_model()
history = model.fit(X, Y, validation_split=0.3, shuffle=False, epochs=50, batch_size=10, verbose=2, callbacks=[history_logs])
Et ceci est un exemple de la précision et des pertes: et .
Nous avons essayé de supprimer la régularisation et le décrochage, ce qui, comme prévu, s'est soldé par un sur-ajustement (formation: ~ 85%). Nous avons même essayé de réduire considérablement le taux d'apprentissage, avec des résultats similaires.
Quelqu'un a-t-il vu des résultats similaires?
Cela se produit lorsque vous utilisez Dropout
, car le comportement lors de la formation et des tests est différent.
Lors de l'entraînement, un pourcentage des fonctionnalités est défini sur zéro (50% dans votre cas puisque vous utilisez Dropout(0.5)
). Lors des tests, toutes les fonctionnalités sont utilisées (et sont mises à l'échelle de manière appropriée). Ainsi, le modèle au moment du test est plus robuste - et peut conduire à des précisions de test plus élevées.
Vous pouvez consulter Keras FAQ et surtout la section "Pourquoi la perte d'entraînement est-elle beaucoup plus élevée que la perte de test?" .
Je vous suggère également de prendre un peu de temps et de lire ceci très bien article concernant certains "contrôles de santé mentale" que vous devriez toujours prendre en considération lors de la construction d'un NN.
De plus, dans la mesure du possible, vérifiez si vos résultats ont du sens. Par exemple, dans le cas d'une classification de classe n avec entropie croisée catégorielle, la perte sur la première époque devrait être -ln(1/n)
.
En dehors de votre cas spécifique, je pense qu'en dehors de Dropout
, la division de l'ensemble de données peut parfois entraîner cette situation. Surtout si la répartition de l'ensemble de données n'est pas aléatoire (dans le cas où des modèles temporels ou spatiaux existent), l'ensemble de validation peut être fondamentalement différent, c'est-à-dire moins de bruit ou moins de variance, du train et donc plus facile à prévoir, ce qui conduit à une plus grande précision sur l'ensemble de validation que sur la formation.
De plus, si l'ensemble de validation est très petit par rapport à la formation, alors au hasard le modèle correspond mieux à l'ensemble de validation qu'à la formation.]
C'est en fait une situation assez souvent. Lorsqu'il n'y a pas tellement de variance dans votre jeu de données, vous pouvez avoir le comportement comme celui-ci. Ici vous pourriez trouver une explication pourquoi cela pourrait arriver.
Cela indique la présence d'un biais élevé dans votre ensemble de données. C'est insuffisant. Les solutions à apporter sont: -
Le réseau a probablement du mal à adapter les données de formation. Par conséquent, essayez un réseau un peu plus grand.
Essayez un autre réseau de neurones profonds. Je veux dire changer un peu l'architecture.
Entraînez-vous plus longtemps.
Essayez d'utiliser des algorithmes d'optimisation avancés.