0
votes

très faible précision sur le jeu de données de vol

J'essaie de former un modèle pour prédire le délai de départ basé sur la compagnie aérienne, la journée du mois, des devises et d'origine. J'ai essayé plusieurs approches, mais la précision est très faible. Entrez la description de l'image ici Fist J'ai utilisé les étiquettes de retardaire directement à partir de -20 à +20 min, j'ai essayé de faciliter la définition de la tâche en définissant les intervalles suivants: pour les retards dans [0 5 [=> 0 [5 10] => 1 ..etc

Mais toujours la précision est mauvaise et j'ai essayé plusieurs approches; P>

Changer les couches
Ne pas normaliser les caractéristiques Suppression et ajout de nouvelles fonctionnalités p>

mais je ne trouve toujours pas quelque chose qui fonctionne p>

#################### Chargez le jeu de données p> xxx pré>

################ Valeurs de retard de masque p> xxx pré>

################ Divisez des étiquettes et des fonctionnalités p> xxx pré>

################# Remplacement des valeurs de caractères p> xxx pré>

########################### NORMALISATION p> xxx pré>

########################## Le modèle P>

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from keras.models import Sequential
from keras.layers import Dense, Dropout
import matplotlib.pyplot as plt
import numpy
class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []

    def on_batch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))

model = Sequential()
model.add(Dense(64, input_dim=4, activation='relu'))
model.add(Dense(30, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(1))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam', metrics= 
    ['accuracy'])
# Fit the model
history = LossHistory()
model.fit(df, y, validation_split=0.33, epochs=1000, 
    batch_size=50,verbose=1, callbacks=[history])
print(history.losses)


0 commentaires

3 Réponses :


1
votes

Lorsque vous utilisez perte = 'méthandre_squared_error' et aucune activation (c.-à-d. La valeur linéaire par défaut) dans une couche finale à un seul nœud, comme vous le faites ici, vous êtes dans une régression EM> Cadre, où La précision est sans signification (c'est significatif que dans classification problèmes).

Malheureusement, Keras ne "protégera" pas dans un tel cas, insistant En informatique et rapportant une "précision", malgré le fait qu'il n'a pas de sens et inapproprié pour votre problème - voir ma réponse dans Quelle fonction définit la précision dans KERAS lorsque la perte est une erreur carrée moyenne (MSE)?

Si vous souhaitez coller à un réglage de régression, vous devez simplement supprimer métrique = ["précision"] de votre compilation modèle et ne vous dérange pas - dans les paramètres de régression, MSE elle-même peut (et habituellement) servir aussi comme la performance m cétrique. Mais cela signifie que vous allez essayer de prédire directement valeurs numériques , pas des "étiquettes" provenant du binning, comme vous le décrivez.

Si vous souhaitez prédire les intervalles binifiés comme xxx

etc., c.-à-d. Travailler dans un paramètre classification , vous devez modifier votre perte sur Catégorical_cross_tropy et conserver la précision de votre métrique . N'oubliez pas que vous devriez également convertir vos étiquettes en une-codées à une fois à chaud (voir Keras to_catégorique ) et remplacez votre couche finale avec xxx

num_classes est le nombre de classes résultant de votre procédure binning.


1 commentaires

Ok merci je vais essayer de métrique la performance après la formation de la formation à l'aide de la traçabilité manuelle



0
votes

En regardant votre ensemble de données, vous avez un mélange de problèmes de classification et de régression. Comme vous pourriez très bien pouvoir utiliser Keras pour modéliser, mais si votre cas est une régression, la classification devient sans signification. D'autre part, ma suggestion tente d'utiliser des arbres de décision.


2 commentaires

Dans de tels cas, on peut être dans un contexte de régression ou dans une classification, il n'y a pas de "mélanges" ...


En fait, j'ai décidé de changer le problème à un problème de classification, en utilisant les intervalles comme étiquettes multiclass. J'espère que ça fonctionnera mieux



0
votes

Mon expérience (E.G. Estimation de l'âge) dit qu'il sera toujours préférable de former le réseau avec une perte combinée, c'est-à-dire la régression + classification.

Je pense que vous avez déjà compris comment faire le problème de la classification, ce qui consiste à quantifier vos sorties cible dans des bacs prédéfinis. En conséquence, la sortie de votre classification prédira la probabilité d'un échantillon appartenant à une corbeille.

sans perte de généralité, disons que vous avez n bacs et la valeur centrale du k th bin est c [k] < / code>. Maintenant, la question est de savoir comment allez-vous inférence, c'est-à-dire un échantillon de test, comment estimer le retard de vol exact . En d'autres termes, vous devez convertir le problème de la classification vers le problème de régression pendant toute la durée de test, sauf si vous êtes satisfait d'une estimation de bac.

Un moyen simple d'estimer le délai de vol ( fd ) est de prendre la moyenne pondérée de vos résultats de classification de bac, c'est-à-dire xxx

proba est la probabilité bin de clf.predict (échantillon) et centres est la valeur centrale de vos bacs, c'est-à-dire centres = [c [k] pour k dans la plage (n)] .

Bien sûr, il existe d'autres moyens que vous pouvez utiliser pendant le temps d'inférence, mais utilisons simplement cela un comme exemple. Maintenant, la question est comment intégrer cette fonction d'inférence à la fonction de perte?

J'espère que vous avez déjà reçu la réponse, qui est juste pour calculer la perte entre FD < / code> infercé à l'aide de la formule ci-dessus et que de la vérité au sol.

suppose que vous avez un modèle keras qui effectue la tâche de classification, ci-dessous est un exemple pour l'entraîner avec Les pertes de régression xxx

Vous pouvez désormais former le même modèle avec une nouvelle perte de régression.

Comme je l'ai mentionné plus tôt, il sera préférable de faire à la fois la régression et la perte de classification. Parce que les utiliser ensemble vous aidera à optimiser le réseau de manière meilleure. Pourquoi?

Parce que lorsqu'il utilise une perte de classification, donné xxx

vous aurez l (gt, p1) = L (gt, p2 ) . Cependant, lorsque vous pensez de votre problème, ce que nous voulons vraiment, c'est L (GT, P1) , et cette partie sera couverte après l'introduction de la perte de régression.

Dans le même temps, le problème de l'utilisation de la perte de régression uniquement est que vous ne savez vraiment pas quelles sont les significations physiques des fonctionnalités pour prédire la valeur cible, mais que vous savez si l'un d'entre eux répond à une valeur aberrante , vous gâchez votre prédiction. Avec la perte de classification, vous savez que la fonctionnalité directe utilisée pour la régression est la composition des bacs.


1 commentaires

Merci Monsieur !! Cela m'a aidé même je l'ai vu tard.