在处理分类任务时,尤其是在处理多个类时,在输出层中使用softmax激活以及分类交叉熵损失是标准做法。然而,还有其他方法可以解决这个问题,我将与您提到的方法一起讨论这些方法。
-
一个热编码输出(Softmax激活)
:
-
这是您在第一个代码片段中使用的方法。对于3类问题,输出层将有3个神经元,每个神经元代表样本属于该类的概率。softmax函数确保这些概率的总和为1。
-
这种情况下使用的损失函数为
categorical_crossentropy
。
-
要从预测的概率中获得类标签,请使用
numpy.argmax()
在输出轴上。
-
单神经元输出(用于二进制分类的Sigmoid激活)
:
-
这种方法适用于二进制分类任务。输出是一个具有S形激活的单个神经元,它给出了属于一个类别的概率。
-
要使用的损失函数为
binary_crossentropy
。
-
要将浮点输出转换为整数,可以使用阈值(例如0.5)。如果输出大于阈值,则将其分类为类1;否则,分类为类0。
-
有序回归(用于有序多类分类)
:
-
如果你的类有一个有序关系(即,有一个像低、中、高这样的顺序),那么可以使用有序回归。这与您尝试的第二种方法更接近,但对于一般的多类任务来说并不常见。
-
通常,自定义激活函数和损失函数用于此方法。
对于三个不同类(-1、0和1)的特定问题,建议使用第一种方法(一种带有softmax激活的热编码)。您提到的第二种方法不是多类分类的标准方法,更适合于回归任务。在这种方法中,你使用的是一个具有tanh激活的单个神经元,它输出-1到1之间的值,这就是为什么你得到浮点值的原因。如果你真的想使用这种方法,你必须对输出进行舍入或bin以获得整数类标签,但这不建议用于你的任务。
正式建议
:
坚持使用softmax激活的一个热编码输出。这是多类分类的标准方法,可能会给你最好的结果。如果您希望从预测的概率中获得整数类标签,请使用:
predicted_classes = np.argmax(testPredict, axis=1) - 1
这个
- 1
最后是将类0、1和2分别映射回-1、0和1。