如何分割训练和测试数据-Tensorflow上的Keras

时间:2018-06-24 02:28:07

标签: validation tensorflow machine-learning neural-network keras

我目前正在使用神经网络和拟合函数来训练数据。

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%。这是否意味着过拟合或欠拟合?

我的最后一个问题是评估收益是什么? Document说它返回损失,但是我已经在每个时期都得到了损失和准确性(作为fit()的返回(历史记录))。评价返回的准确性和分数显示什么?如果评估返回的准确率返回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 :(得分:11)

  1. keras文档说:“验证数据是从提供的x和y数据中的最后一个样本中选择的,在重排之前。”,这意味着重排在拆分之后发生,并且还有一个布尔参数称为“随机播放”,默认设置为true,因此,如果您不希望对数据进行随机播放,可以将其设置为false

  2. 在训练数据上获得良好的结果,然后在评估数据上获得良好或不好的结果,通常意味着您的模型过度拟合,过度拟合是您的模型在非常特定的情况下学习而无法实现的在新数据上取得不错的结果

  3. 评估是针对模型“从未见过”的新数据进行测试,通常是将数据划分为训练和测试,但有时您可能还希望创建第三组数据,因为如果您只是调整模型以在测试数据上获得越来越好的结果,这在某种程度上就像作弊,因为您在某种程度上告诉模型要用于评估的数据如何,这可能会导致过拟合

此外,如果您想不使用keras来拆分数据,建议您使用sklearn train_test_split()函数。

它易于使用,看起来像这样:

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