我认为仅将序数标签编码为的方法
第 1 类表示为 [0 0 0 0 ...]
第 2 类表示为 [1 0 0 0 ...]
第 3 类表示为 [1 1 0 0 ...]
并使用二元交叉熵,因为损失函数不是最优的。如评论中所述,预测向量可能是例如 [1 0 1 0 ...]。这对于进行预测是不希望的。
神经网络的秩一致序数回归一文描述了如何限制神经网络进行秩一致的预测。你必须确保最后一层共享它的权重,但应该有不同的偏差。您可以在 Tensorflow 中通过添加以下内容作为网络的最后一部分来实现这一点(学分https://stackoverflow.com/questions/59656313/how-to-share-weights-and-not-biases-in-keras-密集层):
class BiasLayer(tf.keras.layers.Layer):
def __init__(self, units, *args, **kwargs):
super(BiasLayer, self).__init__(*args, **kwargs)
self.bias = self.add_weight('bias',
shape=[units],
initializer='zeros',
trainable=True)
def call(self, x):
return x + self.bias
# Add the following as the output of the Sequential model
model.add(keras.layers.Dense(1, use_bias=False))
model.add(BiasLayer(4))
model.add(keras.layers.Activation("sigmoid"))
请注意,这里的序数类的数量是 5,因此是偏差。K−1
我在实际数据上测试了性能差异,预测准确性大大提高。希望这可以帮助。