title: How training and test data is split - Keras on Tensorflow
body: <p>I am currently training my data using neural network and using fit function. </p>
  
  <pre><code>history=model.fit(X, encoded_Y, batch_size=50, nb_epoch=500, validation_split = 0.2, verbose=1)
  </code></pre>
  
  <p>Now I have used validation_split as 20%. What I understood is that my training data will be 80% and testing data will be 20%. I am confused how this data is dealt on back end. Is it like top 80% samples will be taken for training and below 20% percent for testing or the samples are randomly picked from inbetween? If I want to give separate training and testing data, how will I do that using fit()??</p>
  
  <p>Moreover, my second concern is how to check if data is fitting well on model? I can see from the results that training accuracy is around 90% while the validation accuracy is around 55%. Does this mean it is the case of over-fitting or Under-fitting?</p>
  
  <p>My last question is what does evaluate returns? Document says it returns the loss but I am already getting loss and accuracy during each epoch (as a return of fit() (in history)). What does accuracy and score returned by evaluate shows? If the accuracy returned by evaluate returns 90%, can I say my data is fitting well, regardless of what individual accuracy and loss was for each epoch?</p>
  
  <p>Below is my Code:</p>
  
  <pre><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)
  </code></pre>