[英]Build CNN model with keras for uneven training and testing data of folders of images
[英]Splitting data to training, testing and valuation when making Keras model
在制作和评估 Keras 机器学习模型时,我对拆分数据集有点困惑。 假设我有 1000 行的数据集。
features = df.iloc[:,:-1]
results = df.iloc[:,-1]
现在我想将这些数据分成训练和测试(33% 的数据用于测试,67% 用于训练):
x_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33)
我在互联网上读到将数据拟合到 model 应该如下所示:
history = model.fit(features, results, validation_split = 0.2, epochs = 10, batch_size=50)
因此,我将完整的数据(特征和结果)拟合到我的 model 中,并从该数据中使用 20% 的数据进行验证: validation_split = 0.2
。 所以基本上,我的 model 将使用 80% 的数据进行训练,并在 20% 的数据上进行测试。
因此,当我需要评估 model 时,就会出现混乱:
score = model.evaluate(x_test, y_test, batch_size=50)
这个对吗? 我的意思是,我为什么要把数据分成训练和测试,x_train 和 y_train go 在哪里?
您能否向我解释一下创建 model 的正确步骤顺序是什么?
通常,在训练时( model. fit
),您有两组:一组用于训练集,另一组用于验证/调整/开发集。 使用训练集,您训练 model,使用验证集,您需要找到最佳的超参数集。 完成后,您可以使用看不见的数据集测试 model - 与训练或验证集不同,该数据集完全隐藏在 model 之外。
现在,当你使用
X_train, X_test, y_train, y_test = train_test_split(features, results, test_size=0.33)
这样,您将features
和results
分成33%
的数据用于测试, 67%
用于训练。 现在,你可以做两件事
X_test
和y_test
作为model.fit(...)
中的验证集。或者,model. predict(...)
model. predict(...)
因此,如果您选择这些测试集作为验证集(编号 1 ),您将执行以下操作:
model.fit(x=X_train, y=y_trian,
validation_data = (X_test, y_test), ...)
在训练日志中,您将获得验证结果以及训练分数。 如果您稍后计算model.evaluate(X_test, y_test)
验证结果应该相同。
现在,如果您选择这些测试集作为最终预测或最终评估集(编号 2 ),那么您需要重新制作验证集或使用validation_split
参数,如下所示:
model.fit(x=X_train, y=y_trian,
validation_split = 0.2, ...)
Keras
API 将采用.2
% 的训练数据( X_train
和y_train
)并将其用于验证。 最后,对于您的 model 的最终评估,您可以执行以下操作:
y_pred = model.predict(x_test, batch_size=50)
现在,您可以将y_test
和y_pred
与一些相关指标进行比较。
通常,您希望在 fit 方法中使用已拆分为 arguments 的 X_train、y_train 数据。 所以它看起来像:
history = model.fit(X_train, y_train, batch_size=50)
虽然在将数据放入 fit 方法之前不拆分数据并添加 validation_split arguments 也可以,但请注意参考 keras 文档,validation_data 和 validation_split ZDBC11CAA5BDA99F77E6FB4DABD882E7 以确保按预期拆分它们。
Keras 文档: https://keras.rstudio.com/reference/fit.ZFC35FDC70D5FC69D269883A8EZC
我在互联网上读到将数据拟合到 model 应该如下所示:
这意味着您需要拟合特征和标签。 您已经将它们拆分为x_train
和y_train
。 所以你的合身应该是这样的:
history = model.fit(x_train, y_train, validation_split = 0.2, epochs = 10, batch_size=50)
因此,当我需要评估 model 时,就会出现混乱:
score = model.evaluate(x_test, y_test, batch_size=50) --> 这是正确的吗?
没错,您通过使用测试功能和相应的标签来评估 model。 此外,如果您只想获得例如预测标签,您可以使用:
y_hat = model.predict(X_test)
然后您可以将y_hat
与y_test
进行比较,即得到一个混淆矩阵等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.