如何分割训练和测试数据-Tensorflow上的Keras
keras
machine-learning
neural-network
tensorflow
13
0

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

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)
参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃
  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)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号