在顺序或功能API模型中预测分类目标变量时,是否有方法获得类标签?



我目前正在使用Keras的Functional API和一个具有多个自变量和单个分类目标变量的数据集构建一个神经网络模型,使用以下代码。

input_layer = keras.Input(shape=(89,), name="input_layer")
dense_1 = keras.layers.Dense(50, name = 'dense_1')(input_layer)
dense_2 = keras.layers.Dense(50, name = 'dense_2')(dense_1)
classification_output_1 = keras.layers.Dense(31, activation = 'softmax', name = 'classification_output_1')(dense_2)
model = keras.Model(inputs = input_layer, outputs = [regression_output_1, classification_output_1])

model.compile(
optimizer = "adam",
loss = 'sparse_categorical_crossentropy'
)
model_1 = model.fit(
X_train,
y_train["Category_Target"],
epochs = 10,
batch_size = 50,
verbose = 1
)
y_pred = model_1.predict(X_train)
y_pred = pd.DataFrame(y_pred[0])
y_pred.columns = [i for i in pd.get_dummies(y_train["Category_Target"]).columns]

由于y_pred是单热向量的形式,因此我假定使用pd.get_dummies()。列可以得到我需要的类标签。我的问题是,这种方法是否可靠,如果不是,是否有其他方法来获得预测值的类标签?获取类标签的旧方法(即predict_classes)已弃用,我真的找不到一种可靠的方法来获取它们。我还考虑了其他方法,如:

y_pred.columns = list(y_train.drop_duplicates(by = "Category_Target")["Category_Target"])

我尝试过的两种方法似乎都不是正确标记类的可靠方法

下面是一个从一组标签到一个包含这些标签的字符串数组再返回的例子。

idx_to_labels = ['lions','tigers','bears']
target_strings = ['tigers','lions','lions','bears']
target_idx = tf.constant([labels.index(x) for x in target_labels], dtype=tf.int64)
target_one_hot = keras.utils.to_categorical(target_idx)
# this is the idiomatic way of going from one-hot to index
recovered_target_idx = tf.argmax(target_one_hot, axis=-1)
# if you have an ordered label list, this is a quick way to map a list with the integers back to strings
recovered_target_labels = [idx_to_labels[x] for x in  recovered_target_idx.numpy()]

如果您的目标是单热编码,那么您需要使用CategoricalCrossentropy损耗。SparseCrossentropy期望目标是索引(在上面的例子中,就像target_idx变量一样)。如果您的评估结果很差,这可能是潜在的原因。

https://keras.io/api/losses/probabilistic_losses/categoricalcrossentropy-function

相关内容

  • 没有找到相关文章

最新更新