web-dev-qa-db-fra.com

Comment les données de formation et de test sont-elles divisées?

J'entraîne actuellement mes données en utilisant un réseau de neurones et en utilisant la fonction d'ajustement. 

history=model.fit(X, encoded_Y, batch_size=50, nb_Epoch=500, validation_split = 0.2, verbose=1)

Maintenant, j'ai utilisé validation_split à 20%. Ce que j'ai compris, c'est que mes données d'entraînement seront de 80% et les données de test de 20%. Je ne comprends pas comment ces données sont traitées en bout de ligne. Est-ce que c'est comme si 80% des échantillons étaient prélevés pour la formation et moins de 20% pour les tests ou que les échantillons soient choisis au hasard entre les deux? Si je veux donner des données de formation et de test séparées, comment vais-je le faire en utilisant fit () ??

De plus, ma deuxième préoccupation est de savoir comment vérifier si les données s’intègrent bien sur le modèle. Les résultats montrent que la précision de l'entraînement est d'environ 90%, tandis que celle de la validation est d'environ 55%. Cela signifie-t-il que c'est le cas d'un sur-ajustement ou d'un sous-ajustement?

Ma dernière question est qu'est-ce que l'évaluation des retours? Le document indique que la perte est renvoyée mais que je reçois déjà une perte et une précision à chaque époque (comme un retour d’ajustement () (dans l’historique)). Qu'est-ce que l'exactitude et le score renvoyé par l'évaluation montre? Si la précision renvoyée par assessment renvoie 90%, puis-je dire que mes données sont bien ajustées, quelles que soient l'exactitude et la perte individuelles pour chaque époque?

Ci-dessous mon code:

import numpy
import pandas
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from keras.utils import np_utils
from sklearn.model_selection import KFold
from sklearn.metrics import confusion_matrix
import itertools

seed = 7
numpy.random.seed(seed)

dataframe = pandas.read_csv("INPUTFILE.csv", skiprows=range(0, 0))

dataset = dataframe.values
X = dataset[:,0:50].astype(float) # number of cols-1
Y = dataset[:,50]

encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

encoded_Y = np_utils.to_categorical(encoded_Y)
print("encoded_Y=", encoded_Y) 
# baseline model
def create_baseline():
    # create model
    model = Sequential()
    model.add(Dense(5, input_dim=5, kernel_initializer='normal', activation='relu'))
    model.add(Dense(5, kernel_initializer='normal', activation='relu'))
    #model.add(Dense(2, kernel_initializer='normal', activation='sigmoid'))

    model.add(Dense(2, kernel_initializer='normal', activation='softmax'))

    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])  # for binayr classification
        #model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  # for multi class
    return model


model=create_baseline();
history=model.fit(X, encoded_Y, batch_size=50, nb_Epoch=500, validation_split = 0.2, verbose=1)

print(history.history.keys())
# list all data in history
print(history.history.keys())
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()


pre_cls=model.predict_classes(X)    
cm1 = confusion_matrix(encoder.transform(Y),pre_cls)
print('Confusion Matrix : \n')
print(cm1)


score, acc = model.evaluate(X,encoded_Y)
print('Test score:', score)
print('Test accuracy:', acc)
1
eshaa
  1. La documentation de keras indique: "Les données de validation sont sélectionnées à partir des derniers échantillons des données x et y fournies, avant le brassage.", Cela signifie que le brassage a lieu après la scission, il existe également un paramètre booléen appelé "shuffle" qui est définir true comme valeur par défaut, donc si vous ne voulez pas que vos données soient mélangées, vous pouvez simplement les définir sur false

  2. Obtenir de bons résultats sur vos données d'entraînement, puis de mauvais ou pas si bons résultats sur vos données d'évaluation signifie généralement que votre modèle est sur-ajusté. Ce sur-ajustement survient lorsque votre modèle apprend dans un scénario très spécifique et ne peut pas obtenir de bons résultats avec de nouvelles données.

  3. l’évaluation consiste à tester votre modèle sur de nouvelles données qu’il «n’a jamais vues auparavant». En général, vous divisez vos données en formation et en test, mais vous pouvez aussi parfois créer un troisième groupe de données, car si vous ajustez simplement votre modèle obtenir de meilleurs résultats sur vos données de test, cela ressemble en quelque sorte à de la tricherie, car vous indiquez en quelque sorte à votre modèle comment sont les données que vous allez utiliser pour l'évaluation et cela peut entraîner un surajustement

De plus, si vous souhaitez fractionner vos données sans utiliser keras, je vous recommande d’utiliser la fonction sklearn train_test_split()

c'est facile à utiliser et ça ressemble à ça:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
4
sebrojas