Как разделяются данные тренировок и тестов - Keras на Tensorflow - PullRequest
0 голосов
/ 24 июня 2018

В настоящее время я тренирую свои данные, используя нейронную сеть и используя функцию подгонки.

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

Теперь я использовал validation_split как 20%. Я понял, что мои тренировочные данные составят 80%, а данные тестирования - 20%. Я запутался, как эти данные обрабатываются на бэкэнде. Это похоже на то, что 80% лучших образцов будут отобраны для обучения и менее 20% для тестирования, или образцы будут случайно выбраны из промежуточного периода? Если я хочу предоставить отдельные данные для обучения и тестирования, как мне это сделать с помощью fit () ??

Кроме того, моя вторая задача - как проверить, хорошо ли соответствуют данные модели? Из результатов видно, что точность обучения составляет около 90%, а точность проверки - около 55%. Означает ли это, что это случай чрезмерной или недостаточной подгонки?

Мой последний вопрос: что оценивает доходность? Документ говорит, что возвращает потери, но я уже получаю потери и точность в течение каждой эпохи (как возвращение соответствия () (в истории). Что показывает точность и результат, полученный оценкой? Если точность, возвращаемая оценкой, возвращает 90%, могу ли я сказать, что мои данные хорошо соответствуют, независимо от того, какой была индивидуальная точность и потери для каждой эпохи?

Ниже мой код:

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 Ответ

0 голосов
/ 24 июня 2018
  1. Документация keras гласит: «Данные проверки выбираются из последних выборок в предоставленных данных x и y перед перемешиванием.», Это означает, что перемешивание происходит после разделения, также есть логический параметр называется shuffle, который по умолчанию имеет значение true, поэтому, если вы не хотите, чтобы ваши данные перемешивались, вы можете просто установить значение false

  2. Получение хороших результатов на ваших данных обучения, а затем получение плохих или не очень хороших результатов на ваших оценочных данных обычно означает, что ваша модель переоснащается, а перегрузка - это когда ваша модель учится в очень специфическом сценарии и не может достичь хорошие результаты на новых данных

  3. оценка состоит в том, чтобы проверить вашу модель на новых данных, которые она «никогда раньше не видела», обычно вы делите свои данные на обучение и тестирование, но иногда вы также можете создать третью группу данных, потому что если вы просто настраиваете свою модель, чтобы получать лучшие и лучшие результаты на своих тестовых данных. Это в некотором роде похоже на мошенничество, потому что в некотором смысле вы рассказываете своей модели, как данные, которые вы собираетесь использовать для оценки, могут вызвать переобучение

Также, если вы хотите разделить данные без использования кераса, я рекомендую вам использовать функцию sklearn train_test_split().

он прост в использовании и выглядит так:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...