制作 Keras 模型时将数据拆分为训练、测试和评估

tag*_*aga 2 python machine-learning deep-learning keras tensorflow

当我制作和评估 Keras 机器学习模型时,我对分割数据集有点困惑。假设我有 1000 行的数据集。

features = df.iloc[:,:-1]
results = df.iloc[:,-1]
Run Code Online (Sandbox Code Playgroud)

现在我想将这些数据分为训练和测试(33%的数据用于测试,67%用于训练):

x_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33)
Run Code Online (Sandbox Code Playgroud)

我在互联网上读到,将数据拟合到模型中应该如下所示:

history = model.fit(features, results, validation_split = 0.2, epochs = 10, batch_size=50)
Run Code Online (Sandbox Code Playgroud)

因此,我将完整数据(特征和结果)拟合到我的模型中,并从该数据中使用 20% 的数据进行验证:validation_split = 0.2。所以基本上,我的模型将使用 80% 的数据进行训练,并使用 20% 的数据进行测试。

因此,当我需要评估模型时,混乱就开始了:

score = model.evaluate(x_test, y_test, batch_size=50)
Run Code Online (Sandbox Code Playgroud)

它是否正确?我的意思是,为什么我要把数据分成训练和测试,x_train 和 y_train 去了哪里?

您能否向我解释一下创建模型的正确步骤顺序是什么?

M.I*_*nat 5

通常,在训练时间 ( model. fit) 中,您有两套:一套用于训练集,另一套用于验证/调整/开发集。使用训练集来训练模型,使用验证集来找到最佳的超参数集。完成后,您可以使用看不见的数据集测试您的模型 - 与训练验证不同,该数据集完全隐藏在模型中。


现在,当你使用

X_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33)
Run Code Online (Sandbox Code Playgroud)

这样,您就可以将featuresresults分成用于测试33%的数据和用于训练的数据。现在,你可以做两件事67%

  1. 使用 (X_testy_test作为 中的验证集model.fit(...)。或者,
  2. 使用它们进行最终预测model. predict(...)

因此,如果您选择这些测试集作为验证集(编号 1),您将执行以下操作:

model.fit(x=X_train, y=y_trian, 
         validation_data = (X_test, y_test), ...)
Run Code Online (Sandbox Code Playgroud)

在训练日志中,您将获得验证结果以及训练分数。如果您稍后计算 ,验证结果应该是相同的model.evaluate(X_test, y_test)


现在,如果您选择这些测试集作为最终预测或最终评估集(编号 2),那么您需要重新制作验证集或使用validation_split参数,如下所示:

model.fit(x=X_train, y=y_trian, 
         validation_split = 0.2, ...)
Run Code Online (Sandbox Code Playgroud)

APIKeras将获取.2训练数据的百分比 (X_trainy_train) 并将其用于验证。最后,为了对模型进行最终评估,您可以执行以下操作:

y_pred = model.predict(x_test, batch_size=50)
Run Code Online (Sandbox Code Playgroud)

现在,您可以与y_test一些y_pred相关指标进行比较。