当看不见的测试数据和训练数据的字段不同时,Keras 模型会出错

数据挖掘 机器学习 深度学习 喀拉斯 图像分类 机器学习模型
2022-03-14 20:43:37

我在 python 中创建了一个简单的 Keras 深度学习模型。训练中的变量总数为 195,而看不见的测试数据为 181。所有输入字段都是分类的(通过一种热编码转换)。由于看不见的测试数据有一些不同的类别,这就是为什么在一个热门编码字段与火车不匹配之后。

因此,在对看不见的测试数据进行预测步骤期间,模型会出现以下错误。有什么出路吗?

ValueError: Error when checking input: expected dense_30_input to have shape (195,)
but got array with shape (181,)
4个回答

正如我之前的其他人指出的那样,您的测试数据中的变量应该与训练数据中的变量完全相同。

在单热编码的情况下,如果您的测试数据中有看不见的类别,您的模型不知道如何处理它们,它没有针对这些变量进行训练。在这种情况下,在数据准备期间,您应创建您在训练期间使用值为 0 的所有变量,并且您不会为看不见的类别创建新变量。

我认为您的困惑和不同数量的变量来自您用来为您进行一次性编码的函数。可能您分别在两个数据集上运行它们,它只会创建它在特定数据集中找到的变量。您可以通过使用来自 scikit-learn 的标签编码器或 onehotencoder 转换器来克服它,这将在其对象内部保存原始状态,并且在每次转换中它将重新创建完全相同的结构。

更新使用 sklearn onehotencoder:

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(handle_unknown='ignore')
encoder.fit(train_categorical_data)
encoded_train=encoder.transform(train_categorical_data)
encoded_test=encoder.transform(test_categorical_data)

您可以保存编码器以供以后使用。在官方文档中查看更多信息。

当您将所有变量都作为训练数据时,该模型才能进行预测。这就是模型学习和神经网络权重更新的方式。当您在训练时不使用它们时,您无法使用不同的类别进行预测。

正如其他人指出的那样,测试数据应该具有与您的训练数据中相同的变量,以便 ML 工作。

如果您的训练和测试数据类别不匹配,这是我的想法。

  1. 可以使用sklearn onehotencoding并指定忽略测试数据中的任何未知类。

    from numpy import array from sklearn.preprocessing import OneHotEncoder data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm'] values = array(data) print(values) onehot_encoder = OneHotEncoder(sparse=False, handle_unknown='ignore') data2 = ['cold', 'warm', 'hot', 'colder'] values = values.reshape(-1, 1) train_encoded = onehot_encoder.fit_transform(values) values2 = array(data2).reshape(-1, 1) print(train_encoded) print(data2) print(onehot_encoder.transform(values2)) data3 = ['cold'] print(data3) values3 = array(data3).reshape(-1, 1) print(onehot_encoder.transform(values3))

输出

`['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm']
[[1. 0. 0.]
 [1. 0. 0.]
 [0. 0. 1.]
 [1. 0. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
['cold', 'warm', 'hot', 'colder']
[[1. 0. 0.]
 [0. 0. 1.]
 [0. 1. 0.]
 [0. 0. 0.]]
['cold']
[[1. 0. 0.]]`

2. 或者结合训练和测试数据,进行一次热编码,得到所有的类标签。

使用任何良好且干净的公开可用数据集并测试您的模型输出。您将了解模型如何预测,如果模型预测良好,那么您将了解您的数据是否存在问题或模型是否存在问题。